From 13cd3bd4a057f6095975500689ed69832eefff52 Mon Sep 17 00:00:00 2001 From: Kata Date: Tue, 5 Dec 2017 02:11:49 -0600 Subject: [PATCH] add server list connection to discord --- API.paw | Bin 0 -> 4553 bytes Server/api/servers_test.js | 14 ++++ Server/package.json | 2 +- Server/services/discord.js | 89 +++++++++++++++++------ UI/public/index.html | 3 +- UI/src/components/servers/Navigation.js | 3 +- UI/src/components/servers/ServerCard.css | 6 +- UI/src/components/servers/ServerCard.js | 19 ++++- UI/src/components/servers/UserCard.css | 10 ++- UI/src/components/servers/index.js | 14 +++- UI/src/components/wrapper/index.js | 3 +- UI/src/components/wrapper/wrapper.css | 4 + UI/src/index.css | 5 +- 13 files changed, 138 insertions(+), 34 deletions(-) create mode 100644 API.paw create mode 100644 Server/api/servers_test.js create mode 100644 UI/src/components/wrapper/wrapper.css diff --git a/API.paw b/API.paw new file mode 100644 index 0000000000000000000000000000000000000000..93ad9d0d55dc930af4bf5aa9556e0d18c529bf2a GIT binary patch literal 4553 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 W0lvw75G(Phbs~?2u`xDqXZ{Ohi%!)5 literal 0 HcmV?d00001 diff --git a/Server/api/servers_test.js b/Server/api/servers_test.js new file mode 100644 index 0000000..953b5d8 --- /dev/null +++ b/Server/api/servers_test.js @@ -0,0 +1,14 @@ +module.exports = (R, $) => { + R.get('/api/~/relevant-servers/:user', (ctx, next) => { + // ctx.body = 'ok' + const srv = $.discord.getRelevantServers(ctx.params.user) + ctx.body = $.discord.presentableServers(srv, ctx.params.user) + return + }) + + R.get('/api/~/roles/:server', (ctx, next) => { + // ctx.body = 'ok' + ctx.body = $.discord.getRoles(ctx.params.server) + return + }) +} diff --git a/Server/package.json b/Server/package.json index 283f8dd..486cb3a 100644 --- a/Server/package.json +++ b/Server/package.json @@ -29,7 +29,7 @@ "pg": "^7.4.0", "pg-hstore": "^2.3.2", "pm2": "^2.8.0", - "sequelize": "^4.25.1", + "sequelize": "^4.26.0", "socket.io": "^2.0.4", "standard": "^10.0.3", "superagent": "^3.8.1", diff --git a/Server/services/discord.js b/Server/services/discord.js index 5920ee4..21348fc 100644 --- a/Server/services/discord.js +++ b/Server/services/discord.js @@ -10,13 +10,58 @@ class DiscordService extends Service { this.clientId = process.env.DISCORD_CLIENT_ID this.clientSecret = process.env.DISCORD_CLIENT_SECRET this.oauthCallback = process.env.OAUTH_AUTH_CALLBACK - this.botCallback = `${ctx.config.appUrl}/oauth/bot/callback` + this.botCallback = `${ctx.config.appUrl}/api/oauth/bot/callback` + + this.client = new discord.Client() this.startBot() } async startBot () { - await discord.login(this.botToken) + await this.client.login(this.botToken) + } + + getRelevantServers (userId) { + return this.client.guilds.filter((g) => g.members.has(userId)) + } + + presentableServers (collection, userId) { + return collection.map((server) => { + const gm = server.members.get(userId) + + return { + id: server.id, + gm: { + nickname: gm.nickname, + color: gm.displayHexColor + }, + server: { + id: server.id, + name: server.name, + ownerID: server.ownerID, + icon: server.icon + }, + perms: this.getPermissions(gm) + } + }) + } + + presentableRoles (serverId) { + return this.client.guilds.get(serverId).roles.map((role) => { + return { + color: role.hexColor, + position: role.calculatedPosition, + id: role.id, + + } + }) + } + + getPermissions (gm) { + return { + isAdmin: gm.permissions.hasPermission('ADMINISTRATOR'), + canManageRoles: gm.permissions.hasPermission('MANAGE_ROLES', false, true) + } } // oauth step 2 flow, grab the auth token via code @@ -42,31 +87,31 @@ class DiscordService extends Service { } // on sign out, we revoke the token we had. - async revokeAuthToken (code, state) { - const url = 'https://discordapp.com/api/oauth2/revoke' - try { - const rsp = - await superagent - .post(url) - .send({ - client_id: this.clientId, - client_secret: this.clientSecret, - grant_type: 'authorization_code', - code: code, - redirect_uri: this.oauthCallback - }) + // async revokeAuthToken (code, state) { + // const url = 'https://discordapp.com/api/oauth2/revoke' + // try { + // const rsp = + // await superagent + // .post(url) + // .send({ + // client_id: this.clientId, + // client_secret: this.clientSecret, + // grant_type: 'authorization_code', + // code: code, + // redirect_uri: this.oauthCallback + // }) - return rsp.body - } catch (e) { - this.log.error('getAuthToken failed', e) - throw e - } - } + // return rsp.body + // } catch (e) { + // this.log.error('getAuthToken failed', e) + // throw e + // } + // } // returns oauth authorize url with IDENTIFY permission // we only need IDENTIFY because we only use it for matching IDs from the bot getAuthUrl (state) { - return `https://discordapp.com/oauth2/authorize?client_id=${this.clientId}&redirect_uri=${this.oauthCallback}&response_type=code&scope=identify` + return `https://discordapp.com/oauth2/authorize?client_id=${this.clientId}&redirect_uri=${this.oauthCallback}&response_type=code&scope=identify&state=${state}` } // returns the bot join url with MANAGE_ROLES permission diff --git a/UI/public/index.html b/UI/public/index.html index 3c5b860..69902b7 100644 --- a/UI/public/index.html +++ b/UI/public/index.html @@ -4,6 +4,7 @@ Roleypoly + @@ -11,7 +12,7 @@ -
+