From b49bed2bc5a8cbab8069c82d7aed51a2dafd6c8f Mon Sep 17 00:00:00 2001 From: CounterFire2023 <136581895+CounterFire2023@users.noreply.github.com> Date: Thu, 25 Jan 2024 15:00:11 +0800 Subject: [PATCH] add general oauth redirect --- src/api.server.ts | 7 +++++-- src/controllers/main.controller.ts | 18 +++++++++++++++++ src/controllers/oauth.controller.ts | 20 +++++++++++++++++++ src/schedule/discord.schedule.ts | 30 +++++++++++++++++++++++++++++ src/services/discord.svr.ts | 26 +++++++++++++++++++++---- start.json | 27 ++++++++++++++++++++++++++ tsconfig.json | 4 ++-- 7 files changed, 124 insertions(+), 8 deletions(-) create mode 100644 src/controllers/oauth.controller.ts create mode 100644 src/schedule/discord.schedule.ts create mode 100644 start.json diff --git a/src/api.server.ts b/src/api.server.ts index f3c437e..241770b 100644 --- a/src/api.server.ts +++ b/src/api.server.ts @@ -7,6 +7,7 @@ import logger from 'logger/logger' import config from 'config/config' import { ConnectOptions } from 'mongoose' import { DiscordSvr } from 'services/discord.svr' +import DiscordSchedule from 'schedule/discord.schedule' const zReqParserPlugin = require('plugins/zReqParser') @@ -93,10 +94,12 @@ export class ApiServer { }) } - initSchedules() {} + initSchedules() { + // new DiscordSchedule().scheduleAll() + } initServcers() { - new DiscordSvr().init() + // new DiscordSvr().init() } async connectDB() { diff --git a/src/controllers/main.controller.ts b/src/controllers/main.controller.ts index 423d997..f2697cb 100644 --- a/src/controllers/main.controller.ts +++ b/src/controllers/main.controller.ts @@ -117,4 +117,22 @@ class MainController extends BaseController { } return result } + + @role(ROLE_ANON) + @router('get /activity/discord/svr/:id') + async checkDiscordJoin(req) { + let { id } = req.params + checkSign(req.params); + let verified = new DiscordSvr().checkUser(id) + return {verified} + } + + @role(ROLE_ANON) + @router('get /activity/discord/role/:id') + async checkDiscordRole(req) { + let { id } = req.params + checkSign(req.params); + let verified = new DiscordSvr().checkUserRole(id) + return {verified} + } } diff --git a/src/controllers/oauth.controller.ts b/src/controllers/oauth.controller.ts new file mode 100644 index 0000000..18e88d6 --- /dev/null +++ b/src/controllers/oauth.controller.ts @@ -0,0 +1,20 @@ + +import BaseController, { ROLE_ANON } from 'common/base.controller' +import { role, router } from 'decorators/router' + +class OauthController extends BaseController { + + @role(ROLE_ANON) + @router('get /oauth/redirect') + @router('post /oauth/redirect') + async appleWebLoginCb(req, res) { + let { code, state, error, token, id_token } = req.params + code = code || token + console.log(`code: ${code}, state: ${state}, error: ${error}`) + if (error) { + res.redirect(`cfoauthcb://login_result?state=${state}&error=${JSON.stringify(error)}`) + } else { + res.redirect(`cfoauthcb://login_result?token=${id_token || code}&state=${state}`) + } + } +} diff --git a/src/schedule/discord.schedule.ts b/src/schedule/discord.schedule.ts new file mode 100644 index 0000000..b769850 --- /dev/null +++ b/src/schedule/discord.schedule.ts @@ -0,0 +1,30 @@ +import { singleton } from 'decorators/singleton' +import * as schedule from 'node-schedule' +import { DiscordSvr } from 'services/discord.svr'; + +/** + * 定时更新discord缓存 + */ +@singleton +export default class DiscordSchedule { + private running: boolean = false; + async updateCache() { + if (this.running) { + return; + } + try { + this.running = true; + await new DiscordSvr().updateCache(); + this.running = false; + } catch (error) { + this.running = false; + console.log(error); + } + } + + scheduleAll() { + schedule.scheduleJob('*/5 * * * * *', async () => { + await this.updateCache() + }) + } +} diff --git a/src/services/discord.svr.ts b/src/services/discord.svr.ts index 045bbdd..b5e2260 100644 --- a/src/services/discord.svr.ts +++ b/src/services/discord.svr.ts @@ -1,6 +1,7 @@ import { ZError } from 'common/ZError' import { singleton } from 'decorators/singleton' -const { Client, Events, GatewayIntentBits } = require('discord.js') + +import { Client, Events, GatewayIntentBits, Guild } from 'discord.js' export async function exchangeDiscrodCodeForToken(code: string) { const clientId = process.env.DISCORD_CLIENT_ID @@ -40,8 +41,8 @@ export async function userInfo(token: string) { @singleton export class DiscordSvr { - private client: any - private guild: any + private client: Client + private guild: Guild public async init() { console.log('DiscordSvr init') this.client = new Client({ intents: [GatewayIntentBits.Guilds] }) @@ -52,11 +53,28 @@ export class DiscordSvr { this.client.login(process.env.DISCORD_BOT_TOKEN) } + public async updateCache() { + console.log('update discord cache') + if (!this.guild) { + throw new ZError(10, 'DiscordSvr not init') + } + await this.guild.members.fetch() + console.log('update discord cache done') + } + + public checkUser(uid: string) { + if (!this.guild) { + throw new ZError(10, 'DiscordSvr not init') + } + return this.guild.members.cache.has(uid) + } + public async checkUserRole(uid: string) { if (!this.guild) { throw new ZError(10, 'DiscordSvr not init') } - const member = await this.guild.members.fetch({ user: uid, force: true }) + // const member = await this.guild.members.fetch({ user: uid, force: true }) + const member = this.guild.members.cache.get(uid) if (!member) { return false } diff --git a/start.json b/start.json new file mode 100644 index 0000000..2c4d00b --- /dev/null +++ b/start.json @@ -0,0 +1,27 @@ +{ + "apps": [ + { + "name": "oauth-svr", + "script": "npm", + "args": "run prod:api", + "cwd": "/home/kingsome/code/oauth-svr", + "max_memory_restart": "1024M", + "log_date_format" : "YYYY-MM-DD HH:mm Z", + "watch": true, + "ignore_watch": [ + "node_modules", + "logs", + "fixtures", + "tasks" + ], + "instances": 1, + "exec_mode": "fork", + "env": { + "NODE_ENV": "production" + }, + "env_production": { + "NODE_ENV": "production" + } + } + ] +} diff --git a/tsconfig.json b/tsconfig.json index a004782..3bc5bd3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,14 +8,14 @@ "emitDecoratorMetadata": true, "module": "commonjs", "esModuleInterop": true, - "target": "es2018", + "target": "es2020", "moduleResolution": "node", "sourceMap": true, "outDir": "./dist", "baseUrl": "./src", "rootDir": "./src" }, - "lib": ["es2018"], + "lib": ["es2020"], "include": [ "src/**/*.ts", "typings/extend.d.ts"