vanilla-wow-addons – Rev 1
?pathlinks?
--[[
Auctioneer Addon for World of Warcraft(tm).
Version: 3.9.0.1000 (Kangaroo)
Revision: $Id: AucAskPrice.lua 994 2006-09-07 01:30:33Z mentalpower $
Auctioneer AskPrice created by Mikezter and merged into Auctioneer by MentalPower.
Functions responsible for AskPrice's operation..
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 GPL.txt); if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
]]
--Local function prototypes
local init, askpriceFrame, commandHandler, chatPrintHelp, onOff, setTrigger, genVarSet, setCustomSmartWords, setKhaosSetKeyValue, eventHandler, sendWhisper, onEventHook
local whisperList = {}
function init()
askPriceFrame = CreateFrame("Frame")
askPriceFrame:RegisterEvent("CHAT_MSG_RAID_LEADER")
askPriceFrame:RegisterEvent("CHAT_MSG_WHISPER")
askPriceFrame:RegisterEvent("CHAT_MSG_OFFICER")
askPriceFrame:RegisterEvent("CHAT_MSG_PARTY")
askPriceFrame:RegisterEvent("CHAT_MSG_GUILD")
askPriceFrame:RegisterEvent("CHAT_MSG_RAID")
askPriceFrame:SetScript("OnEvent", function () Auctioneer.AskPrice.EventHandler(event, arg1, arg2) end)
Auctioneer.AskPrice.Language = GetDefaultLanguage("player");
Stubby.RegisterFunctionHook("ChatFrame_OnEvent", -200, Auctioneer.AskPrice.OnEventHook);
end
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 = Auctioneer.Util.DelocalizeCommand(cmd);
--Now for the real Command handling
--/auctioneer askprice help
if ((cmd == "") or (cmd == "help")) then
chatPrintHelp();
--/auctioneer askprice (on|off|toggle)
elseif (cmd == 'on' or cmd == 'off' or cmd == 'toggle') then
onOff(cmd, chatprint);
--/auctioneer askprice trigger (char)
elseif (cmd == 'trigger') then
setTrigger(param, chatprint)
--/auctioneer askprice (party|guild|smart|ad|whispers) (on|off|toggle)
elseif (
cmd == 'vendor' or cmd == 'party' or cmd == 'guild' or
cmd == 'smart' or cmd == 'ad' or cmd == 'whispers'
) then
genVarSet(cmd, param, chatprint);
--/auctioneer askprice word # (customSmartWord)
elseif (cmd == 'word') then
setCustomSmartWords(param, nil, nil, chatprint);
--Command not recognized
else
if (chatprint) then
Auctioneer.Util.ChatPrint(string.format(_AUCT('FrmtActUnknown'), command));
end
end
end
function chatPrintHelp()
local onOffToggle = " (".._AUCT('CmdOn').."|".._AUCT('CmdOff').."|".._AUCT('CmdToggle')..")";
local lineFormat = " |cffffffff/auctioneer askprice %s"..onOffToggle.."|r |cff2040ff[%s]|r\n %s\n\n";
Auctioneer.Util.ChatPrint(" |cffffffff/auctioneer askprice"..onOffToggle.."|r |cff2040ff["..Auctioneer.Util.GetLocalizedFilterVal('askprice').."]|r\n " .. _AUCT('HelpAskPrice') .. "\n\n");
Auctioneer.Util.ChatPrint(string.format(lineFormat, _AUCT('CmdAskPriceWhispers'), Auctioneer.Util.GetLocalizedFilterVal('askprice-whispers'), _AUCT('HelpAskPriceWhispers')));
Auctioneer.Util.ChatPrint(string.format(lineFormat, _AUCT('CmdAskPriceVendor'), Auctioneer.Util.GetLocalizedFilterVal('askprice-vendor'), _AUCT('HelpAskPriceVendor')));
Auctioneer.Util.ChatPrint(string.format(lineFormat, _AUCT('CmdAskPriceParty'), Auctioneer.Util.GetLocalizedFilterVal('askprice-party'), _AUCT('HelpAskPriceParty')));
Auctioneer.Util.ChatPrint(string.format(lineFormat, _AUCT('CmdAskPriceGuild'), Auctioneer.Util.GetLocalizedFilterVal('askprice-guild'), _AUCT('HelpAskPriceGuild')));
Auctioneer.Util.ChatPrint(string.format(lineFormat, _AUCT('CmdAskPriceSmart'), Auctioneer.Util.GetLocalizedFilterVal('askprice-smart'), _AUCT('HelpAskPriceSmart')));
Auctioneer.Util.ChatPrint(string.format(lineFormat, _AUCT('CmdAskPriceAd'), Auctioneer.Util.GetLocalizedFilterVal('askprice-ad'), _AUCT('HelpAskPriceAd')));
lineFormat = " |cffffffff/auctioneer askprice %s|r |cff2040ff[%s]|r\n %s\n\n";
Auctioneer.Util.ChatPrint(string.format(lineFormat, _AUCT('CmdAskPriceTrigger'), Auctioneer.Command.GetFilterVal('askprice-trigger'), _AUCT('HelpAskPriceTrigger')));
lineFormat = " |cffffffff/auctioneer askprice %s %d|r |cff2040ff[%s]|r\n %s\n\n";
Auctioneer.Util.ChatPrint(string.format(lineFormat, _AUCT('CmdAskPriceWord'), 1, Auctioneer.Command.GetFilterVal('askprice-word1'), _AUCT('HelpAskPriceWord')));
Auctioneer.Util.ChatPrint(string.format(lineFormat, _AUCT('CmdAskPriceWord'), 2, Auctioneer.Command.GetFilterVal('askprice-word2'), _AUCT('HelpAskPriceWord')));
end
--[[
The onOff(state, chatprint) function handles AskPrice's state (whether it is currently on or off)
If "on" or "off" is specified in the first argument then AskPrice's state is changed to that value,
If "toggle" is specified then it will toggle AskPrice's state (if currently on then it will be turned off and vice-versa)
If a boolean (or nil) value is passed as the first argument the conversion is as follows:
"true" is the same as "on"
"false" is the same as "off"
"nil" is the same as "toggle"
If chatprint is "true" then the state will also be printed to the user.
]]
function onOff(state, chatprint)
if (type(state) == "string") then
state = Auctioneer.Util.DelocalizeFilterVal(state);
elseif (state == true) then
state = 'on'
elseif (state == false) then
state = 'off'
elseif (state == nil) then
state = 'toggle'
end
if (state == 'on' or state == 'off') then
Auctioneer.Command.SetFilter('askprice', state);
elseif (state == 'toggle') then
Auctioneer.Command.SetFilter('askprice', not Auctioneer.Command.GetFilter('askprice'));
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) then
state = Auctioneer.Command.GetFilter('askprice')
setKhaosSetKeyValue("askprice", state)
if (state) then
Auctioneer.Util.ChatPrint(_AUCT('StatAskPriceOn'));
else
Auctioneer.Util.ChatPrint(_AUCT('StatAskPriceOff'));
end
end
end
function setTrigger(param, chatprint)
if (not (type(param) == 'string')) then
return
end
param = string.sub(param, 1, 1)
Auctioneer.Command.SetFilter('askprice-trigger', param)
if (chatprint) then
Auctioneer.Util.ChatPrint(string.format(_AUCT('FrmtActSet'), "askprice ".._AUCT('CmdAskPriceTrigger'), param));
setKhaosSetKeyValue('askprice-trigger', param)
end
end
function genVarSet(variable, param, chatprint)
if (type(param) == "string") then
param = Auctioneer.Util.DelocalizeFilterVal(param);
end
local var = "askprice-"..variable
if (param == "on" or param == "off" or type(param) == "boolean") then
Auctioneer.Command.SetFilter(var, param);
elseif (param == "toggle" or param == nil or param == "") then
param = Auctioneer.Command.SetFilter(var, not Auctioneer.Command.GetFilter(var));
end
if (chatprint) then
if (Auctioneer.Command.GetFilter(var)) then
Auctioneer.Util.ChatPrint(string.format(_AUCT('FrmtAskPriceEnable'), Auctioneer.Util.LocalizeCommand(variable)));
setKhaosSetKeyValue(var, true)
else
Auctioneer.Util.ChatPrint(string.format(_AUCT('FrmtAskPriceDisable'), Auctioneer.Util.LocalizeCommand(variable)));
setKhaosSetKeyValue(var, false)
end
end
end
--Function for users to add/modify smartWords (written by Kandoko, integrated into AskPrice by MentalPower)
function setCustomSmartWords(param, number, word, chatprint)
--Only parse the param if the pre-parsed components are not present.
if (not (number and word)) then
--Divide the large command into smaller logical sections (Shameless copy from the original function)
_, _, number, word = string.find(param, "^([^ ]+) (.+)$");
if (not number) then number = param; end
if (not number) then number = ""; end
if (not word) then word = ""; end
end
number = tonumber(number)
if (not (((type(param) == 'string') or (type(word) == 'string'))and number)) then
Auctioneer.Util.ChatPrint(string.format(_AUCT('FrmtUnknownArg'), param or word, "askprice ".._AUCT('CmdAskPriceWord')));
return
end
word = string.lower(word)
--Save choosen words.
if (number == 1) then
Auctioneer.Command.SetFilter('askprice-word1', word)
elseif (number == 2) then
Auctioneer.Command.SetFilter('askprice-word2', word)
else
Auctioneer.Util.ChatPrint(string.format(_AUCT('FrmtUnknownArg'), param, "askprice ".._AUCT('CmdAskPriceWord')));
return;
end
if (chatprint) then
Auctioneer.Util.ChatPrint(string.format(_AUCT('FrmtActSet'), "askprice ".._AUCT('CmdAskPriceWord').." "..number, Auctioneer.Command.GetFilterVal('askprice-word'..number)));
setKhaosSetKeyValue('askprice-word'..number, word)
end
end
function setKhaosSetKeyValue(key, value)
if (Auctioneer_Khaos_Registered) then
local kKey = Khaos.getSetKey("Auctioneer", 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("Auctioneer", key, "checked", value)
elseif (kKey.value ~= nil) then
Khaos.setSetKeyParameter("Auctioneer", key, "value", value)
else
EnhTooltip.DebugPrint("setKhaosSetKeyValue(): don't know how to update key ", key)
end
end
end
function eventHandler(event, text, player)
--Nothing to do if askprice is disabled
if (not Auctioneer.Command.GetFilter('askprice')) then
return;
end
--Make sure that we recieve the proper events and that our settings allow a response
if (not ((event == "CHAT_MSG_WHISPER")
or (((event == "CHAT_MSG_GUILD") or (event == "CHAT_MSG_OFFICER")) and Auctioneer.Command.GetFilter('askprice-guild'))
or (((event == "CHAT_MSG_PARTY") or (event == "CHAT_MSG_RAID") or (event == "CHAT_MSG_RAID_LEADER")) and Auctioneer.Command.GetFilter('askprice-party')))) then
return;
end
local aCount, historicalMedian, snapshotMedian, vendorSell, eachstring, askedCount, items, usedStack, multipleItems;
-- Check for marker (trigger char or "smart" words)
if (not (string.sub(text, 1, 1) == Auctioneer.Command.GetFilterVal('askprice-trigger'))) then
--If the trigger char was not found scan the text for SmartWords (if the feature has been enabled)
if (Auctioneer.Command.GetFilter('askprice-smart')) then
if (not (string.find(string.lower(text), _AUCT('CmdAskPricSmartWord1')) and string.find(string.lower(text), _AUCT('CmdAskPriceSmartWord2')))) then
--Check if the custom SmartWords are present in the chat message
local customSmartWord1, customSmartWord2 = Auctioneer.Command.GetFilterVal('askprice-word1'), Auctioneer.Command.GetFilterVal('askprice-word1');
if (not ((string.find(string.lower(text), customSmartWord1)) and string.find(string.lower(text), customSmartWord2))) then
return;
end
end
else
return;
end
end
-- Check for itemlink after trigger
if (not (string.find(text, "|Hitem:"))) then
return;
end
--Parse the text and separate out the different links
items = getItems(text)
for key, link in ipairs(items) do
--
aCount, historicalMedian, snapshotMedian, vendorSell = getData(link[1]);
local askedCount;
--If there are multiple items send a separator line (since we can't send \n's as those would cause DC's)
if (multipleItems) then
Auctioneer.AskPrice.SendWhisper(" ", player);
end
--If the stackSize is grater than one, add the unit price to the message
if (link[2] > 1) then
eachstring = string.format(_AUCT('FrmtAskPriceEach'), EnhTooltip.GetTextGSC(historicalMedian, nil, true));
else
eachstring = "";
end
if (aCount > 0) then
Auctioneer.AskPrice.SendWhisper(link[1]..": "..string.format(_AUCT('FrmtInfoSeen'), aCount), player);
Auctioneer.AskPrice.SendWhisper(string.format(_AUCT('FrmtAskPriceBuyoutMedianHistorical'), " ", EnhTooltip.GetTextGSC(historicalMedian*link[2], nil, true), eachstring), player);
Auctioneer.AskPrice.SendWhisper(string.format(_AUCT('FrmtAskPriceBuyoutMedianSnapshot'), " ", EnhTooltip.GetTextGSC(snapshotMedian*link[2], nil, true), eachstring), player);
else
Auctioneer.AskPrice.SendWhisper(link[1]..": "..string.format(_AUCT('FrmtInfoNever'), Auctioneer.Util.GetAuctionKey()), player);
end
--Send out vendor info if we have it
if (Auctioneer.Command.GetFilter('askprice-vendor') and (vendorSell > 0)) then
--Again if the stackSize is grater than one, add the unit price to the message
if (link[2] > 1) then
eachstring = string.format(_AUCT('FrmtAskPriceEach'), EnhTooltip.GetTextGSC(vendorSell, nil, true));
else
eachstring = "";
end
Auctioneer.AskPrice.SendWhisper(string.format(_AUCT('FrmtAskPriceVendorPrice'), " ",EnhTooltip.GetTextGSC(vendorSell * link[2], nil, true), eachstring), player);
end
if (link[2] > 1) then
usedStack = link[2]
end
multipleItems = true;
end
--Once we're done sending out the itemInfo, check if the person used the stack size feature, if not send them the ad message.
if ((not usedStack) and (Auctioneer.Command.GetFilter('askprice-ad'))) then
Auctioneer.AskPrice.SendWhisper(string.format(_AUCT('AskPriceAd'), Auctioneer.Command.GetFilterVal('askprice-trigger')), player)
end
end
function getData(itemLink)
local itemID, randomProp, enchant, uniqID, lame = EnhTooltip.BreakLink(itemLink);
local auctKey = Auctioneer.Util.GetAuctionKey();
local itemKey = itemID..":"..randomProp..":"..enchant;
local auctionPriceItem = Auctioneer.Core.GetAuctionPriceItem(itemKey, auctKey);
local aCount,minCount,minPrice,bidCount,bidPrice,buyCount,buyPrice = Auctioneer.Core.GetAuctionPrices(auctionPriceItem.data);
local historicalMedian, historicalMedCount = Auctioneer.Statistic.GetItemHistoricalMedianBuyout(itemKey, auctKey);
local snapshotMedian, snapshotMedCount = Auctioneer.Statistic.GetItemSnapshotMedianBuyout(itemKey, auctKey);
local median, medCount = Auctioneer.Statistic.GetUsableMedian(itemKey, auctKey);
local vendorSell = Auctioneer.API.GetVendorSellPrice(itemID)
if (aCount > 0) then
-- calculate auction values
local avgMin = math.floor(minPrice / minCount);
local bidPct = math.floor(bidCount / minCount * 100);
local avgBid = 0;
if (bidCount > 0) then
avgBid = math.floor(bidPrice / bidCount);
end
local buyPct = math.floor(buyCount / minCount * 100);
local avgBuy = 0;
if (buyCount > 0) then
avgBuy = math.floor(buyPrice / buyCount);
end
end
return aCount or 0, historicalMedian or 0, snapshotMedian or 0, vendorSell or 0;
end
--Many thanks to the guys at irc://chat.freenode.net/wowi-lounge for their help in creating this function
function getItems(str)
if (not str) then return nil end
local itemList = {};
for number, color, item, name in string.gfind(str, "(%d*)|c(%x+)|Hitem:(%d+:%d+:%d+:%d+)|h%[(.-)%]|h|r") do
table.insert(itemList, {"|c"..color.."|Hitem:"..item.."|h["..name.."]|h|r", tonumber(number) or 1})
end
return itemList;
end
function sendWhisper(text, player)
whisperList[text] = true
SendChatMessage(text, "WHISPER", Auctioneer.AskPrice.Language, player)
end
function onEventHook()
if (Auctioneer.Command.GetFilter('askprice-whisper')) then
if ((event == "CHAT_MSG_WHISPER_INFORM") and (whisperList[arg1])) then
return "killorig"
end
end
end
Auctioneer.AskPrice = {
Init = init,
CommandHandler = commandHandler,
ChatPrintHelp = chatPrintHelp,
OnOff = onOff,
SetTrigger = setTrigger,
GenVarSet = genVarSet,
SetCustomSmartWords = setCustomSmartWords,
EventHandler = eventHandler,
SendWhisper = sendWhisper,
OnEventHook = onEventHook,
}