nxslack/index.ts

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!');
})();