initial commit

This commit is contained in:
Badstagram 2025-11-26 15:13:59 +00:00
commit d0e00292e6
9 changed files with 275 additions and 0 deletions

29
.gitignore vendored Normal file
View File

@ -0,0 +1,29 @@
# Ignore a blackhole and the folder for development
node_modules/
.vs/
.idea/
*.iml
# Yarn files
.yarn/install-state.gz
.yarn/build-state.yml
# Environment variables
.DS_Store
dist/
# Ignore the config file (contains sensitive information such as tokens)
config.ts
# Ignore heapsnapshot and log files
*.heapsnapshot
*.log
# Ignore npm lockfiles file
package-lock.json
# Environment variables
.env*
/src/generated/prisma
config.toml

61
package.json Normal file
View File

@ -0,0 +1,61 @@
{
"name": "@aurorabot/plugin-automod",
"description": "Automod plugin for Aurora",
"version": "1.0.2",
"private": false,
"type": "module",
"main": "dist/cjs/index.cjs",
"module": "dist/esm/index.mjs",
"types": "dist/cjs/index.d.cts",
"publishConfig": {
"access": "public"
},
"files": [
"dist"
],
"scripts": {
"test": "vitest run",
"test:watch": "vitest",
"build": "tsdown",
"clean": "rm -rf ./dist; rm aurorabot-plugin-automod-*.tgz"
},
"exports": {
".": {
"import": {
"types": "./dist/esm/index.d.mts",
"default": "./dist/esm/index.mjs"
},
"require": {
"types": "./dist/cjs/index.d.cts",
"default": "./dist/cjs/index.cjs"
}
},
"./register": {
"import": {
"types": "./dist/esm/register.d.mts",
"default": "./dist/esm/register.mjs"
},
"require": {
"types": "./dist/cjs/register.d.cts",
"default": "./dist/cjs/register.cjs"
}
}
},
"repository": {
"type": "git",
"url": "https://git.badstagram.gay/aurora/plugin-automod"
},
"author": "Badstagram",
"license": "MIT",
"bugs": {
"url": "https://git.badstagram.gay/aurora/plugin-automod/issues"
},
"homepage": "https://git.badstagram.gay/aurora/plugin-automod",
"devDependencies": {
"@sapphire/framework": "^5.4.0",
"@types/node": "^24.10.1",
"discord.js": "^14.25.1",
"tsdown": "^0.16.7",
"typescript": "^5.9.3"
}
}

50
src/Structures/AutoMod.ts Normal file
View File

@ -0,0 +1,50 @@
import {
Piece,
Precondition,
PreconditionError,
Result,
UserError,
} from "@sapphire/framework";
import { type Awaitable, Message } from "discord.js";
import { AutomodError } from "./AutoModError.js";
export type AutoModResult = Awaitable<Result<unknown, UserError>>;
export abstract class AutoMod<
Options extends AutoMod.Options = AutoMod.Options
> extends Piece<Options, "automod"> {
constructor(ctx: AutoMod.LoaderContext, opts: AutoMod.Options) {
super(ctx, opts);
}
public abstract run(message: Message): Awaitable<AutoMod.Result>;
public ok(): Precondition.Result {
return Result.ok();
}
/**
* Constructs a {@link PreconditionError} with the precondition parameter set to `this`.
* @param options The information.
*/
public error(
options: Omit<PreconditionError.Options, "precondition"> = {}
): Precondition.Result {
return Result.err(new AutomodError({ automod: this, ...options }));
}
}
export interface AutoModOptions extends Piece.Options {
name: string;
}
// eslint-disable-next-line @typescript-eslint/no-namespace
export namespace AutoMod {
/** @deprecated Use {@linkcode LoaderContext} instead. */
export type Context = LoaderContext; // NOSONAR
export type LoaderContext = Piece.LoaderContext<"automod">;
export type Options = AutoModOptions;
export type JSON = Piece.JSON;
export type LocationJSON = Piece.LocationJSON;
export type Result = AutoModResult;
}

View File

@ -0,0 +1,40 @@
import { UserError } from '@sapphire/framework';
import { AutoMod } from './AutoMod.js';
export class AutomodError extends UserError {
public readonly automod: AutoMod;
public constructor(options: AutomodError.Options) {
super({
...options,
identifier: options.identifier ?? options.automod.name
});
this.automod = options.automod;
}
public override get name(): string {
return 'AutomodError';
}
}
// eslint-disable-next-line @typescript-eslint/no-namespace
export namespace AutomodError {
/**
* The options for {@link PreconditionError}.
* @since 1.0.0
*/
export interface Options extends Omit<UserError.Options, 'identifier'> {
/**
* The automod that caused the error.
* @since 1.0.0
*/
automod: AutoMod;
/**
* The identifier.
* @since 1.0.0
* @default precondition.name
*/
identifier?: string;
}
}

View File

@ -0,0 +1,13 @@
import { Store } from '@sapphire/framework';
import { AutoMod } from './AutoMod.js';
export class AutoModStore extends Store<AutoMod, 'automod'> {
/**
*
*/
constructor() {
super(AutoMod, {
name: 'automod'
});
}
}

10
src/index.ts Normal file
View File

@ -0,0 +1,10 @@
import { AutoModStore } from './Structures/AutoModStore.js';
export * from './Structures/AutoMod.js';
export * from './Structures/AutoModStore.js';
declare module '@sapphire/pieces' {
interface StoreRegistryEntries {
automod: AutoModStore;
}
}

15
src/register.ts Normal file
View File

@ -0,0 +1,15 @@
import './index.js';
import { Plugin, preInitialization, SapphireClient } from '@sapphire/framework';
import { AutoModStore } from './Structures/AutoModStore.js';
export class AutoModPlugin extends Plugin {
public static override [preInitialization](this: SapphireClient): void {
this.stores.register(new AutoModStore());
}
}
try {
SapphireClient.plugins.registerPreInitializationHook(AutoModPlugin[preInitialization], 'AutoMod-PreInitialization');
} catch (e) {
console.error(e);
}

29
tsconfig.json Normal file
View File

@ -0,0 +1,29 @@
{
"compilerOptions": {
// Environment setup & latest features
"lib": ["ESNext"],
"target": "ESNext",
"module": "Preserve",
"moduleDetection": "force",
"jsx": "react-jsx",
"allowJs": true,
// Bundler mode
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"verbatimModuleSyntax": true,
"noEmit": true,
// Best practices
"strict": true,
"skipLibCheck": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
// Some stricter flags (disabled by default)
"noUnusedLocals": false,
"noUnusedParameters": false,
"noPropertyAccessFromIndexSignature": false
}
}

28
tsdown.config.ts Normal file
View File

@ -0,0 +1,28 @@
import { defineConfig, type UserConfig } from "tsdown";
const baseOptions: UserConfig = {
clean: true,
entry: ["src/**/*.ts"],
dts: true,
minify: false,
skipNodeModulesBundle: true,
sourcemap: true,
target: "es2021",
tsconfig: "tsconfig.json",
keepNames: true,
treeshake: true,
};
export default [
defineConfig({
...baseOptions,
outDir: "dist/cjs",
format: "cjs",
outExtension: () => ({ js: ".cjs" }),
}),
defineConfig({
...baseOptions,
outDir: "dist/esm",
format: "esm",
}),
];