--[[-------------------------------------------------------------------------------- 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