diff --git a/src/plugins/CompanionChannels.ts b/src/plugins/CompanionChannels.ts new file mode 100644 index 00000000..4a07be0c --- /dev/null +++ b/src/plugins/CompanionChannels.ts @@ -0,0 +1,82 @@ +import { decorators as d, IPluginOptions, logger } from "knub"; +import { ZeppelinPlugin } from "./ZeppelinPlugin"; +import { Member, Channel, GuildChannel, PermissionOverwrite, Permission, Message } from "eris"; + +// Permissions using these numbers: https://abal.moe/Eris/docs/reference (add all allowed/denied ones up) +interface ICompanionChannel { + channelIds: string[]; + permissions: number; +} + +interface ICompanionChannelMap { + [channelId: string]: ICompanionChannel; +} + +interface ICompanionChannelPluginConfig { + channels: { + [key: string]: ICompanionChannel; + }; +} + +export class CompanionChannelPlugin extends ZeppelinPlugin { + public static pluginName = "companion_channels"; + + companionChannels: Map = new Map(); + + getDefaultOptions(): IPluginOptions { + return { + config: { + channels: {}, + }, + }; + } + + onLoad() { + const tempCompanionChannels: ICompanionChannelMap = this.getConfig().channels; + + for (const [channelId, opts] of Object.entries(tempCompanionChannels)) { + this.companionChannels.set(channelId, opts); + } + } + + onUnload() { + this.companionChannels.clear; + } + + async handleCompanionPermissions(userID: string, voiceChannelId: string, remove?: boolean) { + if (this.companionChannels.has(voiceChannelId)) { + const compChannels = this.companionChannels.get(voiceChannelId); + compChannels.channelIds.forEach(textChannelId => { + const textChannel = this.bot.getChannel(textChannelId); + + if (remove) { + textChannel.deletePermission(userID, `Companion Channel for ${voiceChannelId} | User Left`); + } else { + textChannel.editPermission( + userID, + compChannels.permissions, + 0, + "member", + `Companion Channel for ${voiceChannelId} | User Joined`, + ); + } + }); + } + } + + @d.event("voiceChannelJoin") + onVoiceChannelJoin(member: Member, voiceChannel: Channel) { + this.handleCompanionPermissions(member.id, voiceChannel.id); + } + + @d.event("voiceChannelSwitch") + onVoiceChannelSwitch(member: Member, newChannel: Channel, oldChannel: Channel) { + this.handleCompanionPermissions(member.id, oldChannel.id, true); + this.handleCompanionPermissions(member.id, newChannel.id); + } + + @d.event("voiceChannelLeave") + onVoiceChannelLeave(member: Member, voiceChannel: Channel) { + this.handleCompanionPermissions(member.id, voiceChannel.id, true); + } +} diff --git a/src/plugins/availablePlugins.ts b/src/plugins/availablePlugins.ts index 6082dc74..c18dd052 100644 --- a/src/plugins/availablePlugins.ts +++ b/src/plugins/availablePlugins.ts @@ -21,6 +21,7 @@ import { WelcomeMessagePlugin } from "./WelcomeMessage"; import { BotControlPlugin } from "./BotControl"; import { LogServerPlugin } from "./LogServer"; import { UsernameSaver } from "./UsernameSaver"; +import { CompanionChannelPlugin } from "./CompanionChannels"; /** * Plugins available to be loaded for individual guilds @@ -46,6 +47,7 @@ export const availablePlugins = [ SelfGrantableRolesPlugin, RemindersPlugin, WelcomeMessagePlugin, + CompanionChannelPlugin, ]; /**