—[BE] CRITICAL — Gold/EXP/Meat not tracked from fight results. Combat parser now strips Discord markdown (**bold**) before regex matching.
—[BE] Sell gold regex broken by markdown — sell_f_rank_items() now strips **bold** before parsing gold amount.
v2.6.0
Fixed
—[BE] Suspension bypass on bot start — start_bot() now checks both in-memory state and DB bot_status for suspension before allowing a new bot to start.
—[BE] Auto-sell setting lost on restart — is_auto_selling now persisted to game_accounts and restored from DB on bot startup.
—[BE] Session stats lost on Heroku restart — _run_bot() restores fight count, gold, meat, and exp from un-ended bot_sessions on reconnect.
—[BE] Settings data_type not handled — _on_data_update() now routes 'settings' data to direct column writes (is_auto_selling).
—[BE] Suspended session not ended — bot_sessions now properly end when state transitions to SUSPENDED.
Added
—[FE] WebSocket real-time hook (useWebSocket.ts) — Reusable React hook with JWT auth, auto-reconnect with exponential backoff, and cleanup on unmount.
—[FE] WebSocket integration in Dashboard — Overview page now receives instant state_change and data_update events via WebSocket.
—[FE] WebSocket integration in Accounts — Accounts page now receives instant bot status updates and data merges via WebSocket.
—[BE] Profession sync in periodic loop — do_mine() now runs every 5 minutes to populate mining/profession data for the Profession pages.
v2.5.0
Fixed
—[BE] Periodic sync task leak — _periodic_sync_loop and _activity_watchdog tasks are now properly cancelled when bot.stop() is called. Previously they kept running after disconnect.
—[BE] asyncio deprecation — Replaced deprecated asyncio.get_event_loop() with asyncio.get_running_loop() inside the CAPTCHA solver.
—[BE] Material pagination — Page count now based on actual items on page 1 instead of hardcoded 10; correct for all server configurations.
—[BE] Init sync errors swallowed — Each of the 4 init sync steps is now individually wrapped in try/except so a single failure no longer aborts the entire initialization.
—[BE] BotManager DI consistency — All BotManager() singleton calls in the bot router replaced with request.app.state.bot_manager for proper dependency injection.
—[BE] captcha_warning polluting game_logs — _on_log now only inserts fight events to game_logs; captcha warnings are WebSocket-only.
—[BE] Dead import removed — Removed unused discord.ext.tasks import from selfbot.py.
—[BE] Duplicate manual_refresh method removed — Cleaned up duplicate stub at the bottom of selfbot.py.
—[BE] CAPTCHA flash detection threshold lowered — Threshold 0.05 → 0.02; falls back to random slot selection instead of ERROR on low-contrast CAPTCHAs.
—[FE] Frozen button on expired session — botAction() now clears actionLoading before returning when session is null.
—[FE] runningBots count — Header 'N active' now includes 'ready' bots, not just 'running'.
—[FE] Overlapping setInterval on mapping page — Uses stable isAnyRunning boolean to prevent multiple polling intervals stacking up.
—[FE] Excessive DB refetches from realtime — Mapping page only re-fetches on bot_status/profile_name changes, not every combat_data update.
—[FE] createClient() inside health check loop — Supabase client created once, not on every interval tick.
—[FE] Sync button UX — Shows 'Syncing...' during API call; tooltip explains propagation delay.
Added
—[BE] Activity watchdog now running — _activity_watchdog re-engages $map after 15s of inactivity, properly started alongside periodic sync at bot READY state.
v2.4.7
Added
—Global Glow Loading Bar — Integrated nextjs-toploader to all pages for a beautiful, amber glowing progress bar that animates during route transitions and heavy loads.
v2.4.6
Added
—Top Loading Progress Bar — Added an animated glowing linear progress bar at the very top of both Overview and Accounts pages that activates during initial data load and background control operations.
Fixed
—Expired Discord CDN Images on Accounts Page — Applied the isDiscordUrlExpired verification to the Accounts page to prevent any 404 images from displaying on that screen, replacing them with fallback placeholders.
v2.4.5
Fixed
—Expired Discord CDN Profile Images — Implemented a utility helper isDiscordUrlExpired to parse hex expiration (ex) parameter from Discord attachment URLs. Avoids browser 404 console errors.
—Stale Profile Image Placeholders — Renders a dashed card prompting the user to start their bot to sync/refresh the image rather than leaving a broken image icon on expiration.
v2.4.4
Changed
—Changelog Sync — Synchronized missing changelog entries for v2.4.1, v2.4.2, and v2.4.3.
v2.4.3
Added
—vercel.json — Vercel deployment config for web/ subdirectory. Enables correct Next.js deployment from monorepo root via GitHub import.
v2.4.2
Fixed
—Fight Button Exact Match — Replaced 'fight' in label substring search with exact match (b.label.strip().lower() === 'fight') to prevent accidentally clicking 'Battle All' or similar buttons.
—Post-Victory Loop Missing — After winning a fight, bot now automatically sends $map after 2.5s delay (V1 pattern). Previously relied on 15s watchdog, leaving bot idle between fights.
—Fight Button Helper Centralized — Extracted _find_fight_button() method used across _send_map_command and _handle_message, removing duplicated logic.
Changed
—Mapping Page Redesigned — Removed HP/Energy/EXP bars (data unparseable since $p now returns an image). Replaced with live session stats: fight count, session time, gold earned, gold/hr, meat earned, meat/hr. Refreshes every 5 seconds.
—Floor/Location Display — Current floor and monster level now shown from combat_data in account card header.
v2.4.1
Fixed
—Fight Button Race Condition — discord.py-self dispatches on_message BEFORE wait_for() returns. This caused _handle_message() to always see _pending_fight_message_id as None, skipping the fight click entirely. Fixed by clicking the button directly on the response object in _send_map_command() after send_command() returns.
v2.4.0
Fixed
—Mapping Page Broken — Status comparisons used uppercase strings ("RUNNING") while the database stores lowercase ("running"), making the entire Mapping page non-functional.
—Silent Bot Action Failures — Start/Stop/Sell failures were silently swallowed; errors are now shown to the user.
—sync_profile NameError Crash — Undefined dump_path variable crashed every profile sync. Replaced with clean logger debug calls.
—supabase Variable Scope Bug — In _on_state_change, the supabase client was acquired inside the try block but used after the except block, causing NameError on failure.
—Concurrent Bot Limit Bypassable on Restart — Active bot count now queries the database instead of the in-memory dict, which resets on server restart.
—Start Mapping Resets Session Stats — resume_fight_loop() added to preserve fight_count, gold, exp across pause/resume cycles.
—Fight Count Always Zero on Dashboard — session_fights key mismatch with frontend fight_count type. Both keys now returned.
—Account Delete Orphaned Discord Channels — Channel is now cleaned up via manager_bot.delete_account_channel() on account deletion.
—Admin Sub Update Didn't Sync Discord Role — update_user_role() now called automatically after admin tier changes.
—AccountsPage Supabase Client Memory Leak — createClient() wrapped in useMemo to prevent new instances on every render.
—Missing Rate Limiting on Bot Endpoints — /sell, /eat, /auto-sell, /battle-mode, /refresh, /sync now rate-limited.
—Session Stats Interval Missed 'ready' Status — Polling now starts when any bot is 'running' or 'ready'.
—Invalid :hover in Inline Style — React silently ignores pseudo-selectors in inline styles; removed.
—alert() Replaced with Inline Errors — All native alert() calls in accounts page and mapping page replaced with inline error state.
Added
—Battle Mode Toggle on Mapping Page — Auto/Manual badge on each account card, wired to POST /api/bot/battle-mode.
Changed
—fetchSessionStats Parallelized — Sequential for-await loop changed to Promise.all for simultaneous bot stat fetches.
—Subscription Type — Replaced any type in settings/page.tsx with a proper Subscription interface.
v2.3.0
Added
—Auto-Join System: Selfbots now automatically start and join the designated Discord server immediately upon being added via the dashboard.
—Dual Channel Architecture: The Manager Bot now automatically creates both a Private Dedicated Channel (for grinding) and assigns the bot to a Shared Trading Channel (for inter-account transfers) for every newly added account, regardless of subscription tier.
v2.2.4
Fixed
—Dependency Architecture: Eliminated namespace conflicts by migrating fully to discord.py-self and removing generic discord.py dependencies.
—State Integrity: Prevented potential session data corruption by resolving duplicated method signatures in the selfbot engine.
—Security: Patched information leakage vulnerabilities in the authentication layer by suppressing unhandled exception stack traces.
—Real-Time Scoping: Hardened WebSocket architecture by properly mapping broadcast events exclusively to authorized user IDs.
—Rendering Performance: Eliminated infinite React re-renders across the dashboard components by memoizing Supabase client connections.
—Administrative Tooling: Rewrote user deletion logic to utilize the Supabase Auth Admin API.
Changed
—Rate Limiting: Implemented zero-dependency, sliding-window rate limiters across all critical bot control endpoints.
—Path Resolution: Removed hardcoded local Windows system paths and replaced them with dynamic cross-environment references.
—Session Middleware: Replaced legacy proxy implementations with strict Next.js middleware for reliable server-side JWT session token refresh.
—DOM Hydration: Migrated remaining direct DOM manipulation components to use pure React state.
—Database Schema: Upgraded bot session metrics columns to BIGINT to prevent integer overflow limits.
v2.2.3
Fixed
—Endpoint Authentication: Secured the inter-account trading endpoints (`/api/trade/initiate` and `/api/trade/history`) with Supabase JWT bearer token verification to prevent unauthorized access.
—Database Column Mismatch: Corrected trade history record mappings from backend keys `sender_account_id` / `receiver_account_id` to database physical columns `sender_id` / `receiver_id`, resolving database crashes on transfers.
—Frontend JWT Authorization: Added missing `Authorization` bearer token header in the frontend trade request fetch, ensuring authorized communication with the secured API.
—Config Hardcoding Cleanup: Removed the hardcoded Superadmin Discord ID string inside the admin router, converting the validation and auto-promotion checks to use settings configuration dynamically.
v2.2.2
Added
—Manual Role Configuration: Added custom environment variables `DISCORD_ROLE_FREE_ID`, `DISCORD_ROLE_STARTER_ID`, etc., to allow manual mapping of Discord roles by ID.
—Customizable Subscription Duration: Added custom subscription plan duration in days input to the Admin panel (defaulting to 30) and implemented exact UTC time calculations for the `expires_at` column.
—Highly Detailed Expiry Display: Rendered localized expiry date and time details with seconds precision on both the Admin user lists and the Settings subscription display cards.
Changed
—Removed Auto-Role Creation: Fully disabled automatic role creation by the manager bot. Subscription tier roles are now managed manually by the administrator.
v2.2.1
Fixed
—Gateway Stability: Patched the `discord.py-self` gateway hook to drop user-only `GUILD_SUBSCRIBE` (OP 14) and `BULK_GUILD_SUBSCRIBE` (OP 37) packets for Bot account connections, resolving the issue where the manager bot frequently disconnected with close code 4001 (Unknown opcode).
v2.2.0
Added
—Implemented Server-Based Architecture: Selfbots now operate in a dedicated Discord server rather than through Direct Messages.
—Auto-Join System: Selfbots automatically join the official server upon starting up if they are not already members.
—Manager Bot Verification: Manager Bot securely verifies incoming selfbots against the database and kicks unauthorized users automatically.
—Shared Trading Channels: Pro Plan users now have all their game accounts automatically placed into a single shared Discord channel to facilitate automated inter-account trading.
—Detailed Subscription Section: Created a premium detailed view in Settings for billing cycles (Monthly/Per Bulan), account slots, next invoice dates, and active feature matrix checklists.
—Transfer Page Locks: Enforced subscription limits on the Transfer page, introducing a beautiful locked screen with direct upgrade paths for Free/Starter plans.
—Dynamic Landing CTA: Automatically changes all landing page Sign In/Launch buttons to a primary solid filled 'Dashboard' button if the user is logged in.
—Logo viewBox Tuning: Adjusted bounds from 120x120 to 140x140 in `logo.svg` to fix top and bottom clipping of the sword and star.
—Footer Centralization: Integrated the honest disclaimer into a single cohesive, beautifully centered footer.
v2.1.15
Changed
—Updated 'Account Contribution' table in Overview to explicitly break down values into 'Gold' and 'Meat' columns
—Changed the font for table numbers from the display font to the standard sans-serif font for better readability
v2.1.14
Fixed
—Forced a Next.js cache bypass to ensure the 3-column account layout applies properly for all users
v2.1.13
Changed
—Locked the account card grid to exactly 3 columns on large desktop screens to prevent it from dividing into 4 columns on ultrawide monitors
v2.1.12
Changed
—Updated layout of account cards to display in a responsive auto-filling grid (up to 3 columns) on desktop, making better use of wide screens
Fixed
—Fixed Accounts page layout where action buttons squished the content on narrow grid columns
—Updated Image Modal to be truly full-screen without padding, with a stronger blur and prominent close button
v2.1.11
Changed
—Reverted the desktop layout of the game profile card back to a vertical stack (matching the mobile layout) for better proportions
v2.1.10
Added
—Added a lightbox modal to zoom in on game character profile cards in the dashboard when clicked
v2.1.9
Added
—Display the full game character profile card image (from $p) directly inside the dashboard overview and accounts list, eliminating the need to click 'Stats' to view it
v2.1.8
Added
—Dashboard and Accounts list now display both the original Discord profile avatar and the in-game character avatar side-by-side (stacked style) so you don't have to open stats to see them
v2.1.7
Changed
—Dashboard overview now prioritizes displaying the original Discord profile avatar over the in-game character avatar
v2.1.6
Changed
—Adjusted the Total Value calculation formula. The conversion rate for Meat to Gold is now 1:1 (previously 1:10) to accurately reflect player economy logic
v2.1.5
Fixed
—Fixed Global Balance incorrectly calculating Total Meat and Total Value due to Supabase 1000-row pagination limits when fetching materials
—Upgraded multiple INTEGER columns to BIGINT in the database schema to prevent crashing on extremely wealthy accounts (whales)
v2.1.4
Fixed
—Fixed Delete Account modal being constrained to the dashboard container by using React Portals to ensure it covers the entire screen
v2.1.3
Changed
—Added a confirmation modal for account deletion requiring the user to type their Discord username to prevent accidental deletion
v2.1.2
Fixed
—Fixed bot state synchronization issue where bots appeared running after a server restart
—Gracefully handled unimplemented multi-bot trade logic by properly failing the requests
—Added working cascade account deletion functionality in Settings page
—Fixed React 18 strict-mode duplicate variable definitions causing random crashes
v2.1.1
Fixed
—Fixed mobile layout squishing issues on the dashboard sidebar and account cards
—Fixed TypeScript any linting errors and cascaded render warnings across dashboard pages
—Standardized action buttons across the app
v2.1.0
Added
—Global Stats Sidebar: Real-time aggregated view of Total Gold, Meat, and Value across all linked accounts
Fixed
—Replaced bare exceptions in backend WebSocket logic with structured logger outputs
v2.0.1
Fixed
—Unclickable Delete action button on smaller viewports by redesigning account cards container layout
Added
—Premium glassmorphic confirmation modals for all bot actions (Start, Pause, Stop, Delete)
—Interactive spinner and loading indicators during bot control requests
v2.0.0
Added
—Complete platform rebuild from scratch
—Next.js 16 frontend with TypeScript + Tailwind
—FastAPI backend with async Supabase client
—Discord OAuth authentication via Supabase
—Fernet encryption for stored Discord tokens
—Real-time dashboard with Supabase Realtime
—Multi-account management with bot controls
—Inventory tracking with material sync
—Inter-account trading system
—Mining & profession tracking
—4-tier subscription system (Free/Starter/Pro/Enterprise)
—Design system following Huashu Design anti-slop principles