mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-05-11 20:55:01 +00:00
Merge remote-tracking branch 'origin' into next
This commit is contained in:
commit
cb2306e522
26 changed files with 163 additions and 96 deletions
|
@ -45,7 +45,7 @@
|
|||
"dotenv": "^4.0.0",
|
||||
"emoji-regex": "^8.0.0",
|
||||
"escape-string-regexp": "^1.0.5",
|
||||
"express": "^4.17.0",
|
||||
"express": "^4.19.2",
|
||||
"fp-ts": "^2.0.1",
|
||||
"humanize-duration": "^3.15.0",
|
||||
"js-yaml": "^3.13.1",
|
||||
|
@ -55,7 +55,7 @@
|
|||
"lodash": "^4.17.21",
|
||||
"moment-timezone": "^0.5.21",
|
||||
"multer": "^1.4.5-lts.1",
|
||||
"mysql2": "^3.9.3",
|
||||
"mysql2": "^3.9.8",
|
||||
"parse-color": "^1.0.0",
|
||||
"passport": "^0.6.0",
|
||||
"passport-custom": "^1.0.5",
|
||||
|
|
|
@ -35,7 +35,7 @@ const caseData = z.object({
|
|||
is_hidden: z.boolean(),
|
||||
pp_id: z.nullable(z.string()),
|
||||
pp_name: z.nullable(z.string()),
|
||||
|
||||
log_message_id: z.string().optional(),
|
||||
notes: z.array(caseNoteData),
|
||||
});
|
||||
|
||||
|
@ -168,7 +168,7 @@ export function initGuildsImportExportAPI(guildRouter: express.Router) {
|
|||
is_hidden: theCase.is_hidden,
|
||||
pp_id: theCase.pp_id,
|
||||
pp_name: theCase.pp_name,
|
||||
|
||||
log_message_id: theCase.log_message_id ?? undefined,
|
||||
notes: theCase.notes.map((note) => ({
|
||||
mod_id: note.mod_id,
|
||||
mod_name: note.mod_name,
|
||||
|
|
|
@ -44,7 +44,15 @@ import { availableGuildPlugins, availableGlobalPlugins } from "./plugins/availab
|
|||
import { setProfiler } from "./profiler.js";
|
||||
import { logRateLimit } from "./rateLimitStats.js";
|
||||
import { startUptimeCounter } from "./uptime.js";
|
||||
import { MINUTES, SECONDS, errorMessage, isDiscordAPIError, isDiscordHTTPError, sleep, successMessage } from "./utils.js";
|
||||
import {
|
||||
MINUTES,
|
||||
SECONDS,
|
||||
errorMessage,
|
||||
isDiscordAPIError,
|
||||
isDiscordHTTPError,
|
||||
sleep,
|
||||
successMessage,
|
||||
} from "./utils.js";
|
||||
import { DecayingCounter } from "./utils/DecayingCounter.js";
|
||||
import { enableProfiling } from "./utils/easyProfiler.js";
|
||||
import { loadYamlSafely } from "./utils/loadYamlSafely.js";
|
||||
|
|
|
@ -3,18 +3,24 @@ import { MigrationInterface, QueryRunner, Table, TableColumn } from "typeorm";
|
|||
export class MoveStarboardsToConfig1573248462469 implements MigrationInterface {
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
// Create a new column for the channel's id
|
||||
await queryRunner.addColumn("starboard_messages", new TableColumn({
|
||||
name: "starboard_channel_id",
|
||||
type: "bigint",
|
||||
unsigned: true,
|
||||
}));
|
||||
await queryRunner.addColumn(
|
||||
"starboard_messages",
|
||||
new TableColumn({
|
||||
name: "starboard_channel_id",
|
||||
type: "bigint",
|
||||
unsigned: true,
|
||||
}),
|
||||
);
|
||||
|
||||
// Since we are removing the guild_id with the starboards table, we might want it here
|
||||
await queryRunner.addColumn("starboard_messages", new TableColumn({
|
||||
name: "guild_id",
|
||||
type: "bigint",
|
||||
unsigned: true,
|
||||
}));
|
||||
await queryRunner.addColumn(
|
||||
"starboard_messages",
|
||||
new TableColumn({
|
||||
name: "guild_id",
|
||||
type: "bigint",
|
||||
unsigned: true,
|
||||
}),
|
||||
);
|
||||
|
||||
// Migrate the old starboard_id to the new starboard_channel_id
|
||||
await queryRunner.query(`
|
||||
|
@ -43,11 +49,14 @@ export class MoveStarboardsToConfig1573248462469 implements MigrationInterface {
|
|||
await queryRunner.dropColumn("starboard_messages", "starboard_channel_id");
|
||||
await queryRunner.dropColumn("starboard_messages", "guild_id");
|
||||
|
||||
await queryRunner.addColumn("starboard_messages", new TableColumn({
|
||||
name: "starboard_id",
|
||||
type: "int",
|
||||
unsigned: true,
|
||||
}));
|
||||
await queryRunner.addColumn(
|
||||
"starboard_messages",
|
||||
new TableColumn({
|
||||
name: "starboard_id",
|
||||
type: "int",
|
||||
unsigned: true,
|
||||
}),
|
||||
);
|
||||
|
||||
await queryRunner.query(`
|
||||
ALTER TABLE starboard_messages
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||
import { TableForeignKey } from "typeorm";
|
||||
import { MigrationInterface, QueryRunner, TableForeignKey } from "typeorm";
|
||||
|
||||
export class AddCaseNotesForeignKey1596994103885 implements MigrationInterface {
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||
import { TableColumn } from "typeorm";
|
||||
import { MigrationInterface, QueryRunner, TableColumn } from "typeorm";
|
||||
|
||||
export class AddLogMessageIdToCases1597015567215 implements MigrationInterface {
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||
import { Table } from "typeorm";
|
||||
import { MigrationInterface, QueryRunner, Table } from "typeorm";
|
||||
|
||||
export class CreateMemberTimezonesTable1597109357201 implements MigrationInterface {
|
||||
public async up(queryRunner: QueryRunner): Promise<any> {
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import { MigrationInterface, QueryRunner, TableColumn, TableIndex } from "typeorm";
|
||||
import { TableForeignKey } from "typeorm";
|
||||
import { MigrationInterface, QueryRunner, TableColumn, TableForeignKey, TableIndex } from "typeorm";
|
||||
|
||||
export class UpdateCounterTriggers1617363975046 implements MigrationInterface {
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
|
|
|
@ -1,11 +1,17 @@
|
|||
import { Embed, Invite } from "discord.js";
|
||||
import { Invite } from "discord.js";
|
||||
import escapeStringRegexp from "escape-string-regexp";
|
||||
import { GuildPluginData } from "knub";
|
||||
import cloneDeep from "lodash/cloneDeep.js";
|
||||
import { allowTimeout } from "../../../RegExpRunner.js";
|
||||
import { ZalgoRegex } from "../../../data/Zalgo.js";
|
||||
import { ISavedMessageEmbedData, SavedMessage } from "../../../data/entities/SavedMessage.js";
|
||||
import { getInviteCodesInString, getUrlsInString, isGuildInvite, resolveInvite, resolveMember } from "../../../utils.js";
|
||||
import {
|
||||
getInviteCodesInString,
|
||||
getUrlsInString,
|
||||
isGuildInvite,
|
||||
resolveInvite,
|
||||
resolveMember,
|
||||
} from "../../../utils.js";
|
||||
import { CensorPluginType } from "../types.js";
|
||||
import { censorMessage } from "./censorMessage.js";
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { BasePluginType } from "knub";
|
||||
import { z } from "zod";
|
||||
import { Configs } from "../../data/Configs.js";
|
||||
import Timeout = NodeJS.Timeout;
|
||||
import { z } from "zod";
|
||||
|
||||
export const zGuildConfigReloaderPlugin = z.strictObject({});
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { BasePluginType } from "knub";
|
||||
import { GuildMemberCache } from "../../data/GuildMemberCache.js";
|
||||
import { z } from "zod";
|
||||
import { GuildMemberCache } from "../../data/GuildMemberCache.js";
|
||||
|
||||
export const zGuildMemberCacheConfig = z.strictObject({});
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import { WebhookClient } from "discord.js";
|
||||
import { BasePluginType } from "knub";
|
||||
import { z } from "zod";
|
||||
import { Queue } from "../../Queue.js";
|
||||
import { Webhooks } from "../../data/Webhooks.js";
|
||||
import { z } from "zod";
|
||||
|
||||
export const zInternalPosterConfig = z.strictObject({});
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ import {
|
|||
import { LogsThreadCreateEvt, LogsThreadDeleteEvt, LogsThreadUpdateEvt } from "./events/LogsThreadModifyEvts.js";
|
||||
import { LogsGuildMemberUpdateEvt } from "./events/LogsUserUpdateEvts.js";
|
||||
import { LogsVoiceStateUpdateEvt } from "./events/LogsVoiceChannelEvts.js";
|
||||
import { FORMAT_NO_TIMESTAMP, LogsPluginType, zLogsConfig } from "./types.js";
|
||||
import { LogsPluginType, zLogsConfig } from "./types.js";
|
||||
import { getLogMessage } from "./util/getLogMessage.js";
|
||||
import { log } from "./util/log.js";
|
||||
import { onMessageDelete } from "./util/onMessageDelete.js";
|
||||
|
|
|
@ -12,7 +12,7 @@ import {
|
|||
userToTemplateSafeUser,
|
||||
} from "../../../utils/templateSafeObjects.js";
|
||||
import { TimeAndDatePlugin } from "../../TimeAndDate/TimeAndDatePlugin.js";
|
||||
import { FORMAT_NO_TIMESTAMP, LogsPluginType } from "../types.js";
|
||||
import { LogsPluginType } from "../types.js";
|
||||
import { log } from "../util/log.js";
|
||||
|
||||
export interface LogMessageDeleteData {
|
||||
|
|
|
@ -6,7 +6,7 @@ import { GuildCases } from "../../data/GuildCases.js";
|
|||
import { GuildLogs } from "../../data/GuildLogs.js";
|
||||
import { GuildSavedMessages } from "../../data/GuildSavedMessages.js";
|
||||
import { LogType } from "../../data/LogType.js";
|
||||
import { keys, zBoundedCharacters, zMessageContent, zRegex, zSnowflake } from "../../utils.js";
|
||||
import { zBoundedCharacters, zMessageContent, zRegex, zSnowflake } from "../../utils.js";
|
||||
import { MessageBuffer } from "../../utils/MessageBuffer.js";
|
||||
import {
|
||||
TemplateSafeCase,
|
||||
|
|
|
@ -25,7 +25,7 @@ import {
|
|||
TemplateSafeUser,
|
||||
} from "../../../utils/templateSafeObjects.js";
|
||||
import { TimeAndDatePlugin } from "../../TimeAndDate/TimeAndDatePlugin.js";
|
||||
import { FORMAT_NO_TIMESTAMP, ILogTypeData, LogsPluginType, TLogChannel } from "../types.js";
|
||||
import { ILogTypeData, LogsPluginType, TLogChannel } from "../types.js";
|
||||
|
||||
export async function getLogMessage<TLogType extends keyof ILogTypeData>(
|
||||
pluginData: GuildPluginData<LogsPluginType>,
|
||||
|
|
|
@ -2,7 +2,12 @@ import { PluginOptions, guildPlugin } from "knub";
|
|||
import { GuildSavedMessages } from "../../data/GuildSavedMessages.js";
|
||||
import { SaveMessagesToDBCmd } from "./commands/SaveMessagesToDB.js";
|
||||
import { SavePinsToDBCmd } from "./commands/SavePinsToDB.js";
|
||||
import { MessageCreateEvt, MessageDeleteBulkEvt, MessageDeleteEvt, MessageUpdateEvt } from "./events/SaveMessagesEvts.js";
|
||||
import {
|
||||
MessageCreateEvt,
|
||||
MessageDeleteBulkEvt,
|
||||
MessageDeleteEvt,
|
||||
MessageUpdateEvt,
|
||||
} from "./events/SaveMessagesEvts.js";
|
||||
import { MessageSaverPluginType, zMessageSaverConfig } from "./types.js";
|
||||
|
||||
const defaultOptions: PluginOptions<MessageSaverPluginType> = {
|
||||
|
|
|
@ -3,7 +3,14 @@ import { commandTypeHelpers as ct } from "../../../commandTypes.js";
|
|||
import { CaseTypes } from "../../../data/CaseTypes.js";
|
||||
import { sendErrorMessage } from "../../../pluginUtils.js";
|
||||
import { CasesPlugin } from "../../../plugins/Cases/CasesPlugin.js";
|
||||
import { UnknownUser, chunkArray, emptyEmbedValue, renderUsername, resolveMember, resolveUser } from "../../../utils.js";
|
||||
import {
|
||||
UnknownUser,
|
||||
chunkArray,
|
||||
emptyEmbedValue,
|
||||
renderUsername,
|
||||
resolveMember,
|
||||
resolveUser,
|
||||
} from "../../../utils.js";
|
||||
import { asyncMap } from "../../../utils/async.js";
|
||||
import { createPaginatedMessage } from "../../../utils/createPaginatedMessage.js";
|
||||
import { getGuildPrefix } from "../../../utils/getGuildPrefix.js";
|
||||
|
@ -95,7 +102,7 @@ export const CasesUserCmd = modActionsCmd({
|
|||
// Compact view (= regular message with a preview of each case)
|
||||
const casesPlugin = pluginData.getPlugin(CasesPlugin);
|
||||
|
||||
const totalPages = Math.max(Math.ceil(cases.length / casesPerPage), 1);
|
||||
const totalPages = Math.max(Math.ceil(casesToDisplay.length / casesPerPage), 1);
|
||||
const prefix = getGuildPrefix(pluginData);
|
||||
|
||||
createPaginatedMessage(
|
||||
|
@ -103,16 +110,16 @@ export const CasesUserCmd = modActionsCmd({
|
|||
msg.channel,
|
||||
totalPages,
|
||||
async (page) => {
|
||||
const chunkedCases = chunkArray(cases, casesPerPage)[page - 1];
|
||||
const chunkedCases = chunkArray(casesToDisplay, casesPerPage)[page - 1];
|
||||
const lines = await asyncMap(chunkedCases, (c) => casesPlugin.getCaseSummary(c, true, msg.author.id));
|
||||
|
||||
const isLastPage = page === totalPages;
|
||||
const firstCaseNum = (page - 1) * casesPerPage + 1;
|
||||
const lastCaseNum = isLastPage ? cases.length : page * casesPerPage;
|
||||
const lastCaseNum = isLastPage ? casesToDisplay.length : page * casesPerPage;
|
||||
const title =
|
||||
totalPages === 1
|
||||
? `Cases for ${userName} (${lines.length} total)`
|
||||
: `Most recent cases ${firstCaseNum}-${lastCaseNum} of ${cases.length} for ${userName}`;
|
||||
: `Most recent cases ${firstCaseNum}-${lastCaseNum} of ${casesToDisplay.length} for ${userName}`;
|
||||
|
||||
const embed = {
|
||||
author: {
|
||||
|
|
|
@ -3,7 +3,13 @@ import { GuildPluginData } from "knub";
|
|||
import { CaseTypes } from "../../../data/CaseTypes.js";
|
||||
import { LogType } from "../../../data/LogType.js";
|
||||
import { renderTemplate, TemplateParseError, TemplateSafeValueContainer } from "../../../templateFormatter.js";
|
||||
import { createUserNotificationError, notifyUser, resolveUser, ucfirst, UserNotificationResult } from "../../../utils.js";
|
||||
import {
|
||||
createUserNotificationError,
|
||||
notifyUser,
|
||||
resolveUser,
|
||||
ucfirst,
|
||||
UserNotificationResult,
|
||||
} from "../../../utils.js";
|
||||
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects.js";
|
||||
import { CasesPlugin } from "../../Cases/CasesPlugin.js";
|
||||
import { LogsPlugin } from "../../Logs/LogsPlugin.js";
|
||||
|
|
|
@ -2,7 +2,13 @@ import { GuildMember, Snowflake } from "discord.js";
|
|||
import { GuildPluginData } from "knub";
|
||||
import { CaseTypes } from "../../../data/CaseTypes.js";
|
||||
import { TemplateParseError, TemplateSafeValueContainer, renderTemplate } from "../../../templateFormatter.js";
|
||||
import { UserNotificationResult, createUserNotificationError, notifyUser, resolveUser, ucfirst } from "../../../utils.js";
|
||||
import {
|
||||
UserNotificationResult,
|
||||
createUserNotificationError,
|
||||
notifyUser,
|
||||
resolveUser,
|
||||
ucfirst,
|
||||
} from "../../../utils.js";
|
||||
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects.js";
|
||||
import { waitForButtonConfirm } from "../../../utils/waitForInteraction.js";
|
||||
import { CasesPlugin } from "../../Cases/CasesPlugin.js";
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
import { GuildPluginData } from "knub";
|
||||
import { getPhishermanDomainInfo, phishermanDomainIsSafe, trackPhishermanCaughtDomain } from "../../../data/Phisherman.js";
|
||||
import {
|
||||
getPhishermanDomainInfo,
|
||||
phishermanDomainIsSafe,
|
||||
trackPhishermanCaughtDomain,
|
||||
} from "../../../data/Phisherman.js";
|
||||
import { PhishermanDomainInfo } from "../../../data/types/phisherman.js";
|
||||
import { PhishermanPluginType } from "../types.js";
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import { LoadedGuildPlugin, PluginCommandDefinition } from "knub";
|
||||
import { commandTypeHelpers as ct } from "../../../commandTypes.js";
|
||||
import { env } from "../../../env.js";
|
||||
import { createChunkedMessage } from "../../../utils.js";
|
||||
import { utilityCmd } from "../types.js";
|
||||
|
||||
|
@ -62,7 +63,7 @@ export const HelpCmd = utilityCmd({
|
|||
let snippet = `**${prefix}${trigger}**`;
|
||||
if (description) snippet += `\n${description}`;
|
||||
if (usage) snippet += `\nBasic usage: \`${usage}\``;
|
||||
snippet += `\n<https://zeppelin.gg/docs/plugins/${plugin.blueprint.name}/usage#command-${commandSlug}>`;
|
||||
snippet += `\n<${env.DASHBOARD_URL}/docs/plugins/${plugin.blueprint.name}/usage#command-${commandSlug}>`;
|
||||
|
||||
return snippet;
|
||||
});
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
import test from "ava";
|
||||
import { parseTemplate, renderParsedTemplate, renderTemplate, TemplateSafeValueContainer } from "./templateFormatter.js";
|
||||
import {
|
||||
parseTemplate,
|
||||
renderParsedTemplate,
|
||||
renderTemplate,
|
||||
TemplateSafeValueContainer,
|
||||
} from "./templateFormatter.js";
|
||||
|
||||
test("Parses plain string templates correctly", (t) => {
|
||||
const result = parseTemplate("foo bar baz");
|
||||
|
|
|
@ -286,8 +286,10 @@ export type StrictMessageContent = {
|
|||
};
|
||||
|
||||
export type MessageContent = string | StrictMessageContent;
|
||||
export const zMessageContent = z.union([zBoundedCharacters(0, 4000), zStrictMessageContent]) as z.ZodType<MessageContent>;
|
||||
|
||||
export const zMessageContent = z.union([
|
||||
zBoundedCharacters(0, 4000),
|
||||
zStrictMessageContent,
|
||||
]) as z.ZodType<MessageContent>;
|
||||
|
||||
export function validateAndParseMessageContent(input: unknown): StrictMessageContent {
|
||||
if (input == null) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue