Files
ray zhou f71a5c59af ok
2026-05-29 11:21:40 +08:00

20 lines
27 KiB
JSON

{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nSearch across slot projects for:\n1. How games are listed/configured for users\n2. Random game selection logic if any exists\n3. Registration reward game configuration (specified games list)\n4. game_id in reward or promotion context\n\nSearch in: slot_console, slot_user, slot_wallet, slot_lib, backend, docs\n\nReturn: relevant file paths, config keys, database fields, and any existing patterns for picking a random game from a list.\n</user_query>"}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"Searching the codebase for game listing, random selection, and reward-related `game_id` patterns.\n\n[REDACTED]"},{"type":"tool_use","name":"UpdateCurrentStep","input":{"current_step":"Searching game config patterns","final_summary":""}},{"type":"tool_use","name":"Grep","input":{"pattern":"random.*game|game.*random|pickRandom|randomGame|shuffle.*game","path":"/Users/ray/Documents/project/www/slot","glob":"*.{php,go,js,ts,vue,json,md,yml,yaml}","-i":true,"head_limit":80}},{"type":"tool_use","name":"Grep","input":{"pattern":"registration.*reward|register.*reward|注册.*奖励|signup.*reward","path":"/Users/ray/Documents/project/www/slot","glob":"*.{php,go,js,ts,vue,json,md}","-i":true,"head_limit":80}},{"type":"tool_use","name":"Grep","input":{"pattern":"game_id","path":"/Users/ray/Documents/project/www/slot","glob":"*.{php,go,js,ts,vue}","head_limit":120}},{"type":"tool_use","name":"Grep","input":{"pattern":"reward.*game|game.*reward|promotion.*game|game.*promotion","path":"/Users/ray/Documents/project/www/slot","glob":"*.{php,go,js,ts,vue,json}","-i":true,"head_limit":80}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"pattern":"user_register_reward|register_reward|mobile_register_reward|game_base","glob":"*.{php,json,md}","head_limit":60,"path":"/Users/ray/Documents/project/www/slot"}},{"type":"tool_use","name":"Grep","input":{"pattern":"array_rand|shuffle\\(|random_int.*game|mt_rand.*game|pick.*game|select.*game","-i":true,"glob":"*.php","head_limit":60,"path":"/Users/ray/Documents/project/www/slot"}},{"type":"tool_use","name":"Grep","input":{"pattern":"game_list|game_ids|games_list|specified.*game|指定.*游戏","-i":true,"glob":"*.{php,json,md,vue}","head_limit":80,"path":"/Users/ray/Documents/project/www/slot"}},{"type":"tool_use","name":"Grep","input":{"pattern":"ACTIVITY_TYPE_REG|注册奖励|register.*game|game.*register","-i":true,"glob":"*.php","head_limit":60,"path":"/Users/ray/Documents/project/www/slot"}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/GameService.php","target_directory":"/Users/ray/Documents/project/www/slot"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/service/GameService.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/service/user/UserRegisterEventService.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/napi/logic/GameSearchLogic.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.{php,md,json}","head_limit":80,"path":"/Users/ray/Documents/project/www/slot/docs","pattern":"game_id|game_base|register.*reward|游戏"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":80,"path":"/Users/ray/Documents/project/www/slot/backend","pattern":"plateform_reward|platform_reward|game_base|user_register"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php","offset":680,"limit":80}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/GameApiModel.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/GameController.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":60,"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"game_id"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":60,"path":"/Users/ray/Documents/project/www/slot/slot_wallet","pattern":"game_id|reward|promotion|register"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/service/CommonService.php"}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/IndexGameNav*.php","target_directory":"/Users/ray/Documents/project/www/slot"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_pwa/app/command/Robot.php","limit":100}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_pwa/app/service/task/WithdrawGuideTaskService.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.{php,vue,json}","head_limit":80,"path":"/Users/ray/Documents/project/www/slot/backend","pattern":"game_base|plateform_reward|mobile_register|index_game|IndexGameNav|s_game_api"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/backend/slot_admin/app/yyladmin/model/IndexGameNav.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/IndexGameNavModel.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.{php,sql,json}","head_limit":80,"path":"/Users/ray/Documents/project/www/slot","pattern":"user_register_reward|mobile_register_binding|mobile_register_reward|plateform_reward|wagering_configuration"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":60,"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"getIndexGame|GameSearch|hot\\(|recommend"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":60,"path":"/Users/ray/Documents/project/www/slot","pattern":"wager.*game|game.*wager|allowed.*game|restrict.*game|指定游戏|游戏列表"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/napi/controller/LobbyController.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/napi/controller/GameController.php"}},{"type":"tool_use","name":"Read","input":{"limit":120,"path":"/Users/ray/Documents/project/www/slot/backend/slot_admin/app/game/logic/UserLogic.php","offset":190}},{"type":"tool_use","name":"Grep","input":{"glob":"*.{php,sql,vue}","head_limit":80,"path":"/Users/ray/Documents/project/www/slot","pattern":"game_base|user_register_reward"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.{php,sql}","head_limit":40,"path":"/Users/ray/Documents/project/www/slot","pattern":"index_game_nav|games.*json|CREATE TABLE.*index_game"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/backend/slot_admin/app/yyladmin/logic/IndexGameNavLogic.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/backend/slot_admin/app/game/controller/ConfigGroupController.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.{php,vue,json,sql}","head_limit":100,"path":"/Users/ray/Documents/project/www/slot/slot_center","pattern":"game_base|user_register|register_reward|game_id"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/command/event/HomeEvent.php","limit":120}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":50,"path":"/Users/ray/Documents/project/www/slot/slot_lib","pattern":"game_id|TRANSACTION_TYPE_REGISTER|register"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"glob":"*.{vue,php,sql,json}","head_limit":80,"path":"/Users/ray/Documents/project/www/slot/backend","pattern":"user_register_reward|mobile_register_binding|game_base|plateform_reward|mobile_register_reward"}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/indexGameNav/**","target_directory":"/Users/ray/Documents/project/www/slot/backend"}},{"type":"tool_use","name":"Read","input":{"limit":80,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/CommonController.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":50,"path":"/Users/ray/Documents/project/www/slot/slot_user","pattern":"game|reward|register"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":50,"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"WagerConfig|sendRegisterGiftWagerTask|register.*wager"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/backend/slot_admin_vue/src/views/yyladmin/indexGameNav/edit.vue"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/config/WagerConfigEntity.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_user/app/service/cache/GameConfigRedis.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.{php,sql}","head_limit":60,"path":"/Users/ray/Documents/project/www/slot/backend","pattern":"'game_base'|\\\"game_base\\\"|code.*game_base"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":40,"path":"/Users/ray/Documents/project/www/slot","pattern":"sendRegisterGiftWagerTask|ConsoleMqService"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/common/mq/ConsoleMqService.php","offset":85,"limit":40}},{"type":"tool_use","name":"Read","input":{"limit":120,"offset":240,"path":"/Users/ray/Documents/project/www/slot/backend/slot_admin/app/yyladmin/logic/GameApiLogic.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":40,"path":"/Users/ray/Documents/project/www/slot","pattern":"'reward'.*game_id|game_id.*reward|\\\"game_id\\\""}},{"type":"tool_use","name":"Read","input":{"limit":80,"path":"/Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php","offset":130}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":40,"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"ConfigModel|getGroupData|group_code"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/service/ConfigService.php"}},{"type":"tool_use","name":"Read","input":{"limit":90,"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/common/mq/ConsoleMqService.php"}},{"type":"tool_use","name":"Read","input":{"limit":80,"path":"/Users/ray/Documents/project/www/slot/slot_wallet/app/model/multi/WagerTaskModel.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.{php,vue,md}","head_limit":50,"path":"/Users/ray/Documents/project/www/slot","pattern":"register.*game|game.*register|signup.*game|free.*game|bonus.*game"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":30,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model","pattern":"CREATE TABLE|protected \\$table"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"limit":80,"path":"/Users/ray/Documents/project/www/slot/slot_pwa/app/model/common/GameApiModel.php"}},{"type":"tool_use","name":"Read","input":{"limit":80,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/GameModel.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.{vue,php}","head_limit":40,"path":"/Users/ray/Documents/project/www/slot/backend","pattern":"user_register_reward|mobile_register|game_base|register_template"}},{"type":"tool_use","name":"Read","input":{"limit":50,"offset":160,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":30,"path":"/Users/ray/Documents/project/www/slot/slot_lib","pattern":"SOURCE_TYPE_REGISTER|SOURCE_TYPE"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"glob":"*.{php,vue,sql}","head_limit":60,"path":"/Users/ray/Documents/project/www/slot/backend","pattern":"'key'.*game|game.*'key'|register_game|game_ids|games\\b"}},{"type":"tool_use","name":"Read","input":{"limit":100,"path":"/Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php","offset":55}},{"type":"tool_use","name":"Read","input":{"limit":60,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/command/EventBus.php","offset":220}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":30,"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"register_template|game_notice"}},{"type":"tool_use","name":"Read","input":{"limit":50,"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/common/const/Consts.php"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":40,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/common","pattern":"game_id|game"}},{"type":"tool_use","name":"Read","input":{"limit":80,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/common/BannerModel.php"}},{"type":"tool_use","name":"Read","input":{"limit":50,"offset":100,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/command/CreateSharedTable.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":20,"path":"/Users/ray/Documents/project/www/slot/slot_user","pattern":"user_collect|UserCollect"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/UserCollectGameModel.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":30,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/common/RechargeGiftConfigModel.php","pattern":"game"}},{"type":"tool_use","name":"Read","input":{"limit":60,"path":"/Users/ray/Documents/project/www/slot/slot_center/app/service/ConfigService.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":20,"path":"/Users/ray/Documents/project/www/slot","pattern":"bet_bonus_rate"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":30,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/service/ShareRedisKeyManagerService.php","pattern":"game"}},{"type":"tool_use","name":"Read","input":{"limit":40,"path":"/Users/ray/Documents/project/www/slot/slot_console/config/sharerediskey.php"}},{"type":"tool_use","name":"Grep","input":{"glob":"*.php","head_limit":20,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model","pattern":"config_group|ConfigGroupModel"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/ConfigGroupModel.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/ConfigModel.php"}},{"type":"tool_use","name":"UpdateCurrentStep","input":{"current_step":"Compiling search findings","final_summary":"Searched slot_console, slot_user, slot_wallet, slot_lib, backend, and docs for game listing, random selection, registration rewards, and game_id in reward/promotion contexts. Registration rewards are monetary only (no game list config); random game picking exists only for robots and decorative lamp messages.","completed_subtitle":"Mapped game and reward patterns"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"## Search Report: Game Listing, Random Selection, Registration Rewards, and `game_id`\n\nSearched: `slot_console`, `slot_user`, `slot_wallet`, `slot_lib`, `backend`, `docs`.\n\n---\n\n### 1. How Games Are Listed / Configured for Users\n\n#### Admin configuration (backend)\n\n| Layer | Path | Role |\n|---|---|---|\n| Master game catalog | `/Users/ray/Documents/project/www/slot/backend/slot_admin/app/yyladmin/logic/GameApiLogic.php` | Publish games to `s_game_api`, batch publish (`saveMore`), cache to `game.json` + CDN |\n| Homepage nav sections | `/Users/ray/Documents/project/www/slot/backend/slot_admin/app/yyladmin/controller/IndexGameNavController.php` | CRUD for `index_game_nav` |\n| Admin UI | `/Users/ray/Documents/project/www/slot/backend/slot_admin_vue/src/views/yyladmin/indexGameNav/edit.vue` | Cascader multi-select for `games` field |\n| Game release UI | `/Users/ray/Documents/project/www/slot/backend/slot_admin_vue/src/views/yyladmin/yyladmin/game/releaseGame.vue` | Single-game publish by `game_id` |\n\n#### C-side serving (slot_console)\n\n| Path | Endpoint / method | Purpose |\n|---|---|---|\n| `/Users/ray/Documents/project/www/slot/slot_console/app/napi/controller/GameController.php` | `search`, `homeRecommend`, `navBrand`, `nav`, `brand` | Main lobby game APIs |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/napi/controller/LobbyController.php` | `frontData` | Bundles `home_recommend` + `public_config` |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/napi/logic/GameSearchLogic.php` | `result()` | Filter/sort by nav, brand, name; special orders: `recent`, `favourites`, `hot`, `new` |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/service/GameService.php` | `getIndexGames()`, `hot()`, `getIndexGameLIst()` | Builds homepage sections from DB + Redis cache |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/model/GameApiModel.php` | `hot()`, `getGames()`, `recommends()` | Queries `s_game_api` |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/GameController.php` | `index`, `login`, `collect` | Legacy slot list + game login via `SlotPlatformService` |\n\n#### Database tables (shared `s_common`)\n\n| Table | Key fields | Notes |\n|---|---|---|\n| `game` | `id`, `name`, `status`, `icon_url`, `brand_id`, `third_id`, `publisher` | Master game catalog |\n| `s_game_api` | `game_id`, `game_nav_id`, `brand_id`, `game_model_id`, `is_hot`, `is_index`, `sort`, `status` | Per-channel published games |\n| `s_game_nav` | `id`, `name`, `game_model_id`, `status`, `sort` | Category/nav tabs |\n| `index_game_nav` | `name`, `games`, `num`, `sort`, `status`, `game_model_id` | Homepage sections; **`games`** is array of cascader values |\n| `game_server` | maps `source` → `game_model_id` | Channel scoping |\n| `user_collect_game` | `(uid, game_id)`, `status` | Favorites |\n| `user_play_history_{NN}` | `(uid, game_id)`, `play_time` | Recent play (sharded) |\n\n**`index_game_nav.games` format** (from admin UI + `GameService::getIndexGames`):\n- Values like `nav-{navId}-{brandId}` (e.g. `nav-3-5`)\n- Resolved via `GameApiModel::getGames($navIds, $brandIds, $limit)` — **not explicit game IDs**, but nav+brand filters with a limit (`num`, default 10)\n\n#### Redis cache keys\n\nFrom `/Users/ray/Documents/project/www/slot/slot_console/config/sharerediskey.php`:\n- `game:info:` — per-game detail hash\n- `game:recommend:{gameModelId}` — homepage recommend list\n- `game:hot:{gameModelId}` — hot games\n- `game:nav:list:{gameModelId}` — nav list\n\nConfig groups loaded via Redis hash: `{configManager}{gameModelId}:{source}:{groupCode}` \n(`/Users/ray/Documents/project/www/slot/slot_console/app/service/ShareRedisKeyManagerService.php`)\n\n#### Config storage tables\n\n- `s_config_group` — group `code`, `source`, `game_model_id`\n- `s_config` — `key` / `value` pairs per group\n\n---\n\n### 2. Random Game Selection Logic\n\n**No production user-facing random game picker for rewards or registration was found** in the searched projects.\n\nExisting random patterns (non-reward):\n\n| Path | Pattern | Purpose |\n|---|---|---|\n| `/Users/ray/Documents/project/www/slot/slot_pwa/app/command/Robot.php` | `$gameId = $gameIds[array_rand($gameIds)]` where `$gameIds = array_keys(GameApiModel::dicts())` | Robot fake bet logs |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/CommonController.php` | `$indexes = array_rand($names, 3)` on slot game **names** | Fake marquee/lamp messages |\n\n**Reusable pattern for picking from a list:**\n\n```php\n$gameIds = array_keys($games); // or explicit ID array from config\n$gameId = $gameIds[array_rand($gameIds)];\n```\n\n`GameApiModel::dicts()` in `/Users/ray/Documents/project/www/slot/slot_pwa/app/model/common/GameApiModel.php` loads all active published games joined with `game` table.\n\n---\n\n### 3. Registration Reward Game Configuration\n\n**Finding: Registration rewards are monetary only — no specified games list exists.**\n\n#### Flow\n\n```\nslot_user register\n → MQ TYPE_USER_REGISTER\n → slot_console EventBus::registerEvent()\n → UserRegisterEventService::deal()\n → wallet POST /api/wallet/update type=register\n```\n\n#### Key files\n\n| Path | What it does |\n|---|---|\n| `/Users/ray/Documents/project/www/slot/slot_console/app/command/EventBus.php` | Triggers register event; sends welcome email from `register_template` |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/service/user/UserRegisterEventService.php` | Reads reward amounts, credits wallet |\n| `/Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php` | `register()` — credits wallet, creates wager task `source_type=1` |\n\n#### Config groups & keys (no game list)\n\n| Group code | Keys used | Purpose |\n|---|---|---|\n| `game_base` | `user_register_reward` | Register bonus amount |\n| `game_base` | `mobile_register_binding` | Phone-bind bonus amount |\n| `game_base` | `bet_bonus_rate` | Used in stats, not register flow |\n| `mobile_register_reward` | `title`, `body` | Email template for phone-bind reward |\n| `register_template` | `title`, `body` | Welcome email (no reward) |\n| `wagering_configuration` | `recharge`, `reward`, `win` | Wager multipliers for register task |\n\nRead via:\n- `ConfigService::getGroupData('game_base', '', $gameModelId)` — `/Users/ray/Documents/project/www/slot/slot_console/app/service/ConfigService.php`\n- `CommonService::getConfig()` also exposes `game_base` + `wagering_configuration` to C-side\n\n#### Secondary register reward path (activity)\n\n| Path | Notes |\n|---|---|\n| `/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php` | `ACTIVITY_TYPE_REG` (type 7): gives `gift_coin` / `gift_bonus`, triggers `sendRegisterGiftWagerTask` |\n| Table: `s_recharge_gift_config` | Activity config — **no `game_id` field** |\n\nConstants: `/Users/ray/Documents/project/www/slot/slot_lib/src/common/const/Consts.php`\n- `ACTIVITY_TYPE_REG = 7`\n- `TRANSACTION_TYPE_REGISTER = 11`\n- `SOURCE_TYPE_REGISTER = 1`\n\n---\n\n### 4. `game_id` in Reward / Promotion Context\n\n#### Always `game_id = 0` for rewards\n\n| Path | Context |\n|---|---|\n| `/Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php` | `addTransactionRecord()` hardcodes `'game_id' => 0` for register, reward, recharge gift |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/service/user/UserRegisterEventService.php` | Commented-out transaction log also uses `game_id => 0` |\n| `/Users/ray/Documents/project/www/slot/slot_lib/src/entity/mq/UserTransactionLogEntity.php` | `public int $game_id = 0` default |\n\n#### Email / reward JSON shape (no `game_id`)\n\n```json\n{\"coin\": 100, \"type\": 51}\n```\n\nUsed in:\n- `/Users/ray/Documents/project/www/slot/slot_console/app/service/user/UserRegisterEventService.php` (bind-phone reward)\n- `/Users/ray/Documents/project/www/slot/backend/slot_admin/app/game/logic/UserLogic.php` (`plateform_reward` group — admin manual reward email)\n\nDB field: `user_email_{NN}.reward` varchar(5000) JSON — `/Users/ray/Documents/project/www/slot/slot_console/app/command/CreateSharedTable.php`\n\n#### Wager tasks (reward tracking, no game restriction)\n\n| Field | Table | Notes |\n|---|---|---|\n| `source_type` | `wager_task` | `1` = register, `3` = activity reward, etc. |\n| `reward_amount`, `recharge_amount` | `wager_task` | Amount-based, no game scope |\n\nModel: `/Users/ray/Documents/project/www/slot/slot_wallet/app/model/multi/WagerTaskModel.php` \nMQ: `/Users/ray/Documents/project/www/slot/slot_lib/src/common/mq/ConsoleMqService.php` → `sendRegisterGiftWagerTask()`\n\n#### Promotion popups — `game_id` field exists but unused\n\n| Path | Behavior |\n|---|---|\n| `/Users/ray/Documents/project/www/slot/slot_console/app/command/event/HomeEvent.php` | `withdraw_guide` popup: `'game_id' => 0` hardcoded |\n| `/Users/ray/Documents/project/www/slot/slot_pwa/app/service/task/WithdrawGuideTaskService.php` | `notifyClient($uid, $gameId=0)` — accepts game_id but callers pass 0 |\n\n#### Banner promotions\n\n`/Users/ray/Documents/project/www/slot/slot_console/app/model/common/BannerModel.php`\n- Uses `jump_type` + `jump_val` (not `game_id`)\n- Scoped by `game_model_id`, not individual games\n\n---\n\n### 5. slot_user / slot_wallet / docs Summary\n\n| Project | Relevant findings |\n|---|---|\n| **slot_user** | Register flow only; `user_play_history` has `game_id`; no register-game config |\n| **slot_wallet** | Register/reward always `game_id=0`; wager tasks track reward source by `source_type`, not game |\n| **slot_lib** | Shared constants, MQ wager task entities, `UserTransactionLogEntity.game_id` |\n| **docs** | No game-list or registration-game config documented; only general wallet/free-credits rules |\n\n---\n\n### Key Takeaway for Implementation\n\nIf you need **\"registration reward → pick random game from configured list\"**, there is **no existing config key or DB field** for that in the searched scope. Closest existing patterns to reuse:\n\n1. **Game list source**: `index_game_nav.games` (nav-brand cascader) or explicit game ID array in a new `s_config` key under `game_base`\n2. **Random pick**: `array_rand()` pattern from `/Users/ray/Documents/project/www/slot/slot_pwa/app/command/Robot.php`\n3. **Popup with game**: `withdraw_guide` popup structure in `HomeEvent` / `WithdrawGuideTaskService` already has a `game_id` slot (currently always 0)\n4. **Reward crediting**: stays wallet-based (`user_register_reward` amount); game would be a **navigation hint**, not a wallet field\n\n[REDACTED]"}]}}