greet.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { Plugin, BotEventData, Event } from "src/model/plugin";
  2. import { GuildMember, PartialGuildMember, TextChannel } from "discord.js";
  3. import { getRepository } from "typeorm";
  4. import { logger } from "src/logging";
  5. import { GuildGreeting } from "@shared/db/entity/GuildGreeting";
  6. import { client } from "src/client";
  7. import { formatString } from "src/util";
  8. @Plugin
  9. export class GreetPlugin {
  10. @Event("guildMemberAdd")
  11. async showGreetMessage(data: BotEventData, member: GuildMember | PartialGuildMember): Promise<void> {
  12. await this.displayGreet(member, g => g.onJoinMessage);
  13. }
  14. @Event("guildMemberRemove")
  15. async showGoodbyeMessage(data: BotEventData, member: GuildMember | PartialGuildMember): Promise<void> {
  16. await this.displayGreet(member, g => g.onLeaveMessage);
  17. }
  18. private async displayGreet(member: GuildMember | PartialGuildMember, select: (greeting: GuildGreeting) => string) {
  19. const result = await this.getGreeting(member);
  20. if (!result)
  21. return;
  22. const { guildGreeting, greetingChannel } = result;
  23. await greetingChannel.send(formatString(select(guildGreeting), {
  24. memberID: member.id,
  25. memberTag: member.user?.tag ?? member.displayName,
  26. guildName: member.guild.name
  27. }));
  28. }
  29. private async getGreeting(member: GuildMember | PartialGuildMember) {
  30. const repo = getRepository(GuildGreeting);
  31. const guildGreeting = await repo.findOne(member.guild.id);
  32. if (!guildGreeting) {
  33. logger.debug("Tried to greet user %s in guild %s but no greeting is defined!", member.id, member.guild.id);
  34. return undefined;
  35. }
  36. const greetingChannel = client.bot.channels.resolve(guildGreeting.greetingChannelId);
  37. if (!greetingChannel) {
  38. logger.warn("No channel %s in guild %s, can't greet!", guildGreeting.greetingChannelId, guildGreeting.guildId);
  39. return undefined;
  40. }
  41. if (!(greetingChannel instanceof TextChannel)) {
  42. logger.warn("Channel %s is of not a text channel (got type: %s)", greetingChannel.id, greetingChannel.type);
  43. return undefined;
  44. }
  45. return { guildGreeting, greetingChannel };
  46. }
  47. }