diff --git a/backend/src/plugins/UsernameSaver/UsernameSaverPlugin.ts b/backend/src/plugins/UsernameSaver/UsernameSaverPlugin.ts new file mode 100644 index 00000000..592258ea --- /dev/null +++ b/backend/src/plugins/UsernameSaver/UsernameSaverPlugin.ts @@ -0,0 +1,21 @@ +import { zeppelinPlugin } from "../ZeppelinPluginBlueprint"; +import { UsernameHistory } from "src/data/UsernameHistory"; +import { Queue } from "src/Queue"; +import { UsernameSaverPluginType } from "./types"; +import { MessageCreateEvt } from "./events/MessageCreateEvt"; +import { VoiceChannelJoinEvt } from "./events/VoiceChannelJoinEvt"; + +export const UsernameSaverPlugin = zeppelinPlugin()("username_saver", { + // prettier-ignore + events: [ + MessageCreateEvt, + VoiceChannelJoinEvt, + ], + + onLoad(pluginData) { + const { state, guild } = pluginData; + + state.usernameHistory = new UsernameHistory(); + state.updateQueue = new Queue(); + }, +}); diff --git a/backend/src/plugins/UsernameSaver/events/MessageCreateEvt.ts b/backend/src/plugins/UsernameSaver/events/MessageCreateEvt.ts new file mode 100644 index 00000000..14c6aded --- /dev/null +++ b/backend/src/plugins/UsernameSaver/events/MessageCreateEvt.ts @@ -0,0 +1,11 @@ +import { usernameEvent } from "../types"; +import { updateUsername } from "../updateUsername"; + +export const MessageCreateEvt = usernameEvent({ + event: "messageCreate", + + async listener(meta) { + if (meta.args.message.author.bot) return; + meta.pluginData.state.updateQueue.add(() => updateUsername(meta.pluginData, meta.args.message.author)); + }, +}); diff --git a/backend/src/plugins/UsernameSaver/events/VoiceChannelJoinEvt.ts b/backend/src/plugins/UsernameSaver/events/VoiceChannelJoinEvt.ts new file mode 100644 index 00000000..e26ea435 --- /dev/null +++ b/backend/src/plugins/UsernameSaver/events/VoiceChannelJoinEvt.ts @@ -0,0 +1,11 @@ +import { usernameEvent } from "../types"; +import { updateUsername } from "../updateUsername"; + +export const VoiceChannelJoinEvt = usernameEvent({ + event: "voiceChannelJoin", + + async listener(meta) { + if (meta.args.member.bot) return; + meta.pluginData.state.updateQueue.add(() => updateUsername(meta.pluginData, meta.args.member.user)); + }, +}); diff --git a/backend/src/plugins/UsernameSaver/types.ts b/backend/src/plugins/UsernameSaver/types.ts new file mode 100644 index 00000000..eeb078e7 --- /dev/null +++ b/backend/src/plugins/UsernameSaver/types.ts @@ -0,0 +1,12 @@ +import { BasePluginType, eventListener } from "knub"; +import { UsernameHistory } from "src/data/UsernameHistory"; +import { Queue } from "src/Queue"; + +export interface UsernameSaverPluginType extends BasePluginType { + state: { + usernameHistory: UsernameHistory; + updateQueue: Queue; + }; +} + +export const usernameEvent = eventListener(); diff --git a/backend/src/plugins/UsernameSaver/updateUsername.ts b/backend/src/plugins/UsernameSaver/updateUsername.ts new file mode 100644 index 00000000..6b5129a9 --- /dev/null +++ b/backend/src/plugins/UsernameSaver/updateUsername.ts @@ -0,0 +1,12 @@ +import { User } from "eris"; +import { PluginData } from "knub"; +import { UsernameSaverPluginType } from "./types"; + +export async function updateUsername(pluginData: PluginData, user: User) { + if (!user) return; + const newUsername = `${user.username}#${user.discriminator}`; + const latestEntry = await pluginData.state.usernameHistory.getLastEntry(user.id); + if (!latestEntry || newUsername !== latestEntry.username) { + await pluginData.state.usernameHistory.addEntry(user.id, newUsername); + } +} diff --git a/backend/src/plugins/availablePlugins.ts b/backend/src/plugins/availablePlugins.ts index 099c7bcf..e868a15f 100644 --- a/backend/src/plugins/availablePlugins.ts +++ b/backend/src/plugins/availablePlugins.ts @@ -1,11 +1,13 @@ import { UtilityPlugin } from "./Utility/UtilityPlugin"; import { LocateUserPlugin } from "./LocateUser/LocateUserPlugin"; import { ZeppelinPluginBlueprint } from "./ZeppelinPluginBlueprint"; +import { UsernameSaverPlugin } from "./UsernameSaver/UsernameSaverPlugin"; import { WelcomeMessagePlugin } from "./WelcomeMessage/WelcomeMessagePlugin"; // prettier-ignore export const guildPlugins: Array> = [ LocateUserPlugin, + UsernameSaverPlugin, UtilityPlugin, WelcomeMessagePlugin, ];