Browse Source

Move greet and random react to plugins

ghorsington 4 years ago
parent
commit
f31e67f635
3 changed files with 69 additions and 70 deletions
  1. 2 68
      bot/src/main.ts
  2. 56 0
      bot/src/plugins/greet.ts
  3. 11 2
      bot/src/plugins/react.ts

+ 2 - 68
bot/src/main.ts

@@ -4,18 +4,14 @@ require("module-alias/register");
 import "./environment";
 import * as path from "path";
 import { client } from "./client";
-import { createConnection, getConnectionOptions, getRepository } from "typeorm";
-import { formatString, assertOk } from "./util";
+import { createConnection, getConnectionOptions } from "typeorm";
+import { assertOk } 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";
 import { PluginManager } from "./plugin_manager";
 
 export const plgMgr: PluginManager = new PluginManager(path.resolve(path.dirname(module.filename), "plugins"));
 
-const REACT_PROBABILITY = 0.3;
-
 client.bot.on("ready", async () => {
     logger.info("Starting up NoctBot");
     await client.botUser.setActivity(`@${client.botUser.username} help`, { type: "PLAYING" });
@@ -33,12 +29,6 @@ client.bot.on("message", async m => {
         return;
     }
 
-    if (process.env.FOOLS == "TRUE" && (m.channel.id == "297109482905796608" || m.channel.id == "429295461099110402") && Math.random() <= 0.01) {
-        const neighs = ["*NEIGH*", "neeeeeigh!", "Gimme carrots!", "NEEEEIIIIGH", "**N E I G H**"];
-        await m.channel.send(neighs[Math.floor(Math.random() * neighs.length)]);
-        return;
-    }
-
     let content = m.cleanContent.trim();
 
     if (await plgMgr.trigger("message", m, content))
@@ -64,62 +54,6 @@ client.bot.on("message", async m => {
     await plgMgr.trigger("postMessage", m);
 });
 
-client.bot.on("messageReactionAdd", (r, u) => {
-    if (Math.random() <= REACT_PROBABILITY && !u.bot) {
-        logger.verbose(`Reacting to message ${r.message.id} because user ${u.tag} reacted to it`);
-        r.message.react(r.emoji);
-    }
-});
-
-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;
-
-    await greetingChannel.send(formatString(guildGreeting.onJoinMessage, {
-        memberID: member.id,
-        memberTag: member.user?.tag ?? member.displayName,
-        guildName: member.guild.name
-    }));
-});
-
-client.bot.on("guildMemberRemove", async member => {
-    const result = await getGreeting(member);
-    if (!result)
-        return;
-    const { guildGreeting, greetingChannel } = result;
-
-    await greetingChannel.send(formatString(guildGreeting.onLeaveMessage, {
-        memberID: member.id,
-        memberTag: member.user?.tag ?? member.displayName,
-        guildName: member.guild.name
-    }));
-});
-
 async function main() {
     await createConnection({
         ...await getConnectionOptions(),

+ 56 - 0
bot/src/plugins/greet.ts

@@ -0,0 +1,56 @@
+import { Plugin, BotEventData, Event } from "src/model/plugin";
+import { GuildMember, PartialGuildMember, TextChannel } from "discord.js";
+import { getRepository } from "typeorm";
+import { logger } from "src/logging";
+import { GuildGreeting } from "@shared/db/entity/GuildGreeting";
+import { client } from "src/client";
+import { formatString } from "src/util";
+
+@Plugin
+export class GreetPlugin {
+    @Event("guildMemberAdd")
+    async showGreetMessage(data: BotEventData, member: GuildMember | PartialGuildMember): Promise<void> {
+        await this.displayGreet(member, g => g.onJoinMessage);
+    }
+
+    @Event("guildMemberRemove")
+    async showGoodbyeMessage(data: BotEventData, member: GuildMember | PartialGuildMember): Promise<void> {
+        await this.displayGreet(member, g => g.onLeaveMessage);
+    }
+
+    private async displayGreet(member: GuildMember | PartialGuildMember, select: (greeting: GuildGreeting) => string) {
+        const result = await this.getGreeting(member);
+        if (!result)
+            return;
+        const { guildGreeting, greetingChannel } = result;
+
+        await greetingChannel.send(formatString(select(guildGreeting), {
+            memberID: member.id,
+            memberTag: member.user?.tag ?? member.displayName,
+            guildName: member.guild.name
+        }));
+    }
+    
+    private async 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 };
+    }
+}

+ 11 - 2
bot/src/plugins/react.ts

@@ -1,9 +1,8 @@
 import { client } from "../client";
 import { getRepository } from "typeorm";
-import { MessageReaction } from "@shared/db/entity/MessageReaction";
 import { KnownUser } from "@shared/db/entity/KnownUser";
 import { ReactionType, ReactionEmote } from "@shared/db/entity/ReactionEmote";
-import { Message } from "discord.js";
+import { Message, User, PartialUser, MessageReaction } from "discord.js";
 import { logger } from "src/logging";
 import { Command, ICommandData, Event, BotEventData, Plugin } from "src/model/plugin";
 
@@ -25,9 +24,19 @@ async function getRandomEmotes(allowedTypes: ReactionType[], limit: number) {
     return a;
 }
 
+const REACT_PROBABILITY = 0.3;
+
 @Plugin
 export class ReactCommands {
 
+    @Event("messageReactionAdd")
+    async randomReact(data: BotEventData, reaction: MessageReaction, user: User | PartialUser): Promise<void> {
+        if (Math.random() <= REACT_PROBABILITY && !user.bot) {
+            logger.verbose(`Reacting to message ${reaction.message.id} because user ${user.tag} reacted to it`);
+            reaction.message.react(reaction.emoji);
+        }
+    }
+
     @Command({
         pattern: "react to",
         auth: true,