128 lines
3.9 KiB
TypeScript
128 lines
3.9 KiB
TypeScript
|
import { name, version, repository } from "./package.json";
|
||
|
const USER_AGENT = `${name}/${version} (+${repository.url})`;
|
||
|
|
||
|
const { App, ExpressReceiver } = (await import("@slack/bolt"));import postgres from 'postgres';
|
||
|
import "dotenv/config";
|
||
|
|
||
|
const sql = postgres({
|
||
|
host: '/var/run/postgresql',
|
||
|
database: 'haroon_nxslack',
|
||
|
username: 'haroon'
|
||
|
})
|
||
|
|
||
|
const receiver = new ExpressReceiver({ signingSecret: process.env.SLACK_SIGNING_SECRET! });
|
||
|
|
||
|
const app = new App({
|
||
|
token: process.env.SLACK_BOT_TOKEN,
|
||
|
signingSecret: process.env.SLACK_SIGNING_SECRET,
|
||
|
clientSecret: process.env.SLACK_CLIENT_SECRET,
|
||
|
receiver
|
||
|
});
|
||
|
|
||
|
app.event("app_home_opened", async (ctx) => {
|
||
|
const slackUser = (await ctx.client.users.info({ user: ctx.context.userId! })).user!.profile;
|
||
|
|
||
|
await ctx.client.views.publish({
|
||
|
// Use the user ID associated with the event
|
||
|
user_id: ctx.event.user,
|
||
|
view: {
|
||
|
"type": "home",
|
||
|
"blocks": [
|
||
|
{
|
||
|
"type": "header",
|
||
|
"text": {
|
||
|
"type": "plain_text",
|
||
|
"text": "Not authenticated",
|
||
|
"emoji": true
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
"type": "section",
|
||
|
"text": {
|
||
|
"type": "mrkdwn",
|
||
|
"text": `Hey *${slackUser?.display_name_normalized}*! To sync your Nintendo Switch and Slack status, give me your friend code!`
|
||
|
},
|
||
|
"accessory": {
|
||
|
"type": "button",
|
||
|
"text": {
|
||
|
"type": "plain_text",
|
||
|
"text": "Sync",
|
||
|
"emoji": true
|
||
|
},
|
||
|
"value": "click_me_123",
|
||
|
"action_id": "get-friend-code"
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
});
|
||
|
})
|
||
|
|
||
|
|
||
|
app.action("get-friend-code", async (ctx) => {
|
||
|
ctx.ack();
|
||
|
|
||
|
ctx.client.views.open({
|
||
|
trigger_id: ctx.body.trigger_id!,
|
||
|
view: {
|
||
|
"type": "modal",
|
||
|
callback_id: "friend-code-validation",
|
||
|
"title": {
|
||
|
"type": "plain_text",
|
||
|
"text": "Add me as a friend!",
|
||
|
"emoji": true
|
||
|
},
|
||
|
"submit": {
|
||
|
"type": "plain_text",
|
||
|
"text": "Submit",
|
||
|
"emoji": true
|
||
|
},
|
||
|
"close": {
|
||
|
"type": "plain_text",
|
||
|
"text": "Cancel",
|
||
|
"emoji": true
|
||
|
},
|
||
|
"blocks": [
|
||
|
{
|
||
|
"block_id": "FRIEND_CODE",
|
||
|
"type": "input",
|
||
|
"element": {
|
||
|
"type": "plain_text_input",
|
||
|
"action_id": "code",
|
||
|
"placeholder": {
|
||
|
"type": "plain_text",
|
||
|
"text": "SW-xxxx-xxxx-xxxx"
|
||
|
}
|
||
|
},
|
||
|
"label": {
|
||
|
"type": "plain_text",
|
||
|
"text": "Enter your friend code here...",
|
||
|
"emoji": true
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
})
|
||
|
})
|
||
|
|
||
|
const FRIEND_CODE_REGEX = /(?:SW-)?(\d{4}-\d{4}-\d{4})/g;
|
||
|
|
||
|
app.view("friend-code-validation", async (ctx) => {
|
||
|
// ts is lovely
|
||
|
|
||
|
const friendCode = Object.values(ctx.view.state.values)[0]['code'].value!;
|
||
|
|
||
|
if (FRIEND_CODE_REGEX.test(friendCode)) return await ctx.ack();
|
||
|
else return await ctx.ack({
|
||
|
response_action: 'errors',
|
||
|
errors: {
|
||
|
"FRIEND_CODE": "This isn't a valid friend code. (SW-xxxx-xxxx-xxxx or xxxx-xxxx-xxxx)"
|
||
|
}
|
||
|
});
|
||
|
})
|
||
|
|
||
|
; (async () => {
|
||
|
await app.start(53371);
|
||
|
|
||
|
console.log('⚡️ Bolt app is running!');
|
||
|
})();
|