slackmaster/index.js

238 lines
7.6 KiB
JavaScript
Raw Normal View History

2024-06-19 19:50:14 +00:00
const { App } = require('@slack/bolt');
2024-06-19 20:20:41 +00:00
const postgres = require('postgres');
2024-06-19 19:50:14 +00:00
require('dotenv').config()
2024-06-19 20:20:41 +00:00
const sql = postgres({
host: 'hackclub.app',
port: 5432,
database: 'haroon_slackmaster',
username: 'haroon',
password: process.env.PGSQL_PASSWORD,
ssl: 'require'
})
2024-06-19 19:50:14 +00:00
const BeginnerOpponents = require('./opponents/beginner.json');
const app = new App({
token: process.env.SLACK_BOT_TOKEN,
signingSecret: process.env.SLACK_SIGNING_SECRET
});
2024-06-19 20:20:41 +00:00
app.use(async (ctx) => {
const a = await sql`SELECT * FROM users WHERE slack_id = ${ctx.body.user_id};`
if (a.length === 0) {
await sql`INSERT INTO users (slack_id) VALUES (${ctx.body.user_id})`
}
await ctx.next()
})
2024-06-19 19:50:14 +00:00
app.command('/chooseopponent', async (ctx) => {
await ctx.ack();
await ctx.client.views.open({
trigger_id: ctx.body.trigger_id,
view: {
"type": "modal",
"callback_id": "chooseopponent",
"title": {
"type": "plain_text",
"text": "Choose an opponent",
"emoji": true
},
"submit": {
"type": "plain_text",
"text": "Choose",
"emoji": true
},
"close": {
"type": "plain_text",
"text": "Never mind",
"emoji": true
},
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": `*Battle Support*: Hiya <@${ctx.body.user_id}>! What rank opponent would you like to battle against?\n\nNot sure yet? Don't worry! Just cancel out and view what opponents you can fight with /viewopponents!`
}
},
{
"type": "divider"
},
{
"type": "input",
"element": {
"type": "radio_buttons",
"options": [
{
"text": {
"type": "plain_text",
"text": "Special",
"emoji": true
},
"value": "SPECIAL"
},
{
"text": {
"type": "plain_text",
"text": "Beginner",
"emoji": true
},
"value": "BEGINNER"
},
{
"text": {
"type": "plain_text",
"text": "Casual",
"emoji": true
},
"value": "CASUAL"
}
],
"action_id": "rank-selection"
},
"label": {
"type": "plain_text",
"text": "Choose a rank:",
"emoji": true
}
}
]
}
})
});
app.view("chooseopponent", async (ctx) => {
const { selected_option } = Object.values(ctx.view.state.values)[0]['rank-selection'];
const rank = selected_option.value;
await ctx.ack({
response_action: 'update',
view: {
"type": "modal",
"callback_id": "chooseopponent-" + rank,
"title": {
"type": "plain_text",
"text": "Choose an opponent",
"emoji": true
},
"submit": {
"type": "plain_text",
"text": "Battle",
"emoji": true
},
"close": {
"type": "plain_text",
"text": "Never mind",
"emoji": true
},
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": `*Battle Beginner*: Hey there <@${ctx.body.user.id}>! Let's keep things simple, who do you want to battle against?`
}
},
{
"type": "divider"
},
{
"type": "input",
"element": {
"type": "static_select",
"options": BeginnerOpponents.map(opponent =>
({
"text": {
"type": "plain_text",
"text": `${opponent.name} // ${opponent.stats.health + opponent.stats.min + opponent.stats.max} Battle Power`,
"emoji": true
},
"value": opponent.rawId
})
),
"action_id": "opponents"
},
"label": {
"type": "plain_text",
"text": "Choose an opponent:",
"emoji": true
}
}
]
}
})
})
2024-06-19 20:20:41 +00:00
app.view("chooseopponent-BEGINNER", async (ctx) => {
await ctx.ack();
const userId =
ctx.client.chat.postMessage({
channel: ""
})
})
2024-06-19 19:50:14 +00:00
app.command('/viewopponents', async (ctx) => {
await ctx.ack();
const args = ctx.body.text.split(/ +/g);
switch (args[0].toUpperCase()) {
case "SPECIAL":
ctx.respond({
text: "You're trying to view Special opponents.",
response_type: 'ephemeral'
})
break;
case "BEGINNER":
const mappedBeginner = BeginnerOpponents.map(opponent =>
({
name: opponent.name,
battlePower:
opponent.stats.health +
opponent.stats.min +
opponent.stats.max
})
)
ctx.respond({
response_type: 'ephemeral',
text: `*Battle Master:* Greetings battler. Here are the avaliable *Beginner* opponents for you to battle.`,
blocks: [
{
type: 'section',
text: {
type: 'mrkdwn',
text: `*Battle Master:* Greetings <@${ctx.body.user_id}>. Here are the avaliable *Beginner* opponents for you to battle.`
}
},
{
type: 'section',
text: {
type: 'mrkdwn',
text: mappedBeginner.map(opponent => `*${opponent.name}:*\n\n${opponent.battlePower} Battle Power`).join('\n\n\n')
}
}
]
})
break;
case "CASUAL":
ctx.say("You're trying to view Casual opponents.")
break;
default:
ctx.say("You either wrote nothing or just chose a rank that doesn't exist.")
}
});
; (async () => {
// Start your app
await app.start(process.env.PORT);
console.log('⚡️ Bolt app is running!');
})();