import BaseController, { ROLE_ANON } from 'common/base.controller' import { ZError } from 'common/ZError' import { role, router } from 'decorators/router' import logger from 'logger/logger' import { AuthRecord } from 'modules/AuthRecord' import { DiscordSvr, exchangeDiscrodCodeForToken, userInfo } from 'services/discord.svr' import { parseOauthState } from 'utils/net.util' class DiscordController extends BaseController { @role(ROLE_ANON) @router('get /discord/redirect_uri') async discordCallback(req, res) { let { code, state } = req.params if (code && state) { const stateArr = parseOauthState(state) const address = stateArr[0].toLowerCase() const record = await AuthRecord.insertOrUpdate( { address, platform: 7 }, { address, platform: 7, $inc: { version: 1 } }, ) let tokenResponse = await exchangeDiscrodCodeForToken(code) record.accessToken = tokenResponse.access_token record.refreshToken = tokenResponse.refresh_token record.scope = tokenResponse.scope record.tokenType = tokenResponse.token_type record.expiresIn = (Date.now() / 1000 + tokenResponse.expires_in) | 0 await record.save() if (tokenResponse && tokenResponse.access_token) { let uinfo = await userInfo(tokenResponse.access_token) record.nickname = uinfo.username record.username = uinfo.username record.discriminator = uinfo.discriminator record.openId = uinfo.id await record.save() } if (stateArr.length > 2) { return res.redirect(stateArr[2]) } } if (state) { const stateArr = parseOauthState(state) if (stateArr.length > 2) { return res.redirect(stateArr[2]) } } return res.view('/templates/discord_redirect.ejs') } }