you can now link properly!!
This commit is contained in:
parent
e9c055d3c1
commit
ba90e16f5e
|
@ -1,5 +1,7 @@
|
||||||
# nxslack
|
# nxslack
|
||||||
|
|
||||||
|
Slack bot to set your Nintendo Switch as your status!
|
||||||
|
|
||||||
To install dependencies:
|
To install dependencies:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|
133
index.ts
133
index.ts
|
@ -1,8 +1,10 @@
|
||||||
import { name, version, repository } from "./package.json";
|
import { name, version, repository } from "./package.json";
|
||||||
const USER_AGENT = `${name}/${version} (+${repository.url})`;
|
const USER_AGENT = `${name}/${version} (+${repository.url})`;
|
||||||
|
|
||||||
const { App, ExpressReceiver } = (await import("@slack/bolt"));import postgres from 'postgres';
|
const { App, ExpressReceiver } = (await import("@slack/bolt"));
|
||||||
|
import postgres from 'postgres';
|
||||||
import "dotenv/config";
|
import "dotenv/config";
|
||||||
|
import { spawnSync } from "child_process";
|
||||||
|
|
||||||
const sql = postgres({
|
const sql = postgres({
|
||||||
host: '/var/run/postgresql',
|
host: '/var/run/postgresql',
|
||||||
|
@ -10,18 +12,54 @@ const sql = postgres({
|
||||||
username: 'haroon'
|
username: 'haroon'
|
||||||
})
|
})
|
||||||
|
|
||||||
const receiver = new ExpressReceiver({ signingSecret: process.env.SLACK_SIGNING_SECRET! });
|
|
||||||
|
|
||||||
const app = new App({
|
const app = new App({
|
||||||
token: process.env.SLACK_BOT_TOKEN,
|
token: process.env.SLACK_BOT_TOKEN,
|
||||||
signingSecret: process.env.SLACK_SIGNING_SECRET,
|
signingSecret: process.env.SLACK_SIGNING_SECRET,
|
||||||
clientSecret: process.env.SLACK_CLIENT_SECRET,
|
clientSecret: process.env.SLACK_CLIENT_SECRET
|
||||||
receiver
|
|
||||||
});
|
});
|
||||||
|
|
||||||
app.event("app_home_opened", async (ctx) => {
|
app.event("app_home_opened", async (ctx) => {
|
||||||
const slackUser = (await ctx.client.users.info({ user: ctx.context.userId! })).user!.profile;
|
const slackUser = (await ctx.client.users.info({ user: ctx.context.userId! })).user!.profile;
|
||||||
|
|
||||||
|
const [ link = null ] = await sql`SELECT * FROM links WHERE slackid = ${ctx.context.userId!};`;
|
||||||
|
|
||||||
|
if (link) {
|
||||||
|
const frens = getFriends();
|
||||||
|
const me = frens.find(x => x.nsaId == link.nsaid)!;
|
||||||
|
|
||||||
|
console.log(me, frens)
|
||||||
|
|
||||||
|
await ctx.client.views.publish({
|
||||||
|
user_id: ctx.event.user,
|
||||||
|
view: {
|
||||||
|
type: 'home',
|
||||||
|
blocks: [
|
||||||
|
{
|
||||||
|
type: 'header',
|
||||||
|
text: {
|
||||||
|
type: 'plain_text',
|
||||||
|
text: "You're linked!",
|
||||||
|
emoji: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "section",
|
||||||
|
"text": {
|
||||||
|
"type": "mrkdwn",
|
||||||
|
"text": `Hey *${slackUser?.display_name_normalized}* - you're already linked to a Nintendo Switch account (${me.name}). To unlink yourself, DM <@U06TBP41C3E>.`
|
||||||
|
},
|
||||||
|
"accessory": {
|
||||||
|
"type": "image",
|
||||||
|
"image_url": me.imageUri,
|
||||||
|
"alt_text": "switch profile picture"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
await ctx.client.views.publish({
|
await ctx.client.views.publish({
|
||||||
// Use the user ID associated with the event
|
// Use the user ID associated with the event
|
||||||
user_id: ctx.event.user,
|
user_id: ctx.event.user,
|
||||||
|
@ -32,7 +70,7 @@ app.event("app_home_opened", async (ctx) => {
|
||||||
"type": "header",
|
"type": "header",
|
||||||
"text": {
|
"text": {
|
||||||
"type": "plain_text",
|
"type": "plain_text",
|
||||||
"text": "Not authenticated",
|
"text": "You aren't linked",
|
||||||
"emoji": true
|
"emoji": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -112,13 +150,92 @@ app.view("friend-code-validation", async (ctx) => {
|
||||||
|
|
||||||
const friendCode = Object.values(ctx.view.state.values)[0]['code'].value!;
|
const friendCode = Object.values(ctx.view.state.values)[0]['code'].value!;
|
||||||
|
|
||||||
if (FRIEND_CODE_REGEX.test(friendCode)) return await ctx.ack();
|
if (!FRIEND_CODE_REGEX.test(friendCode)) return await ctx.ack({
|
||||||
else return await ctx.ack({
|
|
||||||
response_action: 'errors',
|
response_action: 'errors',
|
||||||
errors: {
|
errors: {
|
||||||
"FRIEND_CODE": "This isn't a valid friend code. (SW-xxxx-xxxx-xxxx or xxxx-xxxx-xxxx)"
|
"FRIEND_CODE": "This isn't a valid friend code. (SW-xxxx-xxxx-xxxx or xxxx-xxxx-xxxx)"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const realCode = friendCode.replace("SW-", "");
|
||||||
|
|
||||||
|
spawnSync("/home/haroon/nxslack/node_modules/.bin/nxapi", ["nso", "add-friend", realCode], { cwd: process.cwd(), env: {
|
||||||
|
'NXAPI_USER_AGENT': USER_AGENT
|
||||||
|
} });
|
||||||
|
|
||||||
|
await ctx.ack();
|
||||||
|
|
||||||
|
ctx.client.chat.postMessage({
|
||||||
|
channel: ctx.body.user.id,
|
||||||
|
text: "I've added you on Nintendo Switch! Find my friend request and accept it or add me yourself (SW-2973-7062-1423) and then click this button to finish the process!",
|
||||||
|
blocks: [
|
||||||
|
{
|
||||||
|
type: 'section',
|
||||||
|
text: {
|
||||||
|
type: 'mrkdwn',
|
||||||
|
text: "I've added you on Nintendo Switch! Find my friend request and accept it or add me back (`SW-2973-7062-1423`) and then click this button to finish the process!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "actions",
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"type": "button",
|
||||||
|
"text": {
|
||||||
|
"type": "plain_text",
|
||||||
|
"text": "I've accepted!",
|
||||||
|
"emoji": true
|
||||||
|
},
|
||||||
|
"value": realCode,
|
||||||
|
"action_id": "check-synced"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
type NSOUser = {
|
||||||
|
id: number,
|
||||||
|
nsaId: string,
|
||||||
|
imageUri: string,
|
||||||
|
name: string,
|
||||||
|
isFriend: boolean,
|
||||||
|
isFavouriteFriend: boolean,
|
||||||
|
isServiceUser: boolean,
|
||||||
|
friendCreatedAt: number,
|
||||||
|
presence: any
|
||||||
|
}
|
||||||
|
|
||||||
|
const getFriends = function getFriends(): NSOUser[] {
|
||||||
|
const { stdout } = spawnSync("/home/haroon/nxslack/node_modules/.bin/nxapi", ["nso", "friends", "--json"], { cwd: process.cwd(), env: {
|
||||||
|
'NXAPI_USER_AGENT': USER_AGENT
|
||||||
|
} });
|
||||||
|
|
||||||
|
return JSON.parse(stdout.toString('utf-8').slice());
|
||||||
|
};
|
||||||
|
|
||||||
|
app.action('check-synced', async (ctx) => {
|
||||||
|
if (ctx.action.type != "button") return;
|
||||||
|
await ctx.ack();
|
||||||
|
|
||||||
|
const friends = getFriends();
|
||||||
|
|
||||||
|
const { stdout } = spawnSync("/home/haroon/nxslack/node_modules/.bin/nxapi", ["nso", "lookup", ctx.action.value!, "--json"], { cwd: process.cwd(), env: {
|
||||||
|
'NXAPI_USER_AGENT': USER_AGENT
|
||||||
|
} });
|
||||||
|
|
||||||
|
console.log(stdout.toString())
|
||||||
|
|
||||||
|
const user: NSOUser = JSON.parse(stdout.toString('utf-8').slice());
|
||||||
|
|
||||||
|
if (!!friends.find(userA => userA.nsaId == user.nsaId)) {
|
||||||
|
await sql`INSERT INTO links VALUES (${ctx.context.userId!}, ${user.nsaId})`
|
||||||
|
|
||||||
|
ctx.respond({
|
||||||
|
text: `Congrats! You've successfully linked your Slack account to your Nintendo Switch user (${user.name})!`
|
||||||
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
; (async () => {
|
; (async () => {
|
||||||
|
|
Loading…
Reference in a new issue