3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-03-15 05:41:51 +00:00

Port CompanionChannels

This commit is contained in:
Dragory 2020-07-29 00:28:04 +03:00
parent 95a03a0110
commit 0f69473c05
No known key found for this signature in database
GPG key ID: 5F387BA66DF8AAC1
8 changed files with 160 additions and 0 deletions

View file

@ -0,0 +1,18 @@
import { zeppelinPlugin } from "../ZeppelinPluginBlueprint";
import { CompanionChannelsPluginType, ConfigSchema, TCompanionChannelOpts } from "./types";
import { VoiceChannelJoinEvt } from "./events/VoiceChannelJoinEvt";
import { VoiceChannelSwitchEvt } from "./events/VoiceChannelSwitchEvt";
import { VoiceChannelLeaveEvt } from "./events/VoiceChannelLeaveEvt";
const defaultOptions = {
config: {
entries: {},
},
};
export const CompanionChannelsPlugin = zeppelinPlugin<CompanionChannelsPluginType>()("companion_channels", {
configSchema: ConfigSchema,
defaultOptions,
events: [VoiceChannelJoinEvt, VoiceChannelSwitchEvt, VoiceChannelLeaveEvt],
});

View file

@ -0,0 +1,10 @@
import { eventListener } from "knub";
import { CompanionChannelsPluginType } from "../types";
import { handleCompanionPermissions } from "../functions/handleCompanionPermissions";
export const VoiceChannelJoinEvt = eventListener<CompanionChannelsPluginType>()(
"voiceChannelJoin",
({ pluginData, args: { member, newChannel } }) => {
handleCompanionPermissions(pluginData, member.id, newChannel.id);
},
);

View file

@ -0,0 +1,10 @@
import { eventListener } from "knub";
import { CompanionChannelsPluginType } from "../types";
import { handleCompanionPermissions } from "../functions/handleCompanionPermissions";
export const VoiceChannelLeaveEvt = eventListener<CompanionChannelsPluginType>()(
"voiceChannelLeave",
({ pluginData, args: { member, oldChannel } }) => {
handleCompanionPermissions(pluginData, member.id, null, oldChannel.id);
},
);

View file

@ -0,0 +1,10 @@
import { eventListener } from "knub";
import { CompanionChannelsPluginType } from "../types";
import { handleCompanionPermissions } from "../functions/handleCompanionPermissions";
export const VoiceChannelSwitchEvt = eventListener<CompanionChannelsPluginType>()(
"voiceChannelSwitch",
({ pluginData, args: { member, oldChannel, newChannel } }) => {
handleCompanionPermissions(pluginData, member.id, newChannel.id, oldChannel.id);
},
);

View file

@ -0,0 +1,17 @@
import { PluginData } from "knub";
import { CompanionChannelsPluginType, TCompanionChannelOpts } from "../types";
const defaultCompanionChannelOpts: Partial<TCompanionChannelOpts> = {
enabled: true,
};
export function getCompanionChannelOptsForVoiceChannelId(
pluginData: PluginData<CompanionChannelsPluginType>,
userId: string,
voiceChannelId: string,
): TCompanionChannelOpts[] {
const config = pluginData.config.getMatchingConfig({ userId, channelId: voiceChannelId });
return Object.values(config.entries)
.filter(opts => opts.voice_channel_ids.includes(voiceChannelId))
.map(opts => Object.assign({}, defaultCompanionChannelOpts, opts));
}

View file

@ -0,0 +1,65 @@
import { CompanionChannelsPluginType, TCompanionChannelOpts } from "../types";
import { getCompanionChannelOptsForVoiceChannelId } from "./getCompanionChannelOptsForVoiceChannelId";
import { PluginData } from "knub";
import { TextChannel } from "eris";
export function handleCompanionPermissions(
pluginData: PluginData<CompanionChannelsPluginType>,
userId: string,
voiceChannelId: string,
oldChannelId?: string,
);
export function handleCompanionPermissions(
pluginData: PluginData<CompanionChannelsPluginType>,
userId: string,
voiceChannelId: null,
oldChannelId: string,
);
export function handleCompanionPermissions(
pluginData: PluginData<CompanionChannelsPluginType>,
userId: string,
voiceChannelId?: string,
oldChannelId?: string,
) {
const permsToDelete: Set<string> = new Set(); // channelId[]
const oldPerms: Map<string, number> = new Map(); // channelId => permissions
const permsToSet: Map<string, number> = new Map(); // channelId => permissions
const oldChannelOptsArr: TCompanionChannelOpts[] = oldChannelId
? getCompanionChannelOptsForVoiceChannelId(pluginData, userId, oldChannelId)
: [];
const newChannelOptsArr: TCompanionChannelOpts[] = voiceChannelId
? getCompanionChannelOptsForVoiceChannelId(pluginData, userId, voiceChannelId)
: [];
for (const oldChannelOpts of oldChannelOptsArr) {
for (const channelId of oldChannelOpts.text_channel_ids) {
oldPerms.set(channelId, oldChannelOpts.permissions);
permsToDelete.add(channelId);
}
}
for (const newChannelOpts of newChannelOptsArr) {
for (const channelId of newChannelOpts.text_channel_ids) {
if (oldPerms.get(channelId) !== newChannelOpts.permissions) {
// Update text channel perms if the channel we transitioned from didn't already have the same text channel perms
permsToSet.set(channelId, newChannelOpts.permissions);
}
if (permsToDelete.has(channelId)) {
permsToDelete.delete(channelId);
}
}
}
for (const channelId of permsToDelete) {
const channel = pluginData.guild.channels.get(channelId);
if (!channel || !(channel instanceof TextChannel)) continue;
channel.deletePermission(userId, `Companion Channel for ${oldChannelId} | User Left`);
}
for (const [channelId, permissions] of permsToSet) {
const channel = pluginData.guild.channels.get(channelId);
if (!channel || !(channel instanceof TextChannel)) continue;
channel.editPermission(userId, permissions, 0, "member", `Companion Channel for ${voiceChannelId} | User Joined`);
}
}

View file

@ -0,0 +1,28 @@
import * as t from "io-ts";
import { tNullable } from "../../utils";
import { BasePluginType } from "knub";
import { GuildLogs } from "../../data/GuildLogs";
import { GuildSavedMessages } from "../../data/GuildSavedMessages";
// Permissions using these numbers: https://abal.moe/Eris/docs/reference (add all allowed/denied ones up)
export const CompanionChannelOpts = t.type({
voice_channel_ids: t.array(t.string),
text_channel_ids: t.array(t.string),
permissions: t.number,
enabled: tNullable(t.boolean),
});
export type TCompanionChannelOpts = t.TypeOf<typeof CompanionChannelOpts>;
export const ConfigSchema = t.type({
entries: t.record(t.string, CompanionChannelOpts),
});
export type TConfigSchema = t.TypeOf<typeof ConfigSchema>;
export interface ICompanionChannelMap {
[channelId: string]: TCompanionChannelOpts;
}
export interface CompanionChannelsPluginType extends BasePluginType {
config: TConfigSchema;
state: {};
}

View file

@ -27,6 +27,7 @@ import { SelfGrantableRolesPlugin } from "./SelfGrantableRoles/SelfGrantableRole
import { SpamPlugin } from "./Spam/SpamPlugin";
import { ReactionRolesPlugin } from "./ReactionRoles/ReactionRolesPlugin";
import { AutomodPlugin } from "./Automod/AutomodPlugin";
import { CompanionChannelsPlugin } from "./CompanionChannels/CompanionChannelsPlugin";
// prettier-ignore
export const guildPlugins: Array<ZeppelinPluginBlueprint<any>> = [
@ -57,6 +58,7 @@ export const guildPlugins: Array<ZeppelinPluginBlueprint<any>> = [
CasesPlugin,
MutesPlugin,
AutomodPlugin,
CompanionChannelsPlugin,
];
// prettier-ignore