diff --git a/.gitignore b/.gitignore index b604024..0520134 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ .env node_modules -db-logs -db-data +shared/db-logs +shared/db/data +shared/db/loga .cursor # dependencies (bun install) diff --git a/src/assets/fonts/IBMPlexMono-Bold.ttf b/bot/assets/fonts/IBMPlexMono-Bold.ttf similarity index 100% rename from src/assets/fonts/IBMPlexMono-Bold.ttf rename to bot/assets/fonts/IBMPlexMono-Bold.ttf diff --git a/src/assets/fonts/IBMPlexSansCondensed-SemiBold.ttf b/bot/assets/fonts/IBMPlexSansCondensed-SemiBold.ttf similarity index 100% rename from src/assets/fonts/IBMPlexSansCondensed-SemiBold.ttf rename to bot/assets/fonts/IBMPlexSansCondensed-SemiBold.ttf diff --git a/src/assets/graphics/lootdrop/template.png b/bot/assets/graphics/lootdrop/template.png similarity index 100% rename from src/assets/graphics/lootdrop/template.png rename to bot/assets/graphics/lootdrop/template.png diff --git a/src/assets/graphics/studentID/Constellation-A.png b/bot/assets/graphics/studentID/Constellation-A.png similarity index 100% rename from src/assets/graphics/studentID/Constellation-A.png rename to bot/assets/graphics/studentID/Constellation-A.png diff --git a/src/assets/graphics/studentID/Constellation-B.png b/bot/assets/graphics/studentID/Constellation-B.png similarity index 100% rename from src/assets/graphics/studentID/Constellation-B.png rename to bot/assets/graphics/studentID/Constellation-B.png diff --git a/src/assets/graphics/studentID/Constellation-C.png b/bot/assets/graphics/studentID/Constellation-C.png similarity index 100% rename from src/assets/graphics/studentID/Constellation-C.png rename to bot/assets/graphics/studentID/Constellation-C.png diff --git a/src/assets/graphics/studentID/Constellation-D.png b/bot/assets/graphics/studentID/Constellation-D.png similarity index 100% rename from src/assets/graphics/studentID/Constellation-D.png rename to bot/assets/graphics/studentID/Constellation-D.png diff --git a/src/assets/graphics/studentID/Constellation-S.png b/bot/assets/graphics/studentID/Constellation-S.png similarity index 100% rename from src/assets/graphics/studentID/Constellation-S.png rename to bot/assets/graphics/studentID/Constellation-S.png diff --git a/src/assets/graphics/studentID/template.png b/bot/assets/graphics/studentID/template.png similarity index 100% rename from src/assets/graphics/studentID/template.png rename to bot/assets/graphics/studentID/template.png diff --git a/src/commands/admin/case.ts b/bot/commands/admin/case.ts similarity index 93% rename from src/commands/admin/case.ts rename to bot/commands/admin/case.ts index b687f5e..508797e 100644 --- a/src/commands/admin/case.ts +++ b/bot/commands/admin/case.ts @@ -1,6 +1,6 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; 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"; export const moderationCase = createCommand({ diff --git a/src/commands/admin/cases.ts b/bot/commands/admin/cases.ts similarity index 93% rename from src/commands/admin/cases.ts rename to bot/commands/admin/cases.ts index cfbc0ca..c9b6fc0 100644 --- a/src/commands/admin/cases.ts +++ b/bot/commands/admin/cases.ts @@ -1,6 +1,6 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; 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"; export const cases = createCommand({ diff --git a/src/commands/admin/clearwarning.ts b/bot/commands/admin/clearwarning.ts similarity index 95% rename from src/commands/admin/clearwarning.ts rename to bot/commands/admin/clearwarning.ts index 90c78ca..7da9db9 100644 --- a/src/commands/admin/clearwarning.ts +++ b/bot/commands/admin/clearwarning.ts @@ -1,6 +1,6 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; 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"; export const clearwarning = createCommand({ diff --git a/src/commands/admin/config.ts b/bot/commands/admin/config.ts similarity index 98% rename from src/commands/admin/config.ts rename to bot/commands/admin/config.ts index cabc311..376e5b8 100644 --- a/src/commands/admin/config.ts +++ b/bot/commands/admin/config.ts @@ -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 { config, saveConfig } from "@lib/config"; import type { GameConfigType } from "@lib/config"; diff --git a/src/commands/admin/create_color.ts b/bot/commands/admin/create_color.ts similarity index 96% rename from src/commands/admin/create_color.ts rename to bot/commands/admin/create_color.ts index 71b743d..ec8581a 100644 --- a/src/commands/admin/create_color.ts +++ b/bot/commands/admin/create_color.ts @@ -1,8 +1,8 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder, PermissionFlagsBits, AttachmentBuilder } from "discord.js"; import { config, saveConfig } from "@/lib/config"; -import { DrizzleClient } from "@/lib/DrizzleClient"; -import { items } from "@/db/schema"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; +import { items } from "@db/schema"; import { createSuccessEmbed, createErrorEmbed } from "@lib/embeds"; export const createColor = createCommand({ diff --git a/src/commands/admin/create_item.ts b/bot/commands/admin/create_item.ts similarity index 92% rename from src/commands/admin/create_item.ts rename to bot/commands/admin/create_item.ts index d1a6f0a..8613bdf 100644 --- a/src/commands/admin/create_item.ts +++ b/bot/commands/admin/create_item.ts @@ -1,4 +1,4 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { renderWizard } from "@/modules/admin/item_wizard"; diff --git a/src/commands/admin/features.ts b/bot/commands/admin/features.ts similarity index 98% rename from src/commands/admin/features.ts rename to bot/commands/admin/features.ts index e8394c1..d56c3a0 100644 --- a/src/commands/admin/features.ts +++ b/bot/commands/admin/features.ts @@ -1,4 +1,4 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { createBaseEmbed } from "@lib/embeds"; import { configManager } from "@/lib/configManager"; diff --git a/src/commands/admin/health.test.ts b/bot/commands/admin/health.test.ts similarity index 98% rename from src/commands/admin/health.test.ts rename to bot/commands/admin/health.test.ts index dcd86fd..4c7416a 100644 --- a/src/commands/admin/health.test.ts +++ b/bot/commands/admin/health.test.ts @@ -5,7 +5,7 @@ import { AuroraClient } from "@/lib/BotClient"; // Mock DrizzleClient const executeMock = mock(() => Promise.resolve()); -mock.module("@/lib/DrizzleClient", () => ({ +mock.module("@shared/db/DrizzleClient", () => ({ DrizzleClient: { execute: executeMock } diff --git a/src/commands/admin/health.ts b/bot/commands/admin/health.ts similarity index 95% rename from src/commands/admin/health.ts rename to bot/commands/admin/health.ts index 6835cf4..0ea2ba9 100644 --- a/src/commands/admin/health.ts +++ b/bot/commands/admin/health.ts @@ -1,7 +1,7 @@ -import { createCommand } from "@lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { AuroraClient } from "@/lib/BotClient"; 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 { createBaseEmbed } from "@lib/embeds"; diff --git a/src/commands/admin/listing.ts b/bot/commands/admin/listing.ts similarity index 94% rename from src/commands/admin/listing.ts rename to bot/commands/admin/listing.ts index bde00dc..a9f15b6 100644 --- a/src/commands/admin/listing.ts +++ b/bot/commands/admin/listing.ts @@ -1,4 +1,4 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder, ActionRowBuilder, @@ -8,12 +8,12 @@ import { PermissionFlagsBits, MessageFlags } 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 { UserError } from "@/lib/errors"; -import { items } from "@/db/schema"; +import { items } from "@db/schema"; 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"; export const listing = createCommand({ diff --git a/src/commands/admin/note.ts b/bot/commands/admin/note.ts similarity index 92% rename from src/commands/admin/note.ts rename to bot/commands/admin/note.ts index 50cfdfe..d7c3586 100644 --- a/src/commands/admin/note.ts +++ b/bot/commands/admin/note.ts @@ -1,7 +1,7 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; -import { ModerationService } from "@/modules/moderation/moderation.service"; -import { CaseType } from "@/lib/constants"; +import { ModerationService } from "@shared/modules/moderation/moderation.service"; +import { CaseType } from "@shared/lib/constants"; import { getNoteSuccessEmbed, getModerationErrorEmbed } from "@/modules/moderation/moderation.view"; export const note = createCommand({ diff --git a/src/commands/admin/notes.ts b/bot/commands/admin/notes.ts similarity index 92% rename from src/commands/admin/notes.ts rename to bot/commands/admin/notes.ts index 41b7257..a2c09e5 100644 --- a/src/commands/admin/notes.ts +++ b/bot/commands/admin/notes.ts @@ -1,6 +1,6 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; 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"; export const notes = createCommand({ diff --git a/src/commands/admin/prune.ts b/bot/commands/admin/prune.ts similarity index 98% rename from src/commands/admin/prune.ts rename to bot/commands/admin/prune.ts index 7c9be5f..b33fef8 100644 --- a/src/commands/admin/prune.ts +++ b/bot/commands/admin/prune.ts @@ -1,7 +1,7 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags, ComponentType } from "discord.js"; import { config } from "@/lib/config"; -import { PruneService } from "@/modules/moderation/prune.service"; +import { PruneService } from "@shared/modules/moderation/prune.service"; import { getConfirmationMessage, getProgressEmbed, diff --git a/src/commands/admin/refresh.ts b/bot/commands/admin/refresh.ts similarity index 96% rename from src/commands/admin/refresh.ts rename to bot/commands/admin/refresh.ts index 777e44c..5e8d3f1 100644 --- a/src/commands/admin/refresh.ts +++ b/bot/commands/admin/refresh.ts @@ -1,4 +1,4 @@ -import { createCommand } from "@lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { AuroraClient } from "@/lib/BotClient"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { createErrorEmbed, createSuccessEmbed } from "@lib/embeds"; diff --git a/src/commands/admin/terminal.ts b/bot/commands/admin/terminal.ts similarity index 91% rename from src/commands/admin/terminal.ts rename to bot/commands/admin/terminal.ts index bdb2f75..27ee76f 100644 --- a/src/commands/admin/terminal.ts +++ b/bot/commands/admin/terminal.ts @@ -1,7 +1,7 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; 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"; export const terminal = createCommand({ diff --git a/src/commands/admin/update.ts b/bot/commands/admin/update.ts similarity index 97% rename from src/commands/admin/update.ts rename to bot/commands/admin/update.ts index c98b630..90a5340 100644 --- a/src/commands/admin/update.ts +++ b/bot/commands/admin/update.ts @@ -1,6 +1,6 @@ -import { createCommand } from "@lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags, ComponentType } from "discord.js"; -import { UpdateService } from "@/modules/admin/update.service"; +import { UpdateService } from "@shared/modules/admin/update.service"; import { getCheckingEmbed, getNoUpdatesEmbed, diff --git a/src/commands/admin/warn.ts b/bot/commands/admin/warn.ts similarity index 95% rename from src/commands/admin/warn.ts rename to bot/commands/admin/warn.ts index 770ccbe..73b44d0 100644 --- a/src/commands/admin/warn.ts +++ b/bot/commands/admin/warn.ts @@ -1,6 +1,6 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; -import { ModerationService } from "@/modules/moderation/moderation.service"; +import { ModerationService } from "@shared/modules/moderation/moderation.service"; import { getWarnSuccessEmbed, getModerationErrorEmbed, diff --git a/src/commands/admin/warnings.ts b/bot/commands/admin/warnings.ts similarity index 91% rename from src/commands/admin/warnings.ts rename to bot/commands/admin/warnings.ts index 87662bc..e2937cb 100644 --- a/src/commands/admin/warnings.ts +++ b/bot/commands/admin/warnings.ts @@ -1,6 +1,6 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; 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"; export const warnings = createCommand({ diff --git a/src/commands/admin/webhook.ts b/bot/commands/admin/webhook.ts similarity index 97% rename from src/commands/admin/webhook.ts rename to bot/commands/admin/webhook.ts index 2e8b6d8..e822ea5 100644 --- a/src/commands/admin/webhook.ts +++ b/bot/commands/admin/webhook.ts @@ -1,4 +1,4 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags } from "discord.js"; import { createErrorEmbed } from "@/lib/embeds"; import { sendWebhookMessage } from "@/lib/webhookUtils"; diff --git a/src/commands/economy/balance.ts b/bot/commands/economy/balance.ts similarity index 90% rename from src/commands/economy/balance.ts rename to bot/commands/economy/balance.ts index f0c3999..dfc87c8 100644 --- a/src/commands/economy/balance.ts +++ b/bot/commands/economy/balance.ts @@ -1,6 +1,6 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; 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"; export const balance = createCommand({ diff --git a/src/commands/economy/daily.ts b/bot/commands/economy/daily.ts similarity index 92% rename from src/commands/economy/daily.ts rename to bot/commands/economy/daily.ts index d80b5e2..3a6b5c4 100644 --- a/src/commands/economy/daily.ts +++ b/bot/commands/economy/daily.ts @@ -1,7 +1,7 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; 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 { UserError } from "@/lib/errors"; diff --git a/src/commands/economy/exam.ts b/bot/commands/economy/exam.ts similarity index 96% rename from src/commands/economy/exam.ts rename to bot/commands/economy/exam.ts index c259678..0533ead 100644 --- a/src/commands/economy/exam.ts +++ b/bot/commands/economy/exam.ts @@ -1,13 +1,13 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; 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 { UserError } from "@/lib/errors"; -import { userTimers, users } from "@/db/schema"; +import { userTimers, users } from "@db/schema"; import { eq, and, sql } from "drizzle-orm"; -import { DrizzleClient } from "@/lib/DrizzleClient"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; 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_KEY = 'default'; diff --git a/src/commands/economy/pay.ts b/bot/commands/economy/pay.ts similarity index 93% rename from src/commands/economy/pay.ts rename to bot/commands/economy/pay.ts index 5ef6a11..3698184 100644 --- a/src/commands/economy/pay.ts +++ b/bot/commands/economy/pay.ts @@ -1,8 +1,8 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder, MessageFlags } from "discord.js"; -import { economyService } from "@/modules/economy/economy.service"; -import { userService } from "@/modules/user/user.service"; +import { economyService } from "@shared/modules/economy/economy.service"; +import { userService } from "@shared/modules/user/user.service"; import { config } from "@/lib/config"; import { createErrorEmbed, createSuccessEmbed } from "@lib/embeds"; import { UserError } from "@/lib/errors"; diff --git a/src/commands/economy/trade.ts b/bot/commands/economy/trade.ts similarity index 96% rename from src/commands/economy/trade.ts rename to bot/commands/economy/trade.ts index 2a85260..7d13882 100644 --- a/src/commands/economy/trade.ts +++ b/bot/commands/economy/trade.ts @@ -1,6 +1,6 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; 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 { createErrorEmbed, createWarningEmbed } from "@lib/embeds"; diff --git a/src/commands/feedback/feedback.ts b/bot/commands/feedback/feedback.ts similarity index 95% rename from src/commands/feedback/feedback.ts rename to bot/commands/feedback/feedback.ts index 4cfbbe8..8a2f4b9 100644 --- a/src/commands/feedback/feedback.ts +++ b/bot/commands/feedback/feedback.ts @@ -1,4 +1,4 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder } from "discord.js"; import { config } from "@/lib/config"; import { createErrorEmbed } from "@/lib/embeds"; diff --git a/src/commands/inventory/inventory.ts b/bot/commands/inventory/inventory.ts similarity index 88% rename from src/commands/inventory/inventory.ts rename to bot/commands/inventory/inventory.ts index cbfba4e..cc9937b 100644 --- a/src/commands/inventory/inventory.ts +++ b/bot/commands/inventory/inventory.ts @@ -1,7 +1,7 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder } from "discord.js"; -import { inventoryService } from "@/modules/inventory/inventory.service"; -import { userService } from "@/modules/user/user.service"; +import { inventoryService } from "@shared/modules/inventory/inventory.service"; +import { userService } from "@shared/modules/user/user.service"; import { createWarningEmbed } from "@lib/embeds"; import { getInventoryEmbed } from "@/modules/inventory/inventory.view"; diff --git a/src/commands/inventory/use.ts b/bot/commands/inventory/use.ts similarity index 92% rename from src/commands/inventory/use.ts rename to bot/commands/inventory/use.ts index 2ee1160..1d88df8 100644 --- a/src/commands/inventory/use.ts +++ b/bot/commands/inventory/use.ts @@ -1,10 +1,10 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder } from "discord.js"; -import { inventoryService } from "@/modules/inventory/inventory.service"; -import { userService } from "@/modules/user/user.service"; +import { inventoryService } from "@shared/modules/inventory/inventory.service"; +import { userService } from "@shared/modules/user/user.service"; import { createErrorEmbed } from "@lib/embeds"; 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 { config } from "@/lib/config"; diff --git a/src/commands/leveling/leaderboard.ts b/bot/commands/leveling/leaderboard.ts similarity index 93% rename from src/commands/leveling/leaderboard.ts rename to bot/commands/leveling/leaderboard.ts index 2e1ab9c..e175d91 100644 --- a/src/commands/leveling/leaderboard.ts +++ b/bot/commands/leveling/leaderboard.ts @@ -1,7 +1,7 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; import { SlashCommandBuilder } from "discord.js"; -import { DrizzleClient } from "@/lib/DrizzleClient"; -import { users, items, inventory } from "@/db/schema"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; +import { users, items, inventory } from "@db/schema"; import { desc, sql, eq } from "drizzle-orm"; import { createWarningEmbed } from "@lib/embeds"; import { getLeaderboardEmbed } from "@/modules/leveling/leveling.view"; diff --git a/src/commands/quest/quests.ts b/bot/commands/quest/quests.ts similarity index 87% rename from src/commands/quest/quests.ts rename to bot/commands/quest/quests.ts index 78534eb..fab6621 100644 --- a/src/commands/quest/quests.ts +++ b/bot/commands/quest/quests.ts @@ -1,6 +1,6 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; 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 { getQuestListEmbed } from "@/modules/quest/quest.view"; diff --git a/src/commands/user/profile.ts b/bot/commands/user/profile.ts similarity index 92% rename from src/commands/user/profile.ts rename to bot/commands/user/profile.ts index ea4fcd6..b705ea7 100644 --- a/src/commands/user/profile.ts +++ b/bot/commands/user/profile.ts @@ -1,6 +1,6 @@ -import { createCommand } from "@/lib/utils"; +import { createCommand } from "@shared/lib/utils"; 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 { createWarningEmbed } from "@/lib/embeds"; diff --git a/src/events/guildMemberAdd.ts b/bot/events/guildMemberAdd.ts similarity index 92% rename from src/events/guildMemberAdd.ts rename to bot/events/guildMemberAdd.ts index 27241f1..18187d7 100644 --- a/src/events/guildMemberAdd.ts +++ b/bot/events/guildMemberAdd.ts @@ -1,7 +1,7 @@ import { Events } from "discord.js"; -import type { Event } from "@lib/types"; +import type { Event } from "@shared/lib/types"; import { config } from "@lib/config"; -import { userService } from "@modules/user/user.service"; +import { userService } from "@shared/modules/user/user.service"; // Visitor role const event: Event = { diff --git a/src/events/interactionCreate.ts b/bot/events/interactionCreate.ts similarity index 93% rename from src/events/interactionCreate.ts rename to bot/events/interactionCreate.ts index 3d19fd0..405f8ef 100644 --- a/src/events/interactionCreate.ts +++ b/bot/events/interactionCreate.ts @@ -1,6 +1,6 @@ import { Events } from "discord.js"; import { ComponentInteractionHandler, AutocompleteHandler, CommandHandler } from "@/lib/handlers"; -import type { Event } from "@lib/types"; +import type { Event } from "@shared/lib/types"; const event: Event = { name: Events.InteractionCreate, diff --git a/src/events/messageCreate.ts b/bot/events/messageCreate.ts similarity index 74% rename from src/events/messageCreate.ts rename to bot/events/messageCreate.ts index f9adc8a..aa252b4 100644 --- a/src/events/messageCreate.ts +++ b/bot/events/messageCreate.ts @@ -1,7 +1,7 @@ import { Events } from "discord.js"; -import { userService } from "@/modules/user/user.service"; -import { levelingService } from "@/modules/leveling/leveling.service"; -import type { Event } from "@lib/types"; +import { userService } from "@shared/modules/user/user.service"; +import { levelingService } from "@shared/modules/leveling/leveling.service"; +import type { Event } from "@shared/lib/types"; const event: Event = { name: Events.MessageCreate, diff --git a/src/events/ready.ts b/bot/events/ready.ts similarity index 91% rename from src/events/ready.ts rename to bot/events/ready.ts index 0786e9f..dd897aa 100644 --- a/src/events/ready.ts +++ b/bot/events/ready.ts @@ -1,6 +1,6 @@ import { Events } from "discord.js"; import { schedulerService } from "@/modules/system/scheduler"; -import type { Event } from "@lib/types"; +import type { Event } from "@shared/lib/types"; const event: Event = { name: Events.ClientReady, diff --git a/src/graphics/lootdrop.ts b/bot/graphics/lootdrop.ts similarity index 100% rename from src/graphics/lootdrop.ts rename to bot/graphics/lootdrop.ts diff --git a/src/graphics/studentID.ts b/bot/graphics/studentID.ts similarity index 98% rename from src/graphics/studentID.ts rename to bot/graphics/studentID.ts index 552963a..29fada2 100644 --- a/src/graphics/studentID.ts +++ b/bot/graphics/studentID.ts @@ -1,5 +1,5 @@ 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'; // Register Fonts diff --git a/src/index.ts b/bot/index.ts similarity index 87% rename from src/index.ts rename to bot/index.ts index 5d601b9..e573c4a 100644 --- a/src/index.ts +++ b/bot/index.ts @@ -1,8 +1,8 @@ import { AuroraClient } from "@/lib/BotClient"; -import { env } from "@lib/env"; +import { env } from "@shared/lib/env"; import { join } from "node:path"; -import { startWebServerFromRoot } from "./web/src/server"; +import { startWebServerFromRoot } from "../web/src/server"; // Load commands & events await AuroraClient.loadCommands(); @@ -13,7 +13,7 @@ console.log("🌐 Starting web server..."); 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 webHost = process.env.HOST || "0.0.0.0"; diff --git a/src/lib/BotClient.ts b/bot/lib/BotClient.ts similarity index 96% rename from src/lib/BotClient.ts rename to bot/lib/BotClient.ts index 08f5664..365b699 100644 --- a/src/lib/BotClient.ts +++ b/bot/lib/BotClient.ts @@ -1,7 +1,7 @@ import { Client as DiscordClient, Collection, GatewayIntentBits, REST, Routes } from "discord.js"; import { join } from "node:path"; -import type { Command } from "@lib/types"; -import { env } from "@lib/env"; +import type { Command } from "@shared/lib/types"; +import { env } from "@shared/lib/env"; import { CommandLoader } from "@lib/loaders/CommandLoader"; import { EventLoader } from "@lib/loaders/EventLoader"; @@ -96,7 +96,7 @@ export class Client extends DiscordClient { async 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..."); setShuttingDown(true); diff --git a/src/lib/config.ts b/bot/lib/config.ts similarity index 100% rename from src/lib/config.ts rename to bot/lib/config.ts diff --git a/src/lib/configManager.ts b/bot/lib/configManager.ts similarity index 100% rename from src/lib/configManager.ts rename to bot/lib/configManager.ts diff --git a/src/lib/db.test.ts b/bot/lib/db.test.ts similarity index 100% rename from src/lib/db.test.ts rename to bot/lib/db.test.ts diff --git a/src/lib/db.ts b/bot/lib/db.ts similarity index 85% rename from src/lib/db.ts rename to bot/lib/db.ts index a4c9922..c154bba 100644 --- a/src/lib/db.ts +++ b/bot/lib/db.ts @@ -1,5 +1,5 @@ -import { DrizzleClient } from "./DrizzleClient"; -import type { Transaction } from "./types"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; +import type { Transaction } from "@shared/lib/types"; import { isShuttingDown, incrementTransactions, decrementTransactions } from "./shutdown"; export const withTransaction = async ( diff --git a/src/lib/embeds.ts b/bot/lib/embeds.ts similarity index 100% rename from src/lib/embeds.ts rename to bot/lib/embeds.ts diff --git a/src/lib/errors.ts b/bot/lib/errors.ts similarity index 100% rename from src/lib/errors.ts rename to bot/lib/errors.ts diff --git a/src/lib/handlers/AutocompleteHandler.ts b/bot/lib/handlers/AutocompleteHandler.ts similarity index 100% rename from src/lib/handlers/AutocompleteHandler.ts rename to bot/lib/handlers/AutocompleteHandler.ts diff --git a/src/lib/handlers/CommandHandler.test.ts b/bot/lib/handlers/CommandHandler.test.ts similarity index 100% rename from src/lib/handlers/CommandHandler.test.ts rename to bot/lib/handlers/CommandHandler.test.ts diff --git a/src/lib/handlers/CommandHandler.ts b/bot/lib/handlers/CommandHandler.ts similarity index 95% rename from src/lib/handlers/CommandHandler.ts rename to bot/lib/handlers/CommandHandler.ts index 9deee7f..84073e6 100644 --- a/src/lib/handlers/CommandHandler.ts +++ b/bot/lib/handlers/CommandHandler.ts @@ -1,6 +1,6 @@ import { ChatInputCommandInteraction, MessageFlags } from "discord.js"; 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"; diff --git a/src/lib/handlers/ComponentInteractionHandler.ts b/bot/lib/handlers/ComponentInteractionHandler.ts similarity index 100% rename from src/lib/handlers/ComponentInteractionHandler.ts rename to bot/lib/handlers/ComponentInteractionHandler.ts diff --git a/src/lib/handlers/index.ts b/bot/lib/handlers/index.ts similarity index 100% rename from src/lib/handlers/index.ts rename to bot/lib/handlers/index.ts diff --git a/src/lib/interaction.routes.ts b/bot/lib/interaction.routes.ts similarity index 100% rename from src/lib/interaction.routes.ts rename to bot/lib/interaction.routes.ts diff --git a/src/lib/loaders/CommandLoader.ts b/bot/lib/loaders/CommandLoader.ts similarity index 98% rename from src/lib/loaders/CommandLoader.ts rename to bot/lib/loaders/CommandLoader.ts index d5c5323..63d054d 100644 --- a/src/lib/loaders/CommandLoader.ts +++ b/bot/lib/loaders/CommandLoader.ts @@ -1,6 +1,6 @@ import { readdir } from "node:fs/promises"; import { join } from "node:path"; -import type { Command } from "@lib/types"; +import type { Command } from "@shared/lib/types"; import { config } from "@lib/config"; import type { LoadResult, LoadError } from "./types"; import type { Client } from "../BotClient"; diff --git a/src/lib/loaders/EventLoader.ts b/bot/lib/loaders/EventLoader.ts similarity index 98% rename from src/lib/loaders/EventLoader.ts rename to bot/lib/loaders/EventLoader.ts index c2faad1..f306975 100644 --- a/src/lib/loaders/EventLoader.ts +++ b/bot/lib/loaders/EventLoader.ts @@ -1,6 +1,6 @@ import { readdir } from "node:fs/promises"; 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 { Client } from "../BotClient"; diff --git a/src/lib/loaders/types.ts b/bot/lib/loaders/types.ts similarity index 100% rename from src/lib/loaders/types.ts rename to bot/lib/loaders/types.ts diff --git a/src/lib/shutdown.test.ts b/bot/lib/shutdown.test.ts similarity index 100% rename from src/lib/shutdown.test.ts rename to bot/lib/shutdown.test.ts diff --git a/src/lib/shutdown.ts b/bot/lib/shutdown.ts similarity index 100% rename from src/lib/shutdown.ts rename to bot/lib/shutdown.ts diff --git a/src/lib/webhookUtils.ts b/bot/lib/webhookUtils.ts similarity index 100% rename from src/lib/webhookUtils.ts rename to bot/lib/webhookUtils.ts diff --git a/src/modules/admin/item_wizard.test.ts b/bot/modules/admin/item_wizard.test.ts similarity index 99% rename from src/modules/admin/item_wizard.test.ts rename to bot/modules/admin/item_wizard.test.ts index 5b86c7e..e9acf03 100644 --- a/src/modules/admin/item_wizard.test.ts +++ b/bot/modules/admin/item_wizard.test.ts @@ -6,13 +6,13 @@ import { ButtonInteraction, ModalSubmitInteraction, StringSelectMenuInteraction const valuesMock = mock((_args: any) => Promise.resolve()); const insertMock = mock(() => ({ values: valuesMock })); -mock.module("@/lib/DrizzleClient", () => ({ +mock.module("@shared/db/DrizzleClient", () => ({ DrizzleClient: { insert: insertMock } })); -mock.module("@/db/schema", () => ({ +mock.module("@db/schema", () => ({ items: "items_schema" })); diff --git a/src/modules/admin/item_wizard.ts b/bot/modules/admin/item_wizard.ts similarity index 97% rename from src/modules/admin/item_wizard.ts rename to bot/modules/admin/item_wizard.ts index 19ef10f..228f6aa 100644 --- a/src/modules/admin/item_wizard.ts +++ b/bot/modules/admin/item_wizard.ts @@ -1,10 +1,10 @@ import { type Interaction } from "discord.js"; -import { items } from "@/db/schema"; -import { DrizzleClient } from "@/lib/DrizzleClient"; -import type { ItemUsageData, ItemEffect } from "@/lib/types"; +import { items } from "@db/schema"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; +import type { ItemUsageData, ItemEffect } from "@shared/lib/types"; import { getItemWizardEmbed, getItemTypeSelection, getEffectTypeSelection, getDetailsModal, getEconomyModal, getVisualsModal, getEffectConfigModal } from "./item_wizard.view"; import type { DraftItem } from "./item_wizard.types"; -import { ItemType, EffectType } from "@/lib/constants"; +import { ItemType, EffectType } from "@shared/lib/constants"; // --- Types --- diff --git a/src/modules/admin/item_wizard.types.ts b/bot/modules/admin/item_wizard.types.ts similarity index 83% rename from src/modules/admin/item_wizard.types.ts rename to bot/modules/admin/item_wizard.types.ts index 2317204..5f08dcd 100644 --- a/src/modules/admin/item_wizard.types.ts +++ b/bot/modules/admin/item_wizard.types.ts @@ -1,4 +1,4 @@ -import type { ItemUsageData } from "@/lib/types"; +import type { ItemUsageData } from "@shared/lib/types"; export interface DraftItem { name: string; diff --git a/src/modules/admin/item_wizard.view.ts b/bot/modules/admin/item_wizard.view.ts similarity index 99% rename from src/modules/admin/item_wizard.view.ts rename to bot/modules/admin/item_wizard.view.ts index 66b75f7..f9aa952 100644 --- a/src/modules/admin/item_wizard.view.ts +++ b/bot/modules/admin/item_wizard.view.ts @@ -10,7 +10,7 @@ import { } from "discord.js"; import { createBaseEmbed } from "@lib/embeds"; import type { DraftItem } from "./item_wizard.types"; -import { ItemType } from "@/lib/constants"; +import { ItemType } from "@shared/lib/constants"; const getItemTypeOptions = () => [ { label: "Material", value: ItemType.MATERIAL, description: "Used for crafting or trading" }, diff --git a/bot/modules/admin/update.types.ts b/bot/modules/admin/update.types.ts new file mode 100644 index 0000000..633a6ad --- /dev/null +++ b/bot/modules/admin/update.types.ts @@ -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; +} diff --git a/src/modules/admin/update.view.ts b/bot/modules/admin/update.view.ts similarity index 99% rename from src/modules/admin/update.view.ts rename to bot/modules/admin/update.view.ts index cc7bc6b..734d37b 100644 --- a/src/modules/admin/update.view.ts +++ b/bot/modules/admin/update.view.ts @@ -1,6 +1,6 @@ import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } from "discord.js"; 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 const LOG_TRUNCATE_LENGTH = 800; diff --git a/src/modules/economy/lootdrop.interaction.ts b/bot/modules/economy/lootdrop.interaction.ts similarity index 93% rename from src/modules/economy/lootdrop.interaction.ts rename to bot/modules/economy/lootdrop.interaction.ts index 593d4f5..72f1893 100644 --- a/src/modules/economy/lootdrop.interaction.ts +++ b/bot/modules/economy/lootdrop.interaction.ts @@ -1,5 +1,5 @@ import { ButtonInteraction } from "discord.js"; -import { lootdropService } from "./lootdrop.service"; +import { lootdropService } from "@shared/modules/economy/lootdrop.service"; import { UserError } from "@/lib/errors"; import { getLootdropClaimedMessage } from "./lootdrop.view"; diff --git a/src/modules/economy/lootdrop.view.ts b/bot/modules/economy/lootdrop.view.ts similarity index 100% rename from src/modules/economy/lootdrop.view.ts rename to bot/modules/economy/lootdrop.view.ts diff --git a/src/modules/economy/shop.interaction.ts b/bot/modules/economy/shop.interaction.ts similarity index 90% rename from src/modules/economy/shop.interaction.ts rename to bot/modules/economy/shop.interaction.ts index b5439dc..30b470e 100644 --- a/src/modules/economy/shop.interaction.ts +++ b/bot/modules/economy/shop.interaction.ts @@ -1,6 +1,6 @@ import { ButtonInteraction, MessageFlags } from "discord.js"; -import { inventoryService } from "@/modules/inventory/inventory.service"; -import { userService } from "@/modules/user/user.service"; +import { inventoryService } from "@shared/modules/inventory/inventory.service"; +import { userService } from "@shared/modules/user/user.service"; import { UserError } from "@/lib/errors"; export async function handleShopInteraction(interaction: ButtonInteraction) { diff --git a/src/modules/economy/shop.view.ts b/bot/modules/economy/shop.view.ts similarity index 100% rename from src/modules/economy/shop.view.ts rename to bot/modules/economy/shop.view.ts diff --git a/src/modules/feedback/feedback.interaction.ts b/bot/modules/feedback/feedback.interaction.ts similarity index 100% rename from src/modules/feedback/feedback.interaction.ts rename to bot/modules/feedback/feedback.interaction.ts diff --git a/src/modules/feedback/feedback.types.ts b/bot/modules/feedback/feedback.types.ts similarity index 100% rename from src/modules/feedback/feedback.types.ts rename to bot/modules/feedback/feedback.types.ts diff --git a/src/modules/feedback/feedback.view.ts b/bot/modules/feedback/feedback.view.ts similarity index 100% rename from src/modules/feedback/feedback.view.ts rename to bot/modules/feedback/feedback.view.ts diff --git a/src/modules/inventory/effects/handlers.ts b/bot/modules/inventory/effects/handlers.ts similarity index 90% rename from src/modules/inventory/effects/handlers.ts rename to bot/modules/inventory/effects/handlers.ts index a04fbdb..b06f5b6 100644 --- a/src/modules/inventory/effects/handlers.ts +++ b/bot/modules/inventory/effects/handlers.ts @@ -1,11 +1,11 @@ -import { levelingService } from "@/modules/leveling/leveling.service"; -import { economyService } from "@/modules/economy/economy.service"; -import { userTimers } from "@/db/schema"; +import { levelingService } from "@shared/modules/leveling/leveling.service"; +import { economyService } from "@shared/modules/economy/economy.service"; +import { userTimers } from "@db/schema"; import type { EffectHandler } from "./types"; -import type { LootTableItem } from "@/lib/types"; -import { inventoryService } from "@/modules/inventory/inventory.service"; -import { inventory, items } from "@/db/schema"; -import { TimerType, TransactionType, LootType } from "@/lib/constants"; +import type { LootTableItem } from "@shared/lib/types"; +import { inventoryService } from "@shared/modules/inventory/inventory.service"; +import { inventory, items } from "@db/schema"; +import { TimerType, TransactionType, LootType } from "@shared/lib/constants"; // 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 { 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) { return winner.message || `You found ${quantity > 1 ? quantity + 'x ' : ''}**${item.name}**!`; diff --git a/src/modules/inventory/effects/registry.ts b/bot/modules/inventory/effects/registry.ts similarity index 100% rename from src/modules/inventory/effects/registry.ts rename to bot/modules/inventory/effects/registry.ts diff --git a/src/modules/inventory/effects/types.ts b/bot/modules/inventory/effects/types.ts similarity index 64% rename from src/modules/inventory/effects/types.ts rename to bot/modules/inventory/effects/types.ts index 478cc80..98b6c60 100644 --- a/src/modules/inventory/effects/types.ts +++ b/bot/modules/inventory/effects/types.ts @@ -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; diff --git a/src/modules/inventory/inventory.view.ts b/bot/modules/inventory/inventory.view.ts similarity index 93% rename from src/modules/inventory/inventory.view.ts rename to bot/modules/inventory/inventory.view.ts index 2c796b7..c4f806e 100644 --- a/src/modules/inventory/inventory.view.ts +++ b/bot/modules/inventory/inventory.view.ts @@ -1,6 +1,6 @@ import { EmbedBuilder } from "discord.js"; -import type { ItemUsageData } from "@/lib/types"; -import { EffectType } from "@/lib/constants"; +import type { ItemUsageData } from "@shared/lib/types"; +import { EffectType } from "@shared/lib/constants"; /** * Inventory entry with item details diff --git a/src/modules/leveling/leveling.view.ts b/bot/modules/leveling/leveling.view.ts similarity index 100% rename from src/modules/leveling/leveling.view.ts rename to bot/modules/leveling/leveling.view.ts diff --git a/src/modules/moderation/moderation.types.ts b/bot/modules/moderation/moderation.types.ts similarity index 94% rename from src/modules/moderation/moderation.types.ts rename to bot/modules/moderation/moderation.types.ts index 5fa78c7..ddfecbd 100644 --- a/src/modules/moderation/moderation.types.ts +++ b/bot/modules/moderation/moderation.types.ts @@ -1,4 +1,4 @@ -import { CaseType } from "@/lib/constants"; +import { CaseType } from "@shared/lib/constants"; export { CaseType }; diff --git a/src/modules/moderation/moderation.view.ts b/bot/modules/moderation/moderation.view.ts similarity index 100% rename from src/modules/moderation/moderation.view.ts rename to bot/modules/moderation/moderation.view.ts diff --git a/src/modules/moderation/prune.types.ts b/bot/modules/moderation/prune.types.ts similarity index 100% rename from src/modules/moderation/prune.types.ts rename to bot/modules/moderation/prune.types.ts diff --git a/src/modules/moderation/prune.view.ts b/bot/modules/moderation/prune.view.ts similarity index 100% rename from src/modules/moderation/prune.view.ts rename to bot/modules/moderation/prune.view.ts diff --git a/src/modules/quest/quest.view.ts b/bot/modules/quest/quest.view.ts similarity index 100% rename from src/modules/quest/quest.view.ts rename to bot/modules/quest/quest.view.ts diff --git a/src/modules/system/scheduler.ts b/bot/modules/system/scheduler.ts similarity index 88% rename from src/modules/system/scheduler.ts rename to bot/modules/system/scheduler.ts index fda1215..32d5854 100644 --- a/src/modules/system/scheduler.ts +++ b/bot/modules/system/scheduler.ts @@ -1,4 +1,4 @@ -import { temporaryRoleService } from "./temp-role.service"; +import { temporaryRoleService } from "@shared/modules/system/temp-role.service"; export const schedulerService = { start: () => { diff --git a/src/modules/trade/trade.interaction.ts b/bot/modules/trade/trade.interaction.ts similarity index 97% rename from src/modules/trade/trade.interaction.ts rename to bot/modules/trade/trade.interaction.ts index dabe920..ea4a45b 100644 --- a/src/modules/trade/trade.interaction.ts +++ b/bot/modules/trade/trade.interaction.ts @@ -7,8 +7,8 @@ import { TextChannel, EmbedBuilder } from "discord.js"; -import { tradeService } from "./trade.service"; -import { inventoryService } from "@/modules/inventory/inventory.service"; +import { tradeService } from "@shared/modules/trade/trade.service"; +import { inventoryService } from "@shared/modules/inventory/inventory.service"; import { createErrorEmbed, createWarningEmbed, createSuccessEmbed, createInfoEmbed } from "@lib/embeds"; import { UserError } from "@lib/errors"; 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 - const options = inventory.slice(0, 25).map(entry => ({ + const options = inventory.slice(0, 25).map((entry: any) => ({ label: `${entry.item.name} (${entry.quantity})`, value: entry.item.id.toString(), description: `Rarity: ${entry.item.rarity} ` diff --git a/src/modules/trade/trade.types.ts b/bot/modules/trade/trade.types.ts similarity index 100% rename from src/modules/trade/trade.types.ts rename to bot/modules/trade/trade.types.ts diff --git a/src/modules/trade/trade.view.ts b/bot/modules/trade/trade.view.ts similarity index 100% rename from src/modules/trade/trade.view.ts rename to bot/modules/trade/trade.view.ts diff --git a/src/modules/user/enrollment.interaction.ts b/bot/modules/user/enrollment.interaction.ts similarity index 94% rename from src/modules/user/enrollment.interaction.ts rename to bot/modules/user/enrollment.interaction.ts index 60d3e27..2b88fd5 100644 --- a/src/modules/user/enrollment.interaction.ts +++ b/bot/modules/user/enrollment.interaction.ts @@ -1,8 +1,8 @@ import { ButtonInteraction, MessageFlags } from "discord.js"; import { config } from "@/lib/config"; import { getEnrollmentSuccessMessage } from "./enrollment.view"; -import { classService } from "@modules/class/class.service"; -import { userService } from "@modules/user/user.service"; +import { classService } from "@shared/modules/class/class.service"; +import { userService } from "@shared/modules/user/user.service"; import { UserError } from "@/lib/errors"; import { sendWebhookMessage } from "@/lib/webhookUtils"; @@ -37,7 +37,7 @@ export async function handleEnrollmentInteraction(interaction: ButtonInteraction // 2. Get available classes const allClasses = await classService.getAllClasses(); - const validClasses = allClasses.filter(c => c.roleId); + const validClasses = allClasses.filter((c: any) => c.roleId); if (validClasses.length === 0) { throw new UserError("No classes with specified roles found in database."); diff --git a/src/modules/user/enrollment.view.ts b/bot/modules/user/enrollment.view.ts similarity index 100% rename from src/modules/user/enrollment.view.ts rename to bot/modules/user/enrollment.view.ts diff --git a/src/modules/user/user.timers.ts b/bot/modules/user/user.timers.ts similarity index 90% rename from src/modules/user/user.timers.ts rename to bot/modules/user/user.timers.ts index e2e41d4..7e96368 100644 --- a/src/modules/user/user.timers.ts +++ b/bot/modules/user/user.timers.ts @@ -1,7 +1,7 @@ -import { userTimers } from "@/db/schema"; +import { userTimers } from "@db/schema"; import { eq, and } from "drizzle-orm"; -import { DrizzleClient } from "@/lib/DrizzleClient"; -import { TimerType } from "@/lib/constants"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; +import { TimerType } from "@shared/lib/constants"; export { TimerType }; @@ -33,7 +33,7 @@ export const userTimerService = { if (tx) { return await execute(tx); } else { - return await DrizzleClient.transaction(async (t) => { + return await DrizzleClient.transaction(async (t: any) => { return await execute(t); }); } @@ -89,7 +89,7 @@ export const userTimerService = { if (tx) { return await execute(tx); } else { - return await DrizzleClient.transaction(async (t) => { + return await DrizzleClient.transaction(async (t: any) => { return await execute(t); }); } diff --git a/docker-compose.yml b/docker-compose.yml index 0b6754c..1817ee7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,8 +10,8 @@ services: # ports: # - "127.0.0.1:${DB_PORT}:5432" volumes: - - ./src/db/data:/var/lib/postgresql/data - - ./src/db/log:/var/log/postgresql + - ./shared/db/data:/var/lib/postgresql/data + - ./shared/db/log:/var/log/postgresql networks: - internal healthcheck: @@ -33,7 +33,7 @@ services: volumes: - .:/app - /app/node_modules - - /app/src/web/node_modules + - /app/web/node_modules environment: - HOST=0.0.0.0 - DB_USER=${DB_USER} @@ -71,7 +71,7 @@ services: volumes: - .:/app - /app/node_modules - - /app/src/web/node_modules + - /app/web/node_modules environment: - DB_USER=${DB_USER} - DB_PASSWORD=${DB_PASSWORD} diff --git a/drizzle.config.ts b/drizzle.config.ts index fdb7cc3..d82931c 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from "drizzle-kit"; -import { env } from "./src/lib/env"; +import { env } from "./shared/lib/env"; // @ts-expect-error - Polyfill for BigInt serialization BigInt.prototype.toJSON = function () { @@ -7,7 +7,7 @@ BigInt.prototype.toJSON = function () { }; export default defineConfig({ - schema: "./src/db/schema.ts", + schema: "./shared/db/schema.ts", out: "./drizzle", dialect: "postgresql", dbCredentials: { diff --git a/package.json b/package.json index e150ca5..3b28fe4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "app", - "module": "index.ts", + "module": "bot/index.ts", "type": "module", "private": true, "devDependencies": { @@ -15,7 +15,7 @@ "migrate": "docker compose run --rm app drizzle-kit migrate", "db:push": "docker compose run --rm app 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", "studio:remote": "bash scripts/remote-studio.sh", "dashboard:remote": "bash scripts/remote-dashboard.sh", diff --git a/src/lib/DrizzleClient.ts b/shared/db/DrizzleClient.ts similarity index 80% rename from src/lib/DrizzleClient.ts rename to shared/db/DrizzleClient.ts index 7b193bd..0ffe2be 100644 --- a/src/lib/DrizzleClient.ts +++ b/shared/db/DrizzleClient.ts @@ -1,7 +1,7 @@ import { drizzle } from "drizzle-orm/bun-sql"; import { SQL } from "bun"; -import * as schema from "@db/schema"; -import { env } from "@lib/env"; +import * as schema from "./schema"; +import { env } from "@shared/lib/env"; const connectionString = env.DATABASE_URL; export const postgres = new SQL(connectionString); diff --git a/src/db/indexes.test.ts b/shared/db/indexes.test.ts similarity index 97% rename from src/db/indexes.test.ts rename to shared/db/indexes.test.ts index 9f61750..66b7ce6 100644 --- a/src/db/indexes.test.ts +++ b/shared/db/indexes.test.ts @@ -1,5 +1,5 @@ import { expect, test, describe } from "bun:test"; -import { postgres } from "../lib/DrizzleClient"; +import { postgres } from "./DrizzleClient"; describe("Database Indexes", () => { test("should have indexes on users table", async () => { diff --git a/src/db/schema.ts b/shared/db/schema.ts similarity index 100% rename from src/db/schema.ts rename to shared/db/schema.ts diff --git a/shared/lib/config.ts b/shared/lib/config.ts new file mode 100644 index 0000000..f5e678d --- /dev/null +++ b/shared/lib/config.ts @@ -0,0 +1,204 @@ +import { readFileSync, existsSync, writeFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { z } from 'zod'; + +const configPath = join(import.meta.dir, '..', '..', 'config', 'config.json'); + +export interface GameConfigType { + leveling: { + base: number; + exponent: number; + chat: { + cooldownMs: number; + minXp: number; + maxXp: number; + } + }, + economy: { + daily: { + amount: bigint; + streakBonus: bigint; + weeklyBonus: bigint; + cooldownMs: number; + }, + transfers: { + allowSelfTransfer: boolean; + minAmount: bigint; + }, + exam: { + multMin: number; + multMax: number; + } + }, + inventory: { + maxStackSize: bigint; + maxSlots: number; + }, + commands: Record; + lootdrop: { + activityWindowMs: number; + minMessages: number; + spawnChance: number; + cooldownMs: number; + reward: { + min: number; + max: number; + currency: string; + } + }; + studentRole: string; + visitorRole: string; + colorRoles: string[]; + welcomeChannelId?: string; + welcomeMessage?: string; + feedbackChannelId?: string; + terminal?: { + channelId: string; + messageId: string; + }; + moderation: { + prune: { + maxAmount: number; + confirmThreshold: number; + batchSize: number; + batchDelayMs: number; + }; + cases: { + dmOnWarn: boolean; + logChannelId?: string; + autoTimeoutThreshold?: number; + }; + }; + system: Record; +} + +// Initial default config state +export const config: GameConfigType = {} as GameConfigType; + +const bigIntSchema = z.union([z.string(), z.number(), z.bigint()]) + .refine((val) => { + try { + BigInt(val); + return true; + } catch { + return false; + } + }, { message: "Must be a valid integer" }) + .transform((val) => BigInt(val)); + +const configSchema = z.object({ + leveling: z.object({ + base: z.number(), + exponent: z.number(), + chat: z.object({ + cooldownMs: z.number(), + minXp: z.number(), + maxXp: z.number(), + }) + }), + economy: z.object({ + daily: z.object({ + amount: bigIntSchema, + streakBonus: bigIntSchema, + weeklyBonus: bigIntSchema.default(50n), + cooldownMs: z.number(), + }), + transfers: z.object({ + allowSelfTransfer: z.boolean(), + minAmount: bigIntSchema, + }), + exam: z.object({ + multMin: z.number(), + multMax: z.number(), + }) + }), + inventory: z.object({ + maxStackSize: bigIntSchema, + maxSlots: z.number(), + }), + commands: z.record(z.string(), z.boolean()), + lootdrop: z.object({ + activityWindowMs: z.number(), + minMessages: z.number(), + spawnChance: z.number(), + cooldownMs: z.number(), + reward: z.object({ + min: z.number(), + max: z.number(), + currency: z.string(), + }) + + }), + studentRole: z.string(), + visitorRole: z.string(), + colorRoles: z.array(z.string()).default([]), + welcomeChannelId: z.string().optional(), + welcomeMessage: z.string().optional(), + feedbackChannelId: z.string().optional(), + terminal: z.object({ + channelId: z.string(), + messageId: z.string() + }).optional(), + moderation: z.object({ + prune: z.object({ + maxAmount: z.number().default(100), + confirmThreshold: z.number().default(50), + batchSize: z.number().default(100), + batchDelayMs: z.number().default(1000) + }), + cases: z.object({ + dmOnWarn: z.boolean().default(true), + logChannelId: z.string().optional(), + autoTimeoutThreshold: z.number().optional() + }) + }).default({ + prune: { + maxAmount: 100, + confirmThreshold: 50, + batchSize: 100, + batchDelayMs: 1000 + }, + cases: { + dmOnWarn: true + } + }), + system: z.record(z.string(), z.any()).default({}), +}); + +export function reloadConfig() { + if (!existsSync(configPath)) { + throw new Error(`Config file not found at ${configPath}`); + } + + const raw = readFileSync(configPath, 'utf-8'); + const rawConfig = JSON.parse(raw); + + // Update config object in place + // We use Object.assign to keep the reference to the exported 'config' object same + const validatedConfig = configSchema.parse(rawConfig); + Object.assign(config, validatedConfig); + + console.log("šŸ”„ Config reloaded from disk."); +} + +// Initial load +reloadConfig(); + +// Backwards compatibility alias +export const GameConfig = config; + +export function saveConfig(newConfig: unknown) { + // Validate and transform input + const validatedConfig = configSchema.parse(newConfig); + + const replacer = (key: string, value: any) => { + if (typeof value === 'bigint') { + return value.toString(); + } + return value; + }; + + const jsonString = JSON.stringify(validatedConfig, replacer, 4); + writeFileSync(configPath, jsonString, 'utf-8'); + reloadConfig(); +} diff --git a/src/lib/constants.ts b/shared/lib/constants.ts similarity index 100% rename from src/lib/constants.ts rename to shared/lib/constants.ts diff --git a/src/lib/env.ts b/shared/lib/env.ts similarity index 100% rename from src/lib/env.ts rename to shared/lib/env.ts diff --git a/shared/lib/errors.ts b/shared/lib/errors.ts new file mode 100644 index 0000000..32bce8c --- /dev/null +++ b/shared/lib/errors.ts @@ -0,0 +1,18 @@ +export class ApplicationError extends Error { + constructor(message: string) { + super(message); + this.name = this.constructor.name; + } +} + +export class UserError extends ApplicationError { + constructor(message: string) { + super(message); + } +} + +export class SystemError extends ApplicationError { + constructor(message: string) { + super(message); + } +} diff --git a/src/lib/types.ts b/shared/lib/types.ts similarity index 97% rename from src/lib/types.ts rename to shared/lib/types.ts index cc03368..41dfaf5 100644 --- a/src/lib/types.ts +++ b/shared/lib/types.ts @@ -1,6 +1,6 @@ import type { AutocompleteInteraction, ChatInputCommandInteraction, ClientEvents, SlashCommandBuilder, SlashCommandOptionsOnlyBuilder, SlashCommandSubcommandsOnlyBuilder } from "discord.js"; import { LootType, EffectType } from "./constants"; -import { DrizzleClient } from "./DrizzleClient"; +import { DrizzleClient } from "../db/DrizzleClient"; export interface Command { data: SlashCommandBuilder | SlashCommandOptionsOnlyBuilder | SlashCommandSubcommandsOnlyBuilder; diff --git a/src/lib/utils.ts b/shared/lib/utils.ts similarity index 100% rename from src/lib/utils.ts rename to shared/lib/utils.ts diff --git a/src/modules/admin/update.service.test.ts b/shared/modules/admin/update.service.test.ts similarity index 100% rename from src/modules/admin/update.service.test.ts rename to shared/modules/admin/update.service.test.ts diff --git a/src/modules/admin/update.service.ts b/shared/modules/admin/update.service.ts similarity index 90% rename from src/modules/admin/update.service.ts rename to shared/modules/admin/update.service.ts index 3b49cde..665bed0 100644 --- a/src/modules/admin/update.service.ts +++ b/shared/modules/admin/update.service.ts @@ -4,44 +4,14 @@ import { writeFile, readFile, unlink } from "fs/promises"; import { Client, TextChannel } from "discord.js"; import { getPostRestartEmbed, getInstallingDependenciesEmbed, getRunningMigrationsEmbed } from "./update.view"; import type { PostRestartResult } from "./update.view"; +import type { RestartContext, UpdateCheckResult, UpdateInfo, CommitInfo } from "./update.types"; const execAsync = promisify(exec); // Constants const STALE_CONTEXT_MS = 10 * 60 * 1000; // 10 minutes -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; -} export class UpdateService { private static readonly CONTEXT_FILE = ".restart_context.json"; @@ -97,7 +67,7 @@ export class UpdateService { ); const needsWebInstall = changedFiles.some(file => - file === "src/web/package.json" || file === "src/web/bun.lock" + file === "web/package.json" || file === "web/bun.lock" ); const needsMigrations = changedFiles.some(file => @@ -131,10 +101,10 @@ export class UpdateService { for (const file of changedFiles) { let category = "Other"; - if (file.startsWith("src/commands/")) category = "Commands"; - else if (file.startsWith("src/modules/")) category = "Modules"; - else if (file.startsWith("src/web/")) category = "Web Dashboard"; - else if (file.startsWith("src/lib/")) category = "Library"; + if (file.startsWith("bot/commands/")) category = "Commands"; + else if (file.startsWith("bot/modules/")) category = "Modules"; + else if (file.startsWith("web/")) category = "Web Dashboard"; + else if (file.startsWith("bot/lib/") || file.startsWith("shared/lib/")) category = "Library"; else if (file.startsWith("drizzle/") || file.includes("schema")) category = "Database"; else if (file.endsWith(".test.ts")) category = "Tests"; else if (file.includes("package.json") || file.includes("lock")) category = "Dependencies"; @@ -203,7 +173,7 @@ export class UpdateService { } if (options.web) { - const { stdout } = await execAsync("cd src/web && bun install"); + const { stdout } = await execAsync("cd web && bun install"); outputs.push(`🌐 Web: ${stdout.trim() || "Done"}`); } @@ -303,7 +273,7 @@ export class UpdateService { await channel.send({ embeds: [getInstallingDependenciesEmbed()] }); const { stdout: rootOutput } = await execAsync("bun install"); - const { stdout: webOutput } = await execAsync("cd src/web && bun install"); + const { stdout: webOutput } = await execAsync("cd web && bun install"); result.installOutput = `šŸ“¦ Root: ${rootOutput.trim() || "Done"}\n🌐 Web: ${webOutput.trim() || "Done"}`; } catch (err: unknown) { diff --git a/src/modules/class/class.service.test.ts b/shared/modules/class/class.service.test.ts similarity index 97% rename from src/modules/class/class.service.test.ts rename to shared/modules/class/class.service.test.ts index 82dfe8d..7215833 100644 --- a/src/modules/class/class.service.test.ts +++ b/shared/modules/class/class.service.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, mock, beforeEach } from "bun:test"; -import { classService } from "./class.service"; -import { classes, users } from "@/db/schema"; +import { classService } from "@shared/modules/class/class.service"; +import { classes, users } from "@db/schema"; // Define mock functions const mockFindMany = mock(); @@ -24,7 +24,7 @@ mockWhere.mockReturnValue({ returning: mockReturning }); mockDelete.mockReturnValue({ where: mockWhere }); // Fix for delete chaining if needed, usually delete(table).where(...) // Mock DrizzleClient -mock.module("@/lib/DrizzleClient", () => { +mock.module("@shared/db/DrizzleClient", () => { return { DrizzleClient: { query: { diff --git a/src/modules/class/class.service.ts b/shared/modules/class/class.service.ts similarity index 94% rename from src/modules/class/class.service.ts rename to shared/modules/class/class.service.ts index eb25bd2..5b668c0 100644 --- a/src/modules/class/class.service.ts +++ b/shared/modules/class/class.service.ts @@ -1,9 +1,9 @@ -import { classes, users } from "@/db/schema"; +import { classes, users } from "@db/schema"; import { eq, sql } from "drizzle-orm"; -import { DrizzleClient } from "@/lib/DrizzleClient"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; import { UserError } from "@/lib/errors"; import { withTransaction } from "@/lib/db"; -import type { Transaction } from "@/lib/types"; +import type { Transaction } from "@shared/lib/types"; export const classService = { getAllClasses: async () => { diff --git a/src/modules/economy/economy.service.test.ts b/shared/modules/economy/economy.service.test.ts similarity index 98% rename from src/modules/economy/economy.service.test.ts rename to shared/modules/economy/economy.service.test.ts index 537c11d..6682e63 100644 --- a/src/modules/economy/economy.service.test.ts +++ b/shared/modules/economy/economy.service.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, mock, beforeEach, setSystemTime } from "bun:test"; -import { economyService } from "./economy.service"; -import { users, userTimers, transactions } from "@/db/schema"; +import { economyService } from "@shared/modules/economy/economy.service"; +import { users, userTimers, transactions } from "@db/schema"; // Define mock functions const mockFindMany = mock(); @@ -27,7 +27,7 @@ mockSet.mockReturnValue({ where: mockWhere }); mockWhere.mockReturnValue({ returning: mockReturning }); // Mock DrizzleClient -mock.module("@/lib/DrizzleClient", () => { +mock.module("@shared/db/DrizzleClient", () => { // Mock Transaction Object Structure const createMockTx = () => ({ query: { diff --git a/src/modules/economy/economy.service.ts b/shared/modules/economy/economy.service.ts similarity index 97% rename from src/modules/economy/economy.service.ts rename to shared/modules/economy/economy.service.ts index 57288a6..d00b242 100644 --- a/src/modules/economy/economy.service.ts +++ b/shared/modules/economy/economy.service.ts @@ -1,10 +1,10 @@ -import { users, transactions, userTimers } from "@/db/schema"; +import { users, transactions, userTimers } from "@db/schema"; import { eq, sql, and } from "drizzle-orm"; import { config } from "@/lib/config"; import { withTransaction } from "@/lib/db"; -import type { Transaction } from "@/lib/types"; +import type { Transaction } from "@shared/lib/types"; import { UserError } from "@/lib/errors"; -import { TimerType, TransactionType } from "@/lib/constants"; +import { TimerType, TransactionType } from "@shared/lib/constants"; export const economyService = { transfer: async (fromUserId: string, toUserId: string, amount: bigint, tx?: Transaction) => { diff --git a/src/modules/economy/lootdrop.service.test.ts b/shared/modules/economy/lootdrop.service.test.ts similarity index 96% rename from src/modules/economy/lootdrop.service.test.ts rename to shared/modules/economy/lootdrop.service.test.ts index 2594fbe..fd08dca 100644 --- a/src/modules/economy/lootdrop.service.test.ts +++ b/shared/modules/economy/lootdrop.service.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, mock, beforeEach, afterEach, spyOn } from "bun:test"; -import { lootdropService } from "./lootdrop.service"; -import { lootdrops } from "@/db/schema"; -import { economyService } from "./economy.service"; +import { lootdropService } from "@shared/modules/economy/lootdrop.service"; +import { lootdrops } from "@db/schema"; +import { economyService } from "@shared/modules/economy/economy.service"; // Mock dependencies BEFORE using service functionality const mockInsert = mock(); @@ -23,7 +23,7 @@ mockSelect.mockReturnValue({ from: mockFrom }); mockFrom.mockReturnValue({ where: mockWhere }); // Mock DrizzleClient -mock.module("@/lib/DrizzleClient", () => { +mock.module("@shared/db/DrizzleClient", () => { return { DrizzleClient: { insert: mockInsert, diff --git a/src/modules/economy/lootdrop.service.ts b/shared/modules/economy/lootdrop.service.ts similarity index 97% rename from src/modules/economy/lootdrop.service.ts rename to shared/modules/economy/lootdrop.service.ts index 280710d..da4ab80 100644 --- a/src/modules/economy/lootdrop.service.ts +++ b/shared/modules/economy/lootdrop.service.ts @@ -3,11 +3,11 @@ import { Message, TextChannel } from "discord.js"; import { getLootdropMessage } from "./lootdrop.view"; import { config } from "@/lib/config"; import { economyService } from "./economy.service"; -import { terminalService } from "@/modules/terminal/terminal.service"; +import { terminalService } from "@shared/modules/terminal/terminal.service"; -import { lootdrops } from "@/db/schema"; -import { DrizzleClient } from "@/lib/DrizzleClient"; +import { lootdrops } from "@db/schema"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; import { eq, and, isNull, lt } from "drizzle-orm"; interface Lootdrop { diff --git a/src/modules/inventory/inventory.service.test.ts b/shared/modules/inventory/inventory.service.test.ts similarity index 96% rename from src/modules/inventory/inventory.service.test.ts rename to shared/modules/inventory/inventory.service.test.ts index 462e9bd..41dde49 100644 --- a/src/modules/inventory/inventory.service.test.ts +++ b/shared/modules/inventory/inventory.service.test.ts @@ -1,9 +1,9 @@ import { describe, it, expect, mock, beforeEach, afterEach, spyOn } from "bun:test"; -import { inventoryService } from "./inventory.service"; -import { inventory, userTimers } from "@/db/schema"; +import { inventoryService } from "@shared/modules/inventory/inventory.service"; +import { inventory, userTimers } from "@db/schema"; // Helper to mock resolved value for spyOn -import { economyService } from "@/modules/economy/economy.service"; -import { levelingService } from "@/modules/leveling/leveling.service"; +import { economyService } from "@shared/modules/economy/economy.service"; +import { levelingService } from "@shared/modules/leveling/leveling.service"; // Mock dependencies const mockFindFirst = mock(); @@ -42,7 +42,7 @@ mockWhere.mockReturnValue({ returning: mockReturning, limit: mockLimit }); mockLimit.mockResolvedValue([]); // Mock DrizzleClient -mock.module("@/lib/DrizzleClient", () => { +mock.module("@shared/db/DrizzleClient", () => { const createMockTx = () => ({ query: { inventory: { findFirst: mockFindFirst, findMany: mockFindMany }, diff --git a/src/modules/inventory/inventory.service.ts b/shared/modules/inventory/inventory.service.ts similarity index 93% rename from src/modules/inventory/inventory.service.ts rename to shared/modules/inventory/inventory.service.ts index 3eb6e46..bead578 100644 --- a/src/modules/inventory/inventory.service.ts +++ b/shared/modules/inventory/inventory.service.ts @@ -1,13 +1,13 @@ -import { inventory, items, users, userTimers } from "@/db/schema"; +import { inventory, items, users, userTimers } from "@db/schema"; import { eq, and, sql, count, ilike } from "drizzle-orm"; -import { DrizzleClient } from "@/lib/DrizzleClient"; -import { economyService } from "@/modules/economy/economy.service"; -import { levelingService } from "@/modules/leveling/leveling.service"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; +import { economyService } from "@shared/modules/economy/economy.service"; +import { levelingService } from "@shared/modules/leveling/leveling.service"; import { config } from "@/lib/config"; import { UserError } from "@/lib/errors"; import { withTransaction } from "@/lib/db"; -import type { Transaction, ItemUsageData } from "@/lib/types"; -import { TransactionType } from "@/lib/constants"; +import type { Transaction, ItemUsageData } from "@shared/lib/types"; +import { TransactionType } from "@shared/lib/constants"; @@ -196,12 +196,12 @@ export const inventoryService = { )) .limit(20); - const filtered = entries.filter(entry => { + const filtered = entries.filter((entry: any) => { const usageData = entry.item.usageData as ItemUsageData | null; return usageData && usageData.effects && usageData.effects.length > 0; }); - return filtered.map(entry => ({ + return filtered.map((entry: any) => ({ name: `${entry.item.name} (${entry.quantity}) [${entry.item.rarity || 'Common'}]`, value: entry.item.id })); diff --git a/src/modules/leveling/leveling.service.test.ts b/shared/modules/leveling/leveling.service.test.ts similarity index 97% rename from src/modules/leveling/leveling.service.test.ts rename to shared/modules/leveling/leveling.service.test.ts index 05b03cd..e2545b8 100644 --- a/src/modules/leveling/leveling.service.test.ts +++ b/shared/modules/leveling/leveling.service.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, mock, beforeEach, afterEach, setSystemTime } from "bun:test"; -import { levelingService } from "./leveling.service"; -import { users, userTimers } from "@/db/schema"; +import { levelingService } from "@shared/modules/leveling/leveling.service"; +import { users, userTimers } from "@db/schema"; // Mock dependencies const mockFindFirst = mock(); @@ -21,7 +21,7 @@ mockInsert.mockReturnValue({ values: mockValues }); mockValues.mockReturnValue({ onConflictDoUpdate: mockOnConflictDoUpdate }); mockOnConflictDoUpdate.mockResolvedValue({}); -mock.module("@/lib/DrizzleClient", () => { +mock.module("@shared/db/DrizzleClient", () => { const createMockTx = () => ({ query: { users: { findFirst: mockFindFirst }, diff --git a/src/modules/leveling/leveling.service.ts b/shared/modules/leveling/leveling.service.ts similarity index 96% rename from src/modules/leveling/leveling.service.ts rename to shared/modules/leveling/leveling.service.ts index 06ebbda..f6f9f19 100644 --- a/src/modules/leveling/leveling.service.ts +++ b/shared/modules/leveling/leveling.service.ts @@ -1,9 +1,9 @@ -import { users, userTimers } from "@/db/schema"; +import { users, userTimers } from "@db/schema"; import { eq, sql, and } from "drizzle-orm"; import { withTransaction } from "@/lib/db"; import { config } from "@/lib/config"; -import type { Transaction } from "@/lib/types"; -import { TimerType } from "@/lib/constants"; +import type { Transaction } from "@shared/lib/types"; +import { TimerType } from "@shared/lib/constants"; export const levelingService = { // Calculate total XP required to REACH a specific level (Cumulative) diff --git a/src/modules/moderation/moderation.service.test.ts b/shared/modules/moderation/moderation.service.test.ts similarity index 97% rename from src/modules/moderation/moderation.service.test.ts rename to shared/modules/moderation/moderation.service.test.ts index ad23ada..00130f7 100644 --- a/src/modules/moderation/moderation.service.test.ts +++ b/shared/modules/moderation/moderation.service.test.ts @@ -1,8 +1,8 @@ import { describe, it, expect, mock, beforeEach } from "bun:test"; -import { ModerationService } from "./moderation.service"; -import { moderationCases } from "@/db/schema"; -import { CaseType } from "@/lib/constants"; +import { ModerationService } from "@shared/modules/moderation/moderation.service"; +import { moderationCases } from "@db/schema"; +import { CaseType } from "@shared/lib/constants"; // Mock Drizzle Functions const mockFindFirst = mock(); @@ -35,7 +35,7 @@ mock.module("./moderation.view", () => ({ })); // Mock DrizzleClient -mock.module("@/lib/DrizzleClient", () => ({ +mock.module("@shared/db/DrizzleClient", () => ({ DrizzleClient: { query: { moderationCases: { diff --git a/src/modules/moderation/moderation.service.ts b/shared/modules/moderation/moderation.service.ts similarity index 98% rename from src/modules/moderation/moderation.service.ts rename to shared/modules/moderation/moderation.service.ts index 1b577c8..4e1c63e 100644 --- a/src/modules/moderation/moderation.service.ts +++ b/shared/modules/moderation/moderation.service.ts @@ -1,10 +1,10 @@ -import { moderationCases } from "@/db/schema"; +import { moderationCases } from "@db/schema"; import { eq, and, desc } from "drizzle-orm"; -import { DrizzleClient } from "@/lib/DrizzleClient"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; import type { CreateCaseOptions, ClearCaseOptions, SearchCasesFilter } from "./moderation.types"; import { config } from "@/lib/config"; import { getUserWarningEmbed } from "./moderation.view"; -import { CaseType } from "@/lib/constants"; +import { CaseType } from "@shared/lib/constants"; export class ModerationService { /** diff --git a/src/modules/moderation/prune.service.ts b/shared/modules/moderation/prune.service.ts similarity index 100% rename from src/modules/moderation/prune.service.ts rename to shared/modules/moderation/prune.service.ts diff --git a/src/modules/quest/quest.service.test.ts b/shared/modules/quest/quest.service.test.ts similarity index 94% rename from src/modules/quest/quest.service.test.ts rename to shared/modules/quest/quest.service.test.ts index a9f770d..1cd1b73 100644 --- a/src/modules/quest/quest.service.test.ts +++ b/shared/modules/quest/quest.service.test.ts @@ -1,9 +1,9 @@ import { describe, it, expect, mock, beforeEach, afterEach, spyOn } from "bun:test"; -import { questService } from "./quest.service"; -import { userQuests } from "@/db/schema"; +import { questService } from "@shared/modules/quest/quest.service"; +import { userQuests } from "@db/schema"; import { eq, and } from "drizzle-orm"; -import { economyService } from "@/modules/economy/economy.service"; -import { levelingService } from "@/modules/leveling/leveling.service"; +import { economyService } from "@shared/modules/economy/economy.service"; +import { levelingService } from "@shared/modules/leveling/leveling.service"; // Mock dependencies const mockFindFirst = mock(); @@ -29,7 +29,7 @@ mockSet.mockReturnValue({ where: mockWhere }); mockWhere.mockReturnValue({ returning: mockReturning }); // Mock DrizzleClient -mock.module("@/lib/DrizzleClient", () => { +mock.module("@shared/db/DrizzleClient", () => { const createMockTx = () => ({ query: { userQuests: { findFirst: mockFindFirst, findMany: mockFindMany }, diff --git a/src/modules/quest/quest.service.ts b/shared/modules/quest/quest.service.ts similarity index 89% rename from src/modules/quest/quest.service.ts rename to shared/modules/quest/quest.service.ts index ec1d9fb..486dcd1 100644 --- a/src/modules/quest/quest.service.ts +++ b/shared/modules/quest/quest.service.ts @@ -1,12 +1,12 @@ -import { userQuests } from "@/db/schema"; +import { userQuests } from "@db/schema"; import { eq, and } from "drizzle-orm"; import { UserError } from "@/lib/errors"; -import { DrizzleClient } from "@/lib/DrizzleClient"; -import { economyService } from "@/modules/economy/economy.service"; -import { levelingService } from "@/modules/leveling/leveling.service"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; +import { economyService } from "@shared/modules/economy/economy.service"; +import { levelingService } from "@shared/modules/leveling/leveling.service"; import { withTransaction } from "@/lib/db"; -import type { Transaction } from "@/lib/types"; -import { TransactionType } from "@/lib/constants"; +import type { Transaction } from "@shared/lib/types"; +import { TransactionType } from "@shared/lib/constants"; export const questService = { assignQuest: async (userId: string, questId: number, tx?: Transaction) => { diff --git a/src/modules/system/temp-role.service.test.ts b/shared/modules/system/temp-role.service.test.ts similarity index 91% rename from src/modules/system/temp-role.service.test.ts rename to shared/modules/system/temp-role.service.test.ts index 9d9e03a..89757e5 100644 --- a/src/modules/system/temp-role.service.test.ts +++ b/shared/modules/system/temp-role.service.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, mock, beforeEach } from "bun:test"; -import { temporaryRoleService } from "./temp-role.service"; -import { userTimers } from "@/db/schema"; -import { TimerType } from "@/lib/constants"; +import { temporaryRoleService } from "@shared/modules/system/temp-role.service"; +import { userTimers } from "@db/schema"; +import { TimerType } from "@shared/lib/constants"; const mockDelete = mock(); const mockWhere = mock(); @@ -10,7 +10,7 @@ const mockFindMany = mock(); mockDelete.mockReturnValue({ where: mockWhere }); // Mock DrizzleClient -mock.module("@/lib/DrizzleClient", () => ({ +mock.module("@shared/db/DrizzleClient", () => ({ DrizzleClient: { delete: mockDelete, query: { @@ -34,7 +34,7 @@ mock.module("@/lib/BotClient", () => ({ } })); -mock.module("@/lib/env", () => ({ +mock.module("@shared/lib/env", () => ({ env: { DISCORD_GUILD_ID: "guild123" } diff --git a/src/modules/system/temp-role.service.ts b/shared/modules/system/temp-role.service.ts similarity index 92% rename from src/modules/system/temp-role.service.ts rename to shared/modules/system/temp-role.service.ts index 9efa5b8..1a055e9 100644 --- a/src/modules/system/temp-role.service.ts +++ b/shared/modules/system/temp-role.service.ts @@ -1,9 +1,9 @@ -import { userTimers } from "@/db/schema"; +import { userTimers } from "@db/schema"; import { eq, and, lt } from "drizzle-orm"; -import { DrizzleClient } from "@/lib/DrizzleClient"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; import { AuroraClient } from "@/lib/BotClient"; -import { env } from "@/lib/env"; -import { TimerType } from "@/lib/constants"; +import { env } from "@shared/lib/env"; +import { TimerType } from "@shared/lib/constants"; export const temporaryRoleService = { /** diff --git a/src/modules/terminal/terminal.service.ts b/shared/modules/terminal/terminal.service.ts similarity index 93% rename from src/modules/terminal/terminal.service.ts rename to shared/modules/terminal/terminal.service.ts index f8fbec9..2a260a4 100644 --- a/src/modules/terminal/terminal.service.ts +++ b/shared/modules/terminal/terminal.service.ts @@ -9,8 +9,8 @@ import { SeparatorSpacingSize } from "discord.js"; import { AuroraClient } from "@/lib/BotClient"; -import { DrizzleClient } from "@/lib/DrizzleClient"; -import { users, transactions, lootdrops, inventory } from "@/db/schema"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; +import { users, transactions, lootdrops, inventory } from "@db/schema"; import { desc, sql } from "drizzle-orm"; import { config, saveConfig } from "@/lib/config"; @@ -85,7 +85,7 @@ export const terminalService = { const allUsers = await DrizzleClient.select().from(users); const totalUsers = allUsers.length; - const totalWealth = allUsers.reduce((acc, u) => acc + (u.balance || 0n), 0n); + const totalWealth = allUsers.reduce((acc: bigint, u: any) => acc + (u.balance || 0n), 0n); // System stats const uptime = process.uptime(); @@ -100,9 +100,9 @@ export const terminalService = { // Additional metrics const avgLevel = totalUsers > 0 - ? Math.round(allUsers.reduce((acc, u) => acc + (u.level || 1), 0) / totalUsers) + ? Math.round(allUsers.reduce((acc: number, u: any) => acc + (u.level || 1), 0) / totalUsers) : 1; - const topStreak = allUsers.reduce((max, u) => Math.max(max, u.dailyStreak || 0), 0); + const topStreak = allUsers.reduce((max: number, u: any) => Math.max(max, u.dailyStreak || 0), 0); // Items in circulation const itemsResult = await DrizzleClient @@ -125,13 +125,13 @@ export const terminalService = { // Lootdrops const activeDrops = await DrizzleClient.query.lootdrops.findMany({ - where: (lootdrops, { isNull }) => isNull(lootdrops.claimedBy), + where: (lootdrops: any, { isNull }: any) => isNull(lootdrops.claimedBy), limit: 1, orderBy: desc(lootdrops.createdAt) }); const recentDrops = await DrizzleClient.query.lootdrops.findMany({ - where: (lootdrops, { isNotNull }) => isNotNull(lootdrops.claimedBy), + where: (lootdrops: any, { isNotNull }: any) => isNotNull(lootdrops.claimedBy), limit: 1, orderBy: desc(lootdrops.createdAt) }); @@ -257,7 +257,7 @@ export const terminalService = { ); } else if (recentDrops.length > 0 && recentDrops[0]) { const drop = recentDrops[0]; - const claimer = allUsers.find(u => u.id === drop.claimedBy); + const claimer = allUsers.find((u: any) => u.id === drop.claimedBy); const claimedTimestamp = drop.createdAt ? Math.floor(drop.createdAt.getTime() / 1000) : now; activityContainer.addTextDisplayComponents( @@ -278,10 +278,10 @@ export const terminalService = { new SeparatorBuilder().setSpacing(SeparatorSpacingSize.Small) ); - const txLines = recentTx.map(tx => { + const txLines = recentTx.map((tx: any) => { const time = Math.floor(tx.createdAt!.getTime() / 1000); const icon = getActivityIcon(tx.type); - const user = allUsers.find(u => u.id === tx.userId); + const user = allUsers.find((u: any) => u.id === tx.userId); // Clean description (remove trailing channel IDs) let desc = tx.description || "Unknown"; diff --git a/src/modules/trade/trade.service.test.ts b/shared/modules/trade/trade.service.test.ts similarity index 95% rename from src/modules/trade/trade.service.test.ts rename to shared/modules/trade/trade.service.test.ts index 5ac53dd..90edd62 100644 --- a/src/modules/trade/trade.service.test.ts +++ b/shared/modules/trade/trade.service.test.ts @@ -1,8 +1,8 @@ import { describe, it, expect, mock, beforeEach, afterEach, spyOn } from "bun:test"; -import { tradeService } from "./trade.service"; -import { itemTransactions } from "@/db/schema"; -import { economyService } from "@/modules/economy/economy.service"; -import { inventoryService } from "@/modules/inventory/inventory.service"; +import { tradeService } from "@shared/modules/trade/trade.service"; +import { itemTransactions } from "@db/schema"; +import { economyService } from "@shared/modules/economy/economy.service"; +import { inventoryService } from "@shared/modules/inventory/inventory.service"; // Mock dependencies const mockInsert = mock(); @@ -11,7 +11,7 @@ const mockValues = mock(); mockInsert.mockReturnValue({ values: mockValues }); // Mock DrizzleClient -mock.module("@/lib/DrizzleClient", () => { +mock.module("@shared/db/DrizzleClient", () => { return { DrizzleClient: { transaction: async (cb: any) => { diff --git a/src/modules/trade/trade.service.ts b/shared/modules/trade/trade.service.ts similarity index 95% rename from src/modules/trade/trade.service.ts rename to shared/modules/trade/trade.service.ts index c3b4ee4..237f1df 100644 --- a/src/modules/trade/trade.service.ts +++ b/shared/modules/trade/trade.service.ts @@ -1,10 +1,10 @@ import type { TradeSession, TradeParticipant } from "./trade.types"; -import { economyService } from "@/modules/economy/economy.service"; -import { inventoryService } from "@/modules/inventory/inventory.service"; -import { itemTransactions } from "@/db/schema"; +import { economyService } from "@shared/modules/economy/economy.service"; +import { inventoryService } from "@shared/modules/inventory/inventory.service"; +import { itemTransactions } from "@db/schema"; import { withTransaction } from "@/lib/db"; -import type { Transaction } from "@/lib/types"; -import { TransactionType, ItemTransactionType } from "@/lib/constants"; +import type { Transaction } from "@shared/lib/types"; +import { TransactionType, ItemTransactionType } from "@shared/lib/constants"; // Module-level session storage const sessions = new Map(); diff --git a/src/modules/user/user.service.test.ts b/shared/modules/user/user.service.test.ts similarity index 98% rename from src/modules/user/user.service.test.ts rename to shared/modules/user/user.service.test.ts index 168cdd7..b24eabb 100644 --- a/src/modules/user/user.service.test.ts +++ b/shared/modules/user/user.service.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, mock, beforeEach } from "bun:test"; -import { userService } from "./user.service"; +import { userService } from "@shared/modules/user/user.service"; // Define mock functions outside so we can control them in tests const mockFindFirst = mock(); @@ -23,7 +23,7 @@ mockWhere.mockReturnValue({ returning: mockReturning }); mockDelete.mockReturnValue({ where: mockWhere }); // Mock DrizzleClient -mock.module("@/lib/DrizzleClient", () => { +mock.module("@shared/db/DrizzleClient", () => { return { DrizzleClient: { query: { diff --git a/src/modules/user/user.service.ts b/shared/modules/user/user.service.ts similarity index 94% rename from src/modules/user/user.service.ts rename to shared/modules/user/user.service.ts index 759385c..077e438 100644 --- a/src/modules/user/user.service.ts +++ b/shared/modules/user/user.service.ts @@ -1,8 +1,8 @@ -import { users } from "@/db/schema"; +import { users } from "@db/schema"; import { eq } from "drizzle-orm"; -import { DrizzleClient } from "@/lib/DrizzleClient"; +import { DrizzleClient } from "@shared/db/DrizzleClient"; import { withTransaction } from "@/lib/db"; -import type { Transaction } from "@/lib/types"; +import type { Transaction } from "@shared/lib/types"; export const userService = { getUserById: async (id: string) => { diff --git a/tsconfig.json b/tsconfig.json index 4403c52..6e79a5d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -28,20 +28,29 @@ "baseUrl": ".", "paths": { "@/*": [ - "./src/*" + "./bot/*" ], "@commands/*": [ - "./src/commands/*" + "./bot/commands/*" ], "@db/*": [ - "./src/db/*" + "./shared/db/*" ], "@lib/*": [ - "./src/lib/*" + "./bot/lib/*" ], "@modules/*": [ - "./src/modules/*" + "./bot/modules/*" + ], + "@shared/*": [ + "./shared/*" ] } - } + }, + "exclude": [ + "node_modules", + "web", + "dist", + "drizzle" + ] } \ No newline at end of file diff --git a/src/web/.gitignore b/web/.gitignore similarity index 100% rename from src/web/.gitignore rename to web/.gitignore diff --git a/src/web/README.md b/web/README.md similarity index 100% rename from src/web/README.md rename to web/README.md diff --git a/src/web/build.ts b/web/build.ts similarity index 96% rename from src/web/build.ts rename to web/build.ts index f3c5cd4..33b97d5 100644 --- a/src/web/build.ts +++ b/web/build.ts @@ -33,7 +33,7 @@ Example: process.exit(0); } -const toCamelCase = (str: string): string => str.replace(/-([a-z])/g, g => g[1].toUpperCase()); +const toCamelCase = (str: string): string => str.replace(/-([a-z])/g, g => g[1]?.toUpperCase() || ""); const parseValue = (value: string): any => { if (value === "true") return true; @@ -58,12 +58,14 @@ function parseArgs(): Partial { if (arg.startsWith("--no-")) { const key = toCamelCase(arg.slice(5)); + // @ts-ignore config[key] = false; continue; } if (!arg.includes("=") && (i === args.length - 1 || args[i + 1]?.startsWith("--"))) { const key = toCamelCase(arg.slice(2)); + // @ts-ignore config[key] = true; continue; } @@ -82,9 +84,12 @@ function parseArgs(): Partial { if (key.includes(".")) { const [parentKey, childKey] = key.split("."); + // @ts-ignore config[parentKey] = config[parentKey] || {}; + // @ts-ignore config[parentKey][childKey] = parseValue(value); } else { + // @ts-ignore config[key] = parseValue(value); } } diff --git a/src/web/bun-env.d.ts b/web/bun-env.d.ts similarity index 100% rename from src/web/bun-env.d.ts rename to web/bun-env.d.ts diff --git a/src/web/bun.lock b/web/bun.lock similarity index 100% rename from src/web/bun.lock rename to web/bun.lock diff --git a/src/web/bunfig.toml b/web/bunfig.toml similarity index 100% rename from src/web/bunfig.toml rename to web/bunfig.toml diff --git a/src/web/components.json b/web/components.json similarity index 100% rename from src/web/components.json rename to web/components.json diff --git a/src/web/package.json b/web/package.json similarity index 100% rename from src/web/package.json rename to web/package.json diff --git a/src/web/src/App.tsx b/web/src/App.tsx similarity index 100% rename from src/web/src/App.tsx rename to web/src/App.tsx diff --git a/src/web/src/components/AppSidebar.tsx b/web/src/components/AppSidebar.tsx similarity index 100% rename from src/web/src/components/AppSidebar.tsx rename to web/src/components/AppSidebar.tsx diff --git a/src/web/src/components/ui/button.tsx b/web/src/components/ui/button.tsx similarity index 100% rename from src/web/src/components/ui/button.tsx rename to web/src/components/ui/button.tsx diff --git a/src/web/src/components/ui/card.tsx b/web/src/components/ui/card.tsx similarity index 100% rename from src/web/src/components/ui/card.tsx rename to web/src/components/ui/card.tsx diff --git a/src/web/src/components/ui/input.tsx b/web/src/components/ui/input.tsx similarity index 100% rename from src/web/src/components/ui/input.tsx rename to web/src/components/ui/input.tsx diff --git a/src/web/src/components/ui/separator.tsx b/web/src/components/ui/separator.tsx similarity index 100% rename from src/web/src/components/ui/separator.tsx rename to web/src/components/ui/separator.tsx diff --git a/src/web/src/components/ui/sheet.tsx b/web/src/components/ui/sheet.tsx similarity index 100% rename from src/web/src/components/ui/sheet.tsx rename to web/src/components/ui/sheet.tsx diff --git a/src/web/src/components/ui/sidebar.tsx b/web/src/components/ui/sidebar.tsx similarity index 100% rename from src/web/src/components/ui/sidebar.tsx rename to web/src/components/ui/sidebar.tsx diff --git a/src/web/src/components/ui/skeleton.tsx b/web/src/components/ui/skeleton.tsx similarity index 100% rename from src/web/src/components/ui/skeleton.tsx rename to web/src/components/ui/skeleton.tsx diff --git a/src/web/src/components/ui/tooltip.tsx b/web/src/components/ui/tooltip.tsx similarity index 100% rename from src/web/src/components/ui/tooltip.tsx rename to web/src/components/ui/tooltip.tsx diff --git a/src/web/src/frontend.tsx b/web/src/frontend.tsx similarity index 100% rename from src/web/src/frontend.tsx rename to web/src/frontend.tsx diff --git a/src/web/src/hooks/use-mobile.ts b/web/src/hooks/use-mobile.ts similarity index 100% rename from src/web/src/hooks/use-mobile.ts rename to web/src/hooks/use-mobile.ts diff --git a/src/web/src/index.css b/web/src/index.css similarity index 100% rename from src/web/src/index.css rename to web/src/index.css diff --git a/src/web/src/index.html b/web/src/index.html similarity index 75% rename from src/web/src/index.html rename to web/src/index.html index 1da92fe..5b72de0 100644 --- a/src/web/src/index.html +++ b/web/src/index.html @@ -5,8 +5,8 @@ Aurora - - + +
diff --git a/src/web/src/index.ts b/web/src/index.ts similarity index 100% rename from src/web/src/index.ts rename to web/src/index.ts diff --git a/src/web/src/layouts/DashboardLayout.tsx b/web/src/layouts/DashboardLayout.tsx similarity index 100% rename from src/web/src/layouts/DashboardLayout.tsx rename to web/src/layouts/DashboardLayout.tsx diff --git a/src/web/src/lib/utils.ts b/web/src/lib/utils.ts similarity index 100% rename from src/web/src/lib/utils.ts rename to web/src/lib/utils.ts diff --git a/src/web/src/pages/Activity.tsx b/web/src/pages/Activity.tsx similarity index 100% rename from src/web/src/pages/Activity.tsx rename to web/src/pages/Activity.tsx diff --git a/src/web/src/pages/Dashboard.tsx b/web/src/pages/Dashboard.tsx similarity index 100% rename from src/web/src/pages/Dashboard.tsx rename to web/src/pages/Dashboard.tsx diff --git a/src/web/src/pages/Settings.tsx b/web/src/pages/Settings.tsx similarity index 100% rename from src/web/src/pages/Settings.tsx rename to web/src/pages/Settings.tsx diff --git a/src/web/src/server.ts b/web/src/server.ts similarity index 100% rename from src/web/src/server.ts rename to web/src/server.ts diff --git a/src/web/styles/globals.css b/web/styles/globals.css similarity index 100% rename from src/web/styles/globals.css rename to web/styles/globals.css diff --git a/src/web/tsconfig.json b/web/tsconfig.json similarity index 75% rename from src/web/tsconfig.json rename to web/tsconfig.json index 632a36f..a2b6167 100644 --- a/src/web/tsconfig.json +++ b/web/tsconfig.json @@ -1,36 +1,45 @@ { "compilerOptions": { // Environment setup & latest features - "lib": ["ESNext", "DOM"], + "lib": [ + "ESNext", + "DOM" + ], "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, - "baseUrl": ".", "paths": { - "@/*": ["./src/*"] + "@/*": [ + "./src/*" + ], + "@shared/*": [ + "../shared/*" + ], + "@bot/*": [ + "../bot/*" + ] }, - // Some stricter flags (disabled by default) "noUnusedLocals": false, "noUnusedParameters": false, "noPropertyAccessFromIndexSignature": false }, - - "exclude": ["dist", "node_modules"] -} + "exclude": [ + "dist", + "node_modules" + ] +} \ No newline at end of file