ghorsington пре 4 година
родитељ
комит
c210a14abb
4 измењених фајлова са 75 додато и 3 уклоњено
  1. 52 2
      bot/src/main.ts
  2. 4 0
      bot/src/util.ts
  3. 3 1
      shared/src/db/entities.ts
  4. 16 0
      shared/src/db/entity/GuildGreeting.ts

+ 52 - 2
bot/src/main.ts

@@ -7,10 +7,12 @@ import * as path from "path";
 import { client } from "./client";
 import * as mCmd from "./model/command";
 import "reflect-metadata";
-import { createConnection, getConnectionOptions } from "typeorm";
-import { getNumberEnums } from "./util";
+import { createConnection, getConnectionOptions, getRepository } from "typeorm";
+import { getNumberEnums, formatString } from "./util";
 import { DB_ENTITIES } from "@shared/db/entities";
 import { logger } from "./logging";
+import { GuildGreeting } from "@shared/db/entity/GuildGreeting";
+import { TextChannel, GuildMember, PartialGuildMember } from "discord.js";
 
 const REACT_PROBABILITY = 0.3;
 
@@ -108,6 +110,54 @@ client.bot.on("messageReactionAdd", (r, u) => {
     }
 });
 
+
+async function getGreeting(member: GuildMember | PartialGuildMember) {
+    const repo = getRepository(GuildGreeting);
+
+    const guildGreeting = await repo.findOne(member.guild.id);
+    if (!guildGreeting) {
+        logger.debug("Tried to greet user %s in guild %s but no greeting is defined!", member.id, member.guild.id);
+        return undefined;
+    }
+
+    const greetingChannel = client.bot.channels.resolve(guildGreeting.greetingChannelId);
+    if (!greetingChannel) {
+        logger.warning("No channel %s in guild %s, can't greet!", guildGreeting.greetingChannelId, guildGreeting.guildId);
+        return undefined;
+    }
+
+    if (!(greetingChannel instanceof TextChannel)) {
+        logger.warning("Channel %s is of not a text channel (got type: %s)", greetingChannel.id, greetingChannel.type);
+        return undefined;
+    }
+
+    return {guildGreeting, greetingChannel};
+}
+
+client.bot.on("guildMemberAdd", async member => {
+    const result = await getGreeting(member);
+    if(!result)
+        return;
+    const {guildGreeting, greetingChannel} = result;
+    
+    greetingChannel.send(formatString(guildGreeting.onJoinMessage, {
+        memberID: member.id,
+        memberTag: member.user?.tag ?? member.displayName
+    }));
+});
+
+client.bot.on("guildMemberRemove", async member => {
+    const result = await getGreeting(member);
+    if(!result)
+        return;
+    const {guildGreeting, greetingChannel} = result;
+    
+    greetingChannel.send(formatString(guildGreeting.onLeaveMessage, {
+        memberID: member.id,
+        memberTag: member.user?.tag ?? member.displayName
+    }));
+});
+
 function loadCommand(mod: Record<string, unknown>) {
     for (const i in mod) {
         if (!Object.prototype.hasOwnProperty.call(mod, i))

+ 4 - 0
bot/src/util.ts

@@ -71,4 +71,8 @@ export type Dict<TVal> = { [key: string]: TVal };
 
 export function getNumberEnums<E>(e : Record<keyof E, number>) : number[] {
     return Object.keys(e).filter(k => typeof e[k as keyof E] === "number").map(k => e[k as keyof E]);
+}
+
+export function formatString(str: string, vars: Record<string, string>): string {
+    return Object.keys(vars).filter(s => Object.prototype.hasOwnProperty.call(vars, s)).reduce((s, cur) => s.replace(`{${cur}}`, vars[cur]), str);
 }

+ 3 - 1
shared/src/db/entities.ts

@@ -14,6 +14,7 @@ import { ContestEntry } from "./entity/ContestEntry";
 import { ContestVote } from "./entity/ContestVote";
 import { FileOnlyChannel } from "./entity/FileOnlyChannel";
 import { RandomMessageReaction } from "./entity/RandomMesssageReaction";
+import { GuildGreeting } from "./entity/GuildGreeting";
 
 export const DB_ENTITIES = [
     AggroNewsItem,
@@ -34,5 +35,6 @@ export const DB_ENTITIES = [
     ContestEntry,
     ContestVote,
     FileOnlyChannel,
-    RandomMessageReaction
+    RandomMessageReaction,
+    GuildGreeting
 ];

+ 16 - 0
shared/src/db/entity/GuildGreeting.ts

@@ -0,0 +1,16 @@
+import { Entity, PrimaryColumn, Column } from "typeorm";
+
+@Entity()
+export class GuildGreeting {
+    @PrimaryColumn()
+    guildId: string;
+
+    @Column()
+    greetingChannelId: string;
+
+    @Column()
+    onJoinMessage: string;
+
+    @Column()
+    onLeaveMessage: string;
+}