Skip to content

Commit

Permalink
Massive performance improvements to login and basic OAuth support.
Browse files Browse the repository at this point in the history
  • Loading branch information
retrixe committed Mar 16, 2019
1 parent 2b92545 commit 3830073
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 15 deletions.
60 changes: 45 additions & 15 deletions server/resolvers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ MongoClient.connect(mongoURL === 'dotenv' ? process.env.MONGO_URL : mongoURL, (e
db = client.db('ivebot')
})

// A constant.
const api = 'https://discordapp.com/api/v7'

// Set up resolvers.
export default (ctx: { tempDB: DB, client: Client }) => ({
// Queries.
Expand Down Expand Up @@ -52,26 +55,53 @@ export default (ctx: { tempDB: DB, client: Client }) => ({
perms: boolean, icon: string, serverId: string, name: string,
channels: Array<{ id: string, name: string }>
}> = [] /* eslint-enable indent */
ctx.client.guilds.forEach(server => {
ctx.client.guilds.find(a => a.id === server.id).members.forEach(member => {
if (member.id === ctx.tempDB.link[linkToken]) {
servers.push({
serverId: server.id,
name: server.name,
icon: server.iconURL || 'no icon',
channels: server.channels.filter(i => i.type === 0).map(i => ({
id: i.id, name: i.name
})),
perms: host === ctx.tempDB.link[linkToken]
? true : member.permission.has('manageGuild')
})
}
})
// Send back mutual servers.
ctx.client.guilds.forEach(guild => {
if (guild.members.has(ctx.tempDB.link[linkToken])) {
servers.push({
serverId: guild.id,
name: guild.name,
icon: guild.iconURL || 'no icon',
channels: guild.channels.filter(i => i.type === 0).map(i => ({
id: i.id, name: i.name
})),
perms: host === ctx.tempDB.link[linkToken]
? true : guild.members.get(ctx.tempDB.link[linkToken]).permission.has('manageGuild')
})
}
})
return servers
}
return [{ serverId: 'Unavailable: invalid link token.', icon: 'no icon' }]
},
// Get user info.
getOAuthUserInfo: async (_: string, { token }: { token: string }) => {
// Get info about the user.
type Base = { id: string } // eslint-disable-line no-use-before-define
const headers = { Authorization: `Bearer ${token}` }
const guilds: Array<Base> = await (await fetch(`${api}/users/@me/guilds`, { headers })).json()
const { id }: Base = await (await fetch(`${api}/users/@me`, { headers })).json()
// Generate the server info.
let servers: Array<{ /* eslint-disable indent */
perms: boolean, icon: string, serverId: string, name: string,
channels: Array<{ id: string, name: string }>
}> = [] /* eslint-enable indent */
guilds.forEach(server => {
if (ctx.client.guilds.has(server.id)) {
const guild = ctx.client.guilds.get(server.id)
servers.push({
serverId: guild.id,
name: guild.name,
icon: guild.iconURL || 'no icon',
channels: guild.channels.filter(i => i.type === 0).map(i => ({
id: i.id, name: i.name
})),
perms: host === id || guild.members.get(id).permission.has('manageGuild')
})
}
})
return servers
},
getBotId: () => ctx.client.user.id
},
Mutation: {
Expand Down
2 changes: 2 additions & 0 deletions server/schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ type Query {
serverSettings(serverId: String!, linkToken: String!): ServerSetting!
# Get the user for a link code.
getUserInfo(linkToken: String!): [Server!]!
# Get the user for an OAuth token.
getOAuthUserInfo(linkToken: String!): [Server!]!
# Get bot ID.
getBotId: String!
}
Expand Down

0 comments on commit 3830073

Please sign in to comment.