You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Hydro/packages/login-with-qq/service.ts

45 lines
1.5 KiB
TypeScript

4 years ago
import { } from 'hydrooj';
import * as bus from 'hydrooj/src/service/bus';
4 years ago
import WebSocket from 'ws';
declare module 'hydrooj' {
interface SystemKeys {
'login-with-qq.id': string,
'login-with-qq.url': string,
'login-with-qq.token': string,
}
}
4 years ago
export async function postInit() {
const { system, token } = global.Hydro.model;
const [url, accessToken] = system.getMany(['login-with-qq.url', 'login-with-qq.token']);
4 years ago
if (!url) return;
const headers: Record<string, string> = {};
if (accessToken) headers.Authorization = `Bearer ${accessToken}`;
const socket = new WebSocket(url, { headers });
socket.on('error', console.error);
3 years ago
socket.on('message', async (message, isBinary) => {
const payload = JSON.parse(isBinary ? message : message.toString());
4 years ago
if (payload.post_type !== 'message') return;
if (payload.message.startsWith('login ')) {
const secret = payload.message.split(' ')[1];
await token.coll.updateOne(
{ secret, tokenType: token.TYPE_OAUTH },
{
$set: {
email: `${payload.sender.user_id}@qq.com`,
username: payload.sender.nickname,
},
},
);
}
});
await new Promise((resolve) => {
socket.once('open', () => {
4 years ago
resolve(null);
4 years ago
});
});
}
bus.once('app/started', postInit);