--[[ Informant An addon for World of Warcraft that shows pertinent information about an item in a tooltip when you hover over the item in the game. 3.8.0 (Kangaroo) $Id: InfCommand.lua 854 2006-05-10 04:23:18Z mentalpower $ Command handler. Assumes responsibility for allowing the user to set the options via slash command, Khaos, MyAddon etc. License: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program(see GLP.txt); if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. --]] -- function prototypes local commandHandler, cmdHelp, onOff, genVarSet, chatPrint, registerKhaos, restoreDefault, cmdLocale, setLocale, isValidLocale local setKhaosSetKeyValue -- Localization function prototypes local delocalizeFilterVal, localizeFilterVal, getLocalizedFilterVal, delocalizeCommand, localizeCommand, buildCommandMap local commandMap = nil; local commandMapRev = nil; Informant_Khaos_Registered = nil Informant.InitCommands = function() SLASH_INFORMANT1 = "/informant" SLASH_INFORMANT2 = "/inform" SLASH_INFORMANT3 = "/info" SLASH_INFORMANT4 = "/inf" SlashCmdList["INFORMANT"] = function(msg) commandHandler(msg, nil) end chatPrint(string.format(_INFM('FrmtWelcome'), INFORMANT_VERSION)) if (Khaos) then registerKhaos() end end function setKhaosSetKeyValue(key, value) if (Informant_Khaos_Registered) then local kKey = Khaos.getSetKey("Informant", key) if (not kKey) then EnhTooltip.DebugPrint("setKhaosSetKeyParameter(): key " .. key .. " does not exist") elseif (kKey.checked ~= nil) then if (type(value) == "string") then value = (value == "on"); end Khaos.setSetKeyParameter("Informant", key, "checked", value) elseif (kKey.value ~= nil) then Khaos.setSetKeyParameter("Informant", key, "value", value) else EnhTooltip.DebugPrint("setKhaosSetKeyValue(): don't know how to update key ", key) end end end function buildCommandMap() commandMap = { [_INFM('CmdOn')] = 'on', [_INFM('CmdOff')] = 'off', [_INFM('CmdHelp')] = 'help', [_INFM('CmdToggle')] = 'toggle', [_INFM('CmdDisable')] = 'disable', [_INFM('CmdLocale')] = 'locale', [_INFM('CmdDefault')] = 'default', [_INFM('CmdEmbed')] = 'embed', [_INFM('ShowIcon')] = 'show-icon', [_INFM('ShowStack')] = 'show-stack', [_INFM('ShowUsage')] = 'show-usage', [_INFM('ShowQuest')] = 'show-quest', [_INFM('ShowMerchant')] = 'show-merchant', [_INFM('ShowVendor')] = 'show-vendor', [_INFM('ShowVendorBuy')] = 'show-vendor-buy', [_INFM('ShowVendorSell')] = 'show-vendor-sell', } commandMapRev = {} for k,v in pairs(commandMap) do commandMapRev[v] = k; end end --Cleaner Command Handling Functions (added by MentalPower) function commandHandler(command, source) --To print or not to print, that is the question... local chatprint = nil if (source == "GUI") then chatprint = false else chatprint = true end --Divide the large command into smaller logical sections (Shameless copy from the original function) local i,j, cmd, param = string.find(command, "^([^ ]+) (.+)$") if (not cmd) then cmd = command end if (not cmd) then cmd = "" end if (not param) then param = "" end cmd = delocalizeCommand(cmd); --Now for the real Command handling if ((cmd == "") or (cmd == "help")) then cmdHelp() return elseif (cmd == "on" or cmd == "off" or cmd == "toggle") then onOff(cmd, chatprint) elseif (cmd == "disable") then Stubby.SetConfig("Informant", "LoadType", "never"); elseif (cmd == "load") then if (param == "always") or (param == "never") then chatPrint("Setting Informant to "..param.." load for this toon"); Stubby.SetConfig("Informant", "LoadType", param); end elseif (cmd == "locale") then setLocale(param, chatprint) elseif (cmd == "default") then restoreDefault(param, chatprint) elseif (cmd == "embed" or cmd == "show-stack" or cmd == "show-usage" or cmd == "show-quest" or cmd == "show-merchant" or cmd == "show-vendor" or cmd == "show-vendor-buy" or cmd == "show-vendor-sell" or cmd == "show-icon") then genVarSet(cmd, param, chatprint) else if (chatprint) then chatPrint(string.format(_INFM('FrmtActUnknown'), cmd)) end end end --Help ME!! (The Handler) (Another shameless copy from the original function) function cmdHelp() local onOffToggle = " (".._INFM('CmdOn').."|".._INFM('CmdOff').."|".._INFM('CmdToggle')..")" local lineFormat = " |cffffffff/informant %s "..onOffToggle.."|r |cffff4020[%s]|r - %s" chatPrint(_INFM('TextUsage')) chatPrint(" |cffffffff/informant "..onOffToggle.."|r |cffff4020["..getLocalizedFilterVal('all').."]|r - " .. _INFM('HelpOnoff')) chatPrint(" |cffffffff/informant ".._INFM('CmdDisable').."|r - " .. _INFM('HelpDisable')); chatPrint(string.format(lineFormat, _INFM('ShowVendor'), getLocalizedFilterVal('show-vendor'), _INFM('HelpVendor'))) chatPrint(string.format(lineFormat, _INFM('ShowVendorSell'), getLocalizedFilterVal('show-vendor-sell'), _INFM('HelpVendorSell'))) chatPrint(string.format(lineFormat, _INFM('ShowVendorBuy'), getLocalizedFilterVal('show-vendor-buy'), _INFM('HelpVendorBuy'))) chatPrint(string.format(lineFormat, _INFM('ShowUsage'), getLocalizedFilterVal('show-usage'), _INFM('HelpUsage'))) chatPrint(string.format(lineFormat, _INFM('ShowMerchant'), getLocalizedFilterVal('show-merchant'), _INFM('HelpMerchant'))) chatPrint(string.format(lineFormat, _INFM('ShowStack'), getLocalizedFilterVal('show-stack'), _INFM('HelpStack'))) chatPrint(string.format(lineFormat, _INFM('ShowIcon'), getLocalizedFilterVal('show-icon'), _INFM('HelpIcon'))) chatPrint(string.format(lineFormat, _INFM('CmdEmbed'), getLocalizedFilterVal('embed'), _INFM('HelpEmbed'))) lineFormat = " |cffffffff/informant %s %s|r |cffff4020[%s]|r - %s" chatPrint(string.format(lineFormat, _INFM('CmdLocale'), _INFM('OptLocale'), getLocalizedFilterVal('locale'), _INFM('HelpLocale'))) lineFormat = " |cffffffff/informant %s %s|r - %s" chatPrint(string.format(lineFormat, _INFM('CmdDefault'), "", _INFM('HelpDefault'))) end --The onOff(state, chatprint) function handles the state of the Informant AddOn (whether it is currently on or off) --If "on" or "off" is specified in the " state" variable then Informant's state is changed to that value, --If "toggle" is specified then it will toggle Informant's state (if currently on then it will be turned off and vice-versa) --If no keyword is specified then the functione will simply return the current state -- --If chatprint is "true" then the state will also be printed to the user. function onOff(state, chatprint) if ((state == nil) or (state == "")) then state = Informant.GetFilterVal("all") elseif ((state == _INFM('CmdOn')) or (state == "on")) then Informant.SetFilter("all", "on") elseif ((state == _INFM('CmdOff')) or (state == "off")) then Informant.SetFilter("all", "off") elseif ((state == _INFM('CmdToggle')) or (state == "toggle")) then Informant.SetFilter("all", not Informant.GetFilter("all")) state = Informant.GetFilterVal("all") end --Print the change and alert the GUI if the command came from slash commands. Do nothing if they came from the GUI. if (chatprint == true) then if ((state == _INFM('CmdOn')) or (state == "on")) then chatPrint(_INFM('StatOn')) if (Informant_Khaos_Registered) then Khaos.setSetKeyParameter("Informant", "enabled", "checked", true) end else chatPrint(_INFM('StatOff')) if (Informant_Khaos_Registered) then Khaos.setSetKeyParameter("Informant", "enabled", "checked", false) end end end return state end function restoreDefault(param, chatprint) local oldLocale = InformantConfig.filters['locale'] local paramLocalized if ( (param == nil) or (param == "") ) then return elseif ((param == _INFM('CmdClearAll')) or (param == "all")) then param = "all"; InformantConfig.filters = {}; else paramLocalized = param param = delocalizeCommand(param) Informant.SetFilter(param, nil); end -- Apply defaults for settings that went missing Informant.SetFilterDefaults(); -- Apply new locale if needed if (oldLocale ~= InformantConfig.filters['locale']) then setLocale(InformantConfig.filters['locale']); end if (chatprint) then if (param == "all") then chatPrint(_INFM('FrmtActDefaultall')); for k,v in pairs(InformantConfig.filters) do setKhaosSetKeyValue(k, Informant.GetFilterVal(k)); end else chatPrint(string.format(_INFM('FrmtActDefault'), paramLocalized)); setKhaosSetKeyValue(param, Informant.GetFilterVal(param)); end end end function genVarSet(variable, param, chatprint) if (type(param) == "string") then param = delocalizeFilterVal(param); end if (param == "on" or param == "off" or type(param) == "boolean") then Informant.SetFilter(variable, param); elseif (param == "toggle" or param == nil or param == "") then param = Informant.SetFilter(variable, not Informant.GetFilter(variable)); end if (chatprint) then if (Informant.GetFilter(variable)) then chatPrint(string.format(_INFM('FrmtActEnable'), localizeCommand(variable))) setKhaosSetKeyValue(variable, true) else chatPrint(string.format(_INFM('FrmtActDisable'), localizeCommand(variable))) setKhaosSetKeyValue(variable, false) end end end local function getKhaosLocaleList() local options = { [_INFM('CmdDefault')] = 'default' }; for locale, data in InformantLocalizations do options[locale] = locale; end return options end function registerKhaos() local optionSet = { id="Informant"; text="Informant"; helptext=function() return _INFM('GuiMainHelp') end; difficulty=1; default={checked=true}; options={ { id="Header"; text="Informant"; helptext=function() return _INFM('GuiMainHelp') end; type=K_HEADER; difficulty=1; }; { id="enabled"; type=K_TEXT; text=function() return _INFM('GuiMainEnable') end; helptext=function() return _INFM('HelpOnoff') end; callback=function(state) onOff(state.checked) end; feedback=function(state) if (state.checked) then return _INFM('StatOn') else return _INFM('StatOff') end end; check=true; default={checked=true}; disabled={checked=false}; difficulty=1; }; { id="locale"; type=K_PULLDOWN; setup = { options = getKhaosLocaleList; multiSelect = false; }; text=function() return _INFM('GuiLocale') end; helptext=function() return _INFM('HelpLocale') end; callback = function(state) end; feedback = function (state) setLocale(state.value); return string.format(_INFM('FrmtActSet'), _INFM('CmdLocale'), state.value); end; default = { value = getLocale(); }; disabled = { value = getLocale(); }; dependencies={enabled={checked=true;}}; difficulty=2; }; { id="InformantInfoHeader"; type=K_HEADER; text=function() return _INFM('GuiInfoHeader') end; helptext=function() return _INFM('GuiInfoHelp') end; difficulty=1; }; { id="show-icon"; type=K_TEXT; text=function() return _INFM('GuiInfoIcon') end; helptext=function() return _INFM('HelpIcon') end; callback=function(state) genVarSet("show-icon", state.checked) end; feedback=function(state) if (state.checked) then return (string.format(_INFM('FrmtActEnable'), _INFM('ShowIcon'))) else return (string.format(_INFM('FrmtActDisable'), _INFM('ShowIcon'))) end end; check=true; default={checked=true}; disabled={checked=false}; dependencies={enabled={checked=true}}; difficulty=1; }; { id="show-stack"; type=K_TEXT; text=function() return _INFM('GuiInfoStack') end; helptext=function() return _INFM('HelpStack') end; callback=function(state) genVarSet("show-stack", state.checked) end; feedback=function(state) if (state.checked) then return (string.format(_INFM('FrmtActEnable'), _INFM('ShowStack'))) else return (string.format(_INFM('FrmtActDisable'), _INFM('ShowStack'))) end end; check=true; default={checked=true}; disabled={checked=false}; dependencies={enabled={checked=true}}; difficulty=1; }; { id="show-usage"; type=K_TEXT; text=function() return _INFM('GuiInfoUsage') end; helptext=function() return _INFM('HelpUsage') end; callback=function(state) genVarSet("show-usage", state.checked) end; feedback=function(state) if (state.checked) then return (string.format(_INFM('FrmtActEnable'), _INFM('ShowUsage'))) else return (string.format(_INFM('FrmtActDisable'), _INFM('ShowUsage'))) end end; check=true; default={checked=true}; disabled={checked=false}; dependencies={enabled={checked=true}}; difficulty=1; }; { id="show-quest"; type=K_TEXT; text=function() return _INFM('GuiInfoQuest') end; helptext=function() return _INFM('HelpQuest') end; callback=function(state) genVarSet("show-quest", state.checked) end; feedback=function(state) if (state.checked) then return (string.format(_INFM('FrmtActEnable'), _INFM('ShowQuest'))) else return (string.format(_INFM('FrmtActDisable'), _INFM('ShowQuest'))) end end; check=true; default={checked=true}; disabled={checked=false}; dependencies={enabled={checked=true}}; difficulty=1; }; { id="show-merchant"; type=K_TEXT; text=function() return _INFM('GuiInfoMerchant') end; helptext=function() return _INFM('HelpMerchant') end; callback=function(state) genVarSet("show-merchant", state.checked) end; feedback=function(state) if (state.checked) then return (string.format(_INFM('FrmtActEnable'), _INFM('ShowMerchant'))) else return (string.format(_INFM('FrmtActDisable'), _INFM('ShowMerchant'))) end end; check=true; default={checked=true}; disabled={checked=false}; dependencies={enabled={checked=true}}; difficulty=1; }; { id="InformantVendorHeader"; type=K_HEADER; text=function() return _INFM('GuiVendorHeader') end; helptext=function() return _INFM('GuiVendorHelp') end; difficulty=1; }; { id="show-vendor"; type=K_TEXT; text=function() return _INFM('GuiVendor') end; helptext=function() return _INFM('HelpVendor') end; callback=function(state) genVarSet("show-vendor", state.checked) end; feedback=function(state) if (state.checked) then return (string.format(_INFM('FrmtActEnable'), _INFM('ShowVendor'))) else return (string.format(_INFM('FrmtActDisable'), _INFM('ShowVendor'))) end end; check=true; default={checked=true}; disabled={checked=false}; dependencies={enabled={checked=true}}; difficulty=1; }; { id="show-vendor-buy"; type=K_TEXT; text=function() return _INFM('GuiVendorBuy') end; helptext=function() return _INFM('HelpVendorBuy') end; callback=function(state) genVarSet("show-vendor-buy", state.checked) end; feedback=function(state) if (state.checked) then return (string.format(_INFM('FrmtActEnable'), _INFM('ShowVendorBuy'))) else return (string.format(_INFM('FrmtActDisable'), _INFM('ShowVendorBuy'))) end end; check=true; default={checked=true}; disabled={checked=false}; dependencies={["show-vendor"]={checked=true}; enabled={checked=true}}; difficulty=2; }; { id="show-vendor-sell"; type=K_TEXT; text=function() return _INFM('GuiVendorSell') end; helptext=function() return _INFM('HelpVendorSell') end; callback=function(state) genVarSet("show-vendor-sell", state.checked) end; feedback=function(state) if (state.checked) then return (string.format(_INFM('FrmtActEnable'), _INFM('ShowVendorSell'))) else return (string.format(_INFM('FrmtActDisable'), _INFM('ShowVendorSell'))) end end; check=true; default={checked=true}; disabled={checked=false}; dependencies={["show-vendor"]={checked=true}; enabled={checked=true}}; difficulty=2; }; { id="InformantEmbedHeader"; type=K_HEADER; text=function() return _INFM('GuiEmbedHeader') end; helptext=function() return _INFM('HelpEmbed') end; difficulty=1; }; { id="embed"; type=K_TEXT; text=function() return _INFM('GuiEmbed') end; helptext=function() return _INFM('HelpEmbed') end; callback=function(state) genVarSet("embed", state.checked) end; feedback=function(state) if (state.checked) then return (string.format(_INFM('FrmtActEnable'), _INFM('CmdEmbed'))) else return (string.format(_INFM('FrmtActDisable'), _INFM('CmdEmbed'))) end end; check=true; default={checked=false}; disabled={checked=false}; dependencies={enabled={checked=true}}; difficulty=1; }; { id="InformantOtherHeader"; type=K_HEADER; text=function() return _INFM('GuiOtherHeader') end; helptext=function() return _INFM('GuiOtherHelp') end; difficulty=1; }; { id="DefaultAll"; type=K_BUTTON; setup={ buttonText = function() return _INFM('GuiDefaultAllButton') end; }; text=function() return _INFM('GuiDefaultAll') end; helptext=function() return _INFM('GuiDefaultAllHelp') end; callback=function() restoreDefault(_INFM('CmdClearAll')) end; feedback=function() return _INFM('FrmtActDefaultall'); end; dependencies={enabled={checked=true}}; difficulty=1; }; { id="DefaultOption"; type=K_EDITBOX; setup = { callOn = {"tab", "escape", "enter"}; }; text=function() return _INFM('GuiDefaultOption') end; helptext=function() return _INFM('HelpDefault') end; callback = function(state) restoreDefault(state.value) end; feedback = function (state) if (state.value == _INFM('CmdClearAll')) then return _INFM('FrmtActDefaultall') else return string.format(_INFM('FrmtActDefault'), state.value) end end; default = { value = "" }; disabled = { value = "" }; dependencies={enabled={checked=true}}; difficulty=4; }; }; }; Khaos.registerOptionSet("tooltip",optionSet) Informant_Khaos_Registered = true Khaos.refresh(); return true end function isValidLocale(param) return (InformantLocalizations and InformantLocalizations[param]) end function setLocale(param, chatprint) param = delocalizeFilterVal(param); local validLocale = nil; if (param == 'default') or (param == 'off') then Babylonian.SetOrder(''); validLocale = true; elseif (isValidLocale(param)) then Babylonian.SetOrder(param); validLocale = true; else validLocale = false; end BINDING_HEADER_INFORMANT_HEADER = "Informant"; BINDING_NAME_INFORMANT_POPUPDOWN = _INFM('MesgToggleWindow'); if (chatprint) then if (validLocale) then chatPrint(string.format(_INFM('FrmtActSet'), _INFM('CmdLocale'), param)); setKhaosSetKeyValue('locale', param); else chatPrint(string.format(_INFM("FrmtUnknownLocale"), param)); local locales = " "; for locale, data in pairs(InformantLocalizations) do locales = locales .. " '" .. locale .. "' "; end chatPrint(locales); end end commandMap = nil; commandMapRev = nil; end function chatPrint(msg) if (DEFAULT_CHAT_FRAME) then DEFAULT_CHAT_FRAME:AddMessage(msg, 0.25, 0.55, 1.0); end end -------------------------------------- -- Localization functions -- -------------------------------------- function delocalizeFilterVal(value) if (value == _INFM('CmdOn')) then return 'on'; elseif (value == _INFM('CmdOff')) then return 'off'; elseif (value == _INFM('CmdDefault')) then return 'default'; elseif (value == _INFM('CmdToggle')) then return 'toggle'; else return value; end end function localizeFilterVal(value) local result if (value == 'on') then result = _INFM('CmdOn'); elseif (value == 'off') then result = _INFM('CmdOff'); elseif (value == 'default') then result = _INFM('CmdDefault'); elseif (value == 'toggle') then result = _INFM('CmdToggle'); end if (result) then return result; else return value; end end function getLocalizedFilterVal(key) return localizeFilterVal(Informant.GetFilterVal(key)) end -- Turns a localized slash command into the generic English version of the command function delocalizeCommand(cmd) if (not commandMap) then buildCommandMap(); end local result = commandMap[cmd]; if (result) then return result; else return cmd; end end -- Translate a generic English slash command to the localized version, if available function localizeCommand(cmd) if (not commandMapRev) then buildCommandMap(); end local result = commandMapRev[cmd]; if (result) then return result; else return cmd; end end -- Globally accessible functions Informant.SetLocale = setLocale;