diff --git a/Core/MultiBotComm.lua b/Core/MultiBotComm.lua
index 946fa7a..7894b8e 100644
--- a/Core/MultiBotComm.lua
+++ b/Core/MultiBotComm.lua
@@ -2399,6 +2399,27 @@ function Comm.HandleAddonMessage(prefix, message, distribution, sender)
return true
end
+ if opcode == "GBANK_RIGHTS" then
+ local botName, rest = splitOnce(payload or "", "~")
+ local token, rest2 = splitOnce(rest or "", "~")
+ local canWithdraw, remaining = splitOnce(rest2 or "", "~")
+ botName = trim(urlDecodeField(botName))
+ canWithdraw = trim(canWithdraw)
+ remaining = tonumber(remaining or "0") or 0
+ state.connected = true
+ state.lastError = nil
+
+ local active = getActiveGuildBankRequest(botName, token)
+ if active then
+ active.rights = {
+ canWithdraw = canWithdraw == "1" or string.lower(canWithdraw) == "true",
+ remaining = remaining,
+ }
+ end
+
+ return true
+ end
+
if opcode == "GBANK_END" then
local botName, token = splitOnce(payload or "", "~")
botName = trim(urlDecodeField(botName))
@@ -2410,7 +2431,7 @@ function Comm.HandleAddonMessage(prefix, message, distribution, sender)
local key = string.lower(botName)
state.guildBankItems[key] = active.items or {}
if MultiBot.OnBridgeGuildBankItems then
- MultiBot.OnBridgeGuildBankItems(botName, state.guildBankItems[key], active.error, token)
+ MultiBot.OnBridgeGuildBankItems(botName, state.guildBankItems[key], active.error, token, active.rights)
end
end
diff --git a/README.md b/README.md
index 53b610a..d9e9683 100644
--- a/README.md
+++ b/README.md
@@ -101,6 +101,7 @@ GET~OUTFITS
GET~QUESTS
GET~GAMEOBJECTS
RUN~CRAFT_RECIPE
+RUN~ITEM_ACTION
RUN~OUTFIT
RUN~RTI
RUN~COMBAT
@@ -175,7 +176,7 @@ The goal is to remove automatic UI-refresh spam.
| Bot bank / guild bank / vendor buy |
- Bridge-first bank snapshots, guild bank snapshots, bank deposit/withdraw, guild bank deposit and vendor buy actions |
+ Bridge-first bank snapshots, guild bank snapshots, bank deposit/withdraw, guild bank deposit/withdraw and vendor buy actions |
| Profession recipe frame |
@@ -470,7 +471,7 @@ Implemented bridge-first / chatless areas:
- Inventory refresh with icons and item tooltips.
- Spellbook refresh, with profession/crafting spells separated from the combat spellbook path.
- Character Info frame through the bridge with Blizzard-style tabs for class, profession, secondary, weapon and armor skills, reputations and currencies/emblems.
-- Bot bank and guild bank snapshots through the bridge, plus bank deposit/withdraw, guild bank deposit and vendor buy item actions.
+- Bot bank and guild bank snapshots through the bridge, plus bank deposit/withdraw, guild bank deposit/withdraw and vendor buy item actions.
- Profession recipe frame through the bridge, opened from profession and secondary skill rows.
- Glyph refresh with icons and glyph tooltips.
- Outfits refresh and actions through the bridge.
diff --git a/TODO.md b/TODO.md
index 6b16266..40917c2 100644
--- a/TODO.md
+++ b/TODO.md
@@ -21,8 +21,6 @@
## Informations bot
* Dans les frames métier ajout d'un bouton pour faire le bot acheter les composants manquants pour crafter l'item.
* Infos personnage : onglets style Blizzard pour compétences, réputations et monnaies.
-* Ajouter un bouton pour abandonner les quêtes dans la frame de quêtes finies et en cours des bots
-* Ajouter un bouton pour retirer des objets de la banque de guilde
## Inventaire Bot étendu
@@ -32,9 +30,6 @@
* Ajout d'une frame pour afficher le contenu de la banque de guilde.
** TODO
-* Voire si on tient compte des droits de guilde pour les retraits et dépôts, et si les rangs des bots évoluent dans playerbots.
-* Uniformiser le layout des frames de banque bot et BDG
-* Ajouter un bouton retrait à la frame BDG
* Afficher les sous de la guilde dans la frame BDG
## Frame Loot
@@ -112,7 +107,8 @@
* Réputations bridge-first dans la frame Infos personnage.
* Monnaies / emblèmes bridge-first dans la frame Infos personnage, avec argent du bot.
* Banque bot bridge-first avec consultation, dépôt et retrait.
-* Banque de guilde bot bridge-first avec consultation et dépôt.
+* Banque de guilde bot bridge-first avec consultation, dépôt et retrait protégé par les droits de guilde.
+* Layout des frames banque bot et BDG uniformisé avec fond interne sombre.
* Achat vendeur bridge-first depuis les composants manquants de recette métier.
* Profession recipes bridge-first.
* Craft de recettes métier via bridge `RUN~CRAFT_RECIPE`.
diff --git a/UI/MultiBotBankFrame.lua b/UI/MultiBotBankFrame.lua
index c3b48d4..3e276b9 100644
--- a/UI/MultiBotBankFrame.lua
+++ b/UI/MultiBotBankFrame.lua
@@ -10,6 +10,7 @@ local BANK_FRAME_X = -360
local BANK_ROW_WIDTH = 300
local BANK_TEXT_WIDTH = 210
local BANK_WITHDRAW_BUTTON_WIDTH = 70
+local BANK_WITHDRAW_BUTTON_OFFSET_X = -8
local BANK_REFRESH_DELAY = 0.65
local function L(key, fallback)
@@ -34,6 +35,29 @@ local function setButtonEnabled(button, enabled)
end
end
+local function addSimpleBackdrop(frame, bgAlpha)
+ if not frame or not frame.SetBackdrop then
+ return
+ end
+
+ frame:SetBackdrop({
+ bgFile = "Interface\\Buttons\\WHITE8x8",
+ edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
+ tile = true,
+ tileSize = 16,
+ edgeSize = 14,
+ insets = { left = 3, right = 3, top = 3, bottom = 3 },
+ })
+
+ if frame.SetBackdropColor then
+ frame:SetBackdropColor(0.06, 0.06, 0.08, bgAlpha or 0.90)
+ end
+
+ if frame.SetBackdropBorderColor then
+ frame:SetBackdropBorderColor(0.35, 0.35, 0.35, 0.95)
+ end
+end
+
local function createWindow(name, title, width, height, pointX)
if AceGUI then
local widget = AceGUI:Create("Window")
@@ -44,6 +68,11 @@ local function createWindow(name, title, width, height, pointX)
widget.frame:SetPoint("CENTER", UIParent, "CENTER", pointX or 0, 0)
widget.frame:SetFrameStrata("DIALOG")
widget:EnableResize(false)
+
+ if widget.content then
+ addSimpleBackdrop(widget.content, 0.90)
+ end
+
return widget
end
@@ -54,9 +83,15 @@ local function createWindow(name, title, width, height, pointX)
frame.title = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
frame.title:SetPoint("TOP", 0, -7)
frame.title:SetText(title)
+
+ frame.content = CreateFrame("Frame", nil, frame)
+ frame.content:SetPoint("TOPLEFT", frame, "TOPLEFT", 10, -30)
+ frame.content:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -10, 10)
+ addSimpleBackdrop(frame.content, 0.90)
+
return {
frame = frame,
- content = frame,
+ content = frame.content,
SetTitle = function(self, value) self.frame.title:SetText(value) end,
Show = function(self) self.frame:Show() end,
Hide = function(self) self.frame:Hide() end,
@@ -172,8 +207,24 @@ local function getBankModeBridgeRequiredText(mode)
return L("inventory.bank.bridge.required", "Bank bridge is not connected.")
end
-local function canWithdrawFromMode(mode)
- return mode ~= "gbank"
+local function getWithdrawActionForMode(mode)
+ if mode == "gbank" then
+ return "GBANK_WITHDRAW"
+ end
+
+ return "BANK_WITHDRAW"
+end
+
+local function canWithdrawFromFrame(frame)
+ if not frame then
+ return false
+ end
+
+ if frame.mode == "gbank" then
+ return frame.gbankCanWithdraw == true
+ end
+
+ return true
end
local function ensureBankFrame()
@@ -209,18 +260,24 @@ local function ensureBankFrame()
row.text:SetHeight(22)
row.withdrawButton = CreateFrame("Button", nil, row, "UIPanelButtonTemplate")
- row.withdrawButton:SetPoint("RIGHT", row, "RIGHT", 0, 0)
+ row.withdrawButton:SetPoint("RIGHT", row, "RIGHT", BANK_WITHDRAW_BUTTON_OFFSET_X, 0)
row.withdrawButton:SetWidth(BANK_WITHDRAW_BUTTON_WIDTH)
row.withdrawButton:SetHeight(20)
row.withdrawButton:SetText(L("inventory.bank.withdraw", "Withdraw"))
row.withdrawButton:SetScript("OnClick", function()
local item = row.item
- if not item or not frame.botName or not canWithdrawFromMode(frame.mode) then
+ local action = getWithdrawActionForMode(frame.mode)
+ if not item or not frame.botName or not action then
+ return
+ end
+
+ if not canWithdrawFromFrame(frame) then
+ frame.status:SetText(getBankReasonText("NO_GUILD_BANK_RIGHTS"))
return
end
if MultiBot.Comm and MultiBot.Comm.RunInventoryItemAction then
- local token = MultiBot.Comm.RunInventoryItemAction(frame.botName, "BANK_WITHDRAW", item.itemId, 0)
+ local token = MultiBot.Comm.RunInventoryItemAction(frame.botName, action, item.itemId, 0)
if token then
frame.status:SetText(L("inventory.bank.withdraw.pending", "Withdraw requested..."))
setButtonEnabled(row.withdrawButton, false)
@@ -279,9 +336,9 @@ local function ensureBankFrame()
if item then
row.icon:SetTexture(MultiBot.SafeTexturePath(item.icon))
row.text:SetText((item.name or ("item:" .. item.itemId)) .. " |cff999999x" .. tostring(item.count or 1) .. "|r")
- if canWithdrawFromMode(self.mode) then
+ if getWithdrawActionForMode(self.mode) then
row.withdrawButton:SetText(L("inventory.bank.withdraw", "Withdraw"))
- setButtonEnabled(row.withdrawButton, true)
+ setButtonEnabled(row.withdrawButton, canWithdrawFromFrame(self))
row.withdrawButton:Show()
else
row.withdrawButton:Hide()
@@ -304,9 +361,11 @@ local function ensureBankFrame()
frame:render()
end)
- frame.setItems = function(self, botName, lines, errorReason, mode)
+ frame.setItems = function(self, botName, lines, errorReason, mode, guildBankRights)
self.botName = botName
self.mode = mode or self.mode or "bank"
+ self.gbankCanWithdraw = self.mode == "gbank" and type(guildBankRights) == "table" and guildBankRights.canWithdraw == true
+ self.gbankWithdrawRemaining = self.mode == "gbank" and type(guildBankRights) == "table" and tonumber(guildBankRights.remaining or 0) or 0
self.items = {}
self.page = 1
setWindowTitle(self, getBankModeTitle(self.mode) .. " - " .. tostring(botName or ""))
@@ -341,6 +400,8 @@ function MultiBot.OpenBotBank(botName)
local frame = ensureBankFrame()
frame.botName = botName
frame.mode = "bank"
+ frame.gbankCanWithdraw = false
+ frame.gbankWithdrawRemaining = 0
frame.items = {}
frame.page = 1
setWindowTitle(frame, getBankModeTitle(frame.mode) .. " - " .. botName)
@@ -365,6 +426,8 @@ function MultiBot.OpenBotGuildBank(botName)
local frame = ensureBankFrame()
frame.botName = botName
frame.mode = "gbank"
+ frame.gbankCanWithdraw = false
+ frame.gbankWithdrawRemaining = 0
frame.items = {}
frame.page = 1
setWindowTitle(frame, getBankModeTitle(frame.mode) .. " - " .. botName)
@@ -428,8 +491,8 @@ function MultiBot.OnBridgeBankItems(botName, lines, errorReason)
ensureBankFrame():setItems(botName, lines or {}, errorReason, "bank")
end
-function MultiBot.OnBridgeGuildBankItems(botName, lines, errorReason)
- ensureBankFrame():setItems(botName, lines or {}, errorReason, "gbank")
+function MultiBot.OnBridgeGuildBankItems(botName, lines, errorReason, token, guildBankRights)
+ ensureBankFrame():setItems(botName, lines or {}, errorReason, "gbank", guildBankRights)
end
function MultiBot.InitializeBankFrame()
diff --git a/UI/MultiBotInventoryItem.lua b/UI/MultiBotInventoryItem.lua
index a52835c..489f554 100644
--- a/UI/MultiBotInventoryItem.lua
+++ b/UI/MultiBotInventoryItem.lua
@@ -548,7 +548,7 @@ function MultiBot.OnBridgeInventoryItemActionResult(botName, action, itemId, res
if MultiBot.RefreshBotBank and (action == "BANK_DEPOSIT" or action == "BANK_WITHDRAW") then
MultiBot.RefreshBotBank(botName, 0.65)
end
- if action == "GBANK_DEPOSIT" and MultiBot.RefreshBotGuildBank then
+ if (action == "GBANK_DEPOSIT" or action == "GBANK_WITHDRAW") and MultiBot.RefreshBotGuildBank then
MultiBot.RefreshBotGuildBank(botName, 0.65)
end
if action == "BUY_ITEM" and MultiBot.professionRecipeFrame and MultiBot.professionRecipeFrame:IsShown()
@@ -573,6 +573,17 @@ function MultiBot.OnBridgeInventoryItemActionResult(botName, action, itemId, res
end
local reasonText = getInventoryItemActionReason(reason)
+ if (action == "BANK_WITHDRAW" or action == "GBANK_WITHDRAW")
+ and MultiBot.bankFrame and MultiBot.bankFrame.IsShown and MultiBot.bankFrame:IsShown()
+ and MultiBot.bankFrame.botName == botName then
+ if MultiBot.bankFrame.status then
+ MultiBot.bankFrame.status:SetText(reasonText ~= "" and reasonText or tostring(reason or ""))
+ end
+ if MultiBot.bankFrame.render then
+ MultiBot.bankFrame:render()
+ end
+ end
+
if action == "BUY_ITEM" and MultiBot.professionRecipeFrame and MultiBot.professionRecipeFrame:IsShown()
and MultiBot.professionRecipeFrame.botName == botName
and MultiBot.professionRecipeFrame.status then
diff --git a/docs/multibot_bridge_chatless_roadmap.md b/docs/multibot_bridge_chatless_roadmap.md
index ab38120..0b11252 100644
--- a/docs/multibot_bridge_chatless_roadmap.md
+++ b/docs/multibot_bridge_chatless_roadmap.md
@@ -146,9 +146,9 @@ Le but n’est pas de supprimer ces commandes. Le but est de ne plus les lancer
- [x] Endpoint côté bridge : `GET~BANK~~`
- [x] Réponses en paquets courts : `BANK_BEGIN`, `BANK_ITEM`, `BANK_ERROR`, `BANK_END`
- [x] Endpoint côté bridge : `GET~GBANK~~`
-- [x] Réponses en paquets courts : `GBANK_BEGIN`, `GBANK_ITEM`, `GBANK_ERROR`, `GBANK_END`
+- [x] Réponses en paquets courts : `GBANK_BEGIN`, `GBANK_RIGHTS`, `GBANK_ITEM`, `GBANK_ERROR`, `GBANK_END`
- [x] Endpoint côté bridge : `RUN~ITEM_ACTION~~~~~`
-- [x] Actions validées : dépôt banque bot, retrait banque bot, dépôt banque de guilde et achat vendeur
+- [x] Actions validées : dépôt banque bot, retrait banque bot, dépôt banque de guilde, retrait banque de guilde et achat vendeur
- [x] Consultation BDG basée sur la guilde du bot, sans exiger que le joueur soit dans la même guilde
- [x] Détection des banquiers neutres avec flags compatibles Dalaran
- [x] Messages d'erreur structurés pour banquier introuvable, droits BDG, vendeur introuvable, objet non vendu et monnaie spéciale
@@ -283,7 +283,7 @@ Avec beaucoup de bots, éviter les réponses globales trop grosses.
- `GET~BOT_EMBLEMS` répond en paquets `BOT_EMBLEMS_BEGIN` / `BOT_EMBLEM_ITEM` / `BOT_EMBLEMS_MONEY` / `BOT_EMBLEMS_END` ;
- `GET~PROFESSION_RECIPES` répond en paquets `PROFESSION_RECIPES_BEGIN` / `PROFESSION_RECIPES_ITEM` / `PROFESSION_RECIPES_END` ;
- `GET~BANK` répond en paquets `BANK_BEGIN` / `BANK_ITEM` / `BANK_ERROR` / `BANK_END` ;
-- `GET~GBANK` répond en paquets `GBANK_BEGIN` / `GBANK_ITEM` / `GBANK_ERROR` / `GBANK_END` ;
+- `GET~GBANK` répond en paquets `GBANK_BEGIN` / `GBANK_RIGHTS` / `GBANK_ITEM` / `GBANK_ERROR` / `GBANK_END` ;
- un paquet global vide peut seulement servir de réponse vide si aucun bot n’est disponible.
---
@@ -330,7 +330,7 @@ Le craft de recette passe par `RUN~CRAFT_RECIPE`. Les recettes à résultat alé
Les extensions inventaire banque, banque de guilde et achat vendeur sont maintenant bridge-first pour les chemins validés. La banque du bot et la banque de guilde du bot peuvent être consultées via `GET~BANK` et `GET~GBANK`.
-Les actions dépôt banque, retrait banque, dépôt banque de guilde et achat vendeur passent par `RUN~ITEM_ACTION`. Le retrait banque de guilde reste à traiter séparément si l'UI doit l'exposer plus tard, car il demande des garde-fous supplémentaires côté droits et logs.
+Les actions dépôt banque, retrait banque, dépôt banque de guilde, retrait banque de guilde et achat vendeur passent par `RUN~ITEM_ACTION`. Le retrait BDG est exposé dans l'UI avec un bouton grisé quand le bot n'a plus de droits de retrait disponibles.
### Audit chatless final
@@ -435,7 +435,7 @@ Le prochain pas logique est maintenant : **audit résiduel + Roll / ventes / ope
5. tester un craft cuisine sans feu puis avec feu, et vérifier l'erreur localisée ;
6. vérifier en console qu’il n’y a plus de refresh automatique legacy `stats`, `items`, `spells`, `glyphs`, `talents spec list`, `outfit ?` avec `MultiBot.allowLegacyChatFallback = false` ;
7. vérifier que les commandes manuelles volontaires restent fonctionnelles : `who`, `co ?`, `nc ?`, `ss ?`, `.playerbot bot add`, `.playerbot bot remove`, actions inventory, `glyph equip`, sélection de spec et actions Outfits ;
-8. poursuivre ensuite avec Roll, ventes existantes, open items bridge-first, retrait BDG et enchantements d'objets si besoin.
+8. poursuivre ensuite avec Roll, ventes existantes, open items bridge-first et enchantements d'objets si besoin.
Après cette stabilisation, il restera surtout un audit de nettoyage : supprimer les debug temporaires, garder les fallbacks legacy uniquement quand ils sont utiles au diagnostic, et retirer les parsers historiques devenus morts.
diff --git a/docs/multibot_missing_commands_roadmap.md b/docs/multibot_missing_commands_roadmap.md
index 2c1c488..65ffdc6 100644
--- a/docs/multibot_missing_commands_roadmap.md
+++ b/docs/multibot_missing_commands_roadmap.md
@@ -34,7 +34,7 @@ Le principe reste le même que pour Inventory, Spellbook, Glyphs, Talents, Stats
| Character Info / Monnaies | Fait | Onglet monnaies alimenté par `GET~BOT_EMBLEMS`, avec emblèmes et argent du bot. |
| Profession recipes | Fait | Nouvelle frame recettes par métier via `GET~PROFESSION_RECIPES`, composants, compte craftable, recettes à résultat direct ou indirect. |
| Profession recipe craft | Fait | Bouton `Créer` via `RUN~CRAFT_RECIPE`, support recettes classiques et résultats aléatoires/indirects, erreurs détaillées. |
-| Bot bank / Guild bank / Vendor buy | Fait/Partiel | `GET~BANK`, `GET~GBANK` et `RUN~ITEM_ACTION` pour banque bot, banque de guilde bot, achat vendeur et actions inventaire avancées validées. |
+| Bot bank / Guild bank / Vendor buy | Fait/Partiel | `GET~BANK`, `GET~GBANK` et `RUN~ITEM_ACTION` pour banque bot, banque de guilde bot avec retrait protégé, achat vendeur et actions inventaire avancées validées. |
| RTI / Target Icons | Fait | UI complète + bridge `RUN~RTI`, scopes `ALL`, `GROUP`, `BOT`. |
| Pull Control | Fait | Mini-frame MainBar + bridge `RUN~COMBAT`, séquences de commandes, scopes et presets. |
| Combat Strategies | Fait | Toggles individuels dans les EveryBars + mini-frame Party/Raid, via `RUN~COMBAT`. |
@@ -253,15 +253,15 @@ Fonctionnalités terminées :
- dépôt dans la banque du bot ;
- retrait depuis la banque du bot ;
- dépôt en banque de guilde du bot ;
+- retrait depuis la banque de guilde du bot, avec garde-fous sur les droits de retrait ;
- achat de composants chez un vendeur proche ;
- messages d'échec plus précis, notamment vendeur sans monnaie compatible ou banquier introuvable ;
-- consultation de la banque de guilde du bot sans exiger que le joueur soit dans la même guilde.
+- consultation de la banque de guilde du bot sans exiger que le joueur soit dans la même guilde ;
+- harmonisation visuelle des frames banque bot et BDG avec fond interne sombre.
À garder pour plus tard :
-- retrait banque de guilde, si l'UI doit l'exposer ;
- affichage de l'argent de guilde ;
-- harmonisation visuelle finale des frames banque et BDG.
---
@@ -587,7 +587,7 @@ Pas besoin de parsing automatique de réponses longues, sauf si une future UI ve
### Pourquoi
-L'inventaire bridge-first est déjà en place, le craft de recettes métier passe par le bridge, et les actions banque/guild bank/buy principales sont maintenant couvertes. Les commandes restantes sont des améliorations secondaires autour des items ponctuels, de la vente, de l'ouverture d'objets, du retrait BDG et des enchantements ciblant un item.
+L'inventaire bridge-first est déjà en place, le craft de recettes métier passe par le bridge, et les actions banque/guild bank/buy principales sont maintenant couvertes. Les commandes restantes sont des améliorations secondaires autour des items ponctuels, de la vente, de l'ouverture d'objets et des enchantements ciblant un item.
### Commandes à couvrir
@@ -604,7 +604,7 @@ L'inventaire bridge-first est déjà en place, le craft de recettes métier pass
| `bank [item]` | Fait via bridge | Basse | Dépôt banque bot via action item |
| `bank -[item]` | Fait via bridge | Basse | Retrait depuis la frame banque bot |
| `gb [item]` | Fait via bridge | Basse | Dépôt banque de guilde du bot |
-| `gb -[item]` | Manquant / à étudier | Basse | Retrait BDG à exposer seulement avec garde-fous |
+| `gb -[item]` | Fait via bridge | Basse | Retrait BDG depuis la frame banque de guilde avec garde-fous de droits |
| `b [item]` | Fait via bridge | Basse | Achat vendeur proche depuis composants manquants |
---
@@ -718,7 +718,7 @@ Ces commandes sont plutôt serveur/admin/debug ou trop dangereuses pour une UI u
## Point logique suivant
-Le prochain bloc logique conseillé est **Roll + migration optionnelle des ventes/open items vers bridge + retrait BDG + étude des enchantements d'items**.
+Le prochain bloc logique conseillé est **Roll + migration optionnelle des ventes/open items vers bridge + étude des enchantements d'items**.
Raison : les blocs RTI, Pull Control, Combat Strategies, Disperse, Loot Rules, Character Info, Reputations, Monnaies, Profession Recipes, Craft, Loot Master et Items avancés banque/guild bank/buy couvrent maintenant le ciblage, le pull, les stratégies combat, le positionnement collectif, les profils de loot, les compétences, les réputations, les monnaies, les recettes métier, le craft, la préparation du master loot et les actions banque/achat principales. Après vérification du code actuel, la vente grise, la vente vendor et `open items` existent déjà côté addon, mais restent en legacy whisper et ne sont pas encore bridge-first.
@@ -730,7 +730,7 @@ Raison : les blocs RTI, Pull Control, Combat Strategies, Disperse, Loot Rules, C
- `s vendor` : Déjà présent côté addon inventaire, legacy whisper item par item, pas encore bridge-first ;
- `open items` : Déjà présent côté addon, legacy whisper ;
- banque bot : Consultation, dépôt et retrait via bridge ;
-- banque de guilde bot : Consultation et dépôt via bridge, retrait à étudier ;
+- banque de guilde bot : Consultation, dépôt et retrait via bridge, avec garde-fous de droits ;
- achat vendeur : Disponible via bridge depuis les composants manquants de recette ;
- enchantement d'un item précis : manquant / à étudier avec une UI dédiée ;
- `ll [item]` / `ll -[item]` : manquant, amélioration possible depuis l'inventaire.
@@ -741,7 +741,6 @@ Proposition de prochaine itération, plus tard :
- ne pas recréer de boutons `s *`, `s vendor` ou `open items`, car ils existent déjà côté addon ;
- décider si les ventes existantes doivent passer par un endpoint dédié ou par un endpoint existant whitelisté ;
- éviter toute vente automatique dangereuse sans action explicite de l'utilisateur ;
-- décider si le retrait BDG doit être exposé, et avec quels garde-fous ;
- étudier une UI d'enchantement d'item séparée du craft métier classique, car elle doit cibler un item et prévoir plus de garde-fous ;
- garder les commandes informatives manuelles inchangées ;
- noter que `Quest` et `Skill` devront être remplacés plus tard par `Disenchant`, ou devenir de vrais profils ajoutés côté `mod-playerbots` avant exposition définitive.