vanilla-wow-addons – Rev 1
?pathlinks?
--[[--------------------------------------------------------------------------------
ItemSyncCore Core Framework
Author: Derkyle
Website: http://www.manaflux.com
-----------------------------------------------------------------------------------]]
BINDING_HEADER_ITEMSYNC_HEADER = "ItemSync";
--Hook chat messages
local ISync_ChatMessageTypes = {
"CHAT_MSG_SYSTEM",
"CHAT_MSG_SAY",
"CHAT_MSG_TEXT_EMOTE",
"CHAT_MSG_YELL",
"CHAT_MSG_WHISPER",
"CHAT_MSG_PARTY",
"CHAT_MSG_GUILD",
"CHAT_MSG_OFFICER",
"CHAT_MSG_CHANNEL",
"CHAT_MSG_RAID",
"CHAT_MSG",
"CHAT_MSG_LOOT",
"CHAT_MSG_EMOTE",
"CHAT_MSG_WHISPER_INFORM",
"CHAT_MSG_MONSTER_EMOTE",
"CHAT_MSG_MONSTER_SAY",
"CHAT_MSG_MONSTER_WHISPER",
"CHAT_MSG_MONSTER_YELL",
};
local ISync_lOriginal_MerchantFrame_Update;
local ISync_lOriginal_ChatEdit_OnTextChanged;
---------------------------------------------------
-- ISync:OnLoad()
---------------------------------------------------
function ISync:OnLoad()
this:RegisterEvent("VARIABLES_LOADED");
this:RegisterEvent("PLAYER_ENTERING_WORLD");
this:RegisterEvent("PLAYER_LEAVING_WORLD");
this:RegisterEvent("PLAYER_TARGET_CHANGED");
this:RegisterEvent("BANKFRAME_OPENED");
this:RegisterEvent("AUCTION_ITEM_LIST_UPDATE");
this:RegisterEvent("MERCHANT_SHOW");
this:RegisterEvent("BAG_UPDATE");
this:RegisterEvent("UPDATE_MOUSEOVER_UNIT");
this:RegisterEvent("ADDON_LOADED");
--register chat types
for index, value in ISync_ChatMessageTypes do
this:RegisterEvent(value);
end
--Hook ChatEdit_OnTextChanged for type links
ISync_lOriginal_ChatEdit_OnTextChanged = ChatEdit_OnTextChanged;
ChatEdit_OnTextChanged = ISyncCore_ChatEdit_OnTextChanged;
--Hook for the Merchant Prices
ISync_lOriginal_MerchantFrame_Update = MerchantFrame_Update;
MerchantFrame_Update = ISyncCore_MerchantFrame_Update;
--load primary
ISync:PrimaryLoad();
end
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
---------------------------------------------------
-- ISync:GrabDataProfile()
---------------------------------------------------
function ISync:GrabDataProfile()
--main attributes
local RlmCount = ISync:SetVar({"REALMS","REALMCOUNT"}, 0); --check if not on
ISync:SetVar({"OPT","SERVER_MERGE"}, 1); --check if not on
--first check realm stuff
if(not GetCVar("realmName")) then return nil; end
--get data
local sRlm = string.gsub(GetCVar("realmName"), "^%s*(.-)%s*$", "%1");
if(not sRlm) then return nil; end
sRlm = string.upper(sRlm); --convert to uppercase
if(not ISync:SetVar({"REALMS",sRlm}, RlmCount, "CHK")) then
ISync:SetVar({"REALMS",sRlm}, RlmCount); --save
ISync:SetVar({"REALMS","REALMCOUNT"}, RlmCount + 1, "TRUE"); --increment, TRUE = force
end
--create database if it doesn't exist
if(not ISyncDB[RlmCount]) then ISyncDB[RlmCount] = { }; end
--check if merged, if so then use the zero first realm
if(ISync:SetVar({"OPT","SERVER_MERGE"}, 1) == 1) then return 0; else return tonumber(ISync:SetVar({"REALMS",sRlm}, RlmCount)); end
end
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
---------------------------------------------------
-- ISync:SetVar()
---------------------------------------------------
function ISync:SetVar(sArgs, nBool, sOpt)
if(not sArgs or not nBool) then return nil; end
if(type(sArgs) ~= "table") then return nil; end
if(getn(sArgs) <= 0) then return nil; end
if(getn(sArgs) > 2) then return nil; end
if(sOpt and sOpt == "CHK") then
if(ISyncOpt and ISyncOpt[sArgs[1]] and ISyncOpt[sArgs[1]][sArgs[2]]) then return 1; else return nil; end
end
if(sOpt and sOpt == "COMPARE") then
if(ISyncOpt and ISyncOpt[sArgs[1]] and ISyncOpt[sArgs[1]][sArgs[2]]) then
if(tostring(ISyncOpt[sArgs[1]][sArgs[2]]) == tostring(nBool)) then
return 1;
else
return nil;
end
else
return nil;
end
end
if(not ISyncOpt) then ISyncOpt = {}; end
if(not ISyncOpt[sArgs[1]]) then ISyncOpt[sArgs[1]] = {}; end
if(not ISyncOpt[sArgs[1]][sArgs[2]]) then ISyncOpt[sArgs[1]][sArgs[2]] = nBool; end
--force it
if(sOpt) then
sOpt = tostring(sOpt); --convert to string
if( sOpt == "TRUE" or string.upper(sOpt) == "TRUE") then
--force the change
ISyncOpt[sArgs[1]][sArgs[2]] = nBool;
return ISyncOpt[sArgs[1]][sArgs[2]];
end
end
return ISyncOpt[sArgs[1]][sArgs[2]];
end
---------------------------------------------------
-- ISync:SetOpt()
---------------------------------------------------
function ISync:SetOpt(sFrame, sType, sArgs, nBool)
if(not sFrame or not sType or not sArgs or not nBool) then return nil; end
if(type(sArgs) ~= "table") then return nil; end
if(getn(sArgs) <= 0) then return nil; end
if(getn(sArgs) > 2) then return nil; end
if(not tonumber(nBool)) then return nil; end
nBool = tonumber(nBool) or 0;
local iChk;
--check if it's created or not, if so then return value
if(not ISyncOpt or not ISyncOpt[sArgs[1]] or not ISyncOpt[sArgs[1]][sArgs[2]]) then
iChk = ISync:SetVar(sArgs, nBool);
else
iChk = ISync:SetVar(sArgs, nBool, "TRUE");
end
if(not iChk) then iChk = 0; else iChk = tonumber(iChk); end
--check types
if(sType == "checkbutton") then
sFrame:SetChecked(iChk);
elseif(sType == "slider") then
sFrame:SetValue(iChk);
elseif(sType == "frame") then
if(iChk == 0) then sFrame:Hide(); end
if(iChk == 1) then sFrame:Show(); end
end
return iChk;
end
---------------------------------------------------
-- ISync:Chk()
---------------------------------------------------
function ISync:Chk(sName, sGet, sOperator, sNum)
if(not ISyncDB) then return nil; end
if(not sName or not sGet) then return nil; end
if(not ISYNC_REALM_NUM) then ISync:GrabDataProfile(); end
if(not ISYNC_REALM_NUM) then return nil; end
if(not ISyncDB[ISYNC_REALM_NUM]) then return nil; end
if(not ISyncDB[ISYNC_REALM_NUM][sName]) then return nil; end
--if only sGet
if(sGet and not sOperator) then
return ISync:FetchDB(sName, sGet) or nil;
--if get and operator then preform proper action
elseif(sGet and sOperator) then
local getNum = ISync:FetchDB(sName, sGet) or nil;
if(not tonumber(sNum)) then return nil; end
if(not getNum) then return nil; end
if(not tonumber(getNum)) then return nil; end
getNum = tonumber(getNum); --convert
if(sOperator == "==") then
if(getNum == sNum) then return 1; else return nil; end
elseif(sOperator == "~=") then
if(getNum ~= sNum) then return 1; else return nil; end
elseif(sOperator == ">") then
if(getNum > sNum) then return 1; else return nil; end
elseif(sOperator == "<") then
if(getNum < sNum) then return 1; else return nil; end
elseif(sOperator == ">=") then
if(getNum >= sNum) then return 1; else return nil; end
elseif(sOperator == "<=") then
if(getNum <= sNum) then return 1; else return nil; end
else
return nil;
end
else
--we cannot have empty operators or empty values to compare.
return nil;
end
return nil;
end
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
---------------------------------------------------
-- ISync:Print()
---------------------------------------------------
function ISync:Print(sMsg)
if(DEFAULT_CHAT_FRAME) then DEFAULT_CHAT_FRAME:AddMessage(sMsg); end
end
---------------------------------------------------
-- ISync:NameFromLink
---------------------------------------------------
function ISync:NameFromLink(sLink)
local item, name;
--check for link first
if(not sLink) then return nil; end
for item, name in string.gfind(sLink, "|Hitem:(%d+:%d+:%d+:%d+)|h%[(.-)%]|h") do
if(name) then return name; end
end--end for
--try a different way
for name in string.gfind(link, "|h%[(.-)%]|h") do
if(name) then return name; end
end
return nil;
end
---------------------------------------------------
-- ISync:ReturnHexColor()
---------------------------------------------------
function ISync:ReturnHexColor(sNumQuality)
sNumQuality = tonumber(sNumQuality);
local QL_Colors = { "ff9d9d9d", "ffffffff", "ff1eff00", "ff0070dd", "ffa335ee", "ffff8000", "ffffcc9d"};
local color = QL_Colors[sNumQuality + 1];
return color;
end
---------------------------------------------------
-- ISync:ReturnHexColor()
---------------------------------------------------
function ISync:HexReturnQuality(sHexColor)
local QL_Colors = {};
QL_Colors["ff9d9d9d"] = 0;
QL_Colors["ffffffff"] = 1;
QL_Colors["ff1eff00"] = 2;
QL_Colors["ff0070dd"] = 3;
QL_Colors["ffa335ee"] = 4;
QL_Colors["ffff8000"] = 5;
QL_Colors["ffffcc9d"] = 6;
local color = QL_Colors[sHexColor];
if(not color) then color = 0; end
return color;
end
---------------------------------------------------
-- ISync:GetItemID
---------------------------------------------------
function ISync:GetItemID(sLink)
--check for link first
if(not sLink) then return nil; end
local item, name;
if(string.find(sLink, "Hitem:")) then
for item in string.gfind(sLink, "|Hitem:(%d+:%d+:%d+:%d+)|") do
local item = string.gsub(item, "^(%d+):(%d+):(%d+):(%d+)$", "%1:0:%3:0");
if(item) then
return item;
end
end--end for
end
if(string.find(sLink, "item:")) then
--try another way "item:0:0:0:0"
item = string.gsub(sLink, "item:(%d+):(%d+):(%d+):(%d+)$", "%1:0:%3:0")
if(item) then return item; end
end
--try another way "0:0:0:0"
item = string.gsub(sLink, "(%d+):(%d+):(%d+):(%d+)$", "%1:0:%3:0")
if(item) then return item; end
--everything has failed so just ignore
return nil;
end
---------------------------------------------------
-- ISync:GetCoreID
---------------------------------------------------
function ISync:GetCoreID(sLink)
--check for link first
if(not sLink) then return nil; end
local item, name;
if(string.find(sLink, "Hitem:")) then
for item in string.gfind(sLink, "|Hitem:(%d+:%d+:%d+:%d+)|") do
local item = string.gsub(item, "^(%d+):(%d+):(%d+):(%d+)$", "%1");
if(item) then
return tonumber(item);
end
end--end for
end
if(string.find(sLink, "item:")) then
--try another way "item:0:0:0:0"
item = string.gsub(sLink, "item:(%d+):(%d+):(%d+):(%d+)$", "%1")
if(item) then return tonumber(item); end
end
--try another way "0:0:0:0"
item = string.gsub(sLink, "(%d+):(%d+):(%d+):(%d+)$", "%1")
if(item) then return tonumber(item); end
--everything has failed so just ignore
return nil;
end
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
---------------------------------------------------
-- ISyncCore_MerchantFrame_Update
---------------------------------------------------
function ISyncCore_MerchantFrame_Update()
ISync_lOriginal_MerchantFrame_Update(); --do original
ISync:VendorScan(); --do a vendor scan
end
---------------------------------------------------
-- ISync:OnEvent()
---------------------------------------------------
function ISync:OnEvent()
if( event == "PLAYER_LEAVING_WORLD" ) then
ISync_CoreFrame:UnregisterEvent("UNIT_INVENTORY_CHANGED");
ISync_CoreFrame:UnregisterEvent("BAG_UPDATE");
end
if( event == "PLAYER_ENTERING_WORLD" ) then
ISync_CoreFrame:RegisterEvent("UNIT_INVENTORY_CHANGED");
ISync_CoreFrame:RegisterEvent("BAG_UPDATE");
end
--pass to main framework
ISync:OnPrimaryEvent(event,arg1,arg2,arg3,arg4,arg5);
end
---------------------------------------------------
-- ISync:OnUpdate()
---------------------------------------------------
function ISync:OnUpdate(elapsed)
if(ISync and ISync.OnUpdateTriggered) then ISync:OnUpdateTriggered(elapsed); end
end
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
--TYPELINKS FUNCTIONS
--Inspired by Gazmik Fizzwidget
---------------------------------------------------
-- ISyncCore_ChatEdit_OnTextChanged()
---------------------------------------------------
function ISyncCore_ChatEdit_OnTextChanged()
--check for options
if(ISync:SetVar({"OPT","LINKFETCH"}, 1, "COMPARE")) then--show the tooltip icon
local text = this:GetText();
text = ISync:FetchLink_ParseChatMSG(text);
this:SetText(text);
end
return ISync_lOriginal_ChatEdit_OnTextChanged();
end
---------------------------------------------------
-- ISync:FetchLink_ParseChatMSG
---------------------------------------------------
function ISync:FetchLink_ParseChatMSG(text)
return string.gsub(text, "([|]?[h]?)%[(.-)%]([|]?[h]?)", ISync_FetchLink_SetTextLink);
end
---------------------------------------------------
-- ISync_FetchLink_SetTextLink
---------------------------------------------------
function ISync_FetchLink_SetTextLink(head, text, tail)
if (head ~= "|h" and tail ~= "|h") then
local link = ISync:FetchLink_ReturnLink(text);
if (link) then return link; end
end
return head.."["..text.."]"..tail;
end
---------------------------------------------------
-- ISync:FetchLink_ReturnLink
---------------------------------------------------
function ISync:FetchLink_ReturnLink(text)
if(not ISyncDB_Names) then return nil; end
--check
for index, value in ISyncDB_Names do
if(string.lower(value) == string.lower(text)) then
local name_X, link_X, quality_X, minLevel_X, class_X, subclass_X, maxStack_X, equipType_X, iconTexture_X = GetItemInfo("item:"..index..":0:0:0");
if(name_X and link_X) then
return "|c"..ISync:ReturnHexColor(quality_X).."|H"..link_X.."|h["..name_X.."]|h|r";
end
end--if(string.lower(value) == string.lower(text)) then
end
return nil;
end