@m3rcena/eco 0.0.0-stage → 14.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/DOCUMENTATION.md +869 -0
  3. package/LICENSE +191 -0
  4. package/README.md +182 -2
  5. package/assets/logo.png +0 -0
  6. package/dist/host-Bmld-WtZ.cjs +6163 -0
  7. package/dist/host-Bmld-WtZ.cjs.map +1 -0
  8. package/dist/host-XZmTzNyx.d.cts +1833 -0
  9. package/dist/host-XZmTzNyx.d.cts.map +1 -0
  10. package/dist/host-_xxHiG2p.d.mts +1833 -0
  11. package/dist/host-_xxHiG2p.d.mts.map +1 -0
  12. package/dist/host-qJNVzdDa.mjs +5894 -0
  13. package/dist/host-qJNVzdDa.mjs.map +1 -0
  14. package/dist/host.cjs +4 -0
  15. package/dist/host.d.cts +2 -0
  16. package/dist/host.d.mts +2 -0
  17. package/dist/host.mjs +2 -0
  18. package/dist/index.cjs +1440 -0
  19. package/dist/index.cjs.map +1 -0
  20. package/dist/index.d.cts +339 -0
  21. package/dist/index.d.cts.map +1 -0
  22. package/dist/index.d.mts +339 -0
  23. package/dist/index.d.mts.map +1 -0
  24. package/dist/index.mjs +1371 -0
  25. package/dist/index.mjs.map +1 -0
  26. package/dist/register.cjs +46 -0
  27. package/dist/register.cjs.map +1 -0
  28. package/dist/register.d.cts +6 -0
  29. package/dist/register.d.cts.map +1 -0
  30. package/dist/register.d.mts +6 -0
  31. package/dist/register.d.mts.map +1 -0
  32. package/dist/register.mjs +44 -0
  33. package/dist/register.mjs.map +1 -0
  34. package/dist/resolver.cjs +305 -0
  35. package/dist/resolver.cjs.map +1 -0
  36. package/dist/resolver.d.cts +40 -0
  37. package/dist/resolver.d.cts.map +1 -0
  38. package/dist/resolver.d.mts +40 -0
  39. package/dist/resolver.d.mts.map +1 -0
  40. package/dist/resolver.mjs +296 -0
  41. package/dist/resolver.mjs.map +1 -0
  42. package/dist/rolldown-runtime-CmQyd0Gu.cjs +27 -0
  43. package/dist/rolldown-runtime-D3PmRqjj.mjs +4 -0
  44. package/package.json +94 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/ui/ContextAdapter.ts","../src/ui/EcoBaseUI.ts","../src/ui/EcoProfileUI.ts","../src/ui/EcoShopUI.ts","../src/ui/EcoStockMarketUI.ts","../src/ui/EcoHeistUI.ts","../src/ui/EcoBlackjackUI.ts","../src/ui/EcoCrateUI.ts","../src/ui/EcoLeaderboardUI.ts","../src/ui/EcoVaultUI.ts","../src/ui/EcoLoanUI.ts","../src/ui/EcoBillsUI.ts","../src/index.ts"],"sourcesContent":["/**\n * @m3rcena/eco\n * Discord Context Adapter for Unified Slash Command, Message, and Dashboard Execution.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport {\n ActionRowBuilder,\n AttachmentBuilder,\n ButtonInteraction,\n ChatInputCommandInteraction,\n Client,\n ContainerBuilder,\n EmbedBuilder,\n Guild,\n GuildMember,\n Interaction,\n Message,\n MessageCreateOptions,\n MessageEditOptions,\n MessageFlags,\n TextBasedChannel,\n User,\n} from \"discord.js\";\n\nexport type ComponentBuilderType = ActionRowBuilder<any> | ContainerBuilder | any;\n\nexport interface ContextSendOptions {\n content?: string;\n embeds?: EmbedBuilder[];\n components?: ComponentBuilderType[];\n files?: (AttachmentBuilder | Buffer | { attachment: Buffer | string; name?: string })[];\n flags?: MessageFlags | number;\n}\n\nexport type GameContextInput = ChatInputCommandInteraction | ButtonInteraction | Interaction | Message | any;\n\nexport class ContextAdapter {\n public raw: GameContextInput;\n public user: User;\n public userId: string;\n public member: GuildMember | null;\n public guild: Guild | null;\n public channel: TextBasedChannel;\n public client: Client;\n public isInteraction: boolean;\n public isMessage: boolean;\n public gameMessage: Message | null = null;\n\n constructor(context: GameContextInput) {\n if (context instanceof ContextAdapter) {\n context = context.raw;\n }\n this.raw = context;\n\n if (context instanceof Message) {\n this.isMessage = true;\n this.isInteraction = false;\n this.user = context.author;\n this.userId = context.author.id;\n this.member = context.member ?? null;\n this.guild = context.guild ?? null;\n this.channel = context.channel as TextBasedChannel;\n this.client = context.client;\n } else if (typeof (context as any)?.reply === \"function\") {\n this.isInteraction = true;\n this.isMessage = false;\n this.user = context.user || (context as any).author;\n this.userId = this.user?.id || context.member?.id;\n this.member = (context.member as GuildMember) ?? null;\n this.guild = context.guild ?? null;\n this.channel = context.channel as TextBasedChannel;\n this.client = context.client;\n } else {\n this.isInteraction = false;\n this.isMessage = true;\n this.user = context.user || (context as any).author;\n this.userId = this.user?.id || (context.member as any)?.id;\n this.member = (context.member as GuildMember) ?? null;\n this.guild = context.guild ?? null;\n this.channel = (context.channel || (typeof (context as any).send === \"function\" ? context : null)) as TextBasedChannel;\n this.client = context.client;\n }\n\n if (!this.user || !this.channel) {\n throw new Error(\"[ContextAdapter] Invalid Discord context: unable to resolve user or channel.\");\n }\n }\n\n public static from(context: GameContextInput): ContextAdapter {\n return new ContextAdapter(context);\n }\n\n private resolveFlags(options: ContextSendOptions): number | undefined {\n let flags = typeof options.flags === \"number\" ? options.flags : 0;\n const hasContainer = options.components?.some((c: any) => c instanceof ContainerBuilder || typeof c?.setAccentColor === \"function\" || c?.data?.type === 17);\n if (hasContainer) {\n flags |= MessageFlags.IsComponentsV2;\n }\n return flags > 0 ? flags : undefined;\n }\n\n public async sendInitial(options: ContextSendOptions): Promise<Message> {\n if (typeof (this.raw as any)?.sendInitial === \"function\") {\n const msg = await (this.raw as any).sendInitial(options);\n this.gameMessage = msg;\n return msg;\n }\n\n const resolvedFlags = this.resolveFlags(options);\n const isV2 = !!((resolvedFlags ?? 0) & MessageFlags.IsComponentsV2);\n\n if (this.isInteraction) {\n const interaction = this.raw as ChatInputCommandInteraction | ButtonInteraction;\n\n if (interaction.deferred || interaction.replied) {\n const payload: any = {\n components: options.components,\n files: options.files as any,\n flags: resolvedFlags,\n };\n if (!isV2) {\n if (options.content !== undefined) payload.content = options.content;\n if (options.embeds !== undefined) payload.embeds = options.embeds;\n }\n const msg = await interaction.editReply(payload);\n if (msg instanceof Message) {\n this.gameMessage = msg;\n } else if (typeof (interaction as any).fetchReply === \"function\") {\n this.gameMessage = await (interaction as any).fetchReply().catch(() => null);\n } else {\n this.gameMessage = msg || null;\n }\n } else {\n const payload: any = {\n components: options.components,\n files: options.files as any,\n flags: resolvedFlags,\n withResponse: true,\n };\n if (!isV2) {\n if (options.content !== undefined) payload.content = options.content;\n if (options.embeds !== undefined) payload.embeds = options.embeds;\n }\n const response: any = await interaction.reply(payload);\n\n if (response && typeof response === \"object\" && \"resource\" in response && response.resource?.message) {\n this.gameMessage = response.resource.message;\n } else if (response instanceof Message || (response && typeof response === \"object\" && \"id\" in response)) {\n this.gameMessage = response;\n } else if (typeof (interaction as any).fetchReply === \"function\") {\n this.gameMessage = await (interaction as any).fetchReply().catch(() => null);\n } else {\n this.gameMessage = response || null;\n }\n }\n } else {\n const channel = this.channel as any;\n if (typeof channel.send !== \"function\") {\n throw new Error(\"[ContextAdapter] The provided channel is not sendable.\");\n }\n const payload: any = {\n components: options.components,\n files: options.files,\n flags: resolvedFlags,\n allowedMentions: { repliedUser: false },\n };\n if (!isV2) {\n if (options.content !== undefined) payload.content = options.content;\n if (options.embeds !== undefined) payload.embeds = options.embeds;\n }\n const msg = await channel.send(payload as MessageCreateOptions);\n this.gameMessage = msg;\n }\n\n return this.gameMessage!;\n }\n\n public async edit(options: ContextSendOptions): Promise<void> {\n if (typeof (this.raw as any)?.edit === \"function\") {\n await (this.raw as any).edit(options);\n return;\n }\n\n if (!this.gameMessage) {\n await this.sendInitial(options);\n return;\n }\n const resolvedFlags = this.resolveFlags(options);\n const isV2 = !!((resolvedFlags ?? 0) & MessageFlags.IsComponentsV2);\n\n const payload: any = {\n components: options.components ?? [],\n files: (options.files as any) ?? [],\n flags: resolvedFlags,\n };\n if (!isV2) {\n payload.content = options.content ?? null;\n payload.embeds = options.embeds ?? [];\n }\n\n try {\n await this.gameMessage.edit(payload as MessageEditOptions);\n } catch (err: any) {\n if (err.code !== 10008 && err.code !== 50027) {\n // Ignored\n }\n }\n }\n\n public static async replyEphemeral(interaction: any, content: string): Promise<void> {\n try {\n if (typeof interaction.reply === \"function\") {\n if (interaction.replied || interaction.deferred) {\n await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n } else {\n await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n }\n }\n } catch {}\n }\n}\n\n","/**\n * @m3rcena/eco\n * Base Class for Interactive Discord Economy UI Modules.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { ContainerBuilder, ColorResolvable, resolveColor } from \"discord.js\";\nimport { ContextAdapter, GameContextInput } from \"./ContextAdapter.js\";\n\nexport interface EcoBaseUIOptions {\n context: GameContextInput;\n embedColor?: ColorResolvable | number | string;\n time?: number; // Inactivity timeout in ms (default: 120_000)\n}\n\nexport abstract class EcoBaseUI<TOptions extends EcoBaseUIOptions = EcoBaseUIOptions> {\n public manager: any;\n public options: TOptions;\n public ctx: ContextAdapter;\n public id: string;\n public defaultColor: number = 0x5865f2;\n public isActive: boolean = false;\n protected timeoutTimer: NodeJS.Timeout | null = null;\n protected defaultTimeout: number = 120_000;\n\n constructor(manager: any, options: TOptions, prefix: string = \"eco_\") {\n this.manager = manager;\n this.options = options;\n this.ctx = ContextAdapter.from(options.context);\n this.id = `${prefix}${Math.random().toString(36).substring(2, 8)}`;\n this.defaultTimeout = options.time || 120_000;\n this.defaultColor = this.resolveColor(options.embedColor || manager?.embedColor);\n }\n\n public resolveColor(color?: ColorResolvable | string | number | null, fallback: number = 0x5865f2): number {\n if (!color) return fallback;\n if (typeof color === \"number\") return color;\n if (typeof color === \"string\") {\n if (color.startsWith(\"#\")) {\n const parsed = parseInt(color.replace(\"#\", \"\"), 16);\n if (!isNaN(parsed)) return parsed;\n }\n }\n try {\n return resolveColor(color as any);\n } catch {\n return fallback;\n }\n }\n\n public createContainer(color?: number): ContainerBuilder {\n const container = new ContainerBuilder();\n container.setAccentColor(color !== undefined ? color : this.defaultColor);\n return container;\n }\n\n protected resetTimeout(callback?: () => void, customMs?: number): void {\n this.clearTimer();\n const duration = customMs || this.defaultTimeout;\n this.timeoutTimer = setTimeout(() => {\n if (this.isActive) {\n if (callback) {\n callback();\n } else {\n this.destroy();\n }\n }\n }, duration);\n if (typeof (this.timeoutTimer as any).unref === \"function\") {\n (this.timeoutTimer as any).unref();\n }\n }\n\n protected clearTimer(): void {\n if (this.timeoutTimer) {\n clearTimeout(this.timeoutTimer);\n this.timeoutTimer = null;\n }\n }\n\n public destroy(): void {\n this.isActive = false;\n this.clearTimer();\n }\n\n public format(template: string, vars: Record<string, any>): string {\n let result = template;\n for (const [key, value] of Object.entries(vars)) {\n result = result.replaceAll(`{{${key}}}`, String(value));\n }\n return result;\n }\n\n public abstract start(): Promise<void>;\n}\n\n","/**\n * @m3rcena/eco\n * Interactive Discord Economy Profile & Passport UI.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport {\n ActionRowBuilder,\n AttachmentBuilder,\n ButtonBuilder,\n ButtonStyle,\n GuildMember,\n Interaction,\n MessageFlags,\n User,\n} from \"discord.js\";\nimport { EcoBaseUI, EcoBaseUIOptions } from \"./EcoBaseUI.js\";\nimport { RenderBankCard } from \"../canvas/RenderBankCard.js\";\nimport { ContextAdapter } from \"./ContextAdapter.js\";\n\nexport interface EcoProfileUIOptions extends EcoBaseUIOptions {\n targetUser?: User | GuildMember;\n renderCard?: boolean;\n}\n\nexport class EcoProfileUI extends EcoBaseUI<EcoProfileUIOptions> {\n private targetUser: User;\n private currentTab: \"OVERVIEW\" | \"INVENTORY\" | \"BUSINESSES\" | \"STOCKS\" | \"PETS\" = \"OVERVIEW\";\n private btnPrefix: string;\n private cardBuffer: Buffer | null = null;\n\n constructor(manager: any, options: EcoProfileUIOptions) {\n super(manager, options, \"prof_\");\n const target = options.targetUser;\n if (target instanceof GuildMember) {\n this.targetUser = target.user;\n } else if (target instanceof User) {\n this.targetUser = target;\n } else {\n this.targetUser = this.ctx.user;\n }\n this.btnPrefix = this.id + \"_\";\n }\n\n public async start(): Promise<void> {\n this.isActive = true;\n const account = await this.manager.getAccount(this.targetUser.id, this.ctx.guild?.id);\n\n // 1. Generate visual canvas card\n if (this.options.renderCard !== false) {\n try {\n const avatarUrl = this.targetUser.displayAvatarURL ? this.targetUser.displayAvatarURL({ extension: \"png\", size: 128 }) : undefined;\n this.cardBuffer = await RenderBankCard.renderCard({\n username: this.targetUser.username,\n avatarUrl,\n wallet: account.wallet,\n bank: account.bank,\n netWorth: account.wallet + account.bank,\n currencySymbol: this.manager.currencySymbol,\n });\n } catch (err) {\n console.warn(\"Could not generate canvas bank card:\", err);\n }\n }\n\n const container = this.buildContainer(account);\n const files = this.cardBuffer && this.currentTab === \"OVERVIEW\" ? [new AttachmentBuilder(this.cardBuffer, { name: \"bank-card.png\" })] : [];\n\n const msg = await this.ctx.sendInitial({\n components: [container],\n files,\n flags: MessageFlags.IsComponentsV2,\n });\n\n this.setupCollector();\n this.resetTimeout(() => this.destroy());\n }\n\n private setupCollector(): void {\n if (!this.ctx.channel) return;\n const filter = (i: Interaction) => i.isButton() && i.customId.startsWith(this.btnPrefix);\n const collector = this.ctx.channel.createMessageComponentCollector({ filter, time: this.defaultTimeout });\n\n collector.on(\"collect\", async (interaction: any) => {\n if (interaction.user.id !== this.ctx.userId) {\n ContextAdapter.replyEphemeral(interaction, \"⛔ You cannot interact with someone else's profile tabs!\");\n return;\n }\n\n await interaction.deferUpdate().catch(() => {});\n this.resetTimeout(() => this.destroy());\n\n const action = interaction.customId.replace(this.btnPrefix, \"\");\n if (action === \"tab_overview\") this.currentTab = \"OVERVIEW\";\n else if (action === \"tab_inv\") this.currentTab = \"INVENTORY\";\n else if (action === \"tab_biz\") this.currentTab = \"BUSINESSES\";\n else if (action === \"tab_stocks\") this.currentTab = \"STOCKS\";\n else if (action === \"tab_pets\") this.currentTab = \"PETS\";\n\n const account = await this.manager.getAccount(this.targetUser.id, this.ctx.guild?.id);\n const container = this.buildContainer(account);\n const files = this.cardBuffer && this.currentTab === \"OVERVIEW\" ? [new AttachmentBuilder(this.cardBuffer, { name: \"bank-card.png\" })] : [];\n\n await this.ctx.edit({\n components: [container],\n files,\n flags: MessageFlags.IsComponentsV2,\n });\n });\n }\n\n private buildContainer(account: any) {\n const container = this.createContainer();\n const sym = this.manager.currencySymbol || \"🪙\";\n\n let content = \"\";\n if (this.currentTab === \"OVERVIEW\") {\n const netWorth = account.wallet + account.bank;\n const job = account.career?.jobTitle || \"Unemployed\";\n const streak = account.streak?.daily || 0;\n const reqXp = account.level * 250;\n\n content = `## 💳 Financial Passport: ${this.targetUser.username}\\n` +\n `> **Net Worth:** \\`${sym} ${netWorth.toLocaleString()}\\` • **Level:** \\`${account.level}\\` (\\`${account.xp}/${reqXp} XP\\`)\\n` +\n `> **Cash in Wallet:** \\`${sym} ${account.wallet.toLocaleString()}\\`\\n` +\n `> **Bank Vault:** \\`${sym} ${account.bank.toLocaleString()}\\` / \\`${sym} ${account.bankCapacity.toLocaleString()}\\`\\n` +\n `> **Daily Streak:** \\`🔥 ${streak} Days\\` • **Career:** \\`💼 ${job}\\`\\n\\n` +\n `*Click the interactive buttons below to inspect inventory, investments, and businesses.*`;\n } else if (this.currentTab === \"INVENTORY\") {\n const items = account.inventory || [];\n content = `## 🎒 Backpack & Inventory: ${this.targetUser.username}\\n`;\n if (items.length === 0) {\n content += `> *Your backpack is completely empty. Visit the shop to purchase tools and upgrades!*`;\n } else {\n content += items\n .map((it: any) => `> • **${it.name || it.itemId}** (x${it.quantity}) — *${it.category}*`)\n .join(\"\\n\");\n }\n } else if (this.currentTab === \"BUSINESSES\") {\n const biz = account.businesses || [];\n content = `## 🏢 Enterprise Portfolio: ${this.targetUser.username}\\n`;\n if (biz.length === 0) {\n content += `> *No companies owned yet. Purchase a business to unlock automated passive income!*`;\n } else {\n content += biz\n .map((b: any) => `> • **${b.name || b.businessId}** [Level ${b.level}] — 👥 ${b.employees} Staff • Total Rev: \\`${sym} ${(b.totalCollected || 0).toLocaleString()}\\``)\n .join(\"\\n\");\n }\n } else if (this.currentTab === \"STOCKS\") {\n const stocks = account.stocks || [];\n content = `## 📈 Stock & Crypto Portfolio: ${this.targetUser.username}\\n`;\n if (stocks.length === 0) {\n content += `> *No active investments. Browse the stock exchange to trade tech shares and crypto!*`;\n } else {\n content += stocks\n .map((p: any) => `> • **${p.symbol}**: \\`${p.shares} shares\\` (Avg Buy: \\`$${p.averageBuyPrice.toLocaleString()}\\` • Total Invested: \\`$${p.totalInvested.toLocaleString()}\\`)`)\n .join(\"\\n\");\n }\n } else if (this.currentTab === \"PETS\") {\n const pets = account.pets || [];\n content = `## 🐾 Companion Shelter: ${this.targetUser.username}\\n`;\n if (pets.length === 0) {\n content += `> *No companion pets adopted. Adopt a Cybernetic K9 or Lucky Cat to gain foraging loot and defense buffs!*`;\n } else {\n content += pets\n .map((pet: any) => `> • **${pet.name}** (${pet.species}) [Lvl ${pet.level}] — 🍖 Hunger: \\`${pet.hunger}%\\` • ❤️ Joy: \\`${pet.happiness}%\\` ${pet.isExpeditionActive ? \"• *[Expedition Active]*\" : \"\"}`)\n .join(\"\\n\");\n }\n }\n\n container.addTextDisplayComponents((t) => t.setContent(content));\n\n // Navigation buttons row\n const row = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}tab_overview`)\n .setLabel(\"💳 Overview\")\n .setStyle(this.currentTab === \"OVERVIEW\" ? ButtonStyle.Primary : ButtonStyle.Secondary),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}tab_inv`)\n .setLabel(\"🎒 Backpack\")\n .setStyle(this.currentTab === \"INVENTORY\" ? ButtonStyle.Primary : ButtonStyle.Secondary),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}tab_biz`)\n .setLabel(\"🏢 Businesses\")\n .setStyle(this.currentTab === \"BUSINESSES\" ? ButtonStyle.Primary : ButtonStyle.Secondary),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}tab_stocks`)\n .setLabel(\"📈 Stocks\")\n .setStyle(this.currentTab === \"STOCKS\" ? ButtonStyle.Primary : ButtonStyle.Secondary),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}tab_pets`)\n .setLabel(\"🐾 Pets\")\n .setStyle(this.currentTab === \"PETS\" ? ButtonStyle.Primary : ButtonStyle.Secondary)\n );\n\n container.addActionRowComponents(row);\n return container;\n }\n}\n\n","/**\n * @m3rcena/eco\n * Interactive Discord Economy Shop UI with Components V2.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n Interaction,\n MessageFlags,\n StringSelectMenuBuilder,\n StringSelectMenuOptionBuilder,\n} from \"discord.js\";\nimport { EcoBaseUI, EcoBaseUIOptions } from \"./EcoBaseUI.js\";\nimport { ContextAdapter } from \"./ContextAdapter.js\";\nimport { ShopItem } from \"../types.js\";\n\nexport interface EcoShopUIOptions extends EcoBaseUIOptions {\n itemsPerPage?: number;\n}\n\nexport class EcoShopUI extends EcoBaseUI<EcoShopUIOptions> {\n private selectedCategory: string = \"ALL\";\n private selectedItemId: string | null = null;\n private page: number = 0;\n private itemsPerPage: number = 5;\n private btnPrefix: string;\n\n constructor(manager: any, options: EcoShopUIOptions) {\n super(manager, options, \"shop_\");\n this.itemsPerPage = options.itemsPerPage || 5;\n this.btnPrefix = this.id + \"_\";\n }\n\n public async start(): Promise<void> {\n this.isActive = true;\n const container = await this.buildContainer();\n\n await this.ctx.sendInitial({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n\n this.setupCollector();\n this.resetTimeout(() => this.destroy());\n }\n\n private setupCollector(): void {\n if (!this.ctx.channel) return;\n const filter = (i: Interaction) =>\n (i.isButton() && i.customId.startsWith(this.btnPrefix)) ||\n (i.isStringSelectMenu() && i.customId.startsWith(this.btnPrefix));\n\n const collector = this.ctx.channel.createMessageComponentCollector({\n filter,\n time: this.defaultTimeout,\n });\n\n collector.on(\"collect\", async (interaction: any) => {\n if (interaction.user.id !== this.ctx.userId) {\n ContextAdapter.replyEphemeral(interaction, \"⛔ You cannot interact with someone else's shop menu!\");\n return;\n }\n\n await interaction.deferUpdate().catch(() => {});\n this.resetTimeout(() => this.destroy());\n\n if (interaction.isStringSelectMenu()) {\n const value = interaction.values[0];\n if (interaction.customId === `${this.btnPrefix}category_select`) {\n this.selectedCategory = value;\n this.page = 0;\n this.selectedItemId = null;\n } else if (interaction.customId === `${this.btnPrefix}item_select`) {\n this.selectedItemId = value;\n }\n } else if (interaction.isButton()) {\n const action = interaction.customId.replace(this.btnPrefix, \"\");\n if (action === \"prev_page\") {\n this.page = Math.max(0, this.page - 1);\n } else if (action === \"next_page\") {\n this.page++;\n } else if (action === \"buy_1\") {\n if (this.selectedItemId) {\n try {\n const res = await this.manager.buyItem(this.ctx.userId, this.selectedItemId, 1, this.ctx.guild?.id);\n if (res.success) {\n ContextAdapter.replyEphemeral(interaction, `✅ Successfully purchased **1x ${res.item?.name || this.selectedItemId}** for ${this.manager.currencySymbol} ${res.totalPrice.toLocaleString()}!`);\n } else {\n ContextAdapter.replyEphemeral(interaction, `❌ ${res.message || \"Purchase failed.\"}`);\n }\n } catch (err: any) {\n ContextAdapter.replyEphemeral(interaction, `❌ Error: ${err.message}`);\n }\n }\n }\n }\n\n const container = await this.buildContainer();\n await this.ctx.edit({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n });\n }\n\n private async buildContainer() {\n const container = this.createContainer();\n const sym = this.manager.currencySymbol || \"🪙\";\n const allItems: ShopItem[] = this.manager.shop ? this.manager.shop.getItems() : [];\n\n const categories = Array.from(new Set(allItems.map((i) => i.category.toUpperCase())));\n const filtered = allItems.filter((item) =>\n this.selectedCategory === \"ALL\" ? true : item.category.toUpperCase() === this.selectedCategory\n );\n\n const totalPages = Math.ceil(filtered.length / this.itemsPerPage) || 1;\n if (this.page >= totalPages) this.page = totalPages - 1;\n\n const startIdx = this.page * this.itemsPerPage;\n const pageItems = filtered.slice(startIdx, startIdx + this.itemsPerPage);\n\n // If no item is selected, select the first one on the page\n if (!this.selectedItemId && pageItems.length > 0) {\n this.selectedItemId = pageItems[0].id;\n } else if (this.selectedItemId && !pageItems.find((i) => i.id === this.selectedItemId) && pageItems.length > 0) {\n this.selectedItemId = pageItems[0].id;\n }\n\n const selectedItem = allItems.find((i) => i.id === this.selectedItemId);\n\n let content = `## 🛒 Nexus Marketplace\\n` +\n `> **Category:** \\`${this.selectedCategory}\\` • **Page:** \\`${this.page + 1}/${totalPages}\\`\\n\\n`;\n\n if (pageItems.length === 0) {\n content += `> *No items available in this category.*\\n`;\n } else {\n for (const item of pageItems) {\n const isSel = item.id === this.selectedItemId ? \"👉 \" : \"• \";\n content += `${isSel}**${item.name}** [${sym} ${item.price.toLocaleString()}] — *${item.description}*\\n`;\n }\n }\n\n if (selectedItem) {\n content += `\\n### 📦 Selected Item: ${selectedItem.name}\\n` +\n `> **Price:** \\`${sym} ${selectedItem.price.toLocaleString()}\\` • **Type:** \\`${selectedItem.category}\\`\\n` +\n `> **Description:** ${selectedItem.description}\\n`;\n }\n\n container.addTextDisplayComponents((t) => t.setContent(content));\n\n // Category select menu\n const catOptions = [\n new StringSelectMenuOptionBuilder()\n .setLabel(\"All Categories\")\n .setValue(\"ALL\")\n .setDescription(\"Browse entire catalog\")\n .setDefault(this.selectedCategory === \"ALL\"),\n ...categories.map((cat) =>\n new StringSelectMenuOptionBuilder()\n .setLabel(cat.charAt(0) + cat.slice(1).toLowerCase())\n .setValue(cat)\n .setDescription(`Filter by ${cat.toLowerCase()}`)\n .setDefault(this.selectedCategory === cat)\n ),\n ];\n\n const catRow = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(\n new StringSelectMenuBuilder()\n .setCustomId(`${this.btnPrefix}category_select`)\n .setPlaceholder(\"Filter by Category...\")\n .addOptions(catOptions)\n );\n container.addActionRowComponents(catRow);\n\n // Item select menu if items exist on page\n if (pageItems.length > 0) {\n const itemOptions = pageItems.map((it) =>\n new StringSelectMenuOptionBuilder()\n .setLabel(it.name)\n .setValue(it.id)\n .setDescription(`${sym} ${it.price.toLocaleString()} — ${it.category}`)\n .setDefault(it.id === this.selectedItemId)\n );\n\n const itemRow = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(\n new StringSelectMenuBuilder()\n .setCustomId(`${this.btnPrefix}item_select`)\n .setPlaceholder(\"Select an item to inspect or purchase...\")\n .addOptions(itemOptions)\n );\n container.addActionRowComponents(itemRow);\n }\n\n // Action buttons: Prev, Buy 1, Next\n const btnRow = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}prev_page`)\n .setLabel(\"◀ Previous\")\n .setStyle(ButtonStyle.Secondary)\n .setDisabled(this.page === 0),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}buy_1`)\n .setLabel(`Buy Selected`)\n .setStyle(ButtonStyle.Success)\n .setDisabled(!selectedItem),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}next_page`)\n .setLabel(\"Next ▶\")\n .setStyle(ButtonStyle.Secondary)\n .setDisabled(this.page >= totalPages - 1)\n );\n container.addActionRowComponents(btnRow);\n\n return container;\n }\n}\n\n","/**\n * @m3rcena/eco\n * Interactive Discord Stock & Crypto Exchange Terminal UI.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport {\n ActionRowBuilder,\n AttachmentBuilder,\n ButtonBuilder,\n ButtonStyle,\n Interaction,\n MessageFlags,\n StringSelectMenuBuilder,\n StringSelectMenuOptionBuilder,\n} from \"discord.js\";\nimport { EcoBaseUI, EcoBaseUIOptions } from \"./EcoBaseUI.js\";\nimport { RenderMarketChart } from \"../canvas/RenderMarketChart.js\";\nimport { ContextAdapter } from \"./ContextAdapter.js\";\nimport { StockConfig } from \"../types.js\";\n\nexport interface EcoStockMarketUIOptions extends EcoBaseUIOptions {\n renderChart?: boolean;\n}\n\nexport class EcoStockMarketUI extends EcoBaseUI<EcoStockMarketUIOptions> {\n private selectedSymbol: string = \"$AETH\";\n private chartBuffer: Buffer | null = null;\n private btnPrefix: string;\n\n constructor(manager: any, options: EcoStockMarketUIOptions) {\n super(manager, options, \"stock_\");\n this.btnPrefix = this.id + \"_\";\n }\n\n public async start(): Promise<void> {\n this.isActive = true;\n\n // Pick first stock if available\n const stocks = this.getStocks();\n if (stocks.length > 0 && !stocks.find((s) => s.symbol === this.selectedSymbol)) {\n this.selectedSymbol = stocks[0].symbol;\n }\n\n await this.updateChart();\n const container = await this.buildContainer();\n const files = this.chartBuffer ? [new AttachmentBuilder(this.chartBuffer, { name: \"market-chart.png\" })] : [];\n\n await this.ctx.sendInitial({\n components: [container],\n files,\n flags: MessageFlags.IsComponentsV2,\n });\n\n this.setupCollector();\n this.resetTimeout(() => this.destroy());\n }\n\n private getStocks(): StockConfig[] {\n if (this.manager.stocks && typeof this.manager.stocks.getStocks === \"function\") {\n return this.manager.stocks.getStocks();\n }\n return [];\n }\n\n private async updateChart(): Promise<void> {\n if (this.options.renderChart === false) return;\n const stocks = this.getStocks();\n const stock = stocks.find((s) => s.symbol.toUpperCase() === this.selectedSymbol.toUpperCase());\n if (!stock) return;\n\n try {\n this.chartBuffer = await RenderMarketChart.renderChart({\n symbol: stock.symbol,\n name: stock.name,\n currentPrice: stock.currentPrice,\n change24h: stock.change24h,\n history: stock.history,\n });\n } catch (err) {\n console.warn(\"Could not render market chart:\", err);\n }\n }\n\n private setupCollector(): void {\n if (!this.ctx.channel) return;\n const filter = (i: Interaction) =>\n (i.isButton() && i.customId.startsWith(this.btnPrefix)) ||\n (i.isStringSelectMenu() && i.customId.startsWith(this.btnPrefix));\n\n const collector = this.ctx.channel.createMessageComponentCollector({\n filter,\n time: this.defaultTimeout,\n });\n\n collector.on(\"collect\", async (interaction: any) => {\n if (interaction.user.id !== this.ctx.userId) {\n ContextAdapter.replyEphemeral(interaction, \"⛔ You cannot trade on someone else's market terminal!\");\n return;\n }\n\n await interaction.deferUpdate().catch(() => {});\n this.resetTimeout(() => this.destroy());\n\n if (interaction.isStringSelectMenu()) {\n if (interaction.customId === `${this.btnPrefix}select_ticker`) {\n this.selectedSymbol = interaction.values[0];\n await this.updateChart();\n }\n } else if (interaction.isButton()) {\n const action = interaction.customId.replace(this.btnPrefix, \"\");\n if (action === \"buy_1\") {\n try {\n const res = await this.manager.buyStock(this.ctx.userId, this.selectedSymbol, 1, this.ctx.guild?.id);\n ContextAdapter.replyEphemeral(interaction, `📈 Bought 1 share of **${this.selectedSymbol}** at $${res.pricePerShare.toLocaleString()} (Total: $${res.totalAmount.toLocaleString()})`);\n } catch (err: any) {\n ContextAdapter.replyEphemeral(interaction, `❌ ${err.message}`);\n }\n } else if (action === \"buy_10\") {\n try {\n const res = await this.manager.buyStock(this.ctx.userId, this.selectedSymbol, 10, this.ctx.guild?.id);\n ContextAdapter.replyEphemeral(interaction, `📈 Bought 10 shares of **${this.selectedSymbol}** at $${res.pricePerShare.toLocaleString()} (Total: $${res.totalAmount.toLocaleString()})`);\n } catch (err: any) {\n ContextAdapter.replyEphemeral(interaction, `❌ ${err.message}`);\n }\n } else if (action === \"sell_all\") {\n try {\n const portfolio = await this.manager.getStockPortfolio(this.ctx.userId, this.ctx.guild?.id);\n const pos = portfolio.positions.find((p: any) => p.symbol.toUpperCase() === this.selectedSymbol.toUpperCase());\n if (!pos || pos.shares <= 0) {\n ContextAdapter.replyEphemeral(interaction, `❌ You don't own any shares of **${this.selectedSymbol}**.`);\n } else {\n const res = await this.manager.sellStock(this.ctx.userId, this.selectedSymbol, pos.shares, this.ctx.guild?.id);\n const pnlPrefix = (res.profitOrLoss ?? 0) >= 0 ? \"+$\" : \"-$\";\n ContextAdapter.replyEphemeral(interaction, `📉 Sold ${res.shares} shares of **${this.selectedSymbol}** for $${res.totalAmount.toLocaleString()}! (PnL: ${pnlPrefix}${Math.abs(res.profitOrLoss ?? 0).toLocaleString()})`);\n }\n } catch (err: any) {\n ContextAdapter.replyEphemeral(interaction, `❌ ${err.message}`);\n }\n } else if (action === \"refresh\") {\n // If stocks manager has tickMarket, tick it\n if (this.manager.stocks && typeof this.manager.stocks.tickMarket === \"function\") {\n this.manager.stocks.tickMarket();\n }\n await this.updateChart();\n }\n }\n\n const container = await this.buildContainer();\n const files = this.chartBuffer ? [new AttachmentBuilder(this.chartBuffer, { name: \"market-chart.png\" })] : [];\n\n await this.ctx.edit({\n components: [container],\n files,\n flags: MessageFlags.IsComponentsV2,\n });\n });\n }\n\n private async buildContainer() {\n const container = this.createContainer();\n const stocks = this.getStocks();\n const stock = stocks.find((s) => s.symbol.toUpperCase() === this.selectedSymbol.toUpperCase()) || stocks[0];\n const trend = this.manager.stocks?.getMarketTrend?.() || \"STABLE\";\n\n let portfolio: any = { positions: [], totalValue: 0, totalProfitLoss: 0 };\n try {\n portfolio = await this.manager.getStockPortfolio(this.ctx.userId, this.ctx.guild?.id);\n } catch {}\n\n const userPos = portfolio.positions?.find((p: any) => p.symbol.toUpperCase() === (stock?.symbol || \"\").toUpperCase());\n const sharesOwned = userPos ? userPos.shares : 0;\n const avgBuy = userPos ? userPos.averageBuyPrice : 0;\n const currentVal = stock ? sharesOwned * stock.currentPrice : 0;\n const pnl = userPos ? currentVal - userPos.totalInvested : 0;\n const pnlSign = pnl >= 0 ? \"+\" : \"\";\n\n const trendEmoji = trend === \"BULL\" ? \"🟢 🐂 BULL MARKET\" : trend === \"BEAR\" ? \"🔴 🐻 BEAR MARKET\" : \"🟡 ⚖️ STABLE MARKET\";\n const changeSign = stock && stock.change24h >= 0 ? \"+\" : \"\";\n\n let content = `## 📊 Global Financial & Crypto Exchange\\n` +\n `> **Market Mood:** \\`${trendEmoji}\\` • **Total Portfolio Value:** \\`$${(portfolio.totalValue || 0).toLocaleString()}\\`\\n\\n`;\n\n if (stock) {\n content += `### 🏷️ Active Asset: ${stock.name} (${stock.symbol})\\n` +\n `> **Current Price:** \\`$${stock.currentPrice.toLocaleString()}\\` (${changeSign}${stock.change24h}% 24h)\\n` +\n `> **24h Range:** \\`$${stock.low24h.toLocaleString()}\\` — \\`$${stock.high24h.toLocaleString()}\\` • **Volatility:** \\`${(stock.volatility * 100).toFixed(0)}%\\`\\n` +\n `> **Sector:** \\`${stock.category}\\` • **Info:** *${stock.description}*\\n\\n` +\n `> **Your Holdings:** \\`${sharesOwned} shares\\` (Valued at \\`$${currentVal.toLocaleString()}\\`)\\n` +\n `> **Unrealized PnL:** \\`${pnlSign}$${pnl.toLocaleString()}\\` (Avg Buy: \\`$${avgBuy.toLocaleString()}\\`)\\n`;\n }\n\n container.addTextDisplayComponents((t) => t.setContent(content));\n\n // Stock ticker select menu\n if (stocks.length > 0) {\n const options = stocks.map((s) =>\n new StringSelectMenuOptionBuilder()\n .setLabel(`${s.symbol} — ${s.name}`)\n .setValue(s.symbol)\n .setDescription(`$${s.currentPrice.toLocaleString()} (${s.change24h >= 0 ? \"+\" : \"\"}${s.change24h}%)`)\n .setDefault(s.symbol.toUpperCase() === this.selectedSymbol.toUpperCase())\n );\n\n const selectRow = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(\n new StringSelectMenuBuilder()\n .setCustomId(`${this.btnPrefix}select_ticker`)\n .setPlaceholder(\"Select an asset / cryptocurrency...\")\n .addOptions(options)\n );\n container.addActionRowComponents(selectRow);\n }\n\n // Interactive buttons: Buy 1, Buy 10, Sell All, Refresh\n const actionRow = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}buy_1`)\n .setLabel(\"Buy 1x\")\n .setStyle(ButtonStyle.Success),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}buy_10`)\n .setLabel(\"Buy 10x\")\n .setStyle(ButtonStyle.Success),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}sell_all`)\n .setLabel(\"Sell All\")\n .setStyle(ButtonStyle.Danger)\n .setDisabled(sharesOwned <= 0),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}refresh`)\n .setLabel(\"🔄 Live Refresh\")\n .setStyle(ButtonStyle.Secondary)\n );\n container.addActionRowComponents(actionRow);\n\n return container;\n }\n}\n","/**\n * @m3rcena/eco\n * Interactive Discord Multiplayer Crew Bank Heist UI.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n Interaction,\n MessageFlags,\n StringSelectMenuBuilder,\n StringSelectMenuOptionBuilder,\n} from \"discord.js\";\nimport { EcoBaseUI, EcoBaseUIOptions } from \"./EcoBaseUI.js\";\nimport { ContextAdapter } from \"./ContextAdapter.js\";\nimport { HeistTarget, HeistRole, HeistSession, HeistResult } from \"../types.js\";\nimport { DEFAULT_HEIST_TARGETS } from \"../modules/HeistManager.js\";\n\nexport interface EcoHeistUIOptions extends EcoBaseUIOptions {\n initialTargetId?: string;\n}\n\nexport class EcoHeistUI extends EcoBaseUI<EcoHeistUIOptions> {\n private targetId: string = \"city_trust_bank\";\n private session: HeistSession | null = null;\n private btnPrefix: string;\n private statusMessage: string = \"Waiting for crew members to select their roles...\";\n private isExecuting: boolean = false;\n private outcome: HeistResult | null = null;\n\n constructor(manager: any, options: EcoHeistUIOptions) {\n super(manager, options, \"heist_\");\n this.targetId = options.initialTargetId || \"city_trust_bank\";\n this.btnPrefix = this.id + \"_\";\n }\n\n public async start(): Promise<void> {\n this.isActive = true;\n\n // Create session in HeistManager\n try {\n this.session = await this.manager.createHeist(\n this.ctx.userId,\n this.targetId,\n this.ctx.guild?.id\n );\n } catch (err: any) {\n this.statusMessage = `Error initializing heist: ${err.message}`;\n }\n\n const container = this.buildContainer();\n\n await this.ctx.sendInitial({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n\n this.setupCollector();\n this.resetTimeout(() => this.destroy(), 180_000);\n }\n\n private setupCollector(): void {\n if (!this.ctx.channel) return;\n const filter = (i: Interaction) =>\n (i.isButton() && i.customId.startsWith(this.btnPrefix)) ||\n (i.isStringSelectMenu() && i.customId.startsWith(this.btnPrefix));\n\n const collector = this.ctx.channel.createMessageComponentCollector({\n filter,\n time: 180_000,\n });\n\n collector.on(\"collect\", async (interaction: any) => {\n if (this.isExecuting || this.outcome) {\n ContextAdapter.replyEphemeral(interaction, \"⚠️ The heist has already been executed.\");\n return;\n }\n\n await interaction.deferUpdate().catch(() => {});\n this.resetTimeout(() => this.destroy(), 180_000);\n\n if (interaction.isStringSelectMenu()) {\n if (interaction.customId === `${this.btnPrefix}select_target`) {\n if (interaction.user.id !== this.ctx.userId) {\n ContextAdapter.replyEphemeral(interaction, \"⛔ Only the crew leader can change the vault target!\");\n return;\n }\n this.targetId = interaction.values[0];\n try {\n this.session = await this.manager.createHeist(\n this.ctx.userId,\n this.targetId,\n this.ctx.guild?.id\n );\n } catch {}\n }\n } else if (interaction.isButton()) {\n const action = interaction.customId.replace(this.btnPrefix, \"\");\n if (action.startsWith(\"join_\")) {\n const role = action.replace(\"join_\", \"\").toUpperCase() as HeistRole;\n try {\n if (this.session) {\n const username = interaction.user.username;\n const res = await this.manager.joinHeist(\n this.session.id,\n interaction.user.id,\n role,\n username\n );\n this.session = res.session;\n this.statusMessage = `🤝 **${username}** joined as the **${role}**!`;\n }\n } catch (err: any) {\n ContextAdapter.replyEphemeral(interaction, `❌ ${err.message}`);\n }\n } else if (action === \"execute\") {\n if (interaction.user.id !== this.ctx.userId) {\n ContextAdapter.replyEphemeral(interaction, \"⛔ Only the crew leader can trigger the breach!\");\n return;\n }\n if (!this.session) return;\n\n const target = this.getTarget();\n if (this.session.crew.length < target.minCrew) {\n ContextAdapter.replyEphemeral(\n interaction,\n `❌ Need at least ${target.minCrew} crew members to attempt this vault! Currently: ${this.session.crew.length}`\n );\n return;\n }\n\n // Trigger execution simulation\n this.isExecuting = true;\n this.statusMessage = \"🚨 **BREACH IN PROGRESS!** Cutting power grid & drilling safety vault...\";\n\n const interimContainer = this.buildContainer();\n await this.ctx.edit({\n components: [interimContainer],\n flags: MessageFlags.IsComponentsV2,\n });\n\n try {\n this.outcome = await this.manager.executeHeist(this.session.id);\n if (this.outcome?.success) {\n this.statusMessage = `🏆 **VAULT CLEANED OUT!** Stole **$${this.outcome.totalLoot.toLocaleString()}**!`;\n } else {\n this.statusMessage = `🚔 **BUSTED BY SWAT!** Heist failed. Bail fee paid: $${(this.outcome?.finePerPlayer || 0).toLocaleString()}`;\n }\n } catch (err: any) {\n this.statusMessage = `❌ Execution failed: ${err.message}`;\n } finally {\n this.isExecuting = false;\n }\n }\n }\n\n const container = this.buildContainer();\n await this.ctx.edit({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n });\n }\n\n private getTarget(): HeistTarget {\n const targets = this.manager.heist?.getTargets?.() || DEFAULT_HEIST_TARGETS;\n return targets.find((t: HeistTarget) => t.id === this.targetId) || targets[0];\n }\n\n private buildContainer() {\n const container = this.createContainer();\n const target = this.getTarget();\n const crew = this.session?.crew || [];\n const sym = this.manager.currencySymbol || \"🪙\";\n\n let content = `## 🏦 Syndicate Crew Bank Heist Operations\\n` +\n `> **Leader:** <@${this.ctx.userId}> • **Target:** \\`${target.name}\\` [${target.difficulty}]\\n` +\n `> **Potential Haul:** \\`${sym} ${target.baseBountyMin.toLocaleString()}\\` — \\`${sym} ${target.baseBountyMax.toLocaleString()}\\`\\n` +\n `> **Failure Bail Risk:** \\`${sym} ${target.failureBail.toLocaleString()}\\` • **Base Success Odds:** \\`${(target.successRate * 100).toFixed(0)}%\\`\\n\\n` +\n `> **Status:** ${this.statusMessage}\\n\\n`;\n\n content += `### 👥 Active Crew Roster (${crew.length}/${target.maxCrew})\\n`;\n if (crew.length === 0) {\n content += `> *No crew members assembled yet. Claim a role below to gear up!*\\n`;\n } else {\n for (const member of crew) {\n const icon = member.role === \"HACKER\" ? \"💻\" : member.role === \"DRIVER\" ? \"🚗\" : member.role === \"DEMOLITIONIST\" ? \"💣\" : \"💪\";\n content += `> ${icon} **${member.role}**: **${member.username}** (<@${member.userId}>)\\n`;\n }\n }\n\n if (this.outcome) {\n content += `\\n### 📋 After-Action Report\\n`;\n if (this.outcome.success) {\n content += `> 💰 **Total Loot Taken:** \\`${sym} ${this.outcome.totalLoot.toLocaleString()}\\`\\n` +\n `> 💵 **Cut Per Operative:** \\`${sym} ${this.outcome.sharePerPlayer.toLocaleString()}\\`\\n`;\n } else {\n content += `> 🚔 **Interception:** Police interceptors cornered the team.\\n` +\n `> 💸 **Bail Deducted:** \\`${sym} ${(this.outcome.finePerPlayer || 0).toLocaleString()}\\` each\\n`;\n }\n }\n\n container.addTextDisplayComponents((t) => t.setContent(content));\n\n // Target selection menu if not executing or finished\n if (!this.isExecuting && !this.outcome) {\n const targets = this.manager.heist?.getTargets?.() || DEFAULT_HEIST_TARGETS;\n const targetOptions = targets.map((t: HeistTarget) =>\n new StringSelectMenuOptionBuilder()\n .setLabel(`${t.name} [${t.difficulty}]`)\n .setValue(t.id)\n .setDescription(`Crew: ${t.minCrew}-${t.maxCrew} | Payout: ${sym} ${t.baseBountyMin.toLocaleString()}+`)\n .setDefault(t.id === this.targetId)\n );\n\n const targetRow = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(\n new StringSelectMenuBuilder()\n .setCustomId(`${this.btnPrefix}select_target`)\n .setPlaceholder(\"Select a vault target...\")\n .addOptions(targetOptions)\n );\n container.addActionRowComponents(targetRow);\n\n // Role claim buttons: Hacker, Driver, Demo, Muscle\n const roleRow = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}join_hacker`)\n .setLabel(\"💻 Hacker\")\n .setStyle(ButtonStyle.Secondary),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}join_driver`)\n .setLabel(\"🚗 Driver\")\n .setStyle(ButtonStyle.Secondary),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}join_demolitionist`)\n .setLabel(\"💣 Demo\")\n .setStyle(ButtonStyle.Secondary),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}join_muscle`)\n .setLabel(\"💪 Muscle\")\n .setStyle(ButtonStyle.Secondary)\n );\n container.addActionRowComponents(roleRow);\n\n // Launch button\n const canLaunch = crew.length >= target.minCrew && crew.length <= target.maxCrew;\n const launchRow = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}execute`)\n .setLabel(canLaunch ? \"🚀 Launch Heist Breach\" : `Need ${target.minCrew}+ Crew to Launch`)\n .setStyle(canLaunch ? ButtonStyle.Success : ButtonStyle.Secondary)\n .setDisabled(!canLaunch)\n );\n container.addActionRowComponents(launchRow);\n }\n\n return container;\n }\n}\n","/**\n * @m3rcena/eco\n * Interactive Discord Blackjack Casino UI with Components V2.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n Interaction,\n MessageFlags,\n} from \"discord.js\";\nimport { EcoBaseUI, EcoBaseUIOptions } from \"./EcoBaseUI.js\";\nimport { ContextAdapter } from \"./ContextAdapter.js\";\nimport { BlackjackState, Card } from \"../modules/CasinoManager.js\";\n\nexport interface EcoBlackjackUIOptions extends EcoBaseUIOptions {\n betAmount: number;\n}\n\nexport class EcoBlackjackUI extends EcoBaseUI<EcoBlackjackUIOptions> {\n private state: BlackjackState | null = null;\n private btnPrefix: string;\n private initialBet: number;\n\n constructor(manager: any, options: EcoBlackjackUIOptions) {\n super(manager, options, \"bj_\");\n this.initialBet = Math.max(10, Math.floor(options.betAmount || 50));\n this.btnPrefix = this.id + \"_\";\n }\n\n public async start(): Promise<void> {\n this.isActive = true;\n\n try {\n this.state = await this.manager.startBlackjack(\n this.ctx.userId,\n this.initialBet,\n this.ctx.guild?.id\n );\n } catch (err: any) {\n await this.ctx.sendInitial({\n content: `❌ Could not start Blackjack game: ${err.message}`,\n });\n this.destroy();\n return;\n }\n\n const container = this.buildContainer();\n\n await this.ctx.sendInitial({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n\n if (this.state && this.state.finished) {\n this.destroy();\n return;\n }\n\n this.setupCollector();\n this.resetTimeout(() => this.destroy(), 60_000);\n }\n\n private setupCollector(): void {\n if (!this.ctx.channel) return;\n const filter = (i: Interaction) => i.isButton() && i.customId.startsWith(this.btnPrefix);\n const collector = this.ctx.channel.createMessageComponentCollector({\n filter,\n time: 60_000,\n });\n\n collector.on(\"collect\", async (interaction: any) => {\n if (interaction.user.id !== this.ctx.userId) {\n ContextAdapter.replyEphemeral(interaction, \"⛔ You cannot play on someone else's blackjack table!\");\n return;\n }\n\n if (!this.state || this.state.finished) {\n ContextAdapter.replyEphemeral(interaction, \"⚠️ This hand has already concluded.\");\n return;\n }\n\n await interaction.deferUpdate().catch(() => {});\n this.resetTimeout(() => this.destroy(), 60_000);\n\n const action = interaction.customId.replace(this.btnPrefix, \"\");\n try {\n if (action === \"hit\") {\n this.state = await this.manager.blackjackHit(this.state.gameId);\n } else if (action === \"stand\") {\n this.state = await this.manager.blackjackStand(this.state.gameId);\n } else if (action === \"double\") {\n this.state = await this.manager.blackjackDouble(this.state.gameId);\n }\n } catch (err: any) {\n ContextAdapter.replyEphemeral(interaction, `❌ ${err.message}`);\n }\n\n const container = this.buildContainer();\n await this.ctx.edit({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n\n if (this.state?.finished) {\n collector.stop();\n this.destroy();\n }\n });\n }\n\n private formatCards(cards: Card[], hideSecond: boolean = false): string {\n if (hideSecond && cards.length > 1) {\n return `[\\`${cards[0].rank}${cards[0].suit}\\`] [\\`🂠 ?\\`]`;\n }\n return cards.map((c) => `[\\`${c.rank}${c.suit}\\`]`).join(\" \");\n }\n\n private buildContainer() {\n const container = this.createContainer();\n const sym = this.manager.currencySymbol || \"🪙\";\n\n if (!this.state) {\n container.addTextDisplayComponents((t) => t.setContent(\"## 🎰 Blackjack Table\\n> *No game in progress.*\"));\n return container;\n }\n\n const isPlaying = !this.state.finished;\n const pCalc = this.manager.casino.calculateHand(this.state.playerHand);\n const dCalc = this.manager.casino.calculateHand(this.state.dealerHand);\n\n let statusText = \"Game in progress... Hit or Stand?\";\n if (this.state.status === \"blackjack\") {\n statusText = `🏆 **NATURAL BLACKJACK!** Payout: **${sym} ${this.state.payout.toLocaleString()}** (3:2)`;\n } else if (this.state.status === \"player_win\") {\n statusText = `🎉 **YOU WIN!** Dealer lost. Payout: **${sym} ${this.state.payout.toLocaleString()}**`;\n } else if (this.state.status === \"dealer_bust\") {\n statusText = `💥 **DEALER BUSTED!** Payout: **${sym} ${this.state.payout.toLocaleString()}**`;\n } else if (this.state.status === \"player_bust\") {\n statusText = `💥 **BUSTED!** Total exceeded 21. Lost: **${sym} ${this.state.betAmount.toLocaleString()}**`;\n } else if (this.state.status === \"dealer_win\") {\n statusText = `💀 **DEALER WINS!** Dealer had the superior hand. Lost: **${sym} ${this.state.betAmount.toLocaleString()}**`;\n } else if (this.state.status === \"push\") {\n statusText = `🤝 **PUSH (TIE)!** Bet of **${sym} ${this.state.betAmount.toLocaleString()}** refunded.`;\n }\n\n const dealerDisplay = isPlaying\n ? `${this.formatCards(this.state.dealerHand, true)} *(Showing ${this.state.dealerHand[0].value})*`\n : `${this.formatCards(this.state.dealerHand, false)} *(Total: **${dCalc.total}**)*`;\n\n const playerDisplay = `${this.formatCards(this.state.playerHand, false)} *(Total: **${pCalc.total}**${pCalc.isSoft ? \" soft\" : \"\"})*`;\n\n let content = `## 🎰 High Stakes VIP Blackjack Table\\n` +\n `> **Player:** <@${this.ctx.userId}> • **Total Bet:** \\`${sym} ${this.state.betAmount.toLocaleString()}\\`\\n\\n` +\n `### 🤵 Dealer's Hand:\\n> ${dealerDisplay}\\n\\n` +\n `### 🃏 Your Hand:\\n> ${playerDisplay}\\n\\n` +\n `> **Table Status:** ${statusText}\\n`;\n\n container.addTextDisplayComponents((t) => t.setContent(content));\n\n const canDouble = isPlaying && this.state.playerHand.length === 2;\n const actionRow = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}hit`)\n .setLabel(\"🃏 Hit\")\n .setStyle(ButtonStyle.Success)\n .setDisabled(!isPlaying),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}stand`)\n .setLabel(\"🛑 Stand\")\n .setStyle(ButtonStyle.Danger)\n .setDisabled(!isPlaying),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}double`)\n .setLabel(\"⚡ Double Down\")\n .setStyle(ButtonStyle.Primary)\n .setDisabled(!canDouble)\n );\n\n container.addActionRowComponents(actionRow);\n return container;\n }\n}\n","/**\n * @m3rcena/eco\n * Interactive Discord Mystery Loot Crate Unboxing UI with Components V2.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n Interaction,\n MessageFlags,\n StringSelectMenuBuilder,\n StringSelectMenuOptionBuilder,\n} from \"discord.js\";\nimport { EcoBaseUI, EcoBaseUIOptions } from \"./EcoBaseUI.js\";\nimport { ContextAdapter } from \"./ContextAdapter.js\";\nimport { CrateTier, CrateReward } from \"../types.js\";\nimport { CRATE_PRICES } from \"../modules/CrateManager.js\";\n\nexport interface EcoCrateUIOptions extends EcoBaseUIOptions {\n initialTier?: CrateTier;\n}\n\nexport class EcoCrateUI extends EcoBaseUI<EcoCrateUIOptions> {\n private selectedTier: CrateTier = \"rare\";\n private btnPrefix: string;\n private isUnboxing: boolean = false;\n private lastReward: CrateReward | null = null;\n\n constructor(manager: any, options: EcoCrateUIOptions) {\n super(manager, options, \"crate_\");\n this.selectedTier = options.initialTier || \"rare\";\n this.btnPrefix = this.id + \"_\";\n }\n\n public async start(): Promise<void> {\n this.isActive = true;\n const container = this.buildContainer();\n\n await this.ctx.sendInitial({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n\n this.setupCollector();\n this.resetTimeout(() => this.destroy());\n }\n\n private setupCollector(): void {\n if (!this.ctx.channel) return;\n const filter = (i: Interaction) =>\n (i.isButton() && i.customId.startsWith(this.btnPrefix)) ||\n (i.isStringSelectMenu() && i.customId.startsWith(this.btnPrefix));\n\n const collector = this.ctx.channel.createMessageComponentCollector({\n filter,\n time: this.defaultTimeout,\n });\n\n collector.on(\"collect\", async (interaction: any) => {\n if (interaction.user.id !== this.ctx.userId) {\n ContextAdapter.replyEphemeral(interaction, \"⛔ You cannot open someone else's mystery crates!\");\n return;\n }\n\n await interaction.deferUpdate().catch(() => {});\n this.resetTimeout(() => this.destroy());\n\n if (interaction.isStringSelectMenu()) {\n if (interaction.customId === `${this.btnPrefix}select_tier`) {\n this.selectedTier = interaction.values[0] as CrateTier;\n this.lastReward = null;\n }\n } else if (interaction.isButton()) {\n const action = interaction.customId.replace(this.btnPrefix, \"\");\n if (action === \"open\") {\n this.isUnboxing = true;\n this.lastReward = null;\n\n const suspenseContainer = this.buildContainer();\n await this.ctx.edit({\n components: [suspenseContainer],\n flags: MessageFlags.IsComponentsV2,\n });\n\n try {\n this.lastReward = await this.manager.openCrate(\n this.ctx.userId,\n this.selectedTier,\n this.ctx.guild?.id\n );\n } catch (err: any) {\n ContextAdapter.replyEphemeral(interaction, `❌ ${err.message}`);\n } finally {\n this.isUnboxing = false;\n }\n }\n }\n\n const container = this.buildContainer();\n await this.ctx.edit({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n });\n }\n\n private buildContainer() {\n const container = this.createContainer();\n const sym = this.manager.currencySymbol || \"🪙\";\n const cost = CRATE_PRICES[this.selectedTier] || 10000;\n\n const tierIcons: Record<CrateTier, string> = {\n common: \"📦 Common Supply Drop\",\n rare: \"🔷 Rare Tech Capsule\",\n epic: \"💜 Epic Cyber Crate\",\n legendary: \"👑 Legendary Vault Box\",\n mythic: \"🌌 Mythic Celestial Relic\",\n };\n\n let content = `## 🎁 Quantum Mystery Loot Crates\\n` +\n `> **Selected Tier:** \\`${tierIcons[this.selectedTier]}\\`\\n` +\n `> **Price to Unlock:** \\`${sym} ${cost.toLocaleString()}\\`\\n\\n`;\n\n if (this.isUnboxing) {\n content += `> ⏳ **UNBOXING IN PROGRESS...**\\n` +\n `> *Decentralized cryptographic locks cracking... Rolling loot tables...*\\n\\n`;\n } else if (this.lastReward) {\n content += `### 🎊 Loot Drop Received!\\n` +\n `> 💰 **Cash Rewarded:** \\`${sym} ${this.lastReward.coins.toLocaleString()}\\`\\n` +\n `> ⭐ **Experience Points:** \\`+${this.lastReward.xp} XP\\`\\n`;\n\n if (this.lastReward.item) {\n content += `> 🎒 **Special Item Received:** **${this.lastReward.item.name}** (*${this.lastReward.item.category}*)\\n`;\n }\n content += `\\n`;\n } else {\n content += `> *Select a crate tier from the menu below and press Open to reveal randomized riches, XP, and collectible items!* \\n\\n`;\n }\n\n container.addTextDisplayComponents((t) => t.setContent(content));\n\n if (!this.isUnboxing) {\n // Tier selector\n const tiers: CrateTier[] = [\"common\", \"rare\", \"epic\", \"legendary\", \"mythic\"];\n const options = tiers.map((t) =>\n new StringSelectMenuOptionBuilder()\n .setLabel(tierIcons[t])\n .setValue(t)\n .setDescription(`${sym} ${CRATE_PRICES[t].toLocaleString()}`)\n .setDefault(t === this.selectedTier)\n );\n\n const menuRow = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(\n new StringSelectMenuBuilder()\n .setCustomId(`${this.btnPrefix}select_tier`)\n .setPlaceholder(\"Select Crate Tier...\")\n .addOptions(options)\n );\n container.addActionRowComponents(menuRow);\n\n // Open button\n const openRow = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}open`)\n .setLabel(`🎁 Open ${this.selectedTier.toUpperCase()} (${sym} ${cost.toLocaleString()})`)\n .setStyle(ButtonStyle.Success)\n );\n container.addActionRowComponents(openRow);\n }\n\n return container;\n }\n}\n","/**\n * @m3rcena/eco\n * Interactive Discord Leaderboard UI with Components V2.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n Interaction,\n MessageFlags,\n StringSelectMenuBuilder,\n StringSelectMenuOptionBuilder,\n} from \"discord.js\";\nimport { EcoBaseUI, EcoBaseUIOptions } from \"./EcoBaseUI.js\";\nimport { ContextAdapter } from \"./ContextAdapter.js\";\nimport { LeaderboardMetric } from \"../modules/LeaderboardManager.js\";\n\nexport interface EcoLeaderboardUIOptions extends EcoBaseUIOptions {\n initialMetric?: LeaderboardMetric;\n limit?: number;\n}\n\nexport class EcoLeaderboardUI extends EcoBaseUI<EcoLeaderboardUIOptions> {\n private selectedMetric: LeaderboardMetric = \"net_worth\";\n private page: number = 0;\n private pageSize: number = 10;\n private btnPrefix: string;\n\n constructor(manager: any, options: EcoLeaderboardUIOptions) {\n super(manager, options, \"lb_\");\n this.selectedMetric = options.initialMetric || \"net_worth\";\n this.btnPrefix = this.id + \"_\";\n }\n\n public async start(): Promise<void> {\n this.isActive = true;\n const container = await this.buildContainer();\n\n await this.ctx.sendInitial({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n\n this.setupCollector();\n this.resetTimeout(() => this.destroy());\n }\n\n private setupCollector(): void {\n if (!this.ctx.channel) return;\n const filter = (i: Interaction) =>\n (i.isButton() && i.customId.startsWith(this.btnPrefix)) ||\n (i.isStringSelectMenu() && i.customId.startsWith(this.btnPrefix));\n\n const collector = this.ctx.channel.createMessageComponentCollector({\n filter,\n time: this.defaultTimeout,\n });\n\n collector.on(\"collect\", async (interaction: any) => {\n if (interaction.user.id !== this.ctx.userId) {\n ContextAdapter.replyEphemeral(interaction, \"⛔ You cannot paginate someone else's leaderboard view!\");\n return;\n }\n\n await interaction.deferUpdate().catch(() => {});\n this.resetTimeout(() => this.destroy());\n\n if (interaction.isStringSelectMenu()) {\n if (interaction.customId === `${this.btnPrefix}select_metric`) {\n this.selectedMetric = interaction.values[0] as LeaderboardMetric;\n this.page = 0;\n }\n } else if (interaction.isButton()) {\n const action = interaction.customId.replace(this.btnPrefix, \"\");\n if (action === \"prev\") {\n this.page = Math.max(0, this.page - 1);\n } else if (action === \"next\") {\n this.page++;\n }\n }\n\n const container = await this.buildContainer();\n await this.ctx.edit({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n });\n }\n\n private async buildContainer() {\n const container = this.createContainer();\n const sym = this.manager.currencySymbol || \"🪙\";\n\n const allEntries = await this.manager.getLeaderboard(\n this.selectedMetric,\n 50,\n this.ctx.guild?.id\n );\n\n const totalPages = Math.ceil(allEntries.length / this.pageSize) || 1;\n if (this.page >= totalPages) this.page = totalPages - 1;\n\n const startIdx = this.page * this.pageSize;\n const pageEntries = allEntries.slice(startIdx, startIdx + this.pageSize);\n\n const metricLabels: Record<LeaderboardMetric, string> = {\n net_worth: \"💎 Net Worth\",\n wallet: \"💵 Wallet Cash\",\n bank: \"🏦 Bank Vault\",\n level: \"⭐ Level & XP\",\n streak: \"🔥 Daily Streaks\",\n };\n\n let content = `## 🏆 Server Economic Leaderboards\\n` +\n `> **Ranking Metric:** \\`${metricLabels[this.selectedMetric] || this.selectedMetric}\\` • **Page:** \\`${this.page + 1}/${totalPages}\\`\\n\\n`;\n\n if (pageEntries.length === 0) {\n content += `> *No user rankings recorded yet for this metric.*\\n`;\n } else {\n for (const entry of pageEntries) {\n const medal = entry.rank === 1 ? \"🥇\" : entry.rank === 2 ? \"🥈\" : entry.rank === 3 ? \"🥉\" : `\\`#${entry.rank}\\``;\n let valStr = \"\";\n if (this.selectedMetric === \"level\") {\n valStr = `Level ${entry.value.toLocaleString()}`;\n } else if (this.selectedMetric === \"streak\") {\n valStr = `${entry.value.toLocaleString()} days`;\n } else {\n valStr = `${sym} ${entry.value.toLocaleString()}`;\n }\n\n content += `> ${medal} <@${entry.userId}> — **${valStr}**\\n`;\n }\n }\n\n container.addTextDisplayComponents((t) => t.setContent(content));\n\n // Metric selector\n const metrics: LeaderboardMetric[] = [\"net_worth\", \"wallet\", \"bank\", \"level\", \"streak\"];\n const options = metrics.map((m) =>\n new StringSelectMenuOptionBuilder()\n .setLabel(metricLabels[m] || m)\n .setValue(m)\n .setDefault(m === this.selectedMetric)\n );\n\n const menuRow = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(\n new StringSelectMenuBuilder()\n .setCustomId(`${this.btnPrefix}select_metric`)\n .setPlaceholder(\"Select Leaderboard Category...\")\n .addOptions(options)\n );\n container.addActionRowComponents(menuRow);\n\n // Prev / Next pagination buttons\n const btnRow = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}prev`)\n .setLabel(\"◀ Previous\")\n .setStyle(ButtonStyle.Secondary)\n .setDisabled(this.page === 0),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}next`)\n .setLabel(\"Next ▶\")\n .setStyle(ButtonStyle.Secondary)\n .setDisabled(this.page >= totalPages - 1)\n );\n container.addActionRowComponents(btnRow);\n\n return container;\n }\n}\n","/**\n * @m3rcena/eco\n * Interactive Bank Vault Tiers, Upgrade & Compound Interest UI.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n Interaction,\n MessageFlags,\n StringSelectMenuBuilder,\n StringSelectMenuOptionBuilder,\n} from \"discord.js\";\nimport { EcoBaseUI, EcoBaseUIOptions } from \"./EcoBaseUI.js\";\nimport { ContextAdapter } from \"./ContextAdapter.js\";\nimport { BankVaultTier } from \"../types.js\";\nimport { DEFAULT_VAULT_TIERS } from \"../modules/VaultManager.js\";\n\nexport class EcoVaultUI extends EcoBaseUI {\n private selectedTierNum: number = 1;\n private btnPrefix: string;\n private statusMessage: string = \"Select a vault tier below to inspect security specifications and interest yield.\";\n\n constructor(manager: any, options: EcoBaseUIOptions) {\n super(manager, options, \"vault_\");\n this.btnPrefix = this.id + \"_\";\n }\n\n public async start(): Promise<void> {\n this.isActive = true;\n const vault = await this.manager.getUserVault(this.ctx.userId, this.ctx.guild?.id);\n this.selectedTierNum = vault.currentTier.tier;\n\n const container = await this.buildContainer();\n\n await this.ctx.sendInitial({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n\n this.setupCollector();\n this.resetTimeout(() => this.destroy());\n }\n\n private setupCollector(): void {\n if (!this.ctx.channel) return;\n const filter = (i: Interaction) =>\n (i.isButton() && i.customId.startsWith(this.btnPrefix)) ||\n (i.isStringSelectMenu() && i.customId.startsWith(this.btnPrefix));\n\n const collector = this.ctx.channel.createMessageComponentCollector({\n filter,\n time: this.defaultTimeout,\n });\n\n collector.on(\"collect\", async (interaction: any) => {\n if (interaction.user.id !== this.ctx.userId) {\n ContextAdapter.replyEphemeral(interaction, \"⛔ You cannot manage someone else's bank vault!\");\n return;\n }\n\n await interaction.deferUpdate().catch(() => {});\n this.resetTimeout(() => this.destroy());\n\n if (interaction.isStringSelectMenu()) {\n if (interaction.customId === `${this.btnPrefix}select_tier`) {\n this.selectedTierNum = parseInt(interaction.values[0], 10);\n }\n } else if (interaction.isButton()) {\n const action = interaction.customId.replace(this.btnPrefix, \"\");\n if (action === \"upgrade\") {\n try {\n const res = await this.manager.upgradeVault(this.ctx.userId, this.ctx.guild?.id);\n if (res.success) {\n this.selectedTierNum = res.newTier.tier;\n this.statusMessage = `🎉 **VAULT UPGRADED!** You are now Tier ${res.newTier.tier} (${res.newTier.name}). New capacity: $${res.newCapacity.toLocaleString()}!`;\n } else {\n this.statusMessage = `❌ ${res.error}`;\n }\n } catch (err: any) {\n this.statusMessage = `❌ ${err.message}`;\n }\n } else if (action === \"claim_interest\") {\n try {\n const res = await this.manager.claimDailyInterest(this.ctx.userId, this.ctx.guild?.id);\n if (res.success) {\n this.statusMessage = `💰 **INTEREST DISTRIBUTED!** Added **$${res.interestEarned.toLocaleString()}** (${(res.rate * 100).toFixed(1)}% daily) to your vault savings!`;\n } else {\n this.statusMessage = `⏳ ${res.error}`;\n }\n } catch (err: any) {\n this.statusMessage = `❌ ${err.message}`;\n }\n }\n }\n\n const container = await this.buildContainer();\n await this.ctx.edit({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n });\n }\n\n private async buildContainer() {\n const container = this.createContainer();\n const sym = this.manager.currencySymbol || \"🪙\";\n const userVault = await this.manager.getUserVault(this.ctx.userId, this.ctx.guild?.id);\n const tiers: BankVaultTier[] = this.manager.vault ? this.manager.vault.getVaultTiers() : DEFAULT_VAULT_TIERS;\n const inspectingTier = tiers.find((t) => t.tier === this.selectedTierNum) || userVault.currentTier;\n\n const isCurrent = inspectingTier.tier === userVault.currentTier.tier;\n const isNext = userVault.nextTier && inspectingTier.tier === userVault.nextTier.tier;\n\n let content = `## 🏦 Swiss & Orbital Private Vault Showroom\\n` +\n `> **Account Holder:** <@${this.ctx.userId}>\\n` +\n `> **Current Vault Tier:** \\`Tier ${userVault.currentTier.tier} — ${userVault.currentTier.name}\\`\\n` +\n `> **Savings Vault Balance:** \\`${sym} ${userVault.bank.toLocaleString()}\\` / \\`${sym} ${userVault.capacity.toLocaleString()}\\`\\n` +\n `> **Estimated 24h Compound Yield:** \\`${sym} ${userVault.dailyInterestAccrual.toLocaleString()} / day\\`\\n\\n` +\n `> **Status:** ${this.statusMessage}\\n\\n`;\n\n content += `### 🔍 Inspecting: Tier ${inspectingTier.tier} — ${inspectingTier.name} ${isCurrent ? \"*(Active Vault)*\" : \"\"}\\n` +\n `> • **Storage Capacity:** \\`${sym} ${inspectingTier.capacity.toLocaleString()}\\`\\n` +\n `> • **Daily Compound Yield:** \\`${(inspectingTier.interestRate * 100).toFixed(1)}% / 24h\\`\\n` +\n `> • **Robbery Shield Defense:** \\`${(inspectingTier.robberyDefense * 100).toFixed(0)}% deterrence\\`\\n` +\n `> • **Upgrade Price:** \\`${inspectingTier.upgradeCost > 0 ? `${sym} ${inspectingTier.upgradeCost.toLocaleString()}` : \"Included Free\"}\\`\\n`;\n\n if (inspectingTier.perks && inspectingTier.perks.length > 0) {\n content += `> • **Special Perks:** ${inspectingTier.perks.join(\" • \")}\\n`;\n }\n\n container.addTextDisplayComponents((t) => t.setContent(content));\n\n // Vault Tier Selector\n const options = tiers.map((t) =>\n new StringSelectMenuOptionBuilder()\n .setLabel(`Tier ${t.tier}: ${t.name}`)\n .setValue(String(t.tier))\n .setDescription(`Cap: ${sym} ${t.capacity.toLocaleString()} | Interest: ${(t.interestRate * 100).toFixed(1)}%`)\n .setDefault(t.tier === this.selectedTierNum)\n );\n\n const selectRow = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(\n new StringSelectMenuBuilder()\n .setCustomId(`${this.btnPrefix}select_tier`)\n .setPlaceholder(\"Select a vault tier to inspect...\")\n .addOptions(options)\n );\n container.addActionRowComponents(selectRow);\n\n // Buttons: Upgrade Vault, Claim Daily Interest\n const canUpgrade = !!userVault.nextTier;\n const upgradeLabel = canUpgrade\n ? `⚡ Upgrade to Tier ${userVault.nextTier!.tier} (${sym} ${userVault.nextTier!.upgradeCost.toLocaleString()})`\n : \"👑 Maximum Vault Tier Reached\";\n\n const btnRow = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}upgrade`)\n .setLabel(upgradeLabel)\n .setStyle(canUpgrade ? ButtonStyle.Success : ButtonStyle.Secondary)\n .setDisabled(!canUpgrade),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}claim_interest`)\n .setLabel(userVault.canClaimInterest ? `💰 Claim Interest (${sym} ${userVault.dailyInterestAccrual.toLocaleString()})` : \"⏳ Interest Payout Pending\")\n .setStyle(userVault.canClaimInterest ? ButtonStyle.Primary : ButtonStyle.Secondary)\n .setDisabled(!userVault.canClaimInterest)\n );\n container.addActionRowComponents(btnRow);\n\n return container;\n }\n}\n\n","/**\n * @m3rcena/eco\n * Interactive Bank Loan, Credit Score & Debt Management UI.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n Interaction,\n MessageFlags,\n StringSelectMenuBuilder,\n StringSelectMenuOptionBuilder,\n} from \"discord.js\";\nimport { EcoBaseUI, EcoBaseUIOptions } from \"./EcoBaseUI.js\";\nimport { ContextAdapter } from \"./ContextAdapter.js\";\nimport { LoanTier, LoanOffer, UserLoan } from \"../types.js\";\nimport { LOAN_CATALOG } from \"../modules/LoanManager.js\";\n\nexport class EcoLoanUI extends EcoBaseUI {\n private selectedTier: LoanTier = \"starter\";\n private selectedLoanId: string | null = null;\n private btnPrefix: string;\n private statusMessage: string = \"Select a credit package below to inspect terms or choose an active loan to pay down.\";\n\n constructor(manager: any, options: EcoBaseUIOptions) {\n super(manager, options, \"loan_\");\n this.btnPrefix = this.id + \"_\";\n }\n\n public async start(): Promise<void> {\n this.isActive = true;\n const container = await this.buildContainer();\n\n await this.ctx.sendInitial({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n\n this.setupCollector();\n this.resetTimeout(() => this.destroy());\n }\n\n private setupCollector(): void {\n if (!this.ctx.channel) return;\n const filter = (i: Interaction) =>\n (i.isButton() && i.customId.startsWith(this.btnPrefix)) ||\n (i.isStringSelectMenu() && i.customId.startsWith(this.btnPrefix));\n\n const collector = this.ctx.channel.createMessageComponentCollector({\n filter,\n time: this.defaultTimeout,\n });\n\n collector.on(\"collect\", async (interaction: any) => {\n if (interaction.user.id !== this.ctx.userId) {\n ContextAdapter.replyEphemeral(interaction, \"⛔ You cannot manage someone else's credit lines!\");\n return;\n }\n\n await interaction.deferUpdate().catch(() => {});\n this.resetTimeout(() => this.destroy());\n\n if (interaction.isStringSelectMenu()) {\n if (interaction.customId === `${this.btnPrefix}select_offer`) {\n this.selectedTier = interaction.values[0] as LoanTier;\n } else if (interaction.customId === `${this.btnPrefix}select_loan`) {\n this.selectedLoanId = interaction.values[0];\n }\n } else if (interaction.isButton()) {\n const action = interaction.customId.replace(this.btnPrefix, \"\");\n if (action === \"apply\") {\n try {\n const res = await this.manager.applyLoan(this.ctx.userId, this.selectedTier, this.ctx.guild?.id);\n if (res.success) {\n this.statusMessage = `✅ **LOAN APPROVED!** Disbursed **$${res.loan.principal.toLocaleString()}** to your cash wallet! (Repay by: <t:${Math.floor(res.loan.dueAt / 1000)}:R>)`;\n } else {\n this.statusMessage = `❌ Application rejected: ${res.error}`;\n }\n } catch (err: any) {\n this.statusMessage = `❌ ${err.message}`;\n }\n } else if (action === \"repay_all\" || action === \"repay_half\") {\n const loans = await this.manager.getUserLoans(this.ctx.userId, this.ctx.guild?.id);\n const activeLoan = loans.find((l: UserLoan) => (this.selectedLoanId ? l.id === this.selectedLoanId : l.status !== \"paid\"));\n if (!activeLoan) {\n ContextAdapter.replyEphemeral(interaction, \"❌ You have no active debts to pay!\");\n return;\n }\n\n const payAmount = action === \"repay_all\" ? \"all\" : Math.ceil(activeLoan.remainingDue / 2);\n try {\n const res = await this.manager.repayLoan(this.ctx.userId, activeLoan.id, payAmount, this.ctx.guild?.id);\n if (res.success) {\n if (res.isFullyPaid) {\n this.statusMessage = `🎉 **DEBT PAID IN FULL!** Succeeded in settling debt. Credit score boosted to **${res.newCreditScore}**!`;\n } else {\n this.statusMessage = `💵 Paid **$${res.amountPaid.toLocaleString()}** toward debt. Remaining: **$${res.remainingDue.toLocaleString()}**`;\n }\n } else {\n this.statusMessage = `❌ ${res.error}`;\n }\n } catch (err: any) {\n this.statusMessage = `❌ ${err.message}`;\n }\n }\n }\n\n const container = await this.buildContainer();\n await this.ctx.edit({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n });\n }\n\n private async buildContainer() {\n const container = this.createContainer();\n const sym = this.manager.currencySymbol || \"🪙\";\n\n const credit = await this.manager.getCreditScore(this.ctx.userId, this.ctx.guild?.id);\n const loans: UserLoan[] = await this.manager.getUserLoans(this.ctx.userId, this.ctx.guild?.id);\n const offers: LoanOffer[] = this.manager.loans ? this.manager.loans.getOffers() : LOAN_CATALOG;\n const selectedOffer = offers.find((o) => o.tier === this.selectedTier) || offers[0];\n\n const activeLoans = loans.filter((l) => l.status === \"active\" || l.status === \"defaulted\");\n const totalDebt = activeLoans.reduce((sum, l) => sum + l.remainingDue, 0);\n\n const ratingColors: Record<string, string> = {\n EXCELLENT: \"🟢 800-850 (EXCELLENT)\",\n VERY_GOOD: \"🟢 740-799 (VERY GOOD)\",\n GOOD: \"🟡 670-739 (GOOD)\",\n FAIR: \"🟠 580-669 (FAIR)\",\n POOR: \"🔴 300-579 (POOR - HIGH RISK)\",\n };\n\n let content = `## 🏦 Global Commercial Credit Bureau & Loan Broker\\n` +\n `> **Account:** <@${this.ctx.userId}> • **FICO Credit Rating:** \\`${ratingColors[credit.rating] || credit.rating}\\` (\\`${credit.score} Score\\`)\\n` +\n `> **Total Active Debt:** \\`${sym} ${totalDebt.toLocaleString()}\\` • **Loans Repaid:** \\`${credit.loansRepaid}\\` • **Defaults:** \\`${credit.defaultsCount}\\`\\n\\n` +\n `> **Status:** ${this.statusMessage}\\n\\n`;\n\n if (activeLoans.length > 0) {\n content += `### 💳 Outstanding Debts (${activeLoans.length}/2 Active):\\n`;\n for (const l of activeLoans) {\n const isDefault = l.status === \"defaulted\";\n const tag = isDefault ? \"🚨 **[OVERDUE DEFAULT]**\" : `⏳ Due: <t:${Math.floor(l.dueAt / 1000)}:R>`;\n content += `> • **${l.name}**: Remaining: \\`${sym} ${l.remainingDue.toLocaleString()}\\` / \\`${sym} ${l.totalDue.toLocaleString()}\\` — ${tag}\\n`;\n }\n content += `\\n`;\n }\n\n content += `### 📋 Inspecting Offer: ${selectedOffer.name}\\n` +\n `> • **Principal Cash Advance:** \\`${sym} ${selectedOffer.principal.toLocaleString()}\\`\\n` +\n `> • **Fixed Interest:** \\`${(selectedOffer.interestRate * 100).toFixed(1)}%\\` (Total Due: \\`${sym} ${selectedOffer.totalDue.toLocaleString()}\\`)\\n` +\n `> • **Repayment Window:** \\`${selectedOffer.durationHours} hours\\`\\n` +\n `> • **Required Credit Score:** \\`${selectedOffer.minCreditScore}+\\` ${credit.score >= selectedOffer.minCreditScore ? \"*(Eligible)*\" : \"*(Score Too Low)*\"}\\n` +\n `> • **Description:** *${selectedOffer.description}*\\n`;\n\n container.addTextDisplayComponents((t) => t.setContent(content));\n\n // Offer selector\n const options = offers.map((o) =>\n new StringSelectMenuOptionBuilder()\n .setLabel(`${o.name} (${sym} ${o.principal.toLocaleString()})`)\n .setValue(o.tier)\n .setDescription(`Rate: ${(o.interestRate * 100).toFixed(1)}% | Min Score: ${o.minCreditScore}`)\n .setDefault(o.tier === this.selectedTier)\n );\n\n const offerRow = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(\n new StringSelectMenuBuilder()\n .setCustomId(`${this.btnPrefix}select_offer`)\n .setPlaceholder(\"Select a credit advance package...\")\n .addOptions(options)\n );\n container.addActionRowComponents(offerRow);\n\n // Buttons\n const canApply = credit.score >= selectedOffer.minCreditScore && activeLoans.length < 2 && !activeLoans.some((l) => l.status === \"defaulted\");\n const hasDebt = totalDebt > 0;\n\n const btnRow = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}apply`)\n .setLabel(`📝 Apply for ${selectedOffer.name}`)\n .setStyle(canApply ? ButtonStyle.Success : ButtonStyle.Secondary)\n .setDisabled(!canApply),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}repay_half`)\n .setLabel(\"💵 Pay 50% Debt\")\n .setStyle(ButtonStyle.Primary)\n .setDisabled(!hasDebt),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}repay_all`)\n .setLabel(\"🎉 Settle Full Debt\")\n .setStyle(ButtonStyle.Success)\n .setDisabled(!hasDebt)\n );\n container.addActionRowComponents(btnRow);\n\n return container;\n }\n}\n\n","/**\n * @m3rcena/eco\n * Interactive Municipal Bills, Wealth Taxes & Audit Desk UI.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n Interaction,\n MessageFlags,\n StringSelectMenuBuilder,\n StringSelectMenuOptionBuilder,\n} from \"discord.js\";\nimport { EcoBaseUI, EcoBaseUIOptions } from \"./EcoBaseUI.js\";\nimport { ContextAdapter } from \"./ContextAdapter.js\";\nimport { MunicipalBill } from \"../types.js\";\n\nexport class EcoBillsUI extends EcoBaseUI {\n private selectedBillId: string | null = null;\n private btnPrefix: string;\n private statusMessage: string = \"Review municipal bills and wealth taxes below. Settle on time to protect your credit score!\";\n\n constructor(manager: any, options: EcoBaseUIOptions) {\n super(manager, options, \"bills_\");\n this.btnPrefix = this.id + \"_\";\n }\n\n public async start(): Promise<void> {\n this.isActive = true;\n\n // Generate bills if due\n if (this.manager.taxes && typeof this.manager.taxes.generateBillsIfDue === \"function\") {\n await this.manager.taxes.generateBillsIfDue(this.ctx.userId, this.ctx.guild?.id);\n }\n\n const container = await this.buildContainer();\n\n await this.ctx.sendInitial({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n\n this.setupCollector();\n this.resetTimeout(() => this.destroy());\n }\n\n private setupCollector(): void {\n if (!this.ctx.channel) return;\n const filter = (i: Interaction) =>\n (i.isButton() && i.customId.startsWith(this.btnPrefix)) ||\n (i.isStringSelectMenu() && i.customId.startsWith(this.btnPrefix));\n\n const collector = this.ctx.channel.createMessageComponentCollector({\n filter,\n time: this.defaultTimeout,\n });\n\n collector.on(\"collect\", async (interaction: any) => {\n if (interaction.user.id !== this.ctx.userId) {\n ContextAdapter.replyEphemeral(interaction, \"⛔ You cannot manage someone else's municipal tax desk!\");\n return;\n }\n\n await interaction.deferUpdate().catch(() => {});\n this.resetTimeout(() => this.destroy());\n\n if (interaction.isStringSelectMenu()) {\n if (interaction.customId === `${this.btnPrefix}select_bill`) {\n this.selectedBillId = interaction.values[0];\n }\n } else if (interaction.isButton()) {\n const action = interaction.customId.replace(this.btnPrefix, \"\");\n if (action === \"pay_selected\") {\n if (!this.selectedBillId) {\n ContextAdapter.replyEphemeral(interaction, \"❌ Please select a bill from the menu first.\");\n return;\n }\n try {\n const res = await this.manager.payBill(this.ctx.userId, this.selectedBillId, this.ctx.guild?.id);\n if (res.success) {\n this.statusMessage = `✅ Paid **${res.bill?.title}** ($${res.amountPaid.toLocaleString()})! Credit score increased to **${res.newCreditScore}**!`;\n } else {\n this.statusMessage = `❌ ${res.error}`;\n }\n } catch (err: any) {\n this.statusMessage = `❌ ${err.message}`;\n }\n } else if (action === \"pay_all\") {\n try {\n const res = await this.manager.payAllBills(this.ctx.userId, this.ctx.guild?.id);\n if (res.success) {\n this.statusMessage = `🏛️ **TAX COMPLIANCE ACHIEVED!** Settled ${res.paidCount} bills ($${res.totalAmountPaid.toLocaleString()})! Credit score boosted to **${res.newCreditScore}**!`;\n } else {\n this.statusMessage = `❌ ${res.error}`;\n }\n } catch (err: any) {\n this.statusMessage = `❌ ${err.message}`;\n }\n } else if (action === \"evade\") {\n try {\n const res = await this.manager.attemptTaxEvasion(this.ctx.userId, this.ctx.guild?.id);\n this.statusMessage = res.auditDetails;\n } catch (err: any) {\n this.statusMessage = `❌ ${err.message}`;\n }\n }\n }\n\n const container = await this.buildContainer();\n await this.ctx.edit({\n components: [container],\n flags: MessageFlags.IsComponentsV2,\n });\n });\n }\n\n private async buildContainer() {\n const container = this.createContainer();\n const sym = this.manager.currencySymbol || \"🪙\";\n\n const bills: MunicipalBill[] = await this.manager.getPendingBills(this.ctx.userId, this.ctx.guild?.id);\n const totalBilled = bills.reduce((sum, b) => sum + b.amount, 0);\n const credit = await this.manager.getCreditScore(this.ctx.userId, this.ctx.guild?.id);\n\n let content = `## 🏛️ Municipal Treasury, Utilities & Tax Compliance\\n` +\n `> **Citizen:** <@${this.ctx.userId}> • **Credit Rating:** \\`${credit.rating}\\` (\\`${credit.score} pts\\`)\\n` +\n `> **Total Pending Obligations:** \\`${sym} ${totalBilled.toLocaleString()}\\` across \\`${bills.length} bills\\`\\n\\n` +\n `> **Status:** ${this.statusMessage}\\n\\n`;\n\n if (bills.length === 0) {\n content += `> ✨ **ALL OBLIGATIONS SETTLED!** You are in 100% tax and utility compliance. No pending fees!\\n`;\n } else {\n content += `### 📄 Pending Notices:\\n`;\n for (const b of bills) {\n const isSel = b.id === this.selectedBillId ? \"👉 \" : \"• \";\n content += `> ${isSel}**${b.title}**: \\`${sym} ${b.amount.toLocaleString()}\\` (Due: <t:${Math.floor(b.dueAt / 1000)}:R>)\\n`;\n }\n }\n\n container.addTextDisplayComponents((t) => t.setContent(content));\n\n if (bills.length > 0) {\n // Bill select menu\n const options = bills.map((b) =>\n new StringSelectMenuOptionBuilder()\n .setLabel(`${b.title.slice(0, 50)}`)\n .setValue(b.id)\n .setDescription(`${sym} ${b.amount.toLocaleString()}`)\n .setDefault(b.id === this.selectedBillId)\n );\n\n const billRow = new ActionRowBuilder<StringSelectMenuBuilder>().addComponents(\n new StringSelectMenuBuilder()\n .setCustomId(`${this.btnPrefix}select_bill`)\n .setPlaceholder(\"Select a bill to settle...\")\n .addOptions(options)\n );\n container.addActionRowComponents(billRow);\n\n const hasTax = bills.some((b) => b.type === \"wealth_tax\");\n\n // Action buttons\n const btnRow = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}pay_selected`)\n .setLabel(\"Pay Selected Bill\")\n .setStyle(ButtonStyle.Primary)\n .setDisabled(!this.selectedBillId),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}pay_all`)\n .setLabel(`🏛️ Settle All (${sym} ${totalBilled.toLocaleString()})`)\n .setStyle(ButtonStyle.Success),\n new ButtonBuilder()\n .setCustomId(`${this.btnPrefix}evade`)\n .setLabel(\"🎲 Offshore Shell Evasion\")\n .setStyle(ButtonStyle.Danger)\n .setDisabled(!hasTax)\n );\n container.addActionRowComponents(btnRow);\n }\n\n return container;\n }\n}\n\n","/**\n * @m3rcena/eco\n * The Ultimate High-Performance Economy, Progression & Casino Engine for Discord.js bots.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nexport * from \"./types.js\";\nexport * from \"./storage/EcoStorage.js\";\nexport * from \"./storage/SqliteEcoStorage.js\";\nexport * from \"./storage/PrismaEcoStorage.js\";\nexport * from \"./storage/EcoDatabaseHandler.js\";\nexport * from \"./modules/BankManager.js\";\nexport * from \"./modules/RewardManager.js\";\nexport * from \"./modules/CareerManager.js\";\nexport * from \"./modules/ShopManager.js\";\nexport * from \"./modules/BusinessManager.js\";\nexport * from \"./modules/CasinoManager.js\";\nexport * from \"./modules/LeaderboardManager.js\";\nexport * from \"./modules/StockMarketManager.js\";\nexport * from \"./modules/HeistManager.js\";\nexport * from \"./modules/PetManager.js\";\nexport * from \"./modules/CrateManager.js\";\nexport * from \"./modules/VaultManager.js\";\nexport * from \"./modules/LoanManager.js\";\nexport * from \"./modules/TaxManager.js\";\nexport * from \"./canvas/RenderBankCard.js\";\nexport * from \"./canvas/RenderMarketChart.js\";\nexport * from \"./ui/ContextAdapter.js\";\nexport * from \"./ui/EcoBaseUI.js\";\nexport * from \"./ui/EcoProfileUI.js\";\nexport * from \"./ui/EcoShopUI.js\";\nexport * from \"./ui/EcoStockMarketUI.js\";\nexport * from \"./ui/EcoHeistUI.js\";\nexport * from \"./ui/EcoBlackjackUI.js\";\nexport * from \"./ui/EcoCrateUI.js\";\nexport * from \"./ui/EcoLeaderboardUI.js\";\nexport * from \"./ui/EcoVaultUI.js\";\nexport * from \"./ui/EcoLoanUI.js\";\nexport * from \"./ui/EcoBillsUI.js\";\nexport * from \"./bridge/EcoBridgeRouter.js\";\nexport * from \"./connector/EcoWekyConnector.js\";\nexport * from \"./EcoManager.js\";\nexport { M3rcenaBridge } from \"@m3rcena/bridge\";\nexport {\n boxConsole,\n checkPackageUpdates,\n compareSemver,\n fetchLatestVersion,\n stripAnsi,\n ECO_VERSION,\n} from \"./utils/Notifier.js\";\n\n// Rust-Style Submodule Resolver & Local Host\nexport * from \"./resolver.js\";\nexport * from \"./host.js\";\n\n"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_resolver = require("./resolver.cjs");
3
+ // src/register.ts
4
+ /**
5
+ * @m3rcena/eco - Auto-Register Hook for Rust-Style Submodule Resolver
6
+ *
7
+ * Automatically intercepts and patches module resolution so that:
8
+ * import { WekyManager } from '@m3rcena/weky';
9
+ * import { EcoManager } from '@m3rcena/eco';
10
+ * import { M3rcenaBridge } from '@m3rcena/bridge';
11
+ * resolve transparently to local Git submodules if present on disk,
12
+ * falling back gracefully to standard npm registry installations.
13
+ *
14
+ * @copyright 2026 M3rcena Development. All rights reserved.
15
+ * @license Apache-2.0
16
+ */
17
+ let hasRegistered = false;
18
+ function registerSubmoduleResolver(options = {}) {
19
+ if (hasRegistered) return;
20
+ hasRegistered = true;
21
+ const resolutions = require_resolver.getAllPackageResolutions();
22
+ const hasAnySubmodule = Object.values(resolutions).some((r) => r.status === "submodule");
23
+ if (!options.silent && !process.env.M3RCENA_RESOLVER_SILENT && hasAnySubmodule) require_resolver.printResolutionSummary();
24
+ try {
25
+ const Module = require?.main?.constructor || require("node:module");
26
+ if (Module && typeof Module._resolveFilename === "function") {
27
+ const origResolveFilename = Module._resolveFilename;
28
+ Module._resolveFilename = function(request, parent, isMain, options) {
29
+ if (request === "@m3rcena/weky" && resolutions["@m3rcena/weky"].status === "submodule") return resolutions["@m3rcena/weky"].path;
30
+ if (request === "@m3rcena/eco" && resolutions["@m3rcena/eco"].status === "submodule") return resolutions["@m3rcena/eco"].path;
31
+ if (request === "@m3rcena/bridge" && resolutions["@m3rcena/bridge"].status === "submodule") return resolutions["@m3rcena/bridge"].path;
32
+ if (request === "@m3rcena/bridge/client" && resolutions["@m3rcena/bridge"].status === "submodule" && resolutions["@m3rcena/bridge"].rootDirectory) {
33
+ const root = resolutions["@m3rcena/bridge"].rootDirectory;
34
+ return resolutions["@m3rcena/bridge"].type === "source" ? `${root}/src/client.ts` : `${root}/dist/client.mjs`;
35
+ }
36
+ return origResolveFilename.call(this, request, parent, isMain, options);
37
+ };
38
+ }
39
+ } catch {}
40
+ }
41
+ registerSubmoduleResolver();
42
+ exports.getAllPackageResolutions = require_resolver.getAllPackageResolutions;
43
+ exports.printResolutionSummary = require_resolver.printResolutionSummary;
44
+ exports.registerSubmoduleResolver = registerSubmoduleResolver;
45
+
46
+ //# sourceMappingURL=register.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.cjs","names":["getAllPackageResolutions"],"sources":["../src/register.ts"],"sourcesContent":["/**\n * @m3rcena/eco - Auto-Register Hook for Rust-Style Submodule Resolver\n *\n * Automatically intercepts and patches module resolution so that:\n * import { WekyManager } from '@m3rcena/weky';\n * import { EcoManager } from '@m3rcena/eco';\n * import { M3rcenaBridge } from '@m3rcena/bridge';\n * resolve transparently to local Git submodules if present on disk,\n * falling back gracefully to standard npm registry installations.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { getAllPackageResolutions, printResolutionSummary } from \"./resolver.js\";\n\nlet hasRegistered = false;\n\nexport function registerSubmoduleResolver(options: { silent?: boolean } = {}): void {\n if (hasRegistered) return;\n hasRegistered = true;\n\n const resolutions = getAllPackageResolutions();\n const hasAnySubmodule = Object.values(resolutions).some((r) => r.status === \"submodule\");\n\n if (!options.silent && !process.env.M3RCENA_RESOLVER_SILENT && hasAnySubmodule) {\n printResolutionSummary();\n }\n\n try {\n const Module = (require as any)?.main?.constructor || require(\"node:module\");\n if (Module && typeof Module._resolveFilename === \"function\") {\n const origResolveFilename = Module._resolveFilename;\n Module._resolveFilename = function (request: string, parent: any, isMain: boolean, options: any) {\n if (request === \"@m3rcena/weky\" && resolutions[\"@m3rcena/weky\"].status === \"submodule\") {\n return resolutions[\"@m3rcena/weky\"].path;\n }\n if (request === \"@m3rcena/eco\" && resolutions[\"@m3rcena/eco\"].status === \"submodule\") {\n return resolutions[\"@m3rcena/eco\"].path;\n }\n if (request === \"@m3rcena/bridge\" && resolutions[\"@m3rcena/bridge\"].status === \"submodule\") {\n return resolutions[\"@m3rcena/bridge\"].path;\n }\n if (request === \"@m3rcena/bridge/client\" && resolutions[\"@m3rcena/bridge\"].status === \"submodule\" && resolutions[\"@m3rcena/bridge\"].rootDirectory) {\n const root = resolutions[\"@m3rcena/bridge\"].rootDirectory!;\n const clientPath = resolutions[\"@m3rcena/bridge\"].type === \"source\"\n ? `${root}/src/client.ts`\n : `${root}/dist/client.mjs`;\n return clientPath;\n }\n return origResolveFilename.call(this, request, parent, isMain, options);\n };\n }\n } catch {\n // ESM fallback\n }\n}\n\nregisterSubmoduleResolver();\n\nexport { getAllPackageResolutions, printResolutionSummary };\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,IAAI,gBAAgB;AAEpB,SAAgB,0BAA0B,UAAgC,CAAC,GAAS;CAClF,IAAI,eAAe;CACnB,gBAAgB;CAEhB,MAAM,cAAcA,iBAAAA,yBAAyB;CAC7C,MAAM,kBAAkB,OAAO,OAAO,WAAW,CAAC,CAAC,MAAM,MAAM,EAAE,WAAW,WAAW;CAEvF,IAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,IAAI,2BAA2B,iBAC7D,iBAAA,uBAAuB;CAGzB,IAAI;EACF,MAAM,SAAU,SAAiB,MAAM,eAAe,QAAQ,aAAa;EAC3E,IAAI,UAAU,OAAO,OAAO,qBAAqB,YAAY;GAC3D,MAAM,sBAAsB,OAAO;GACnC,OAAO,mBAAmB,SAAU,SAAiB,QAAa,QAAiB,SAAc;IAC/F,IAAI,YAAY,mBAAmB,YAAY,gBAAgB,CAAC,WAAW,aACzE,OAAO,YAAY,gBAAgB,CAAC;IAEtC,IAAI,YAAY,kBAAkB,YAAY,eAAe,CAAC,WAAW,aACvE,OAAO,YAAY,eAAe,CAAC;IAErC,IAAI,YAAY,qBAAqB,YAAY,kBAAkB,CAAC,WAAW,aAC7E,OAAO,YAAY,kBAAkB,CAAC;IAExC,IAAI,YAAY,4BAA4B,YAAY,kBAAkB,CAAC,WAAW,eAAe,YAAY,kBAAkB,CAAC,eAAe;KACjJ,MAAM,OAAO,YAAY,kBAAkB,CAAC;KAI5C,OAHmB,YAAY,kBAAkB,CAAC,SAAS,WACvD,GAAG,KAAK,kBACR,GAAG,KAAK;IAEd;IACA,OAAO,oBAAoB,KAAK,MAAM,SAAS,QAAQ,QAAQ,OAAO;GACxE;EACF;CACF,QAAQ,CAER;AACF;AAEA,0BAA0B"}
@@ -0,0 +1,6 @@
1
+ import { getAllPackageResolutions, printResolutionSummary } from "./resolver.cjs";
2
+ export declare function registerSubmoduleResolver(options?: {
3
+ silent?: boolean;
4
+ }): void;
5
+ export { getAllPackageResolutions, printResolutionSummary };
6
+ //# sourceMappingURL=register.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.cts","names":[],"sources":["../src/register.ts"],"mappings":";wBAkBgB,0BAA0B;EAAW"}
@@ -0,0 +1,6 @@
1
+ import { getAllPackageResolutions, printResolutionSummary } from "./resolver.mjs";
2
+ export declare function registerSubmoduleResolver(options?: {
3
+ silent?: boolean;
4
+ }): void;
5
+ export { getAllPackageResolutions, printResolutionSummary };
6
+ //# sourceMappingURL=register.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.mts","names":[],"sources":["../src/register.ts"],"mappings":";wBAkBgB,0BAA0B;EAAW"}
@@ -0,0 +1,44 @@
1
+ import { t as __require } from "./rolldown-runtime-D3PmRqjj.mjs";
2
+ import { getAllPackageResolutions, printResolutionSummary } from "./resolver.mjs";
3
+ // src/register.ts
4
+ /**
5
+ * @m3rcena/eco - Auto-Register Hook for Rust-Style Submodule Resolver
6
+ *
7
+ * Automatically intercepts and patches module resolution so that:
8
+ * import { WekyManager } from '@m3rcena/weky';
9
+ * import { EcoManager } from '@m3rcena/eco';
10
+ * import { M3rcenaBridge } from '@m3rcena/bridge';
11
+ * resolve transparently to local Git submodules if present on disk,
12
+ * falling back gracefully to standard npm registry installations.
13
+ *
14
+ * @copyright 2026 M3rcena Development. All rights reserved.
15
+ * @license Apache-2.0
16
+ */
17
+ let hasRegistered = false;
18
+ function registerSubmoduleResolver(options = {}) {
19
+ if (hasRegistered) return;
20
+ hasRegistered = true;
21
+ const resolutions = getAllPackageResolutions();
22
+ const hasAnySubmodule = Object.values(resolutions).some((r) => r.status === "submodule");
23
+ if (!options.silent && !process.env.M3RCENA_RESOLVER_SILENT && hasAnySubmodule) printResolutionSummary();
24
+ try {
25
+ const Module = __require?.main?.constructor || __require("node:module");
26
+ if (Module && typeof Module._resolveFilename === "function") {
27
+ const origResolveFilename = Module._resolveFilename;
28
+ Module._resolveFilename = function(request, parent, isMain, options) {
29
+ if (request === "@m3rcena/weky" && resolutions["@m3rcena/weky"].status === "submodule") return resolutions["@m3rcena/weky"].path;
30
+ if (request === "@m3rcena/eco" && resolutions["@m3rcena/eco"].status === "submodule") return resolutions["@m3rcena/eco"].path;
31
+ if (request === "@m3rcena/bridge" && resolutions["@m3rcena/bridge"].status === "submodule") return resolutions["@m3rcena/bridge"].path;
32
+ if (request === "@m3rcena/bridge/client" && resolutions["@m3rcena/bridge"].status === "submodule" && resolutions["@m3rcena/bridge"].rootDirectory) {
33
+ const root = resolutions["@m3rcena/bridge"].rootDirectory;
34
+ return resolutions["@m3rcena/bridge"].type === "source" ? `${root}/src/client.ts` : `${root}/dist/client.mjs`;
35
+ }
36
+ return origResolveFilename.call(this, request, parent, isMain, options);
37
+ };
38
+ }
39
+ } catch {}
40
+ }
41
+ registerSubmoduleResolver();
42
+ export { getAllPackageResolutions, printResolutionSummary, registerSubmoduleResolver };
43
+
44
+ //# sourceMappingURL=register.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.mjs","names":[],"sources":["../src/register.ts"],"sourcesContent":["/**\n * @m3rcena/eco - Auto-Register Hook for Rust-Style Submodule Resolver\n *\n * Automatically intercepts and patches module resolution so that:\n * import { WekyManager } from '@m3rcena/weky';\n * import { EcoManager } from '@m3rcena/eco';\n * import { M3rcenaBridge } from '@m3rcena/bridge';\n * resolve transparently to local Git submodules if present on disk,\n * falling back gracefully to standard npm registry installations.\n *\n * @copyright 2026 M3rcena Development. All rights reserved.\n * @license Apache-2.0\n */\n\nimport { getAllPackageResolutions, printResolutionSummary } from \"./resolver.js\";\n\nlet hasRegistered = false;\n\nexport function registerSubmoduleResolver(options: { silent?: boolean } = {}): void {\n if (hasRegistered) return;\n hasRegistered = true;\n\n const resolutions = getAllPackageResolutions();\n const hasAnySubmodule = Object.values(resolutions).some((r) => r.status === \"submodule\");\n\n if (!options.silent && !process.env.M3RCENA_RESOLVER_SILENT && hasAnySubmodule) {\n printResolutionSummary();\n }\n\n try {\n const Module = (require as any)?.main?.constructor || require(\"node:module\");\n if (Module && typeof Module._resolveFilename === \"function\") {\n const origResolveFilename = Module._resolveFilename;\n Module._resolveFilename = function (request: string, parent: any, isMain: boolean, options: any) {\n if (request === \"@m3rcena/weky\" && resolutions[\"@m3rcena/weky\"].status === \"submodule\") {\n return resolutions[\"@m3rcena/weky\"].path;\n }\n if (request === \"@m3rcena/eco\" && resolutions[\"@m3rcena/eco\"].status === \"submodule\") {\n return resolutions[\"@m3rcena/eco\"].path;\n }\n if (request === \"@m3rcena/bridge\" && resolutions[\"@m3rcena/bridge\"].status === \"submodule\") {\n return resolutions[\"@m3rcena/bridge\"].path;\n }\n if (request === \"@m3rcena/bridge/client\" && resolutions[\"@m3rcena/bridge\"].status === \"submodule\" && resolutions[\"@m3rcena/bridge\"].rootDirectory) {\n const root = resolutions[\"@m3rcena/bridge\"].rootDirectory!;\n const clientPath = resolutions[\"@m3rcena/bridge\"].type === \"source\"\n ? `${root}/src/client.ts`\n : `${root}/dist/client.mjs`;\n return clientPath;\n }\n return origResolveFilename.call(this, request, parent, isMain, options);\n };\n }\n } catch {\n // ESM fallback\n }\n}\n\nregisterSubmoduleResolver();\n\nexport { getAllPackageResolutions, printResolutionSummary };\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,IAAI,gBAAgB;AAEpB,SAAgB,0BAA0B,UAAgC,CAAC,GAAS;CAClF,IAAI,eAAe;CACnB,gBAAgB;CAEhB,MAAM,cAAc,yBAAyB;CAC7C,MAAM,kBAAkB,OAAO,OAAO,WAAW,CAAC,CAAC,MAAM,MAAM,EAAE,WAAW,WAAW;CAEvF,IAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,IAAI,2BAA2B,iBAC7D,uBAAuB;CAGzB,IAAI;EACF,MAAM,SAAA,WAA2B,MAAM,eAAA,UAAuB,aAAa;EAC3E,IAAI,UAAU,OAAO,OAAO,qBAAqB,YAAY;GAC3D,MAAM,sBAAsB,OAAO;GACnC,OAAO,mBAAmB,SAAU,SAAiB,QAAa,QAAiB,SAAc;IAC/F,IAAI,YAAY,mBAAmB,YAAY,gBAAgB,CAAC,WAAW,aACzE,OAAO,YAAY,gBAAgB,CAAC;IAEtC,IAAI,YAAY,kBAAkB,YAAY,eAAe,CAAC,WAAW,aACvE,OAAO,YAAY,eAAe,CAAC;IAErC,IAAI,YAAY,qBAAqB,YAAY,kBAAkB,CAAC,WAAW,aAC7E,OAAO,YAAY,kBAAkB,CAAC;IAExC,IAAI,YAAY,4BAA4B,YAAY,kBAAkB,CAAC,WAAW,eAAe,YAAY,kBAAkB,CAAC,eAAe;KACjJ,MAAM,OAAO,YAAY,kBAAkB,CAAC;KAI5C,OAHmB,YAAY,kBAAkB,CAAC,SAAS,WACvD,GAAG,KAAK,kBACR,GAAG,KAAK;IAEd;IACA,OAAO,oBAAoB,KAAK,MAAM,SAAS,QAAQ,QAAQ,OAAO;GACxE;EACF;CACF,QAAQ,CAER;AACF;AAEA,0BAA0B"}