mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-07-13 21:57:18 +00:00
Allow users to be DM'd when they use reaction roles
This commit is contained in:
parent
7f75d6d8d3
commit
54bea9ef14
3 changed files with 32 additions and 0 deletions
|
@ -17,6 +17,8 @@ const defaultOptions: PluginOptions<ReactionRolesPluginType> = {
|
||||||
config: {
|
config: {
|
||||||
auto_refresh_interval: MIN_AUTO_REFRESH,
|
auto_refresh_interval: MIN_AUTO_REFRESH,
|
||||||
remove_user_reactions: true,
|
remove_user_reactions: true,
|
||||||
|
dm_on_change: true,
|
||||||
|
change_message: "Your roles have been modified on {guildName}:\nRemoved: {removedRoles}\nAdded: {addedRoles}",
|
||||||
|
|
||||||
can_manage: false,
|
can_manage: false,
|
||||||
},
|
},
|
||||||
|
|
|
@ -8,6 +8,8 @@ export const ConfigSchema = t.type({
|
||||||
auto_refresh_interval: t.number,
|
auto_refresh_interval: t.number,
|
||||||
remove_user_reactions: t.boolean,
|
remove_user_reactions: t.boolean,
|
||||||
can_manage: t.boolean,
|
can_manage: t.boolean,
|
||||||
|
dm_on_change: t.boolean,
|
||||||
|
change_message: t.string,
|
||||||
});
|
});
|
||||||
export type TConfigSchema = t.TypeOf<typeof ConfigSchema>;
|
export type TConfigSchema = t.TypeOf<typeof ConfigSchema>;
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { GuildPluginData } from "knub";
|
||||||
import { ReactionRolesPluginType, RoleChangeMode, PendingMemberRoleChanges } from "../types";
|
import { ReactionRolesPluginType, RoleChangeMode, PendingMemberRoleChanges } from "../types";
|
||||||
import { resolveMember } from "../../../utils";
|
import { resolveMember } from "../../../utils";
|
||||||
import { logger } from "../../../logger";
|
import { logger } from "../../../logger";
|
||||||
|
import { renderTemplate } from "../../../templateFormatter";
|
||||||
|
|
||||||
const ROLE_CHANGE_BATCH_DEBOUNCE_TIME = 1500;
|
const ROLE_CHANGE_BATCH_DEBOUNCE_TIME = 1500;
|
||||||
|
|
||||||
|
@ -22,6 +23,7 @@ export async function addMemberPendingRoleChange(
|
||||||
|
|
||||||
const member = await resolveMember(pluginData.client, pluginData.guild, memberId);
|
const member = await resolveMember(pluginData.client, pluginData.guild, memberId);
|
||||||
if (member) {
|
if (member) {
|
||||||
|
const oldRoles = member.roles;
|
||||||
const newRoleIds = new Set(member.roles);
|
const newRoleIds = new Set(member.roles);
|
||||||
for (const change of newPendingRoleChangeObj.changes) {
|
for (const change of newPendingRoleChangeObj.changes) {
|
||||||
if (change.mode === "+") newRoleIds.add(change.roleId);
|
if (change.mode === "+") newRoleIds.add(change.roleId);
|
||||||
|
@ -40,6 +42,32 @@ export async function addMemberPendingRoleChange(
|
||||||
`Failed to apply role changes to ${member.username}#${member.discriminator} (${member.id}): ${e.message}`,
|
`Failed to apply role changes to ${member.username}#${member.discriminator} (${member.id}): ${e.message}`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const cfg = pluginData.config.getForMember(member);
|
||||||
|
if (cfg.dm_on_change) {
|
||||||
|
const addedRoles: string[] = [];
|
||||||
|
const removedRoles: string[] = [];
|
||||||
|
for (const change of newPendingRoleChangeObj.changes) {
|
||||||
|
const roleName = pluginData.guild.roles.get(change.roleId)?.name ?? "";
|
||||||
|
if (change.mode === "+" && !oldRoles.includes(change.roleId)) addedRoles.push(roleName);
|
||||||
|
else if (change.mode === "-" && oldRoles.includes(change.roleId)) removedRoles.push(roleName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addedRoles.length === 0 && removedRoles.length === 0) return; // Reaction that caused no change
|
||||||
|
|
||||||
|
const dmMessage = await renderTemplate(cfg.change_message, {
|
||||||
|
guildName: pluginData.guild.name,
|
||||||
|
addedRoles: addedRoles.length >= 1 ? addedRoles.join(", ") : "None",
|
||||||
|
removedRoles: removedRoles.length >= 1 ? removedRoles.join(", ") : "None",
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const dms = await member.user.getDMChannel();
|
||||||
|
await dms.createMessage(dmMessage);
|
||||||
|
} catch (e) {
|
||||||
|
// We are probably blocked or privacy is too high, ignore silently
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
},
|
},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue