Class GuiApiServer
java.lang.Object
server.gui.GuiApiServer
GUI 管理控制台的輕量 HTTP API,提供
gui/ 前端讀取「即時」伺服器狀態。
使用 JDK 內建 HttpServer(零新相依),僅綁定
127.0.0.1 ——永遠不對外可達,符合本專案 localhost 信任的安全姿態
(與 DatabaseConnection 對 loopback DB 的特例一致)。回應為 UTF-8 JSON。
於 server.Start.run() 在三個 Netty 伺服器與遊戲資料皆就緒後啟動
(start()),於關服流程停止(stop())。可由 settings.ini
的 gui.api.enabled / gui.api.port 開關與設定埠號。
端點:
GET /api/health—— 存活檢查。GET /api/overview—— 總覽頁所需的即時資訊(在線、歷史最高、運行時間、 今日註冊、倍率、各頻道狀態、最近嚴重事件、管理員模式、倒數關機狀態)。GET /api/players—— 玩家管理頁的角色清單(characters表內容聯結accounts取遊戲帳號名,並依目前在線玩家集合標記online狀態)。GET /api/players/{id}—— 單一角色 + 其帳號的完整詳情(供詳情/編輯視窗)。POST /api/players/{id}—— 儲存詳情視窗的修改(帳號欄位、角色欄位, 以及帳號/MAC/IP 的封鎖狀態);角色在線時變更會即時套用到遊戲中(見LiveCharacterEditor)。POST /api/players/{id}/password—— 以{"password":"…"}變更該角色所屬帳號的密碼。GET /api/players/{id}/equips—— 角色目前穿戴的裝備清單(部位中文名、道具名、可編輯數值、 潛能含可讀名稱與可指定的潛能選項);線上以記憶體穿戴格位為準、離線自inventoryequipment載入。POST /api/players/{id}/equips/{position}—— 儲存單件裝備的數值;角色在線時即時套用到記憶體並刷新 (見MapleCharacter.reloadEquip),離線時定點寫回inventoryequipment。GET /api/bans/related—— 封鎖/解封頁的「關聯帳號」:以創建與最後連線的 IP/MAC 連動歸群(union-find 連通分量),回傳每組共用 IP/MAC 的帳號(含其所有角色名與封鎖狀態)。POST /api/bans/account/{id}—— 以{"banned":bool}切換單一帳號的封鎖狀態 (accounts.banned)。POST /api/control/shutdown—— 以{"minutes":N}排程倒數關機 (等同遊戲內!shutdowntime N);{"cancel":true}取消倒數。POST /api/control/admin-mode—— 以{"enabled":bool}切換 「管理員模式」(只有 GM 帳號可登入),並寫回settings.ini以便重啟後記住。GET /api/chatlog?type=N&names=a,b—— 對話紀錄頁的訊息清單(依頻道型別、可選角色名稱 篩選;chatlog表聯結characters取角色名,依時間遞增回傳最近 N 筆)。GET /api/chatlog/context?id=N—— 某句話前後的對話上下文(同頻道、不套用名稱篩選),供「跳到」檢視。GET /api/chatlog/check-name?name=X—— 驗證遊戲暱稱是否存在(供加入篩選前檢查)。GET /api/logs/lookup?q=X—— 統一紀錄頁的查詢:以遊戲帳號或角色暱稱解析出帳號 + 其所有角色 (角色暱稱搜尋會一併回傳預選的角色 id)。GET /api/logs/entries?accId=N&charId=M—— 某角色(CHAR範圍)與其帳號(ACC範圍) 在當前週期的_acc_char_log計數(依日/週/月/永久分類,與遊戲端getLog讀同一列)。POST /api/logs/entry—— 以{accId,charId,scope,resetType,eventName,count}覆蓋當前週期某筆計數。POST /api/logs/entry/delete—— 以{accId,charId,scope,resetType,eventName}刪除當前週期某筆計數。GET /api/drops/monsters—— 「掉落物設定 / 怪物掉落」頁的怪物清單(WZMob.img的 怪物 id → 名稱,附各怪在drop_data的掉落列數dropCount)。GET /api/drops/monster/{id}—— 單一怪物的掉落列(drop_data聯結wz_itemdata取道具名)。POST /api/drops/monster/{id}—— 以{itemId,min,max,chance,questId}新增一筆掉落, 寫入drop_data並重載掉落表使其即時生效(等同!reloaddrops)。PUT /api/drops/drop/{id}—— 以{min,max,chance,questId}修改既有掉落列 (以drop_data.id定位,不更換物品),並重載掉落表使其即時生效。DELETE /api/drops/drop/{id}—— 刪除既有怪物掉落列(以drop_data.id定位),並重載掉落表使其即時生效。GET /api/drops/item-lookup?code=X|name=Y—— 道具代碼↔名稱互查(讀wz_itemdata),供新增視窗自動帶入另一欄。GET /api/drops/global—— 全部全域掉落(drop_data_global聯結wz_itemdata取道具名; 含怪物等級門檻mobLevel、活動旗標eventOnly與起訖時間startDate/endDate)。POST /api/drops/global—— 以{itemId,min,max,chance,mobLevel,eventOnly,startDate,endDate}新增一筆全域掉落(continent=-1套用所有地圖),寫入drop_data_global並重載掉落表使其即時生效。PUT /api/drops/global/{id}—— 以{min,max,chance,mobLevel,eventOnly,startDate,endDate}修改既有全域掉落 (以drop_data_global.id定位,不更換物品),並重載掉落表使其即時生效。DELETE /api/drops/global/{id}—— 刪除既有全域掉落列(以drop_data_global.id定位),並重載掉落表使其即時生效。GET /api/shops—— 「NPC 商店」頁左側的商店清單(shops表的shopid/npcid, NPC 名稱取自 WZString.wz/Npc.img,附各商店在shopitems的販售列數itemCount)。GET /api/shops/{shopId}—— 單一商店的販售道具列(shopitems聯結wz_itemdata取道具名)。POST /api/shops/{shopId}—— 以{itemId,buyable,price,reqItem,reqItemQ,minLevel,expiration}新增一筆販售道具,寫入shopitems並清空商店快取使其即時生效(等同!reloadshops)。PUT /api/shops/item/{id}—— 以{buyable,price,reqItem,reqItemQ,minLevel,expiration}修改既有販售列 (以shopitems.shopitemid定位,不更換物品),並清空商店快取使其即時生效。DELETE /api/shops/item/{id}—— 刪除既有販售列(以shopitems.shopitemid定位),並清空商店快取使其即時生效。GET /api/gachapon—— 「轉蛋機設置」頁左側的機台清單(gashapons左聯gashapon_items, 每台機台附其id/npcId/name與獎勵列數itemCount)。POST /api/gachapon—— 以{npcId,name}新增一台機台,寫入gashapons(刻意不重載快取, 須另按「刷新轉蛋機」才生效);回傳新機台id。PUT /api/gachapon/{id}—— 以{npcId,name}修改既有機台(以gashapons.id定位;刻意不重載快取)。DELETE /api/gachapon/{id}—— 刪除既有機台(以gashapons.id定位)並連帶刪除其所有gashapon_items(gashaponsid={id};刻意不重載快取)。GET /api/gachapon/{id}/items—— 單一機台的獎勵列(gashapon_items以gashaponsid={id}, 聯結wz_itemdata取道具名)。POST /api/gachapon/{id}/items—— 以{itemid,chance,min,max,showmsg}新增一筆獎勵,寫入gashapon_items(gashaponsid={id};刻意不重載快取);回傳新獎勵id。PUT /api/gachapon/item/{itemId}—— 以{chance,min,max,showmsg}修改既有獎勵 (以gashapon_items.id定位,不更換物品;刻意不重載快取)。DELETE /api/gachapon/item/{itemId}—— 刪除既有獎勵列(以gashapon_items.id定位;刻意不重載快取)。POST /api/gachapon/reload—— 手動重載遊戲內轉蛋機快取(GashaponFactory.reloadGashapons(), 等同!reloadgashpon),讓先前對gashapons/gashapon_items的變更即時生效。GET /api/cashshop—— 「商城設置」頁的完整狀態:items(CashItemFactory現行商品目錄, 每筆含序號/道具/價格/旗標與所屬分類名)、categories(後端唯一定義的分類碼→名稱對照)、settings(點裝清除能力/強制楓葉點數/回收價百分比三項)。POST /api/cashshop/item—— 以{serial?,category?,itemId,count,price,period,gender,mark,showup,priority}新增或修改一筆商品(serial缺/0 時依category取下一個空序號),寫入cashshop_modified_items並即時更新執行中目錄(CashItemFactory.saveModifiedItem(int, int, int, int, int, int, int, boolean, int));回{ok,serial}。DELETE /api/cashshop/item/{serial}—— 以序號刪除一筆商品(CashItemFactory.removeModifiedItem(int))。POST /api/cashshop/reload—— 全量重載商城目錄(CashItemFactory.initialize(boolean),等同!reloadCS)。GET /api/cashshop/export—— 以CommodityXmlConverter.exportXml()把資料庫匯出為Commodity.img.xml(直接下載原始 XML,非 JSON)。POST /api/cashshop/import—— 請求內文為Commodity.img.xml原始文字,以CommodityXmlConverter.importXml(String)匯入資料庫;回{imported:N}。POST /api/cashshop/settings—— 以{stripEquipStats?,forceMaplePoint?,recyclePercent?}設定三項商城設定欄位(現金商城點裝清除能力/現金商城強制楓葉點數/現金商城回收價百分比), 即時寫入ServerConstants並各以ServerProperties.saveProperty(String, String)寫回settings.ini。GET /api/special-items—— 「特殊道具」頁的全部設定(special_items聯結wz_itemdata取道具名)。POST /api/special-items—— 以 camelCase 全欄位新增一筆(itemId須存在且未重複;寫入後立刻重載快取即時生效)。PUT /api/special-items/{itemId}—— 修改既有特殊道具設定(以item_id定位;寫入後立刻重載快取即時生效)。DELETE /api/special-items/{itemId}—— 刪除既有特殊道具設定(以item_id定位;刪除後立刻重載快取即時生效)。POST /api/special-items/reload—— 手動全量重載遊戲內特殊道具快取(SpecialItemFactory.reload(),等同!reloadspecialitems);增刪改已自動重載,此端點供外部直接改special_items後手動全量同步。GET /api/fishing—— 「釣魚系統」頁的全部設定:config(總開關/觸發間隔秒數/全地圖旗標/指定地圖;取自ServerConstants.fishingEnabled/fishingIntervalSeconds/fishingAllMaps/fishingMaps) 與rewards(fishing_rewards聯結wz_itemdata取道具名)。POST /api/fishing/config—— 以{enabled,intervalSeconds,allMaps,maps}(maps為逗號分隔字串) 即時設定釣魚開關/間隔/地圖範圍,套用到ServerConstants並寫回settings.ini(設定為遊戲端直接讀取的即時欄位,免重載)。POST /api/fishing/rewards—— 以FishingRewardInput(camelCase 全欄位)新增一筆釣魚獎勵,寫入fishing_rewards並重載獎勵快取(FishingRewardFactory.reloadItems())即時生效;回傳含新id與道具名的完整列。PUT /api/fishing/rewards/{id}—— 修改既有釣魚獎勵(以fishing_rewards.id定位),寫入後重載快取即時生效。DELETE /api/fishing/rewards/{id}—— 刪除既有釣魚獎勵(以fishing_rewards.id定位),刪除後重載快取即時生效。GET /api/backup—— 「備份設置」頁的狀態:自動備份開關/間隔/保留份數(ServerConstants.DbBackup*)、 備份資料夾名稱,以及Backup/下既有備份 zip 清單(檔名/大小/修改時間,新→舊)。POST /api/backup/settings—— 以{enabled,intervalMinutes,keep}設定並持久化自動備份三參數 (寫回settings.ini),並即時重排程使其免重啟生效。POST /api/backup/run—— 立即執行一次資料庫備份;成功回傳新備份檔名/大小/修改時間。POST /api/backup/restore—— 以{name}從某個既有備份 zip 還原(覆寫)資料庫 (破壞性操作,嚴格驗證檔名防路徑穿越、以執行中旗標防與備份重疊)。GET /api/settings—— 「設置」頁的狀態:目前全服倍率(經驗/楓幣/掉落,小數)、 管理員上線預設效果(隱身/無敵)、線上玩家自動存檔(開關/間隔分鐘)、打怪獲得楓葉點數 (開關/機率/點數區間/每日上限)、道具堆疊區間、經驗區間倍率。POST /api/settings/rates—— 以{exp,meso,drop,mesoDropChance}(前三者小數倍率、 後者 0~100 整數 %)即時設定全服倍率與楓幣掉落機率,套用到所有頻道並寫回settings.ini。POST /api/settings/admin-login—— 以{hide?,godmode?}切換管理員(GM)上線預設的隱身/無敵 (等同!hide/!godmode),寫回settings.ini,下次該 GM 角色登入時生效。POST /api/settings/auto-save—— 以{enabled,intervalMinutes}設定線上玩家定時自動存檔, 寫回settings.ini並即時重排程(見PlayerAutoSaver)。POST /api/settings/kill-point—— 以{enabled,chance,min,max,dailyLimit}即時設定「打怪獲得 楓葉點數」(開關/機率 0~100%/每次隨機點數區間/每日上限,dailyLimit=0表不限),套用到ServerConstants.mobdropMP等欄位並寫回settings.ini;點數以帳號為單位、每日重置累計。POST /api/settings/item-stacks—— 以{value}(格式"起始ID-結束ID:堆疊上限, …") 整批設定道具堆疊區間,即時套用(ServerConstants.getStackOverride(int))並寫回settings.ini。POST /api/settings/exp-brackets—— 以{value}(格式"起始等級-結束等級:倍率, …") 整批設定經驗區間倍率,即時套用(ServerConstants.getExpBracketRate(int))並寫回settings.ini。POST /api/settings/level-up—— 以{enabled}切換「連續升級」(一次經驗連升數級時不再 捨棄超額經驗),套用到ServerConstants.連續升級並寫回settings.ini。
寫入端點同樣只綁 127.0.0.1,沿用本專案 localhost 信任的安全姿態。
-
Method Summary
-
Method Details
-
start
public static void start()啟動 HTTP API(依 settings.ini 開關;重複呼叫無作用)。 -
stop
public static void stop()停止 HTTP API(關服流程呼叫;未啟動則無作用)。
-