rpc.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import express from "express";
  2. import { createServer } from "http";
  3. import { ModuleRpcServer } from "rpc_ts/lib/server";
  4. import { ModuleRpcProtocolServer } from "rpc_ts/lib/protocol/server";
  5. import { NoctBotService } from "@shared/rpc/backend";
  6. import { logger } from "./logging";
  7. import { client } from "./client";
  8. import { tryDo } from "@shared/common/async_utils";
  9. import { getRepository } from "typeorm";
  10. import { GuildVerification } from "@shared/db/entity/GuildVerification";
  11. import { isAuthorisedAsync } from "./util";
  12. import { GuildMember } from "discord.js";
  13. const PORT = +(process.env.RPC_PORT ?? "8181");
  14. const app = express();
  15. async function checkUser(userId: string, check: (user: GuildMember) => Promise<boolean>): Promise<boolean> {
  16. const verificationGuildRepo = getRepository(GuildVerification);
  17. const guilds = await verificationGuildRepo.find({
  18. select: [
  19. "guildId"
  20. ]
  21. });
  22. for (const guild of guilds) {
  23. const guildInstance = await tryDo(client.bot.guilds.fetch(guild.guildId));
  24. if (!guildInstance.ok) {
  25. logger.error("Failed to fetch guild instance for guild %s: %s", guild.guildId, guildInstance.error);
  26. continue;
  27. }
  28. const user = await tryDo(guildInstance.result.members.fetch(userId));
  29. if (user.ok && await check(user.result)) {
  30. return true;
  31. }
  32. }
  33. return false;
  34. }
  35. const handler: ModuleRpcServer.ServiceHandlerFor<typeof NoctBotService> = {
  36. async getPing({ ping }): Promise<{ text: string }> {
  37. return { text: `pong: ${ping}` };
  38. },
  39. async userInServer({ userId }): Promise<{ exists: boolean }> {
  40. return { exists: await checkUser(userId, async () => true) };
  41. },
  42. async userAuthorised({ userId }): Promise<{ authorised: boolean }> {
  43. return { authorised: await checkUser(userId, (user) => isAuthorisedAsync(user)) };
  44. },
  45. };
  46. app.use(ModuleRpcProtocolServer.registerRpcRoutes(NoctBotService, handler));
  47. export function startRpcServer(): void {
  48. logger.info(`Starting RPC at *:${PORT}`);
  49. createServer(app).listen(PORT);
  50. }