mirror of
https://github.com/ZeppelinBot/Zeppelin.git
synced 2025-03-14 21:31:50 +00:00
refactor: convert /backend to ESM
This commit is contained in:
parent
31d74c05aa
commit
5772e27cda
766 changed files with 3473 additions and 3500 deletions
|
@ -3,6 +3,7 @@
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"description": "",
|
"description": "",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"watch": "tsc-watch --build --onSuccess \"node start-dev.js\"",
|
"watch": "tsc-watch --build --onSuccess \"node start-dev.js\"",
|
||||||
"watch-yaml-parse-test": "tsc-watch --build --onSuccess \"node dist/yamlParseTest.js\"",
|
"watch-yaml-parse-test": "tsc-watch --build --onSuccess \"node dist/yamlParseTest.js\"",
|
||||||
|
@ -48,12 +49,7 @@
|
||||||
"knub": "^32.0.0-next.21",
|
"knub": "^32.0.0-next.21",
|
||||||
"knub-command-manager": "^9.1.0",
|
"knub-command-manager": "^9.1.0",
|
||||||
"last-commit-log": "^2.1.0",
|
"last-commit-log": "^2.1.0",
|
||||||
"lodash.chunk": "^4.2.0",
|
"lodash": "^4.17.21",
|
||||||
"lodash.clonedeep": "^4.5.0",
|
|
||||||
"lodash.difference": "^4.5.0",
|
|
||||||
"lodash.intersection": "^4.4.0",
|
|
||||||
"lodash.isequal": "^4.5.0",
|
|
||||||
"lodash.pick": "^4.4.0",
|
|
||||||
"moment-timezone": "^0.5.21",
|
"moment-timezone": "^0.5.21",
|
||||||
"multer": "^1.4.5-lts.1",
|
"multer": "^1.4.5-lts.1",
|
||||||
"mysql2": "^3.9.3",
|
"mysql2": "^3.9.3",
|
||||||
|
@ -87,7 +83,6 @@
|
||||||
"@types/lodash.at": "^4.6.3",
|
"@types/lodash.at": "^4.6.3",
|
||||||
"@types/moment-timezone": "^0.5.6",
|
"@types/moment-timezone": "^0.5.6",
|
||||||
"@types/multer": "^1.4.7",
|
"@types/multer": "^1.4.7",
|
||||||
"@types/node": "^18.16.3",
|
|
||||||
"@types/passport": "^1.0.0",
|
"@types/passport": "^1.0.0",
|
||||||
"@types/passport-oauth2": "^1.4.8",
|
"@types/passport-oauth2": "^1.4.8",
|
||||||
"@types/passport-strategy": "^0.2.35",
|
"@types/passport-strategy": "^0.2.35",
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { SECONDS } from "./utils";
|
import { SECONDS } from "./utils.js";
|
||||||
|
|
||||||
type InternalQueueFn = () => Promise<void>;
|
type InternalQueueFn = () => Promise<void>;
|
||||||
type AnyFn = (...args: any[]) => any;
|
type AnyFn = (...args: any[]) => any;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Queue } from "./Queue";
|
import { Queue } from "./Queue.js";
|
||||||
|
|
||||||
type Listener = (...args: any[]) => void;
|
type Listener = (...args: any[]) => void;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { EventEmitter } from "events";
|
import { EventEmitter } from "events";
|
||||||
import { CooldownManager } from "knub";
|
import { CooldownManager } from "knub";
|
||||||
import { RegExpWorker, TimeoutError } from "regexp-worker";
|
import { RegExpWorker, TimeoutError } from "regexp-worker";
|
||||||
import { MINUTES, SECONDS } from "./utils";
|
import { MINUTES, SECONDS } from "./utils.js";
|
||||||
import Timeout = NodeJS.Timeout;
|
import Timeout = NodeJS.Timeout;
|
||||||
|
|
||||||
const isTimeoutError = (a): a is TimeoutError => {
|
const isTimeoutError = (a): a is TimeoutError => {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import express, { Request, Response } from "express";
|
import express, { Request, Response } from "express";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { GuildArchives } from "../data/GuildArchives";
|
import { GuildArchives } from "../data/GuildArchives.js";
|
||||||
import { notFound } from "./responses";
|
import { notFound } from "./responses.js";
|
||||||
|
|
||||||
export function initArchives(router: express.Router) {
|
export function initArchives(router: express.Router) {
|
||||||
const archives = new GuildArchives(null);
|
const archives = new GuildArchives(null);
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
import express, { Request, Response } from "express";
|
import express, { Request, Response } from "express";
|
||||||
import https from "https";
|
import https from "https";
|
||||||
import pick from "lodash.pick";
|
import pick from "lodash/pick.js";
|
||||||
import passport from "passport";
|
import passport from "passport";
|
||||||
import { Strategy as CustomStrategy } from "passport-custom";
|
import { Strategy as CustomStrategy } from "passport-custom";
|
||||||
import OAuth2Strategy from "passport-oauth2";
|
import OAuth2Strategy from "passport-oauth2";
|
||||||
import { ApiLogins } from "../data/ApiLogins";
|
import { ApiLogins } from "../data/ApiLogins.js";
|
||||||
import { ApiPermissionAssignments } from "../data/ApiPermissionAssignments";
|
import { ApiPermissionAssignments } from "../data/ApiPermissionAssignments.js";
|
||||||
import { ApiUserInfo } from "../data/ApiUserInfo";
|
import { ApiUserInfo } from "../data/ApiUserInfo.js";
|
||||||
import { ApiUserInfoData } from "../data/entities/ApiUserInfo";
|
import { ApiUserInfoData } from "../data/entities/ApiUserInfo.js";
|
||||||
import { env } from "../env";
|
import { env } from "../env.js";
|
||||||
import { ok } from "./responses";
|
import { ok } from "./responses.js";
|
||||||
|
|
||||||
interface IPassportApiUser {
|
interface IPassportApiUser {
|
||||||
apiKey: string;
|
apiKey: string;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import express from "express";
|
import express from "express";
|
||||||
import z from "zod";
|
import z from "zod";
|
||||||
import { guildPlugins } from "../plugins/availablePlugins";
|
import { guildPlugins } from "../plugins/availablePlugins.js";
|
||||||
import { guildPluginInfo } from "../plugins/pluginInfo";
|
import { guildPluginInfo } from "../plugins/pluginInfo.js";
|
||||||
import { indentLines } from "../utils";
|
import { indentLines } from "../utils.js";
|
||||||
import { notFound } from "./responses";
|
import { notFound } from "./responses.js";
|
||||||
|
|
||||||
function isZodObject(schema: z.ZodTypeAny): schema is z.ZodObject<any> {
|
function isZodObject(schema: z.ZodTypeAny): schema is z.ZodObject<any> {
|
||||||
return schema._def.typeName === "ZodObject";
|
return schema._def.typeName === "ZodObject";
|
||||||
|
|
|
@ -1,20 +1,22 @@
|
||||||
import { ApiPermissions } from "@zeppelinbot/shared";
|
import { ApiPermissions } from "@zeppelinbot/shared";
|
||||||
import express, { Request, Response } from "express";
|
import express, { Request, Response } from "express";
|
||||||
import { YAMLException } from "js-yaml";
|
import jsYaml from "js-yaml";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Queue } from "../Queue";
|
import { Queue } from "../Queue.js";
|
||||||
import { validateGuildConfig } from "../configValidator";
|
import { validateGuildConfig } from "../configValidator.js";
|
||||||
import { AllowedGuilds } from "../data/AllowedGuilds";
|
import { AllowedGuilds } from "../data/AllowedGuilds.js";
|
||||||
import { ApiAuditLog } from "../data/ApiAuditLog";
|
import { ApiAuditLog } from "../data/ApiAuditLog.js";
|
||||||
import { ApiPermissionAssignments, ApiPermissionTypes } from "../data/ApiPermissionAssignments";
|
import { ApiPermissionAssignments, ApiPermissionTypes } from "../data/ApiPermissionAssignments.js";
|
||||||
import { Configs } from "../data/Configs";
|
import { Configs } from "../data/Configs.js";
|
||||||
import { AuditLogEventTypes } from "../data/apiAuditLogTypes";
|
import { AuditLogEventTypes } from "../data/apiAuditLogTypes.js";
|
||||||
import { isSnowflake } from "../utils";
|
import { isSnowflake } from "../utils.js";
|
||||||
import { loadYamlSafely } from "../utils/loadYamlSafely";
|
import { loadYamlSafely } from "../utils/loadYamlSafely.js";
|
||||||
import { ObjectAliasError } from "../utils/validateNoObjectAliases";
|
import { ObjectAliasError } from "../utils/validateNoObjectAliases.js";
|
||||||
import { apiTokenAuthHandlers } from "./auth";
|
import { apiTokenAuthHandlers } from "./auth.js";
|
||||||
import { hasGuildPermission, requireGuildPermission } from "./permissions";
|
import { hasGuildPermission, requireGuildPermission } from "./permissions.js";
|
||||||
import { clientError, ok, serverError, unauthorized } from "./responses";
|
import { clientError, ok, serverError, unauthorized } from "./responses.js";
|
||||||
|
|
||||||
|
const YAMLException = jsYaml.YAMLException;
|
||||||
|
|
||||||
const apiPermissionAssignments = new ApiPermissionAssignments();
|
const apiPermissionAssignments = new ApiPermissionAssignments();
|
||||||
const auditLog = new ApiAuditLog();
|
const auditLog = new ApiAuditLog();
|
||||||
|
|
|
@ -2,12 +2,12 @@ import { ApiPermissions } from "@zeppelinbot/shared";
|
||||||
import express, { Request, Response } from "express";
|
import express, { Request, Response } from "express";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import { GuildCases } from "../../data/GuildCases";
|
import { GuildCases } from "../../data/GuildCases.js";
|
||||||
import { Case } from "../../data/entities/Case";
|
import { Case } from "../../data/entities/Case.js";
|
||||||
import { MINUTES } from "../../utils";
|
import { MINUTES } from "../../utils.js";
|
||||||
import { requireGuildPermission } from "../permissions";
|
import { requireGuildPermission } from "../permissions.js";
|
||||||
import { rateLimit } from "../rateLimits";
|
import { rateLimit } from "../rateLimits.js";
|
||||||
import { clientError, ok } from "../responses";
|
import { clientError, ok } from "../responses.js";
|
||||||
|
|
||||||
const caseHandlingModeSchema = z.union([
|
const caseHandlingModeSchema = z.union([
|
||||||
z.literal("replace"),
|
z.literal("replace"),
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import express from "express";
|
import express from "express";
|
||||||
import { apiTokenAuthHandlers } from "../auth";
|
import { apiTokenAuthHandlers } from "../auth.js";
|
||||||
import { initGuildsImportExportAPI } from "./importExport";
|
import { initGuildsImportExportAPI } from "./importExport.js";
|
||||||
import { initGuildsMiscAPI } from "./misc";
|
import { initGuildsMiscAPI } from "./misc.js";
|
||||||
|
|
||||||
export function initGuildsAPI(router: express.Router) {
|
export function initGuildsAPI(router: express.Router) {
|
||||||
const guildRouter = express.Router();
|
const guildRouter = express.Router();
|
||||||
|
|
|
@ -1,19 +1,21 @@
|
||||||
import { ApiPermissions } from "@zeppelinbot/shared";
|
import { ApiPermissions } from "@zeppelinbot/shared";
|
||||||
import express, { Request, Response } from "express";
|
import express, { Request, Response } from "express";
|
||||||
import { YAMLException } from "js-yaml";
|
import jsYaml from "js-yaml";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Queue } from "../../Queue";
|
import { Queue } from "../../Queue.js";
|
||||||
import { validateGuildConfig } from "../../configValidator";
|
import { validateGuildConfig } from "../../configValidator.js";
|
||||||
import { AllowedGuilds } from "../../data/AllowedGuilds";
|
import { AllowedGuilds } from "../../data/AllowedGuilds.js";
|
||||||
import { ApiAuditLog } from "../../data/ApiAuditLog";
|
import { ApiAuditLog } from "../../data/ApiAuditLog.js";
|
||||||
import { ApiPermissionAssignments, ApiPermissionTypes } from "../../data/ApiPermissionAssignments";
|
import { ApiPermissionAssignments, ApiPermissionTypes } from "../../data/ApiPermissionAssignments.js";
|
||||||
import { Configs } from "../../data/Configs";
|
import { Configs } from "../../data/Configs.js";
|
||||||
import { AuditLogEventTypes } from "../../data/apiAuditLogTypes";
|
import { AuditLogEventTypes } from "../../data/apiAuditLogTypes.js";
|
||||||
import { isSnowflake } from "../../utils";
|
import { isSnowflake } from "../../utils.js";
|
||||||
import { loadYamlSafely } from "../../utils/loadYamlSafely";
|
import { loadYamlSafely } from "../../utils/loadYamlSafely.js";
|
||||||
import { ObjectAliasError } from "../../utils/validateNoObjectAliases";
|
import { ObjectAliasError } from "../../utils/validateNoObjectAliases.js";
|
||||||
import { hasGuildPermission, requireGuildPermission } from "../permissions";
|
import { hasGuildPermission, requireGuildPermission } from "../permissions.js";
|
||||||
import { clientError, ok, serverError, unauthorized } from "../responses";
|
import { clientError, ok, serverError, unauthorized } from "../responses.js";
|
||||||
|
|
||||||
|
const YAMLException = jsYaml.YAMLException;
|
||||||
|
|
||||||
const apiPermissionAssignments = new ApiPermissionAssignments();
|
const apiPermissionAssignments = new ApiPermissionAssignments();
|
||||||
const auditLog = new ApiAuditLog();
|
const auditLog = new ApiAuditLog();
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
// KEEP THIS AS FIRST IMPORT
|
// KEEP THIS AS FIRST IMPORT
|
||||||
// See comment in module for details
|
// See comment in module for details
|
||||||
import "../threadsSignalFix";
|
import "../threadsSignalFix.js";
|
||||||
|
|
||||||
import { connect } from "../data/db";
|
import { connect } from "../data/db.js";
|
||||||
import { env } from "../env";
|
import { env } from "../env.js";
|
||||||
import { setIsAPI } from "../globals";
|
import { setIsAPI } from "../globals.js";
|
||||||
|
|
||||||
if (!env.KEY) {
|
if (!env.KEY) {
|
||||||
// tslint:disable-next-line:no-console
|
// tslint:disable-next-line:no-console
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { ApiPermissions, hasPermission, permissionArrToSet } from "@zeppelinbot/shared";
|
import { ApiPermissions, hasPermission, permissionArrToSet } from "@zeppelinbot/shared";
|
||||||
import { Request, Response } from "express";
|
import { Request, Response } from "express";
|
||||||
import { ApiPermissionAssignments } from "../data/ApiPermissionAssignments";
|
import { ApiPermissionAssignments } from "../data/ApiPermissionAssignments.js";
|
||||||
import { isStaff } from "../staff";
|
import { isStaff } from "../staff.js";
|
||||||
import { unauthorized } from "./responses";
|
import { unauthorized } from "./responses.js";
|
||||||
|
|
||||||
const apiPermissionAssignments = new ApiPermissionAssignments();
|
const apiPermissionAssignments = new ApiPermissionAssignments();
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { Request, Response } from "express";
|
import { Request, Response } from "express";
|
||||||
import { error } from "./responses";
|
import { error } from "./responses.js";
|
||||||
|
|
||||||
const lastRequestsByKey: Map<string, number> = new Map();
|
const lastRequestsByKey: Map<string, number> = new Map();
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import express, { Request, Response } from "express";
|
import express, { Request, Response } from "express";
|
||||||
import { isStaff } from "../staff";
|
import { isStaff } from "../staff.js";
|
||||||
import { apiTokenAuthHandlers } from "./auth";
|
import { apiTokenAuthHandlers } from "./auth.js";
|
||||||
|
|
||||||
export function initStaff(app: express.Express) {
|
export function initStaff(app: express.Express) {
|
||||||
const staffRouter = express.Router();
|
const staffRouter = express.Router();
|
||||||
|
|
|
@ -2,13 +2,13 @@ import cors from "cors";
|
||||||
import express from "express";
|
import express from "express";
|
||||||
import multer from "multer";
|
import multer from "multer";
|
||||||
import { TokenError } from "passport-oauth2";
|
import { TokenError } from "passport-oauth2";
|
||||||
import { env } from "../env";
|
import { env } from "../env.js";
|
||||||
import { initArchives } from "./archives";
|
import { initArchives } from "./archives.js";
|
||||||
import { initAuth } from "./auth";
|
import { initAuth } from "./auth.js";
|
||||||
import { initDocs } from "./docs";
|
import { initDocs } from "./docs.js";
|
||||||
import { initGuildsAPI } from "./guilds/index";
|
import { initGuildsAPI } from "./guilds/index.js";
|
||||||
import { clientError, error, notFound } from "./responses";
|
import { clientError, error, notFound } from "./responses.js";
|
||||||
import { startBackgroundTasks } from "./tasks";
|
import { startBackgroundTasks } from "./tasks.js";
|
||||||
|
|
||||||
const apiPathPrefix = env.API_PATH_PREFIX || (env.NODE_ENV === "development" ? "/api" : "");
|
const apiPathPrefix = env.API_PATH_PREFIX || (env.NODE_ENV === "development" ? "/api" : "");
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { ApiPermissionAssignments } from "../data/ApiPermissionAssignments";
|
import { ApiPermissionAssignments } from "../data/ApiPermissionAssignments.js";
|
||||||
import { MINUTES } from "../utils";
|
import { MINUTES } from "../utils.js";
|
||||||
|
|
||||||
export function startBackgroundTasks() {
|
export function startBackgroundTasks() {
|
||||||
// Clear expired API permissions every minute
|
// Clear expired API permissions every minute
|
||||||
|
|
|
@ -24,9 +24,9 @@ import {
|
||||||
resolveUserId,
|
resolveUserId,
|
||||||
roleMentionRegex,
|
roleMentionRegex,
|
||||||
UnknownUser,
|
UnknownUser,
|
||||||
} from "./utils";
|
} from "./utils.js";
|
||||||
import { isValidTimezone } from "./utils/isValidTimezone";
|
import { isValidTimezone } from "./utils/isValidTimezone.js";
|
||||||
import { MessageTarget, resolveMessageTarget } from "./utils/resolveMessageTarget";
|
import { MessageTarget, resolveMessageTarget } from "./utils/resolveMessageTarget.js";
|
||||||
|
|
||||||
export const commandTypes = {
|
export const commandTypes = {
|
||||||
...messageCommandBaseTypeConverters,
|
...messageCommandBaseTypeConverters,
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import { ConfigValidationError, GuildPluginBlueprint, PluginConfigManager } from "knub";
|
import { ConfigValidationError, GuildPluginBlueprint, PluginConfigManager } from "knub";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { ZodError } from "zod";
|
import { ZodError } from "zod";
|
||||||
import { guildPlugins } from "./plugins/availablePlugins";
|
import { guildPlugins } from "./plugins/availablePlugins.js";
|
||||||
import { ZeppelinGuildConfig, zZeppelinGuildConfig } from "./types";
|
import { ZeppelinGuildConfig, zZeppelinGuildConfig } from "./types.js";
|
||||||
import { formatZodIssue } from "./utils/formatZodIssue";
|
import { formatZodIssue } from "./utils/formatZodIssue.js";
|
||||||
|
|
||||||
const pluginNameToPlugin = new Map<string, GuildPluginBlueprint<any, any>>();
|
const pluginNameToPlugin = new Map<string, GuildPluginBlueprint<any, any>>();
|
||||||
for (const plugin of guildPlugins) {
|
for (const plugin of guildPlugins) {
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { DBDateFormat } from "../utils";
|
import { DBDateFormat } from "../utils.js";
|
||||||
import { ApiPermissionTypes } from "./ApiPermissionAssignments";
|
import { ApiPermissionTypes } from "./ApiPermissionAssignments.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { AllowedGuild } from "./entities/AllowedGuild";
|
import { AllowedGuild } from "./entities/AllowedGuild.js";
|
||||||
|
|
||||||
export class AllowedGuilds extends BaseRepository {
|
export class AllowedGuilds extends BaseRepository {
|
||||||
private allowedGuilds: Repository<AllowedGuild>;
|
private allowedGuilds: Repository<AllowedGuild>;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { Repository } from "typeorm/index";
|
import { Repository } from "typeorm";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { AuditLogEventData, AuditLogEventType } from "./apiAuditLogTypes";
|
import { AuditLogEventData, AuditLogEventType } from "./apiAuditLogTypes.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { ApiAuditLogEntry } from "./entities/ApiAuditLogEntry";
|
import { ApiAuditLogEntry } from "./entities/ApiAuditLogEntry.js";
|
||||||
|
|
||||||
export class ApiAuditLog extends BaseRepository {
|
export class ApiAuditLog extends BaseRepository {
|
||||||
private auditLog: Repository<ApiAuditLogEntry<any>>;
|
private auditLog: Repository<ApiAuditLogEntry<any>>;
|
||||||
|
|
|
@ -3,10 +3,10 @@ import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
// tslint:disable-next-line:no-submodule-imports
|
// tslint:disable-next-line:no-submodule-imports
|
||||||
import { v4 as uuidv4 } from "uuid";
|
import { v4 as uuidv4 } from "uuid";
|
||||||
import { DAYS, DBDateFormat } from "../utils";
|
import { DAYS, DBDateFormat } from "../utils.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { ApiLogin } from "./entities/ApiLogin";
|
import { ApiLogin } from "./entities/ApiLogin.js";
|
||||||
|
|
||||||
const LOGIN_EXPIRY_TIME = 1 * DAYS;
|
const LOGIN_EXPIRY_TIME = 1 * DAYS;
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { ApiPermissions } from "@zeppelinbot/shared";
|
import { ApiPermissions } from "@zeppelinbot/shared";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { ApiAuditLog } from "./ApiAuditLog";
|
import { ApiAuditLog } from "./ApiAuditLog.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { AuditLogEventTypes } from "./apiAuditLogTypes";
|
import { AuditLogEventTypes } from "./apiAuditLogTypes.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { ApiPermissionAssignment } from "./entities/ApiPermissionAssignment";
|
import { ApiPermissionAssignment } from "./entities/ApiPermissionAssignment.js";
|
||||||
|
|
||||||
export enum ApiPermissionTypes {
|
export enum ApiPermissionTypes {
|
||||||
User = "USER",
|
User = "USER",
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { DBDateFormat } from "../utils";
|
import { DBDateFormat } from "../utils.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { ApiUserInfoData, ApiUserInfo as ApiUserInfoEntity } from "./entities/ApiUserInfo";
|
import { ApiUserInfoData, ApiUserInfo as ApiUserInfoEntity } from "./entities/ApiUserInfo.js";
|
||||||
|
|
||||||
export class ApiUserInfo extends BaseRepository {
|
export class ApiUserInfo extends BaseRepository {
|
||||||
private apiUserInfo: Repository<ApiUserInfoEntity>;
|
private apiUserInfo: Repository<ApiUserInfoEntity>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { ArchiveEntry } from "./entities/ArchiveEntry";
|
import { ArchiveEntry } from "./entities/ArchiveEntry.js";
|
||||||
|
|
||||||
export class Archives extends BaseRepository {
|
export class Archives extends BaseRepository {
|
||||||
protected archives: Repository<ArchiveEntry>;
|
protected archives: Repository<ArchiveEntry>;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
|
|
||||||
export class BaseGuildRepository<TEntity = unknown> extends BaseRepository<TEntity> {
|
export class BaseGuildRepository<TEntity = unknown> extends BaseRepository<TEntity> {
|
||||||
private static guildInstances: Map<string, any>;
|
private static guildInstances: Map<string, any>;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { asyncMap } from "../utils/async";
|
import { asyncMap } from "../utils/async.js";
|
||||||
|
|
||||||
export class BaseRepository<TEntity = unknown> {
|
export class BaseRepository<TEntity = unknown> {
|
||||||
private nextRelations: string[];
|
private nextRelations: string[];
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { isAPI } from "../globals";
|
import { isAPI } from "../globals.js";
|
||||||
import { HOURS, SECONDS } from "../utils";
|
import { HOURS, SECONDS } from "../utils.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { cleanupConfigs } from "./cleanup/configs";
|
import { cleanupConfigs } from "./cleanup/configs.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { Config } from "./entities/Config";
|
import { Config } from "./entities/Config.js";
|
||||||
|
|
||||||
const CLEANUP_INTERVAL = 1 * HOURS;
|
const CLEANUP_INTERVAL = 1 * HOURS;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { AntiraidLevel } from "./entities/AntiraidLevel";
|
import { AntiraidLevel } from "./entities/AntiraidLevel.js";
|
||||||
|
|
||||||
export class GuildAntiraidLevels extends BaseGuildRepository {
|
export class GuildAntiraidLevels extends BaseGuildRepository {
|
||||||
protected antiraidLevels: Repository<AntiraidLevel>;
|
protected antiraidLevels: Repository<AntiraidLevel>;
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
import { Guild, Snowflake } from "discord.js";
|
import { Guild, Snowflake } from "discord.js";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { TemplateSafeValueContainer, renderTemplate } from "../templateFormatter";
|
import { TemplateSafeValueContainer, renderTemplate } from "../templateFormatter.js";
|
||||||
import { renderUsername, trimLines } from "../utils";
|
import { renderUsername, trimLines } from "../utils.js";
|
||||||
import { decrypt, encrypt } from "../utils/crypt";
|
import { decrypt, encrypt } from "../utils/crypt.js";
|
||||||
import { isDefaultSticker } from "../utils/isDefaultSticker";
|
import { isDefaultSticker } from "../utils/isDefaultSticker.js";
|
||||||
import { channelToTemplateSafeChannel, guildToTemplateSafeGuild } from "../utils/templateSafeObjects";
|
import { channelToTemplateSafeChannel, guildToTemplateSafeGuild } from "../utils/templateSafeObjects.js";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { ArchiveEntry } from "./entities/ArchiveEntry";
|
import { ArchiveEntry } from "./entities/ArchiveEntry.js";
|
||||||
import { SavedMessage } from "./entities/SavedMessage";
|
import { SavedMessage } from "./entities/SavedMessage.js";
|
||||||
|
|
||||||
const DEFAULT_EXPIRY_DAYS = 30;
|
const DEFAULT_EXPIRY_DAYS = 30;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { AutoReaction } from "./entities/AutoReaction";
|
import { AutoReaction } from "./entities/AutoReaction.js";
|
||||||
|
|
||||||
export class GuildAutoReactions extends BaseGuildRepository {
|
export class GuildAutoReactions extends BaseGuildRepository {
|
||||||
private autoReactions: Repository<AutoReaction>;
|
private autoReactions: Repository<AutoReaction>;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { getRepository, Repository } from "typeorm";
|
import { getRepository, Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { ButtonRole } from "./entities/ButtonRole";
|
import { ButtonRole } from "./entities/ButtonRole.js";
|
||||||
|
|
||||||
export class GuildButtonRoles extends BaseGuildRepository {
|
export class GuildButtonRoles extends BaseGuildRepository {
|
||||||
private buttonRoles: Repository<ButtonRole>;
|
private buttonRoles: Repository<ButtonRole>;
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import { In, InsertResult, Repository } from "typeorm";
|
import { In, InsertResult, Repository } from "typeorm";
|
||||||
import { Queue } from "../Queue";
|
import { Queue } from "../Queue.js";
|
||||||
import { chunkArray } from "../utils";
|
import { chunkArray } from "../utils.js";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { CaseTypes } from "./CaseTypes";
|
import { CaseTypes } from "./CaseTypes.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { Case } from "./entities/Case";
|
import { Case } from "./entities/Case.js";
|
||||||
import { CaseNote } from "./entities/CaseNote";
|
import { CaseNote } from "./entities/CaseNote.js";
|
||||||
|
|
||||||
export class GuildCases extends BaseGuildRepository {
|
export class GuildCases extends BaseGuildRepository {
|
||||||
private cases: Repository<Case>;
|
private cases: Repository<Case>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { DeleteResult, InsertResult, Repository } from "typeorm";
|
import { DeleteResult, InsertResult, Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { ContextMenuLink } from "./entities/ContextMenuLink";
|
import { ContextMenuLink } from "./entities/ContextMenuLink.js";
|
||||||
|
|
||||||
export class GuildContextMenuLinks extends BaseGuildRepository {
|
export class GuildContextMenuLinks extends BaseGuildRepository {
|
||||||
private contextLinks: Repository<ContextMenuLink>;
|
private contextLinks: Repository<ContextMenuLink>;
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { FindOptionsWhere, In, IsNull, Not, Repository } from "typeorm";
|
import { FindOptionsWhere, In, IsNull, Not, Repository } from "typeorm";
|
||||||
import { Queue } from "../Queue";
|
import { Queue } from "../Queue.js";
|
||||||
import { DAYS, DBDateFormat, HOURS, MINUTES } from "../utils";
|
import { DAYS, DBDateFormat, HOURS, MINUTES } from "../utils.js";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { Counter } from "./entities/Counter";
|
import { Counter } from "./entities/Counter.js";
|
||||||
import { CounterTrigger, TriggerComparisonOp, isValidCounterComparisonOp } from "./entities/CounterTrigger";
|
import { CounterTrigger, TriggerComparisonOp, isValidCounterComparisonOp } from "./entities/CounterTrigger.js";
|
||||||
import { CounterTriggerState } from "./entities/CounterTriggerState";
|
import { CounterTriggerState } from "./entities/CounterTriggerState.js";
|
||||||
import { CounterValue } from "./entities/CounterValue";
|
import { CounterValue } from "./entities/CounterValue.js";
|
||||||
|
|
||||||
const DELETE_UNUSED_COUNTERS_AFTER = 1 * DAYS;
|
const DELETE_UNUSED_COUNTERS_AFTER = 1 * DAYS;
|
||||||
const DELETE_UNUSED_COUNTER_TRIGGERS_AFTER = 1 * DAYS;
|
const DELETE_UNUSED_COUNTER_TRIGGERS_AFTER = 1 * DAYS;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { Mute } from "./entities/Mute";
|
import { Mute } from "./entities/Mute.js";
|
||||||
import { Reminder } from "./entities/Reminder";
|
import { Reminder } from "./entities/Reminder.js";
|
||||||
import { ScheduledPost } from "./entities/ScheduledPost";
|
import { ScheduledPost } from "./entities/ScheduledPost.js";
|
||||||
import { Tempban } from "./entities/Tempban";
|
import { Tempban } from "./entities/Tempban.js";
|
||||||
import { VCAlert } from "./entities/VCAlert";
|
import { VCAlert } from "./entities/VCAlert.js";
|
||||||
|
|
||||||
interface GuildEventArgs extends Record<string, unknown[]> {
|
interface GuildEventArgs extends Record<string, unknown[]> {
|
||||||
expiredMute: [Mute];
|
expiredMute: [Mute];
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import * as events from "events";
|
import * as events from "events";
|
||||||
import { LogType } from "./LogType";
|
import { LogType } from "./LogType.js";
|
||||||
|
|
||||||
// Use the same instance for the same guild, even if a new instance is created
|
// Use the same instance for the same guild, even if a new instance is created
|
||||||
const guildInstances: Map<string, GuildLogs> = new Map();
|
const guildInstances: Map<string, GuildLogs> = new Map();
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { Blocker } from "../Blocker";
|
import { Blocker } from "../Blocker.js";
|
||||||
import { DBDateFormat, MINUTES } from "../utils";
|
import { DBDateFormat, MINUTES } from "../utils.js";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { MemberCacheItem } from "./entities/MemberCacheItem";
|
import { MemberCacheItem } from "./entities/MemberCacheItem.js";
|
||||||
|
|
||||||
const SAVE_PENDING_BLOCKER_KEY = "save-pending" as const;
|
const SAVE_PENDING_BLOCKER_KEY = "save-pending" as const;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm/index";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { MemberTimezone } from "./entities/MemberTimezone";
|
import { MemberTimezone } from "./entities/MemberTimezone.js";
|
||||||
|
|
||||||
export class GuildMemberTimezones extends BaseGuildRepository {
|
export class GuildMemberTimezones extends BaseGuildRepository {
|
||||||
protected memberTimezones: Repository<MemberTimezone>;
|
protected memberTimezones: Repository<MemberTimezone>;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Brackets, Repository } from "typeorm";
|
import { Brackets, Repository } from "typeorm";
|
||||||
import { DBDateFormat } from "../utils";
|
import { DBDateFormat } from "../utils.js";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { MuteTypes } from "./MuteTypes";
|
import { MuteTypes } from "./MuteTypes.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { Mute } from "./entities/Mute";
|
import { Mute } from "./entities/Mute.js";
|
||||||
|
|
||||||
export type AddMuteParams = {
|
export type AddMuteParams = {
|
||||||
userId: Mute["user_id"];
|
userId: Mute["user_id"];
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { In, Repository } from "typeorm";
|
import { In, Repository } from "typeorm";
|
||||||
import { isAPI } from "../globals";
|
import { isAPI } from "../globals.js";
|
||||||
import { MINUTES, SECONDS } from "../utils";
|
import { MINUTES, SECONDS } from "../utils.js";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { cleanupNicknames } from "./cleanup/nicknames";
|
import { cleanupNicknames } from "./cleanup/nicknames.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { NicknameHistoryEntry } from "./entities/NicknameHistoryEntry";
|
import { NicknameHistoryEntry } from "./entities/NicknameHistoryEntry.js";
|
||||||
|
|
||||||
const CLEANUP_INTERVAL = 5 * MINUTES;
|
const CLEANUP_INTERVAL = 5 * MINUTES;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { PersistedData } from "./entities/PersistedData";
|
import { PersistedData } from "./entities/PersistedData.js";
|
||||||
|
|
||||||
export class GuildPersistedData extends BaseGuildRepository {
|
export class GuildPersistedData extends BaseGuildRepository {
|
||||||
private persistedData: Repository<PersistedData>;
|
private persistedData: Repository<PersistedData>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { PingableRole } from "./entities/PingableRole";
|
import { PingableRole } from "./entities/PingableRole.js";
|
||||||
|
|
||||||
export class GuildPingableRoles extends BaseGuildRepository {
|
export class GuildPingableRoles extends BaseGuildRepository {
|
||||||
private pingableRoles: Repository<PingableRole>;
|
private pingableRoles: Repository<PingableRole>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { ReactionRole } from "./entities/ReactionRole";
|
import { ReactionRole } from "./entities/ReactionRole.js";
|
||||||
|
|
||||||
export class GuildReactionRoles extends BaseGuildRepository {
|
export class GuildReactionRoles extends BaseGuildRepository {
|
||||||
private reactionRoles: Repository<ReactionRole>;
|
private reactionRoles: Repository<ReactionRole>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { Reminder } from "./entities/Reminder";
|
import { Reminder } from "./entities/Reminder.js";
|
||||||
|
|
||||||
export class GuildReminders extends BaseGuildRepository {
|
export class GuildReminders extends BaseGuildRepository {
|
||||||
private reminders: Repository<Reminder>;
|
private reminders: Repository<Reminder>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { RoleButtonsItem } from "./entities/RoleButtonsItem";
|
import { RoleButtonsItem } from "./entities/RoleButtonsItem.js";
|
||||||
|
|
||||||
export class GuildRoleButtons extends BaseGuildRepository {
|
export class GuildRoleButtons extends BaseGuildRepository {
|
||||||
private roleButtons: Repository<RoleButtonsItem>;
|
private roleButtons: Repository<RoleButtonsItem>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { RoleQueueItem } from "./entities/RoleQueueItem";
|
import { RoleQueueItem } from "./entities/RoleQueueItem.js";
|
||||||
|
|
||||||
export class GuildRoleQueue extends BaseGuildRepository {
|
export class GuildRoleQueue extends BaseGuildRepository {
|
||||||
private roleQueue: Repository<RoleQueueItem>;
|
private roleQueue: Repository<RoleQueueItem>;
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
import { GuildChannel, Message } from "discord.js";
|
import { GuildChannel, Message } from "discord.js";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { QueuedEventEmitter } from "../QueuedEventEmitter";
|
import { QueuedEventEmitter } from "../QueuedEventEmitter.js";
|
||||||
import { noop } from "../utils";
|
import { noop } from "../utils.js";
|
||||||
import { asyncMap } from "../utils/async";
|
import { asyncMap } from "../utils/async.js";
|
||||||
import { decryptJson, encryptJson } from "../utils/cryptHelpers";
|
import { decryptJson, encryptJson } from "../utils/cryptHelpers.js";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { buildEntity } from "./buildEntity";
|
import { buildEntity } from "./buildEntity.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { ISavedMessageData, SavedMessage } from "./entities/SavedMessage";
|
import { ISavedMessageData, SavedMessage } from "./entities/SavedMessage.js";
|
||||||
|
|
||||||
export class GuildSavedMessages extends BaseGuildRepository<SavedMessage> {
|
export class GuildSavedMessages extends BaseGuildRepository<SavedMessage> {
|
||||||
private messages: Repository<SavedMessage>;
|
private messages: Repository<SavedMessage>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { ScheduledPost } from "./entities/ScheduledPost";
|
import { ScheduledPost } from "./entities/ScheduledPost.js";
|
||||||
|
|
||||||
export class GuildScheduledPosts extends BaseGuildRepository {
|
export class GuildScheduledPosts extends BaseGuildRepository {
|
||||||
private scheduledPosts: Repository<ScheduledPost>;
|
private scheduledPosts: Repository<ScheduledPost>;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { SlowmodeChannel } from "./entities/SlowmodeChannel";
|
import { SlowmodeChannel } from "./entities/SlowmodeChannel.js";
|
||||||
import { SlowmodeUser } from "./entities/SlowmodeUser";
|
import { SlowmodeUser } from "./entities/SlowmodeUser.js";
|
||||||
|
|
||||||
export class GuildSlowmodes extends BaseGuildRepository {
|
export class GuildSlowmodes extends BaseGuildRepository {
|
||||||
private slowmodeChannels: Repository<SlowmodeChannel>;
|
private slowmodeChannels: Repository<SlowmodeChannel>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { StarboardMessage } from "./entities/StarboardMessage";
|
import { StarboardMessage } from "./entities/StarboardMessage.js";
|
||||||
|
|
||||||
export class GuildStarboardMessages extends BaseGuildRepository {
|
export class GuildStarboardMessages extends BaseGuildRepository {
|
||||||
private allStarboardMessages: Repository<StarboardMessage>;
|
private allStarboardMessages: Repository<StarboardMessage>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { StarboardReaction } from "./entities/StarboardReaction";
|
import { StarboardReaction } from "./entities/StarboardReaction.js";
|
||||||
|
|
||||||
export class GuildStarboardReactions extends BaseGuildRepository {
|
export class GuildStarboardReactions extends BaseGuildRepository {
|
||||||
private allStarboardReactions: Repository<StarboardReaction>;
|
private allStarboardReactions: Repository<StarboardReaction>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { StatValue } from "./entities/StatValue";
|
import { StatValue } from "./entities/StatValue.js";
|
||||||
|
|
||||||
export class GuildStats extends BaseGuildRepository {
|
export class GuildStats extends BaseGuildRepository {
|
||||||
private stats: Repository<StatValue>;
|
private stats: Repository<StatValue>;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { Tag } from "./entities/Tag";
|
import { Tag } from "./entities/Tag.js";
|
||||||
import { TagResponse } from "./entities/TagResponse";
|
import { TagResponse } from "./entities/TagResponse.js";
|
||||||
|
|
||||||
export class GuildTags extends BaseGuildRepository {
|
export class GuildTags extends BaseGuildRepository {
|
||||||
private tags: Repository<Tag>;
|
private tags: Repository<Tag>;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { Tempban } from "./entities/Tempban";
|
import { Tempban } from "./entities/Tempban.js";
|
||||||
|
|
||||||
export class GuildTempbans extends BaseGuildRepository {
|
export class GuildTempbans extends BaseGuildRepository {
|
||||||
private tempbans: Repository<Tempban>;
|
private tempbans: Repository<Tempban>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseGuildRepository } from "./BaseGuildRepository";
|
import { BaseGuildRepository } from "./BaseGuildRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { VCAlert } from "./entities/VCAlert";
|
import { VCAlert } from "./entities/VCAlert.js";
|
||||||
|
|
||||||
export class GuildVCAlerts extends BaseGuildRepository {
|
export class GuildVCAlerts extends BaseGuildRepository {
|
||||||
private allAlerts: Repository<VCAlert>;
|
private allAlerts: Repository<VCAlert>;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { DAYS } from "../utils";
|
import { DAYS } from "../utils.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { MemberCacheItem } from "./entities/MemberCacheItem";
|
import { MemberCacheItem } from "./entities/MemberCacheItem.js";
|
||||||
|
|
||||||
const STALE_PERIOD = 90 * DAYS;
|
const STALE_PERIOD = 90 * DAYS;
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { DAYS, DBDateFormat } from "../utils";
|
import { DAYS, DBDateFormat } from "../utils.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { MuteTypes } from "./MuteTypes";
|
import { MuteTypes } from "./MuteTypes.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { Mute } from "./entities/Mute";
|
import { Mute } from "./entities/Mute.js";
|
||||||
|
|
||||||
const OLD_EXPIRED_MUTE_THRESHOLD = 7 * DAYS;
|
const OLD_EXPIRED_MUTE_THRESHOLD = 7 * DAYS;
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import crypto from "crypto";
|
import crypto from "crypto";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { env } from "../env";
|
import { env } from "../env.js";
|
||||||
import { DAYS, DBDateFormat, HOURS, MINUTES } from "../utils";
|
import { DAYS, DBDateFormat, HOURS, MINUTES } from "../utils.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { PhishermanCacheEntry } from "./entities/PhishermanCacheEntry";
|
import { PhishermanCacheEntry } from "./entities/PhishermanCacheEntry.js";
|
||||||
import { PhishermanKeyCacheEntry } from "./entities/PhishermanKeyCacheEntry";
|
import { PhishermanKeyCacheEntry } from "./entities/PhishermanKeyCacheEntry.js";
|
||||||
import { PhishermanDomainInfo, PhishermanUnknownDomain } from "./types/phisherman";
|
import { PhishermanDomainInfo, PhishermanUnknownDomain } from "./types/phisherman.js";
|
||||||
|
|
||||||
const API_URL = "https://api.phisherman.gg";
|
const API_URL = "https://api.phisherman.gg";
|
||||||
const MASTER_API_KEY = env.PHISHERMAN_API_KEY;
|
const MASTER_API_KEY = env.PHISHERMAN_API_KEY;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { DBDateFormat } from "../utils";
|
import { DBDateFormat } from "../utils.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { Reminder } from "./entities/Reminder";
|
import { Reminder } from "./entities/Reminder.js";
|
||||||
|
|
||||||
export class Reminders extends BaseRepository {
|
export class Reminders extends BaseRepository {
|
||||||
private reminders: Repository<Reminder>;
|
private reminders: Repository<Reminder>;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { DBDateFormat } from "../utils";
|
import { DBDateFormat } from "../utils.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { ScheduledPost } from "./entities/ScheduledPost";
|
import { ScheduledPost } from "./entities/ScheduledPost.js";
|
||||||
|
|
||||||
export class ScheduledPosts extends BaseRepository {
|
export class ScheduledPosts extends BaseRepository {
|
||||||
private scheduledPosts: Repository<ScheduledPost>;
|
private scheduledPosts: Repository<ScheduledPost>;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { Supporter } from "./entities/Supporter";
|
import { Supporter } from "./entities/Supporter.js";
|
||||||
|
|
||||||
export class Supporters extends BaseRepository {
|
export class Supporters extends BaseRepository {
|
||||||
private supporters: Repository<Supporter>;
|
private supporters: Repository<Supporter>;
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { DBDateFormat } from "../utils";
|
import { DBDateFormat } from "../utils.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { Tempban } from "./entities/Tempban";
|
import { Tempban } from "./entities/Tempban.js";
|
||||||
|
|
||||||
export class Tempbans extends BaseRepository {
|
export class Tempbans extends BaseRepository {
|
||||||
private tempbans: Repository<Tempban>;
|
private tempbans: Repository<Tempban>;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { In, Repository } from "typeorm";
|
import { In, Repository } from "typeorm";
|
||||||
import { isAPI } from "../globals";
|
import { isAPI } from "../globals.js";
|
||||||
import { MINUTES, SECONDS } from "../utils";
|
import { MINUTES, SECONDS } from "../utils.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { cleanupUsernames } from "./cleanup/usernames";
|
import { cleanupUsernames } from "./cleanup/usernames.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { UsernameHistoryEntry } from "./entities/UsernameHistoryEntry";
|
import { UsernameHistoryEntry } from "./entities/UsernameHistoryEntry.js";
|
||||||
|
|
||||||
const CLEANUP_INTERVAL = 5 * MINUTES;
|
const CLEANUP_INTERVAL = 5 * MINUTES;
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { DBDateFormat } from "../utils";
|
import { DBDateFormat } from "../utils.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { VCAlert } from "./entities/VCAlert";
|
import { VCAlert } from "./entities/VCAlert.js";
|
||||||
|
|
||||||
export class VCAlerts extends BaseRepository {
|
export class VCAlerts extends BaseRepository {
|
||||||
private allAlerts: Repository<VCAlert>;
|
private allAlerts: Repository<VCAlert>;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { decrypt, encrypt } from "../utils/crypt";
|
import { decrypt, encrypt } from "../utils/crypt.js";
|
||||||
import { BaseRepository } from "./BaseRepository";
|
import { BaseRepository } from "./BaseRepository.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { Webhook } from "./entities/Webhook";
|
import { Webhook } from "./entities/Webhook.js";
|
||||||
|
|
||||||
export class Webhooks extends BaseRepository {
|
export class Webhooks extends BaseRepository {
|
||||||
repository: Repository<Webhook> = dataSource.getRepository(Webhook);
|
repository: Repository<Webhook> = dataSource.getRepository(Webhook);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { ApiPermissionTypes } from "./ApiPermissionAssignments";
|
import { ApiPermissionTypes } from "./ApiPermissionAssignments.js";
|
||||||
|
|
||||||
export const AuditLogEventTypes = {
|
export const AuditLogEventTypes = {
|
||||||
ADD_API_PERMISSION: "ADD_API_PERMISSION" as const,
|
ADD_API_PERMISSION: "ADD_API_PERMISSION" as const,
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { In } from "typeorm";
|
import { In } from "typeorm";
|
||||||
import { DBDateFormat } from "../../utils";
|
import { DBDateFormat } from "../../utils.js";
|
||||||
import { dataSource } from "../dataSource";
|
import { dataSource } from "../dataSource.js";
|
||||||
import { Config } from "../entities/Config";
|
import { Config } from "../entities/Config.js";
|
||||||
|
|
||||||
const CLEAN_PER_LOOP = 50;
|
const CLEAN_PER_LOOP = 50;
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { In } from "typeorm";
|
import { In } from "typeorm";
|
||||||
import { DAYS, DBDateFormat, MINUTES, SECONDS, sleep } from "../../utils";
|
import { DAYS, DBDateFormat, MINUTES, SECONDS, sleep } from "../../utils.js";
|
||||||
import { dataSource } from "../dataSource";
|
import { dataSource } from "../dataSource.js";
|
||||||
import { SavedMessage } from "../entities/SavedMessage";
|
import { SavedMessage } from "../entities/SavedMessage.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* How long message edits, deletions, etc. will include the original message content.
|
* How long message edits, deletions, etc. will include the original message content.
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { In } from "typeorm";
|
import { In } from "typeorm";
|
||||||
import { DAYS, DBDateFormat } from "../../utils";
|
import { DAYS, DBDateFormat } from "../../utils.js";
|
||||||
import { dataSource } from "../dataSource";
|
import { dataSource } from "../dataSource.js";
|
||||||
import { NicknameHistoryEntry } from "../entities/NicknameHistoryEntry";
|
import { NicknameHistoryEntry } from "../entities/NicknameHistoryEntry.js";
|
||||||
|
|
||||||
export const NICKNAME_RETENTION_PERIOD = 30 * DAYS;
|
export const NICKNAME_RETENTION_PERIOD = 30 * DAYS;
|
||||||
const CLEAN_PER_LOOP = 500;
|
const CLEAN_PER_LOOP = 500;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { In } from "typeorm";
|
import { In } from "typeorm";
|
||||||
import { DAYS, DBDateFormat } from "../../utils";
|
import { DAYS, DBDateFormat } from "../../utils.js";
|
||||||
import { dataSource } from "../dataSource";
|
import { dataSource } from "../dataSource.js";
|
||||||
import { UsernameHistoryEntry } from "../entities/UsernameHistoryEntry";
|
import { UsernameHistoryEntry } from "../entities/UsernameHistoryEntry.js";
|
||||||
|
|
||||||
export const USERNAME_RETENTION_PERIOD = 30 * DAYS;
|
export const USERNAME_RETENTION_PERIOD = 30 * DAYS;
|
||||||
const CLEAN_PER_LOOP = 500;
|
const CLEAN_PER_LOOP = 500;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { DataSource } from "typeorm";
|
import { DataSource } from "typeorm";
|
||||||
import { env } from "../env";
|
import { env } from "../env.js";
|
||||||
import { backendDir } from "../paths";
|
import { backendDir } from "../paths.js";
|
||||||
|
|
||||||
moment.tz.setDefault("UTC");
|
moment.tz.setDefault("UTC");
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { SimpleError } from "../SimpleError";
|
import { SimpleError } from "../SimpleError.js";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
|
|
||||||
let connectionPromise: Promise<void>;
|
let connectionPromise: Promise<void>;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { Column, Entity, PrimaryColumn } from "typeorm";
|
import { Column, Entity, PrimaryColumn } from "typeorm";
|
||||||
import { AuditLogEventData, AuditLogEventType } from "../apiAuditLogTypes";
|
import { AuditLogEventData, AuditLogEventType } from "../apiAuditLogTypes.js";
|
||||||
|
|
||||||
@Entity("api_audit_log")
|
@Entity("api_audit_log")
|
||||||
export class ApiAuditLogEntry<TEventType extends AuditLogEventType> {
|
export class ApiAuditLogEntry<TEventType extends AuditLogEventType> {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm";
|
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn, Relation } from "typeorm";
|
||||||
import { ApiUserInfo } from "./ApiUserInfo";
|
import { ApiUserInfo } from "./ApiUserInfo.js";
|
||||||
|
|
||||||
@Entity("api_logins")
|
@Entity("api_logins")
|
||||||
export class ApiLogin {
|
export class ApiLogin {
|
||||||
|
@ -21,5 +21,5 @@ export class ApiLogin {
|
||||||
|
|
||||||
@ManyToOne(() => ApiUserInfo, (userInfo) => userInfo.logins)
|
@ManyToOne(() => ApiUserInfo, (userInfo) => userInfo.logins)
|
||||||
@JoinColumn({ name: "user_id" })
|
@JoinColumn({ name: "user_id" })
|
||||||
userInfo: ApiUserInfo;
|
userInfo: Relation<ApiUserInfo>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm";
|
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm";
|
||||||
import { ApiPermissionTypes } from "../ApiPermissionAssignments";
|
import { ApiPermissionTypes } from "../ApiPermissionAssignments.js";
|
||||||
import { ApiUserInfo } from "./ApiUserInfo";
|
import { ApiUserInfo } from "./ApiUserInfo.js";
|
||||||
|
|
||||||
@Entity("api_permissions")
|
@Entity("api_permissions")
|
||||||
export class ApiPermissionAssignment {
|
export class ApiPermissionAssignment {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { Column, Entity, OneToMany, PrimaryColumn } from "typeorm";
|
import { Column, Entity, OneToMany, PrimaryColumn, Relation } from "typeorm";
|
||||||
import { ApiLogin } from "./ApiLogin";
|
import { ApiLogin } from "./ApiLogin.js";
|
||||||
import { ApiPermissionAssignment } from "./ApiPermissionAssignment";
|
import { ApiPermissionAssignment } from "./ApiPermissionAssignment.js";
|
||||||
|
|
||||||
export interface ApiUserInfoData {
|
export interface ApiUserInfoData {
|
||||||
username: string;
|
username: string;
|
||||||
|
@ -21,8 +21,8 @@ export class ApiUserInfo {
|
||||||
updated_at: string;
|
updated_at: string;
|
||||||
|
|
||||||
@OneToMany(() => ApiLogin, (login) => login.userInfo)
|
@OneToMany(() => ApiLogin, (login) => login.userInfo)
|
||||||
logins: ApiLogin[];
|
logins: Relation<ApiLogin[]>;
|
||||||
|
|
||||||
@OneToMany(() => ApiPermissionAssignment, (p) => p.userInfo)
|
@OneToMany(() => ApiPermissionAssignment, (p) => p.userInfo)
|
||||||
permissionAssignments: ApiPermissionAssignment[];
|
permissionAssignments: Relation<ApiPermissionAssignment[]>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm";
|
import { Column, Entity, OneToMany, PrimaryGeneratedColumn, Relation } from "typeorm";
|
||||||
import { CaseNote } from "./CaseNote";
|
import { CaseNote } from "./CaseNote.js";
|
||||||
|
|
||||||
@Entity("cases")
|
@Entity("cases")
|
||||||
export class Case {
|
export class Case {
|
||||||
|
@ -36,5 +36,5 @@ export class Case {
|
||||||
@Column({ type: String, nullable: true }) log_message_id: string | null;
|
@Column({ type: String, nullable: true }) log_message_id: string | null;
|
||||||
|
|
||||||
@OneToMany(() => CaseNote, (note) => note.case)
|
@OneToMany(() => CaseNote, (note) => note.case)
|
||||||
notes: CaseNote[];
|
notes: Relation<CaseNote[]>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
|
import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn, Relation } from "typeorm";
|
||||||
import { Case } from "./Case";
|
import { Case } from "./Case.js";
|
||||||
|
|
||||||
@Entity("case_notes")
|
@Entity("case_notes")
|
||||||
export class CaseNote {
|
export class CaseNote {
|
||||||
|
@ -17,5 +17,5 @@ export class CaseNote {
|
||||||
|
|
||||||
@ManyToOne(() => Case, (theCase) => theCase.notes)
|
@ManyToOne(() => Case, (theCase) => theCase.notes)
|
||||||
@JoinColumn({ name: "case_id" })
|
@JoinColumn({ name: "case_id" })
|
||||||
case: Case;
|
case: Relation<Case>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm";
|
import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm";
|
||||||
import { ApiUserInfo } from "./ApiUserInfo";
|
import { ApiUserInfo } from "./ApiUserInfo.js";
|
||||||
|
|
||||||
@Entity("configs")
|
@Entity("configs")
|
||||||
export class Config {
|
export class Config {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { Column, Entity, PrimaryColumn } from "typeorm";
|
import { Column, Entity, PrimaryColumn } from "typeorm";
|
||||||
import { PhishermanDomainInfo } from "../types/phisherman";
|
import { PhishermanDomainInfo } from "../types/phisherman.js";
|
||||||
|
|
||||||
@Entity("phisherman_cache")
|
@Entity("phisherman_cache")
|
||||||
export class PhishermanCacheEntry {
|
export class PhishermanCacheEntry {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Snowflake, StickerFormatType, StickerType } from "discord.js";
|
import { EmbedType, Snowflake, StickerFormatType, StickerType } from "discord.js";
|
||||||
import { Column, Entity, PrimaryColumn } from "typeorm";
|
import { Column, Entity, PrimaryColumn } from "typeorm";
|
||||||
|
|
||||||
export interface ISavedMessageAttachmentData {
|
export interface ISavedMessageAttachmentData {
|
||||||
|
@ -14,6 +14,7 @@ export interface ISavedMessageAttachmentData {
|
||||||
|
|
||||||
export interface ISavedMessageEmbedData {
|
export interface ISavedMessageEmbedData {
|
||||||
title: string | null;
|
title: string | null;
|
||||||
|
type?: EmbedType;
|
||||||
description: string | null;
|
description: string | null;
|
||||||
url: string | null;
|
url: string | null;
|
||||||
timestamp: number | null;
|
timestamp: number | null;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { Attachment } from "discord.js";
|
import { Attachment } from "discord.js";
|
||||||
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
|
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
|
||||||
import { StrictMessageContent } from "../../utils";
|
import { StrictMessageContent } from "../../utils.js";
|
||||||
|
|
||||||
@Entity("scheduled_posts")
|
@Entity("scheduled_posts")
|
||||||
export class ScheduledPost {
|
export class ScheduledPost {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { Column, Entity, JoinColumn, OneToOne, PrimaryColumn } from "typeorm";
|
import { Column, Entity, JoinColumn, OneToOne, PrimaryColumn } from "typeorm";
|
||||||
import { SavedMessage } from "./SavedMessage";
|
import { SavedMessage } from "./SavedMessage.js";
|
||||||
|
|
||||||
@Entity("starboard_messages")
|
@Entity("starboard_messages")
|
||||||
export class StarboardMessage {
|
export class StarboardMessage {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { Column, Entity, JoinColumn, OneToOne, PrimaryColumn } from "typeorm";
|
import { Column, Entity, JoinColumn, OneToOne, PrimaryColumn } from "typeorm";
|
||||||
import { SavedMessage } from "./SavedMessage";
|
import { SavedMessage } from "./SavedMessage.js";
|
||||||
|
|
||||||
@Entity("starboard_reactions")
|
@Entity("starboard_reactions")
|
||||||
export class StarboardReaction {
|
export class StarboardReaction {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { Repository } from "typeorm";
|
import { Repository } from "typeorm";
|
||||||
import { dataSource } from "./dataSource";
|
import { dataSource } from "./dataSource.js";
|
||||||
import { SavedMessage } from "./entities/SavedMessage";
|
import { SavedMessage } from "./entities/SavedMessage.js";
|
||||||
|
|
||||||
let repository: Repository<SavedMessage>;
|
let repository: Repository<SavedMessage>;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// tslint:disable:no-console
|
// tslint:disable:no-console
|
||||||
|
|
||||||
import { lazyMemoize, MINUTES } from "../../utils";
|
import { lazyMemoize, MINUTES } from "../../utils.js";
|
||||||
import { Archives } from "../Archives";
|
import { Archives } from "../Archives.js";
|
||||||
|
|
||||||
const LOOP_INTERVAL = 15 * MINUTES;
|
const LOOP_INTERVAL = 15 * MINUTES;
|
||||||
const getArchivesRepository = lazyMemoize(() => new Archives());
|
const getArchivesRepository = lazyMemoize(() => new Archives());
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// tslint:disable:no-console
|
// tslint:disable:no-console
|
||||||
|
|
||||||
import { HOURS, lazyMemoize } from "../../utils";
|
import { HOURS, lazyMemoize } from "../../utils.js";
|
||||||
import { MemberCache } from "../MemberCache";
|
import { MemberCache } from "../MemberCache.js";
|
||||||
|
|
||||||
const LOOP_INTERVAL = 6 * HOURS;
|
const LOOP_INTERVAL = 6 * HOURS;
|
||||||
const getMemberCacheRepository = lazyMemoize(() => new MemberCache());
|
const getMemberCacheRepository = lazyMemoize(() => new MemberCache());
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
// tslint:disable:no-console
|
// tslint:disable:no-console
|
||||||
|
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { lazyMemoize, MINUTES, SECONDS } from "../../utils";
|
import { lazyMemoize, MINUTES, SECONDS } from "../../utils.js";
|
||||||
import { Mute } from "../entities/Mute";
|
import { Mute } from "../entities/Mute.js";
|
||||||
import { emitGuildEvent, hasGuildEventListener } from "../GuildEvents";
|
import { emitGuildEvent, hasGuildEventListener } from "../GuildEvents.js";
|
||||||
import { Mutes, TIMEOUT_RENEWAL_THRESHOLD } from "../Mutes";
|
import { Mutes, TIMEOUT_RENEWAL_THRESHOLD } from "../Mutes.js";
|
||||||
import Timeout = NodeJS.Timeout;
|
import Timeout = NodeJS.Timeout;
|
||||||
|
|
||||||
const LOOP_INTERVAL = 15 * MINUTES;
|
const LOOP_INTERVAL = 15 * MINUTES;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
// tslint:disable:no-console
|
// tslint:disable:no-console
|
||||||
|
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { lazyMemoize, MINUTES } from "../../utils";
|
import { lazyMemoize, MINUTES } from "../../utils.js";
|
||||||
import { Tempban } from "../entities/Tempban";
|
import { Tempban } from "../entities/Tempban.js";
|
||||||
import { emitGuildEvent, hasGuildEventListener } from "../GuildEvents";
|
import { emitGuildEvent, hasGuildEventListener } from "../GuildEvents.js";
|
||||||
import { Tempbans } from "../Tempbans";
|
import { Tempbans } from "../Tempbans.js";
|
||||||
import Timeout = NodeJS.Timeout;
|
import Timeout = NodeJS.Timeout;
|
||||||
|
|
||||||
const LOOP_INTERVAL = 15 * MINUTES;
|
const LOOP_INTERVAL = 15 * MINUTES;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
// tslint:disable:no-console
|
// tslint:disable:no-console
|
||||||
|
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { lazyMemoize, MINUTES } from "../../utils";
|
import { lazyMemoize, MINUTES } from "../../utils.js";
|
||||||
import { VCAlert } from "../entities/VCAlert";
|
import { VCAlert } from "../entities/VCAlert.js";
|
||||||
import { emitGuildEvent, hasGuildEventListener } from "../GuildEvents";
|
import { emitGuildEvent, hasGuildEventListener } from "../GuildEvents.js";
|
||||||
import { VCAlerts } from "../VCAlerts";
|
import { VCAlerts } from "../VCAlerts.js";
|
||||||
import Timeout = NodeJS.Timeout;
|
import Timeout = NodeJS.Timeout;
|
||||||
|
|
||||||
const LOOP_INTERVAL = 15 * MINUTES;
|
const LOOP_INTERVAL = 15 * MINUTES;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// tslint:disable:no-console
|
// tslint:disable:no-console
|
||||||
|
|
||||||
import { lazyMemoize, MINUTES } from "../../utils";
|
import { lazyMemoize, MINUTES } from "../../utils.js";
|
||||||
import { MemberCache } from "../MemberCache";
|
import { MemberCache } from "../MemberCache.js";
|
||||||
|
|
||||||
const LOOP_INTERVAL = 5 * MINUTES;
|
const LOOP_INTERVAL = 5 * MINUTES;
|
||||||
const getMemberCacheRepository = lazyMemoize(() => new MemberCache());
|
const getMemberCacheRepository = lazyMemoize(() => new MemberCache());
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
// tslint:disable:no-console
|
// tslint:disable:no-console
|
||||||
|
|
||||||
import { MINUTES } from "../../utils";
|
import { MINUTES } from "../../utils.js";
|
||||||
import {
|
import {
|
||||||
deleteStalePhishermanCacheEntries,
|
deleteStalePhishermanCacheEntries,
|
||||||
deleteStalePhishermanKeyCacheEntries,
|
deleteStalePhishermanKeyCacheEntries,
|
||||||
reportTrackedDomainsToPhisherman,
|
reportTrackedDomainsToPhisherman,
|
||||||
} from "../Phisherman";
|
} from "../Phisherman.js";
|
||||||
|
|
||||||
const CACHE_CLEANUP_LOOP_INTERVAL = 15 * MINUTES;
|
const CACHE_CLEANUP_LOOP_INTERVAL = 15 * MINUTES;
|
||||||
const REPORT_LOOP_INTERVAL = 15 * MINUTES;
|
const REPORT_LOOP_INTERVAL = 15 * MINUTES;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// tslint:disable:no-console
|
// tslint:disable:no-console
|
||||||
|
|
||||||
import { MINUTES } from "../../utils";
|
import { MINUTES } from "../../utils.js";
|
||||||
import { cleanupMessages } from "../cleanup/messages";
|
import { cleanupMessages } from "../cleanup/messages.js";
|
||||||
|
|
||||||
const LOOP_INTERVAL = 5 * MINUTES;
|
const LOOP_INTERVAL = 5 * MINUTES;
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
// tslint:disable:no-console
|
// tslint:disable:no-console
|
||||||
|
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { lazyMemoize, MINUTES } from "../../utils";
|
import { lazyMemoize, MINUTES } from "../../utils.js";
|
||||||
import { Reminder } from "../entities/Reminder";
|
import { Reminder } from "../entities/Reminder.js";
|
||||||
import { emitGuildEvent, hasGuildEventListener } from "../GuildEvents";
|
import { emitGuildEvent, hasGuildEventListener } from "../GuildEvents.js";
|
||||||
import { Reminders } from "../Reminders";
|
import { Reminders } from "../Reminders.js";
|
||||||
import Timeout = NodeJS.Timeout;
|
import Timeout = NodeJS.Timeout;
|
||||||
|
|
||||||
const LOOP_INTERVAL = 15 * MINUTES;
|
const LOOP_INTERVAL = 15 * MINUTES;
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
// tslint:disable:no-console
|
// tslint:disable:no-console
|
||||||
|
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { lazyMemoize, MINUTES } from "../../utils";
|
import { lazyMemoize, MINUTES } from "../../utils.js";
|
||||||
import { ScheduledPost } from "../entities/ScheduledPost";
|
import { ScheduledPost } from "../entities/ScheduledPost.js";
|
||||||
import { emitGuildEvent, hasGuildEventListener } from "../GuildEvents";
|
import { emitGuildEvent, hasGuildEventListener } from "../GuildEvents.js";
|
||||||
import { ScheduledPosts } from "../ScheduledPosts";
|
import { ScheduledPosts } from "../ScheduledPosts.js";
|
||||||
import Timeout = NodeJS.Timeout;
|
import Timeout = NodeJS.Timeout;
|
||||||
|
|
||||||
const LOOP_INTERVAL = 15 * MINUTES;
|
const LOOP_INTERVAL = 15 * MINUTES;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { AdvancedConsoleLogger } from "typeorm/logger/AdvancedConsoleLogger";
|
import { AdvancedConsoleLogger } from "typeorm";
|
||||||
|
|
||||||
let groupedQueryStats: Map<string, number> = new Map();
|
let groupedQueryStats: Map<string, number> = new Map();
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ import dotenv from "dotenv";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import { rootDir } from "./paths";
|
import { rootDir } from "./paths.js";
|
||||||
|
|
||||||
const envType = z.object({
|
const envType = z.object({
|
||||||
KEY: z.string().length(32),
|
KEY: z.string().length(32),
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import zodToJsonSchema from "zod-to-json-schema";
|
import { zodToJsonSchema } from "zod-to-json-schema";
|
||||||
import { guildPluginInfo } from "./plugins/pluginInfo";
|
import { guildPluginInfo } from "./plugins/pluginInfo.js";
|
||||||
import { zZeppelinGuildConfig } from "./types";
|
import { zZeppelinGuildConfig } from "./types.js";
|
||||||
|
|
||||||
const pluginSchemaMap = Object.entries(guildPluginInfo).reduce((map, [pluginName, pluginInfo]) => {
|
const pluginSchemaMap = Object.entries(guildPluginInfo).reduce((map, [pluginName, pluginInfo]) => {
|
||||||
if (pluginInfo.configSchema) {
|
if (pluginInfo.configSchema) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// KEEP THIS AS FIRST IMPORT
|
// KEEP THIS AS FIRST IMPORT
|
||||||
// See comment in module for details
|
// See comment in module for details
|
||||||
import "./threadsSignalFix";
|
import "./threadsSignalFix.js";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Client,
|
Client,
|
||||||
|
@ -17,37 +17,37 @@ import { Knub, PluginError, PluginLoadError, PluginNotLoadedError } from "knub";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import { performance } from "perf_hooks";
|
import { performance } from "perf_hooks";
|
||||||
import process from "process";
|
import process from "process";
|
||||||
import { DiscordJSError } from "./DiscordJSError";
|
import { DiscordJSError } from "./DiscordJSError.js";
|
||||||
import { RecoverablePluginError } from "./RecoverablePluginError";
|
import { RecoverablePluginError } from "./RecoverablePluginError.js";
|
||||||
import { SimpleError } from "./SimpleError";
|
import { SimpleError } from "./SimpleError.js";
|
||||||
import { AllowedGuilds } from "./data/AllowedGuilds";
|
import { AllowedGuilds } from "./data/AllowedGuilds.js";
|
||||||
import { Configs } from "./data/Configs";
|
import { Configs } from "./data/Configs.js";
|
||||||
import { GuildLogs } from "./data/GuildLogs";
|
import { GuildLogs } from "./data/GuildLogs.js";
|
||||||
import { LogType } from "./data/LogType";
|
import { LogType } from "./data/LogType.js";
|
||||||
import { hasPhishermanMasterAPIKey } from "./data/Phisherman";
|
import { hasPhishermanMasterAPIKey } from "./data/Phisherman.js";
|
||||||
import { dataSource } from "./data/dataSource";
|
import { dataSource } from "./data/dataSource.js";
|
||||||
import { connect } from "./data/db";
|
import { connect } from "./data/db.js";
|
||||||
import { runExpiredArchiveDeletionLoop } from "./data/loops/expiredArchiveDeletionLoop";
|
import { runExpiredArchiveDeletionLoop } from "./data/loops/expiredArchiveDeletionLoop.js";
|
||||||
import { runExpiredMemberCacheDeletionLoop } from "./data/loops/expiredMemberCacheDeletionLoop";
|
import { runExpiredMemberCacheDeletionLoop } from "./data/loops/expiredMemberCacheDeletionLoop.js";
|
||||||
import { runExpiringMutesLoop } from "./data/loops/expiringMutesLoop";
|
import { runExpiringMutesLoop } from "./data/loops/expiringMutesLoop.js";
|
||||||
import { runExpiringTempbansLoop } from "./data/loops/expiringTempbansLoop";
|
import { runExpiringTempbansLoop } from "./data/loops/expiringTempbansLoop.js";
|
||||||
import { runExpiringVCAlertsLoop } from "./data/loops/expiringVCAlertsLoop";
|
import { runExpiringVCAlertsLoop } from "./data/loops/expiringVCAlertsLoop.js";
|
||||||
import { runMemberCacheDeletionLoop } from "./data/loops/memberCacheDeletionLoop";
|
import { runMemberCacheDeletionLoop } from "./data/loops/memberCacheDeletionLoop.js";
|
||||||
import { runPhishermanCacheCleanupLoop, runPhishermanReportingLoop } from "./data/loops/phishermanLoops";
|
import { runPhishermanCacheCleanupLoop, runPhishermanReportingLoop } from "./data/loops/phishermanLoops.js";
|
||||||
import { runSavedMessageCleanupLoop } from "./data/loops/savedMessageCleanupLoop";
|
import { runSavedMessageCleanupLoop } from "./data/loops/savedMessageCleanupLoop.js";
|
||||||
import { runUpcomingRemindersLoop } from "./data/loops/upcomingRemindersLoop";
|
import { runUpcomingRemindersLoop } from "./data/loops/upcomingRemindersLoop.js";
|
||||||
import { runUpcomingScheduledPostsLoop } from "./data/loops/upcomingScheduledPostsLoop";
|
import { runUpcomingScheduledPostsLoop } from "./data/loops/upcomingScheduledPostsLoop.js";
|
||||||
import { consumeQueryStats } from "./data/queryLogger";
|
import { consumeQueryStats } from "./data/queryLogger.js";
|
||||||
import { env } from "./env";
|
import { env } from "./env.js";
|
||||||
import { logger } from "./logger";
|
import { logger } from "./logger.js";
|
||||||
import { baseGuildPlugins, globalPlugins, guildPlugins } from "./plugins/availablePlugins";
|
import { baseGuildPlugins, globalPlugins, guildPlugins } from "./plugins/availablePlugins.js";
|
||||||
import { setProfiler } from "./profiler";
|
import { setProfiler } from "./profiler.js";
|
||||||
import { logRateLimit } from "./rateLimitStats";
|
import { logRateLimit } from "./rateLimitStats.js";
|
||||||
import { startUptimeCounter } from "./uptime";
|
import { startUptimeCounter } from "./uptime.js";
|
||||||
import { MINUTES, SECONDS, errorMessage, isDiscordAPIError, isDiscordHTTPError, sleep, successMessage } from "./utils";
|
import { MINUTES, SECONDS, errorMessage, isDiscordAPIError, isDiscordHTTPError, sleep, successMessage } from "./utils.js";
|
||||||
import { DecayingCounter } from "./utils/DecayingCounter";
|
import { DecayingCounter } from "./utils/DecayingCounter.js";
|
||||||
import { enableProfiling } from "./utils/easyProfiler";
|
import { enableProfiling } from "./utils/easyProfiler.js";
|
||||||
import { loadYamlSafely } from "./utils/loadYamlSafely";
|
import { loadYamlSafely } from "./utils/loadYamlSafely.js";
|
||||||
|
|
||||||
// Error handling
|
// Error handling
|
||||||
let recentPluginErrors = 0;
|
let recentPluginErrors = 0;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue