mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-03-16 22:21:51 +00:00
automod.reply: allow embeds, add auto_delete option
This commit is contained in:
parent
1cff4fb801
commit
53a9c58dd4
4 changed files with 55 additions and 30 deletions
|
@ -13,6 +13,7 @@ import {
|
||||||
messageSummary,
|
messageSummary,
|
||||||
MINUTES,
|
MINUTES,
|
||||||
noop,
|
noop,
|
||||||
|
renderRecursively,
|
||||||
SECONDS,
|
SECONDS,
|
||||||
stripObjectToScalars,
|
stripObjectToScalars,
|
||||||
tDeepPartial,
|
tDeepPartial,
|
||||||
|
@ -1297,12 +1298,24 @@ export class AutomodPlugin extends ZeppelinPlugin<TConfigSchema, ICustomOverride
|
||||||
const channel = this.guild.channels.get(channelId);
|
const channel = this.guild.channels.get(channelId);
|
||||||
if (channel && channel instanceof TextChannel) {
|
if (channel && channel instanceof TextChannel) {
|
||||||
const user = await this.resolveUser(matchResult.userId);
|
const user = await this.resolveUser(matchResult.userId);
|
||||||
const formatted = await renderTemplate(rule.actions.reply, {
|
const renderReplyText = async str =>
|
||||||
user: stripObjectToScalars(user),
|
renderTemplate(str, {
|
||||||
});
|
user: stripObjectToScalars(user),
|
||||||
|
});
|
||||||
|
const formatted =
|
||||||
|
typeof rule.actions.reply === "string"
|
||||||
|
? await renderReplyText(rule.actions.reply)
|
||||||
|
: await renderRecursively(rule.actions.reply.text, renderReplyText);
|
||||||
|
|
||||||
if (formatted) {
|
if (formatted) {
|
||||||
await channel.createMessage(formatted);
|
const replyMsg = await channel.createMessage(formatted);
|
||||||
actionsTaken.push("reply");
|
actionsTaken.push("reply");
|
||||||
|
|
||||||
|
if (typeof rule.actions.reply === "object" && rule.actions.reply.auto_delete != null) {
|
||||||
|
const delay = convertDelayStringToMS(String(rule.actions.reply.auto_delete));
|
||||||
|
setTimeout(() => replyMsg.delete().catch(noop), delay);
|
||||||
|
console.log("deleting in", delay);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import * as t from "io-ts";
|
import * as t from "io-ts";
|
||||||
import { TSafeRegex } from "../../validatorUtils";
|
import { TSafeRegex } from "../../validatorUtils";
|
||||||
import { tDelayString, tNullable } from "../../utils";
|
import { tDelayString, tMessageContent, tNullable } from "../../utils";
|
||||||
|
|
||||||
export enum RecentActionType {
|
export enum RecentActionType {
|
||||||
Message = 1,
|
Message = 1,
|
||||||
|
@ -286,7 +286,13 @@ export const RemoveRolesAction = t.array(t.string);
|
||||||
|
|
||||||
export const SetAntiraidLevelAction = t.string;
|
export const SetAntiraidLevelAction = t.string;
|
||||||
|
|
||||||
export const ReplyAction = t.string;
|
export const ReplyAction = t.union([
|
||||||
|
t.string,
|
||||||
|
t.type({
|
||||||
|
text: tMessageContent,
|
||||||
|
auto_delete: tNullable(t.union([t.string, t.number])),
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RULES
|
* RULES
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { Member, Message, TextChannel } from "eris";
|
||||||
import {
|
import {
|
||||||
convertDelayStringToMS,
|
convertDelayStringToMS,
|
||||||
errorMessage,
|
errorMessage,
|
||||||
|
renderRecursively,
|
||||||
StrictMessageContent,
|
StrictMessageContent,
|
||||||
stripObjectToScalars,
|
stripObjectToScalars,
|
||||||
tEmbed,
|
tEmbed,
|
||||||
|
@ -353,29 +354,6 @@ export class TagsPlugin extends ZeppelinPlugin<TConfigSchema> {
|
||||||
const variableStr = str.slice(prefix.length + tagName.length).trim();
|
const variableStr = str.slice(prefix.length + tagName.length).trim();
|
||||||
const tagArgs = parseArguments(variableStr).map(v => v.value);
|
const tagArgs = parseArguments(variableStr).map(v => v.value);
|
||||||
|
|
||||||
// Renders strings in objects and arrays recursively, effectively supporting embeds for tags
|
|
||||||
const renderTagValue = async value => {
|
|
||||||
if (Array.isArray(value)) {
|
|
||||||
const result = [];
|
|
||||||
for (const item of value) {
|
|
||||||
result.push(await renderTagValue(item));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
} else if (value == null) {
|
|
||||||
return null;
|
|
||||||
} else if (typeof value === "object") {
|
|
||||||
const result = {};
|
|
||||||
for (const [prop, _value] of Object.entries(value)) {
|
|
||||||
result[prop] = await renderTagValue(_value);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
} else if (typeof value === "string") {
|
|
||||||
return renderTagString(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return value;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderTagString = async _str => {
|
const renderTagString = async _str => {
|
||||||
let rendered = await this.renderTag(_str, tagArgs, {
|
let rendered = await this.renderTag(_str, tagArgs, {
|
||||||
member: stripObjectToScalars(member, ["user"]),
|
member: stripObjectToScalars(member, ["user"]),
|
||||||
|
@ -388,7 +366,9 @@ export class TagsPlugin extends ZeppelinPlugin<TConfigSchema> {
|
||||||
|
|
||||||
// Format the string
|
// Format the string
|
||||||
try {
|
try {
|
||||||
return typeof tagBody === "string" ? { content: await renderTagString(tagBody) } : await renderTagValue(tagBody);
|
return typeof tagBody === "string"
|
||||||
|
? { content: await renderTagString(tagBody) }
|
||||||
|
: await renderRecursively(tagBody, renderTagString);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e instanceof TemplateParseError) {
|
if (e instanceof TemplateParseError) {
|
||||||
logger.warn(`Invalid tag format!\nError: ${e.message}\nFormat: ${tagBody}`);
|
logger.warn(`Invalid tag format!\nError: ${e.message}\nFormat: ${tagBody}`);
|
||||||
|
|
|
@ -204,6 +204,8 @@ export const tStrictMessageContent = t.type({
|
||||||
embed: tNullable(tEmbed),
|
embed: tNullable(tEmbed),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const tMessageContent = t.union([t.string, tStrictMessageContent]);
|
||||||
|
|
||||||
export function dropPropertiesByName(obj, propName) {
|
export function dropPropertiesByName(obj, propName) {
|
||||||
if (obj.hasOwnProperty(propName)) delete obj[propName];
|
if (obj.hasOwnProperty(propName)) delete obj[propName];
|
||||||
for (const value of Object.values(obj)) {
|
for (const value of Object.values(obj)) {
|
||||||
|
@ -1126,3 +1128,27 @@ export function memoize<T>(fn: (...args: any[]) => T, key?, time?): T {
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RecursiveRenderFn = (str: string) => string | Promise<string>;
|
||||||
|
|
||||||
|
export async function renderRecursively(value, fn: RecursiveRenderFn) {
|
||||||
|
if (Array.isArray(value)) {
|
||||||
|
const result = [];
|
||||||
|
for (const item of value) {
|
||||||
|
result.push(await renderRecursively(item, fn));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
} else if (value === null) {
|
||||||
|
return null;
|
||||||
|
} else if (typeof value === "object") {
|
||||||
|
const result = {};
|
||||||
|
for (const [prop, _value] of Object.entries(value)) {
|
||||||
|
result[prop] = await renderRecursively(_value, fn);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
} else if (typeof value === "string") {
|
||||||
|
return fn(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue