Port CompanionChannels
This commit is contained in:
parent
95a03a0110
commit
0f69473c05
8 changed files with 160 additions and 0 deletions
|
@ -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],
|
||||||
|
});
|
|
@ -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);
|
||||||
|
},
|
||||||
|
);
|
|
@ -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);
|
||||||
|
},
|
||||||
|
);
|
|
@ -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);
|
||||||
|
},
|
||||||
|
);
|
|
@ -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));
|
||||||
|
}
|
|
@ -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`);
|
||||||
|
}
|
||||||
|
}
|
28
backend/src/plugins/CompanionChannels/types.ts
Normal file
28
backend/src/plugins/CompanionChannels/types.ts
Normal 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: {};
|
||||||
|
}
|
|
@ -27,6 +27,7 @@ import { SelfGrantableRolesPlugin } from "./SelfGrantableRoles/SelfGrantableRole
|
||||||
import { SpamPlugin } from "./Spam/SpamPlugin";
|
import { SpamPlugin } from "./Spam/SpamPlugin";
|
||||||
import { ReactionRolesPlugin } from "./ReactionRoles/ReactionRolesPlugin";
|
import { ReactionRolesPlugin } from "./ReactionRoles/ReactionRolesPlugin";
|
||||||
import { AutomodPlugin } from "./Automod/AutomodPlugin";
|
import { AutomodPlugin } from "./Automod/AutomodPlugin";
|
||||||
|
import { CompanionChannelsPlugin } from "./CompanionChannels/CompanionChannelsPlugin";
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
export const guildPlugins: Array<ZeppelinPluginBlueprint<any>> = [
|
export const guildPlugins: Array<ZeppelinPluginBlueprint<any>> = [
|
||||||
|
@ -57,6 +58,7 @@ export const guildPlugins: Array<ZeppelinPluginBlueprint<any>> = [
|
||||||
CasesPlugin,
|
CasesPlugin,
|
||||||
MutesPlugin,
|
MutesPlugin,
|
||||||
AutomodPlugin,
|
AutomodPlugin,
|
||||||
|
CompanionChannelsPlugin,
|
||||||
];
|
];
|
||||||
|
|
||||||
// prettier-ignore
|
// prettier-ignore
|
||||||
|
|
Loading…
Add table
Reference in a new issue