refactor: initial moves

This commit is contained in:
syntaxbullet
2026-01-08 16:09:26 +01:00
parent 53a2f1ff0c
commit 88b266f81b
164 changed files with 529 additions and 280 deletions

5
.gitignore vendored
View File

@@ -1,7 +1,8 @@
.env .env
node_modules node_modules
db-logs shared/db-logs
db-data shared/db/data
shared/db/loga
.cursor .cursor
# dependencies (bun install) # dependencies (bun install)

View File

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@@ -1,6 +1,6 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js";
import { ModerationService } from "@/modules/moderation/moderation.service"; import { ModerationService } from "@shared/modules/moderation/moderation.service";
import { getCaseEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view"; import { getCaseEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view";
export const moderationCase = createCommand({ export const moderationCase = createCommand({

View File

@@ -1,6 +1,6 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js";
import { ModerationService } from "@/modules/moderation/moderation.service"; import { ModerationService } from "@shared/modules/moderation/moderation.service";
import { getCasesListEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view"; import { getCasesListEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view";
export const cases = createCommand({ export const cases = createCommand({

View File

@@ -1,6 +1,6 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js";
import { ModerationService } from "@/modules/moderation/moderation.service"; import { ModerationService } from "@shared/modules/moderation/moderation.service";
import { getClearSuccessEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view"; import { getClearSuccessEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view";
export const clearwarning = createCommand({ export const clearwarning = createCommand({

View File

@@ -1,4 +1,4 @@
import { createCommand } from "@lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, ModalBuilder, TextInputBuilder, TextInputStyle, ActionRowBuilder, ModalSubmitInteraction } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, ModalBuilder, TextInputBuilder, TextInputStyle, ActionRowBuilder, ModalSubmitInteraction } from "discord.js";
import { config, saveConfig } from "@lib/config"; import { config, saveConfig } from "@lib/config";
import type { GameConfigType } from "@lib/config"; import type { GameConfigType } from "@lib/config";

View File

@@ -1,8 +1,8 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, AttachmentBuilder } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, AttachmentBuilder } from "discord.js";
import { config, saveConfig } from "@/lib/config"; import { config, saveConfig } from "@/lib/config";
import { DrizzleClient } from "@/lib/DrizzleClient"; import { DrizzleClient } from "@shared/db/DrizzleClient";
import { items } from "@/db/schema"; import { items } from "@db/schema";
import { createSuccessEmbed, createErrorEmbed } from "@lib/embeds"; import { createSuccessEmbed, createErrorEmbed } from "@lib/embeds";
export const createColor = createCommand({ export const createColor = createCommand({

View File

@@ -1,4 +1,4 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js";
import { renderWizard } from "@/modules/admin/item_wizard"; import { renderWizard } from "@/modules/admin/item_wizard";

View File

@@ -1,4 +1,4 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js";
import { createBaseEmbed } from "@lib/embeds"; import { createBaseEmbed } from "@lib/embeds";
import { configManager } from "@/lib/configManager"; import { configManager } from "@/lib/configManager";

View File

@@ -5,7 +5,7 @@ import { AuroraClient } from "@/lib/BotClient";
// Mock DrizzleClient // Mock DrizzleClient
const executeMock = mock(() => Promise.resolve()); const executeMock = mock(() => Promise.resolve());
mock.module("@/lib/DrizzleClient", () => ({ mock.module("@shared/db/DrizzleClient", () => ({
DrizzleClient: { DrizzleClient: {
execute: executeMock execute: executeMock
} }

View File

@@ -1,7 +1,7 @@
import { createCommand } from "@lib/utils"; import { createCommand } from "@shared/lib/utils";
import { AuroraClient } from "@/lib/BotClient"; import { AuroraClient } from "@/lib/BotClient";
import { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, Colors } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder, Colors } from "discord.js";
import { DrizzleClient } from "@/lib/DrizzleClient"; import { DrizzleClient } from "@shared/db/DrizzleClient";
import { sql } from "drizzle-orm"; import { sql } from "drizzle-orm";
import { createBaseEmbed } from "@lib/embeds"; import { createBaseEmbed } from "@lib/embeds";

View File

@@ -1,4 +1,4 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { import {
SlashCommandBuilder, SlashCommandBuilder,
ActionRowBuilder, ActionRowBuilder,
@@ -8,12 +8,12 @@ import {
PermissionFlagsBits, PermissionFlagsBits,
MessageFlags MessageFlags
} from "discord.js"; } from "discord.js";
import { inventoryService } from "@/modules/inventory/inventory.service"; import { inventoryService } from "@shared/modules/inventory/inventory.service";
import { createSuccessEmbed, createErrorEmbed, createBaseEmbed } from "@lib/embeds"; import { createSuccessEmbed, createErrorEmbed, createBaseEmbed } from "@lib/embeds";
import { UserError } from "@/lib/errors"; import { UserError } from "@/lib/errors";
import { items } from "@/db/schema"; import { items } from "@db/schema";
import { ilike, isNotNull, and } from "drizzle-orm"; import { ilike, isNotNull, and } from "drizzle-orm";
import { DrizzleClient } from "@/lib/DrizzleClient"; import { DrizzleClient } from "@shared/db/DrizzleClient";
import { getShopListingMessage } from "@/modules/economy/shop.view"; import { getShopListingMessage } from "@/modules/economy/shop.view";
export const listing = createCommand({ export const listing = createCommand({

View File

@@ -1,7 +1,7 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js";
import { ModerationService } from "@/modules/moderation/moderation.service"; import { ModerationService } from "@shared/modules/moderation/moderation.service";
import { CaseType } from "@/lib/constants"; import { CaseType } from "@shared/lib/constants";
import { getNoteSuccessEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view"; import { getNoteSuccessEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view";
export const note = createCommand({ export const note = createCommand({

View File

@@ -1,6 +1,6 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js";
import { ModerationService } from "@/modules/moderation/moderation.service"; import { ModerationService } from "@shared/modules/moderation/moderation.service";
import { getCasesListEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view"; import { getCasesListEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view";
export const notes = createCommand({ export const notes = createCommand({

View File

@@ -1,7 +1,7 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags, ComponentType } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags, ComponentType } from "discord.js";
import { config } from "@/lib/config"; import { config } from "@/lib/config";
import { PruneService } from "@/modules/moderation/prune.service"; import { PruneService } from "@shared/modules/moderation/prune.service";
import { import {
getConfirmationMessage, getConfirmationMessage,
getProgressEmbed, getProgressEmbed,

View File

@@ -1,4 +1,4 @@
import { createCommand } from "@lib/utils"; import { createCommand } from "@shared/lib/utils";
import { AuroraClient } from "@/lib/BotClient"; import { AuroraClient } from "@/lib/BotClient";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js";
import { createErrorEmbed, createSuccessEmbed } from "@lib/embeds"; import { createErrorEmbed, createSuccessEmbed } from "@lib/embeds";

View File

@@ -1,7 +1,7 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, ChannelType, TextChannel } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, ChannelType, TextChannel } from "discord.js";
import { terminalService } from "@/modules/terminal/terminal.service"; import { terminalService } from "@shared/modules/terminal/terminal.service";
import { createBaseEmbed, createErrorEmbed } from "@/lib/embeds"; import { createBaseEmbed, createErrorEmbed } from "@/lib/embeds";
export const terminal = createCommand({ export const terminal = createCommand({

View File

@@ -1,6 +1,6 @@
import { createCommand } from "@lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags, ComponentType } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags, ComponentType } from "discord.js";
import { UpdateService } from "@/modules/admin/update.service"; import { UpdateService } from "@shared/modules/admin/update.service";
import { import {
getCheckingEmbed, getCheckingEmbed,
getNoUpdatesEmbed, getNoUpdatesEmbed,

View File

@@ -1,6 +1,6 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js";
import { ModerationService } from "@/modules/moderation/moderation.service"; import { ModerationService } from "@shared/modules/moderation/moderation.service";
import { import {
getWarnSuccessEmbed, getWarnSuccessEmbed,
getModerationErrorEmbed, getModerationErrorEmbed,

View File

@@ -1,6 +1,6 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js";
import { ModerationService } from "@/modules/moderation/moderation.service"; import { ModerationService } from "@shared/modules/moderation/moderation.service";
import { getWarningsEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view"; import { getWarningsEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view";
export const warnings = createCommand({ export const warnings = createCommand({

View File

@@ -1,4 +1,4 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js";
import { createErrorEmbed } from "@/lib/embeds"; import { createErrorEmbed } from "@/lib/embeds";
import { sendWebhookMessage } from "@/lib/webhookUtils"; import { sendWebhookMessage } from "@/lib/webhookUtils";

View File

@@ -1,6 +1,6 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder } from "discord.js"; import { SlashCommandBuilder } from "discord.js";
import { userService } from "@/modules/user/user.service"; import { userService } from "@shared/modules/user/user.service";
import { createBaseEmbed } from "@lib/embeds"; import { createBaseEmbed } from "@lib/embeds";
export const balance = createCommand({ export const balance = createCommand({

View File

@@ -1,7 +1,7 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder } from "discord.js"; import { SlashCommandBuilder } from "discord.js";
import { economyService } from "@/modules/economy/economy.service"; import { economyService } from "@shared/modules/economy/economy.service";
import { createErrorEmbed, createSuccessEmbed } from "@lib/embeds"; import { createErrorEmbed, createSuccessEmbed } from "@lib/embeds";
import { UserError } from "@/lib/errors"; import { UserError } from "@/lib/errors";

View File

@@ -1,13 +1,13 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder } from "discord.js"; import { SlashCommandBuilder } from "discord.js";
import { userService } from "@/modules/user/user.service"; import { userService } from "@shared/modules/user/user.service";
import { createErrorEmbed, createSuccessEmbed } from "@lib/embeds"; import { createErrorEmbed, createSuccessEmbed } from "@lib/embeds";
import { UserError } from "@/lib/errors"; import { UserError } from "@/lib/errors";
import { userTimers, users } from "@/db/schema"; import { userTimers, users } from "@db/schema";
import { eq, and, sql } from "drizzle-orm"; import { eq, and, sql } from "drizzle-orm";
import { DrizzleClient } from "@/lib/DrizzleClient"; import { DrizzleClient } from "@shared/db/DrizzleClient";
import { config } from "@lib/config"; import { config } from "@lib/config";
import { TimerType } from "@/lib/constants"; import { TimerType } from "@shared/lib/constants";
const EXAM_TIMER_TYPE = TimerType.EXAM_SYSTEM; const EXAM_TIMER_TYPE = TimerType.EXAM_SYSTEM;
const EXAM_TIMER_KEY = 'default'; const EXAM_TIMER_KEY = 'default';

View File

@@ -1,8 +1,8 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, MessageFlags } from "discord.js"; import { SlashCommandBuilder, MessageFlags } from "discord.js";
import { economyService } from "@/modules/economy/economy.service"; import { economyService } from "@shared/modules/economy/economy.service";
import { userService } from "@/modules/user/user.service"; import { userService } from "@shared/modules/user/user.service";
import { config } from "@/lib/config"; import { config } from "@/lib/config";
import { createErrorEmbed, createSuccessEmbed } from "@lib/embeds"; import { createErrorEmbed, createSuccessEmbed } from "@lib/embeds";
import { UserError } from "@/lib/errors"; import { UserError } from "@/lib/errors";

View File

@@ -1,6 +1,6 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, ChannelType, ThreadAutoArchiveDuration, MessageFlags } from "discord.js"; import { SlashCommandBuilder, ChannelType, ThreadAutoArchiveDuration, MessageFlags } from "discord.js";
import { tradeService } from "@/modules/trade/trade.service"; import { tradeService } from "@shared/modules/trade/trade.service";
import { getTradeDashboard } from "@/modules/trade/trade.view"; import { getTradeDashboard } from "@/modules/trade/trade.view";
import { createErrorEmbed, createWarningEmbed } from "@lib/embeds"; import { createErrorEmbed, createWarningEmbed } from "@lib/embeds";

View File

@@ -1,4 +1,4 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder } from "discord.js"; import { SlashCommandBuilder } from "discord.js";
import { config } from "@/lib/config"; import { config } from "@/lib/config";
import { createErrorEmbed } from "@/lib/embeds"; import { createErrorEmbed } from "@/lib/embeds";

View File

@@ -1,7 +1,7 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder } from "discord.js"; import { SlashCommandBuilder } from "discord.js";
import { inventoryService } from "@/modules/inventory/inventory.service"; import { inventoryService } from "@shared/modules/inventory/inventory.service";
import { userService } from "@/modules/user/user.service"; import { userService } from "@shared/modules/user/user.service";
import { createWarningEmbed } from "@lib/embeds"; import { createWarningEmbed } from "@lib/embeds";
import { getInventoryEmbed } from "@/modules/inventory/inventory.view"; import { getInventoryEmbed } from "@/modules/inventory/inventory.view";

View File

@@ -1,10 +1,10 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder } from "discord.js"; import { SlashCommandBuilder } from "discord.js";
import { inventoryService } from "@/modules/inventory/inventory.service"; import { inventoryService } from "@shared/modules/inventory/inventory.service";
import { userService } from "@/modules/user/user.service"; import { userService } from "@shared/modules/user/user.service";
import { createErrorEmbed } from "@lib/embeds"; import { createErrorEmbed } from "@lib/embeds";
import { getItemUseResultEmbed } from "@/modules/inventory/inventory.view"; import { getItemUseResultEmbed } from "@/modules/inventory/inventory.view";
import type { ItemUsageData } from "@/lib/types"; import type { ItemUsageData } from "@shared/lib/types";
import { UserError } from "@/lib/errors"; import { UserError } from "@/lib/errors";
import { config } from "@/lib/config"; import { config } from "@/lib/config";

View File

@@ -1,7 +1,7 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder } from "discord.js"; import { SlashCommandBuilder } from "discord.js";
import { DrizzleClient } from "@/lib/DrizzleClient"; import { DrizzleClient } from "@shared/db/DrizzleClient";
import { users, items, inventory } from "@/db/schema"; import { users, items, inventory } from "@db/schema";
import { desc, sql, eq } from "drizzle-orm"; import { desc, sql, eq } from "drizzle-orm";
import { createWarningEmbed } from "@lib/embeds"; import { createWarningEmbed } from "@lib/embeds";
import { getLeaderboardEmbed } from "@/modules/leveling/leveling.view"; import { getLeaderboardEmbed } from "@/modules/leveling/leveling.view";

View File

@@ -1,6 +1,6 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, MessageFlags } from "discord.js"; import { SlashCommandBuilder, MessageFlags } from "discord.js";
import { questService } from "@/modules/quest/quest.service"; import { questService } from "@shared/modules/quest/quest.service";
import { createWarningEmbed } from "@lib/embeds"; import { createWarningEmbed } from "@lib/embeds";
import { getQuestListEmbed } from "@/modules/quest/quest.view"; import { getQuestListEmbed } from "@/modules/quest/quest.view";

View File

@@ -1,6 +1,6 @@
import { createCommand } from "@/lib/utils"; import { createCommand } from "@shared/lib/utils";
import { SlashCommandBuilder, AttachmentBuilder } from "discord.js"; import { SlashCommandBuilder, AttachmentBuilder } from "discord.js";
import { userService } from "@/modules/user/user.service"; import { userService } from "@shared/modules/user/user.service";
import { generateStudentIdCard } from "@/graphics/studentID"; import { generateStudentIdCard } from "@/graphics/studentID";
import { createWarningEmbed } from "@/lib/embeds"; import { createWarningEmbed } from "@/lib/embeds";

View File

@@ -1,7 +1,7 @@
import { Events } from "discord.js"; import { Events } from "discord.js";
import type { Event } from "@lib/types"; import type { Event } from "@shared/lib/types";
import { config } from "@lib/config"; import { config } from "@lib/config";
import { userService } from "@modules/user/user.service"; import { userService } from "@shared/modules/user/user.service";
// Visitor role // Visitor role
const event: Event<Events.GuildMemberAdd> = { const event: Event<Events.GuildMemberAdd> = {

View File

@@ -1,6 +1,6 @@
import { Events } from "discord.js"; import { Events } from "discord.js";
import { ComponentInteractionHandler, AutocompleteHandler, CommandHandler } from "@/lib/handlers"; import { ComponentInteractionHandler, AutocompleteHandler, CommandHandler } from "@/lib/handlers";
import type { Event } from "@lib/types"; import type { Event } from "@shared/lib/types";
const event: Event<Events.InteractionCreate> = { const event: Event<Events.InteractionCreate> = {
name: Events.InteractionCreate, name: Events.InteractionCreate,

View File

@@ -1,7 +1,7 @@
import { Events } from "discord.js"; import { Events } from "discord.js";
import { userService } from "@/modules/user/user.service"; import { userService } from "@shared/modules/user/user.service";
import { levelingService } from "@/modules/leveling/leveling.service"; import { levelingService } from "@shared/modules/leveling/leveling.service";
import type { Event } from "@lib/types"; import type { Event } from "@shared/lib/types";
const event: Event<Events.MessageCreate> = { const event: Event<Events.MessageCreate> = {
name: Events.MessageCreate, name: Events.MessageCreate,

View File

@@ -1,6 +1,6 @@
import { Events } from "discord.js"; import { Events } from "discord.js";
import { schedulerService } from "@/modules/system/scheduler"; import { schedulerService } from "@/modules/system/scheduler";
import type { Event } from "@lib/types"; import type { Event } from "@shared/lib/types";
const event: Event<Events.ClientReady> = { const event: Event<Events.ClientReady> = {
name: Events.ClientReady, name: Events.ClientReady,

View File

@@ -1,5 +1,5 @@
import { GlobalFonts, createCanvas, loadImage } from '@napi-rs/canvas'; import { GlobalFonts, createCanvas, loadImage } from '@napi-rs/canvas';
import { levelingService } from '@/modules/leveling/leveling.service'; import { levelingService } from '@shared/modules/leveling/leveling.service';
import path from 'path'; import path from 'path';
// Register Fonts // Register Fonts

View File

@@ -1,8 +1,8 @@
import { AuroraClient } from "@/lib/BotClient"; import { AuroraClient } from "@/lib/BotClient";
import { env } from "@lib/env"; import { env } from "@shared/lib/env";
import { join } from "node:path"; import { join } from "node:path";
import { startWebServerFromRoot } from "./web/src/server"; import { startWebServerFromRoot } from "../web/src/server";
// Load commands & events // Load commands & events
await AuroraClient.loadCommands(); await AuroraClient.loadCommands();
@@ -13,7 +13,7 @@ console.log("🌐 Starting web server...");
let shuttingDown = false; let shuttingDown = false;
const webProjectPath = join(import.meta.dir, "web"); const webProjectPath = join(import.meta.dir, "../web");
const webPort = Number(process.env.WEB_PORT) || 3000; const webPort = Number(process.env.WEB_PORT) || 3000;
const webHost = process.env.HOST || "0.0.0.0"; const webHost = process.env.HOST || "0.0.0.0";

View File

@@ -1,7 +1,7 @@
import { Client as DiscordClient, Collection, GatewayIntentBits, REST, Routes } from "discord.js"; import { Client as DiscordClient, Collection, GatewayIntentBits, REST, Routes } from "discord.js";
import { join } from "node:path"; import { join } from "node:path";
import type { Command } from "@lib/types"; import type { Command } from "@shared/lib/types";
import { env } from "@lib/env"; import { env } from "@shared/lib/env";
import { CommandLoader } from "@lib/loaders/CommandLoader"; import { CommandLoader } from "@lib/loaders/CommandLoader";
import { EventLoader } from "@lib/loaders/EventLoader"; import { EventLoader } from "@lib/loaders/EventLoader";
@@ -96,7 +96,7 @@ export class Client extends DiscordClient {
async shutdown() { async shutdown() {
const { setShuttingDown, waitForTransactions } = await import("./shutdown"); const { setShuttingDown, waitForTransactions } = await import("./shutdown");
const { closeDatabase } = await import("./DrizzleClient"); const { closeDatabase } = await import("@shared/db/DrizzleClient");
console.log("🛑 Shutdown signal received. Starting graceful shutdown..."); console.log("🛑 Shutdown signal received. Starting graceful shutdown...");
setShuttingDown(true); setShuttingDown(true);

View File

@@ -1,5 +1,5 @@
import { DrizzleClient } from "./DrizzleClient"; import { DrizzleClient } from "@shared/db/DrizzleClient";
import type { Transaction } from "./types"; import type { Transaction } from "@shared/lib/types";
import { isShuttingDown, incrementTransactions, decrementTransactions } from "./shutdown"; import { isShuttingDown, incrementTransactions, decrementTransactions } from "./shutdown";
export const withTransaction = async <T>( export const withTransaction = async <T>(

View File

@@ -1,6 +1,6 @@
import { ChatInputCommandInteraction, MessageFlags } from "discord.js"; import { ChatInputCommandInteraction, MessageFlags } from "discord.js";
import { AuroraClient } from "@/lib/BotClient"; import { AuroraClient } from "@/lib/BotClient";
import { userService } from "@/modules/user/user.service"; import { userService } from "@shared/modules/user/user.service";
import { createErrorEmbed } from "@lib/embeds"; import { createErrorEmbed } from "@lib/embeds";

View File

@@ -1,6 +1,6 @@
import { readdir } from "node:fs/promises"; import { readdir } from "node:fs/promises";
import { join } from "node:path"; import { join } from "node:path";
import type { Command } from "@lib/types"; import type { Command } from "@shared/lib/types";
import { config } from "@lib/config"; import { config } from "@lib/config";
import type { LoadResult, LoadError } from "./types"; import type { LoadResult, LoadError } from "./types";
import type { Client } from "../BotClient"; import type { Client } from "../BotClient";

View File

@@ -1,6 +1,6 @@
import { readdir } from "node:fs/promises"; import { readdir } from "node:fs/promises";
import { join } from "node:path"; import { join } from "node:path";
import type { Event } from "@lib/types"; import type { Event } from "@shared/lib/types";
import type { LoadResult } from "./types"; import type { LoadResult } from "./types";
import type { Client } from "../BotClient"; import type { Client } from "../BotClient";

View File

@@ -6,13 +6,13 @@ import { ButtonInteraction, ModalSubmitInteraction, StringSelectMenuInteraction
const valuesMock = mock((_args: any) => Promise.resolve()); const valuesMock = mock((_args: any) => Promise.resolve());
const insertMock = mock(() => ({ values: valuesMock })); const insertMock = mock(() => ({ values: valuesMock }));
mock.module("@/lib/DrizzleClient", () => ({ mock.module("@shared/db/DrizzleClient", () => ({
DrizzleClient: { DrizzleClient: {
insert: insertMock insert: insertMock
} }
})); }));
mock.module("@/db/schema", () => ({ mock.module("@db/schema", () => ({
items: "items_schema" items: "items_schema"
})); }));

View File

@@ -1,10 +1,10 @@
import { type Interaction } from "discord.js"; import { type Interaction } from "discord.js";
import { items } from "@/db/schema"; import { items } from "@db/schema";
import { DrizzleClient } from "@/lib/DrizzleClient"; import { DrizzleClient } from "@shared/db/DrizzleClient";
import type { ItemUsageData, ItemEffect } from "@/lib/types"; import type { ItemUsageData, ItemEffect } from "@shared/lib/types";
import { getItemWizardEmbed, getItemTypeSelection, getEffectTypeSelection, getDetailsModal, getEconomyModal, getVisualsModal, getEffectConfigModal } from "./item_wizard.view"; import { getItemWizardEmbed, getItemTypeSelection, getEffectTypeSelection, getDetailsModal, getEconomyModal, getVisualsModal, getEffectConfigModal } from "./item_wizard.view";
import type { DraftItem } from "./item_wizard.types"; import type { DraftItem } from "./item_wizard.types";
import { ItemType, EffectType } from "@/lib/constants"; import { ItemType, EffectType } from "@shared/lib/constants";
// --- Types --- // --- Types ---

View File

@@ -1,4 +1,4 @@
import type { ItemUsageData } from "@/lib/types"; import type { ItemUsageData } from "@shared/lib/types";
export interface DraftItem { export interface DraftItem {
name: string; name: string;

View File

@@ -10,7 +10,7 @@ import {
} from "discord.js"; } from "discord.js";
import { createBaseEmbed } from "@lib/embeds"; import { createBaseEmbed } from "@lib/embeds";
import type { DraftItem } from "./item_wizard.types"; import type { DraftItem } from "./item_wizard.types";
import { ItemType } from "@/lib/constants"; import { ItemType } from "@shared/lib/constants";
const getItemTypeOptions = () => [ const getItemTypeOptions = () => [
{ label: "Material", value: ItemType.MATERIAL, description: "Used for crafting or trading" }, { label: "Material", value: ItemType.MATERIAL, description: "Used for crafting or trading" },

View File

@@ -0,0 +1,33 @@
export interface RestartContext {
channelId: string;
userId: string;
timestamp: number;
runMigrations: boolean;
installDependencies: boolean;
previousCommit: string;
newCommit: string;
}
export interface UpdateCheckResult {
needsRootInstall: boolean;
needsWebInstall: boolean;
needsMigrations: boolean;
changedFiles: string[];
error?: Error;
}
export interface UpdateInfo {
hasUpdates: boolean;
branch: string;
currentCommit: string;
latestCommit: string;
commitCount: number;
commits: CommitInfo[];
}
export interface CommitInfo {
hash: string;
message: string;
author: string;
}

View File

@@ -1,6 +1,6 @@
import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js"; import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js";
import { createInfoEmbed, createSuccessEmbed, createWarningEmbed, createErrorEmbed } from "@lib/embeds"; import { createInfoEmbed, createSuccessEmbed, createWarningEmbed, createErrorEmbed } from "@lib/embeds";
import type { UpdateInfo, UpdateCheckResult } from "./update.service"; import type { UpdateInfo, UpdateCheckResult } from "./update.types";
// Constants for UI // Constants for UI
const LOG_TRUNCATE_LENGTH = 800; const LOG_TRUNCATE_LENGTH = 800;

View File

@@ -1,5 +1,5 @@
import { ButtonInteraction } from "discord.js"; import { ButtonInteraction } from "discord.js";
import { lootdropService } from "./lootdrop.service"; import { lootdropService } from "@shared/modules/economy/lootdrop.service";
import { UserError } from "@/lib/errors"; import { UserError } from "@/lib/errors";
import { getLootdropClaimedMessage } from "./lootdrop.view"; import { getLootdropClaimedMessage } from "./lootdrop.view";

View File

@@ -1,6 +1,6 @@
import { ButtonInteraction, MessageFlags } from "discord.js"; import { ButtonInteraction, MessageFlags } from "discord.js";
import { inventoryService } from "@/modules/inventory/inventory.service"; import { inventoryService } from "@shared/modules/inventory/inventory.service";
import { userService } from "@/modules/user/user.service"; import { userService } from "@shared/modules/user/user.service";
import { UserError } from "@/lib/errors"; import { UserError } from "@/lib/errors";
export async function handleShopInteraction(interaction: ButtonInteraction) { export async function handleShopInteraction(interaction: ButtonInteraction) {

View File

@@ -1,11 +1,11 @@
import { levelingService } from "@/modules/leveling/leveling.service"; import { levelingService } from "@shared/modules/leveling/leveling.service";
import { economyService } from "@/modules/economy/economy.service"; import { economyService } from "@shared/modules/economy/economy.service";
import { userTimers } from "@/db/schema"; import { userTimers } from "@db/schema";
import type { EffectHandler } from "./types"; import type { EffectHandler } from "./types";
import type { LootTableItem } from "@/lib/types"; import type { LootTableItem } from "@shared/lib/types";
import { inventoryService } from "@/modules/inventory/inventory.service"; import { inventoryService } from "@shared/modules/inventory/inventory.service";
import { inventory, items } from "@/db/schema"; import { inventory, items } from "@db/schema";
import { TimerType, TransactionType, LootType } from "@/lib/constants"; import { TimerType, TransactionType, LootType } from "@shared/lib/constants";
// Helper to extract duration in seconds // Helper to extract duration in seconds
@@ -120,7 +120,7 @@ export const handleLootbox: EffectHandler = async (userId, effect, txFn) => {
// Try to fetch item name for the message // Try to fetch item name for the message
try { try {
const item = await txFn.query.items.findFirst({ const item = await txFn.query.items.findFirst({
where: (items, { eq }) => eq(items.id, winner.itemId!) where: (items: any, { eq }: any) => eq(items.id, winner.itemId!)
}); });
if (item) { if (item) {
return winner.message || `You found ${quantity > 1 ? quantity + 'x ' : ''}**${item.name}**!`; return winner.message || `You found ${quantity > 1 ? quantity + 'x ' : ''}**${item.name}**!`;

View File

@@ -1,4 +1,4 @@
import type { Transaction } from "@/lib/types"; import type { Transaction } from "@shared/lib/types";
export type EffectHandler = (userId: string, effect: any, txFn: Transaction) => Promise<string>; export type EffectHandler = (userId: string, effect: any, txFn: Transaction) => Promise<string>;

View File

@@ -1,6 +1,6 @@
import { EmbedBuilder } from "discord.js"; import { EmbedBuilder } from "discord.js";
import type { ItemUsageData } from "@/lib/types"; import type { ItemUsageData } from "@shared/lib/types";
import { EffectType } from "@/lib/constants"; import { EffectType } from "@shared/lib/constants";
/** /**
* Inventory entry with item details * Inventory entry with item details

View File

@@ -1,4 +1,4 @@
import { CaseType } from "@/lib/constants"; import { CaseType } from "@shared/lib/constants";
export { CaseType }; export { CaseType };

View File

@@ -1,4 +1,4 @@
import { temporaryRoleService } from "./temp-role.service"; import { temporaryRoleService } from "@shared/modules/system/temp-role.service";
export const schedulerService = { export const schedulerService = {
start: () => { start: () => {

View File

@@ -7,8 +7,8 @@ import {
TextChannel, TextChannel,
EmbedBuilder EmbedBuilder
} from "discord.js"; } from "discord.js";
import { tradeService } from "./trade.service"; import { tradeService } from "@shared/modules/trade/trade.service";
import { inventoryService } from "@/modules/inventory/inventory.service"; import { inventoryService } from "@shared/modules/inventory/inventory.service";
import { createErrorEmbed, createWarningEmbed, createSuccessEmbed, createInfoEmbed } from "@lib/embeds"; import { createErrorEmbed, createWarningEmbed, createSuccessEmbed, createInfoEmbed } from "@lib/embeds";
import { UserError } from "@lib/errors"; import { UserError } from "@lib/errors";
import { getTradeDashboard, getTradeMoneyModal, getItemSelectMenu, getTradeCompletedEmbed } from "./trade.view"; import { getTradeDashboard, getTradeMoneyModal, getItemSelectMenu, getTradeCompletedEmbed } from "./trade.view";
@@ -101,7 +101,7 @@ async function handleAddItemClick(interaction: ButtonInteraction, threadId: stri
} }
// Slice top 25 for select menu // Slice top 25 for select menu
const options = inventory.slice(0, 25).map(entry => ({ const options = inventory.slice(0, 25).map((entry: any) => ({
label: `${entry.item.name} (${entry.quantity})`, label: `${entry.item.name} (${entry.quantity})`,
value: entry.item.id.toString(), value: entry.item.id.toString(),
description: `Rarity: ${entry.item.rarity} ` description: `Rarity: ${entry.item.rarity} `

View File

@@ -1,8 +1,8 @@
import { ButtonInteraction, MessageFlags } from "discord.js"; import { ButtonInteraction, MessageFlags } from "discord.js";
import { config } from "@/lib/config"; import { config } from "@/lib/config";
import { getEnrollmentSuccessMessage } from "./enrollment.view"; import { getEnrollmentSuccessMessage } from "./enrollment.view";
import { classService } from "@modules/class/class.service"; import { classService } from "@shared/modules/class/class.service";
import { userService } from "@modules/user/user.service"; import { userService } from "@shared/modules/user/user.service";
import { UserError } from "@/lib/errors"; import { UserError } from "@/lib/errors";
import { sendWebhookMessage } from "@/lib/webhookUtils"; import { sendWebhookMessage } from "@/lib/webhookUtils";
@@ -37,7 +37,7 @@ export async function handleEnrollmentInteraction(interaction: ButtonInteraction
// 2. Get available classes // 2. Get available classes
const allClasses = await classService.getAllClasses(); const allClasses = await classService.getAllClasses();
const validClasses = allClasses.filter(c => c.roleId); const validClasses = allClasses.filter((c: any) => c.roleId);
if (validClasses.length === 0) { if (validClasses.length === 0) {
throw new UserError("No classes with specified roles found in database."); throw new UserError("No classes with specified roles found in database.");

View File

@@ -1,7 +1,7 @@
import { userTimers } from "@/db/schema"; import { userTimers } from "@db/schema";
import { eq, and } from "drizzle-orm"; import { eq, and } from "drizzle-orm";
import { DrizzleClient } from "@/lib/DrizzleClient"; import { DrizzleClient } from "@shared/db/DrizzleClient";
import { TimerType } from "@/lib/constants"; import { TimerType } from "@shared/lib/constants";
export { TimerType }; export { TimerType };
@@ -33,7 +33,7 @@ export const userTimerService = {
if (tx) { if (tx) {
return await execute(tx); return await execute(tx);
} else { } else {
return await DrizzleClient.transaction(async (t) => { return await DrizzleClient.transaction(async (t: any) => {
return await execute(t); return await execute(t);
}); });
} }
@@ -89,7 +89,7 @@ export const userTimerService = {
if (tx) { if (tx) {
return await execute(tx); return await execute(tx);
} else { } else {
return await DrizzleClient.transaction(async (t) => { return await DrizzleClient.transaction(async (t: any) => {
return await execute(t); return await execute(t);
}); });
} }

View File

@@ -10,8 +10,8 @@ services:
# ports: # ports:
# - "127.0.0.1:${DB_PORT}:5432" # - "127.0.0.1:${DB_PORT}:5432"
volumes: volumes:
- ./src/db/data:/var/lib/postgresql/data - ./shared/db/data:/var/lib/postgresql/data
- ./src/db/log:/var/log/postgresql - ./shared/db/log:/var/log/postgresql
networks: networks:
- internal - internal
healthcheck: healthcheck:
@@ -33,7 +33,7 @@ services:
volumes: volumes:
- .:/app - .:/app
- /app/node_modules - /app/node_modules
- /app/src/web/node_modules - /app/web/node_modules
environment: environment:
- HOST=0.0.0.0 - HOST=0.0.0.0
- DB_USER=${DB_USER} - DB_USER=${DB_USER}
@@ -71,7 +71,7 @@ services:
volumes: volumes:
- .:/app - .:/app
- /app/node_modules - /app/node_modules
- /app/src/web/node_modules - /app/web/node_modules
environment: environment:
- DB_USER=${DB_USER} - DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD} - DB_PASSWORD=${DB_PASSWORD}

View File

@@ -1,5 +1,5 @@
import { defineConfig } from "drizzle-kit"; import { defineConfig } from "drizzle-kit";
import { env } from "./src/lib/env"; import { env } from "./shared/lib/env";
// @ts-expect-error - Polyfill for BigInt serialization // @ts-expect-error - Polyfill for BigInt serialization
BigInt.prototype.toJSON = function () { BigInt.prototype.toJSON = function () {
@@ -7,7 +7,7 @@ BigInt.prototype.toJSON = function () {
}; };
export default defineConfig({ export default defineConfig({
schema: "./src/db/schema.ts", schema: "./shared/db/schema.ts",
out: "./drizzle", out: "./drizzle",
dialect: "postgresql", dialect: "postgresql",
dbCredentials: { dbCredentials: {

View File

@@ -1,6 +1,6 @@
{ {
"name": "app", "name": "app",
"module": "index.ts", "module": "bot/index.ts",
"type": "module", "type": "module",
"private": true, "private": true,
"devDependencies": { "devDependencies": {
@@ -15,7 +15,7 @@
"migrate": "docker compose run --rm app drizzle-kit migrate", "migrate": "docker compose run --rm app drizzle-kit migrate",
"db:push": "docker compose run --rm app drizzle-kit push", "db:push": "docker compose run --rm app drizzle-kit push",
"db:push:local": "drizzle-kit push", "db:push:local": "drizzle-kit push",
"dev": "bun --watch src/index.ts", "dev": "bun --watch bot/index.ts",
"db:studio": "drizzle-kit studio --host 0.0.0.0", "db:studio": "drizzle-kit studio --host 0.0.0.0",
"studio:remote": "bash scripts/remote-studio.sh", "studio:remote": "bash scripts/remote-studio.sh",
"dashboard:remote": "bash scripts/remote-dashboard.sh", "dashboard:remote": "bash scripts/remote-dashboard.sh",

View File

@@ -1,7 +1,7 @@
import { drizzle } from "drizzle-orm/bun-sql"; import { drizzle } from "drizzle-orm/bun-sql";
import { SQL } from "bun"; import { SQL } from "bun";
import * as schema from "@db/schema"; import * as schema from "./schema";
import { env } from "@lib/env"; import { env } from "@shared/lib/env";
const connectionString = env.DATABASE_URL; const connectionString = env.DATABASE_URL;
export const postgres = new SQL(connectionString); export const postgres = new SQL(connectionString);

Some files were not shown because too many files have changed in this diff Show More