commit 2749216aa5e88866156fdf7246a67f69df8dbff5 Author: Robin Date: Wed Jan 13 13:51:23 2021 +0100 Revision 24 diff --git a/common.lua b/common.lua new file mode 100644 index 0000000..8b7bc13 --- /dev/null +++ b/common.lua @@ -0,0 +1,340 @@ +local name, addon = ... + +local embed = addon:LibInit("zzCommon-Base", 37, {'RegisterFunc','HandleFunclist','round','split','classcolor','colorize','Print','buildMoneyString','RegisterEventThrottle','RGB2Hex','Hex2RGB','sortArray','IsTwink','getItemId','itemInfo','startup','IsClassic'}) +if(type(embed) ~= 'function') then return end + +local table = table +local string = string +local math = math +local type = type +local tostring = tostring +local tonumber = tonumber + +local throttles = {} +local schedules = {} +local newtmp = {} + +local ScheduleCheckDelay = .5 +local function checkSchedule() + for k = #schedules,1,-1 do + local v = schedules[k] + if(v['lastcall'] + v['delay'] < GetTime()) then + v['func'](v['event'], v['arg1'], v['arg2']) + tremove(schedules, k) + end + end + if(#schedules > 0) then + C_Timer.After(ScheduleCheckDelay, checkSchedule) + end +end + +C_Timer.After(ScheduleCheckDelay, checkSchedule) + +local function scheduleThrottle(obj, arg1, arg2) + local found,v = false + for k = 1, #schedules do + local v = schedules[k] + if(v['name'] == obj['name']) then + v = obj + v['arg1'] = arg1 + v['arg2'] = arg2 + found = true + break + end + end + if(not found) then + schedules[#schedules + 1] = obj + schedules[#schedules]['arg1'] = arg1 + schedules[#schedules]['arg2'] = arg2 + end + C_Timer.After(ScheduleCheckDelay, checkSchedule) +end + +local function eventThrottle(self, event, ...) + for k = 1, #throttles do + local v = throttles[k] + if(v['event'] == event) then + if(v['lastcall'] + v['delay'] < GetTime()) then + v['lastcall'] = GetTime() + v['func'](event, ...) + else + scheduleThrottle(v, ...) + end + end + end +end + +local lib = {} +function lib:RegisterFunc(event,typ,func) + local f = CreateFrame("Frame") + if(type(event) == "table") then + for i = 1, #event do + f:RegisterEvent(event[i]) + end + elseif(event) then + f:RegisterEvent(event) + end + if(typ and type(func) == 'function') then + f:SetScript(typ, func) + end + return f +end +function lib:HandleFunclist(list, ...) + for _, v in ipairs(self[list]) do + v(...) + end +end +function lib:RGB2Hex(r,g,b) + r = r <= 255 and r >= 0 and r or 0 + g = g <= 255 and g >= 0 and g or 0 + b = b <= 255 and b >= 0 and b or 0 + return string.format("%02x%02x%02x", r, g, b) +end +function lib:Hex2RGB(hex) + local r, g, b = string.sub(hex, 1, 2), string.sub(hex, 3, 4), string.sub(hex, 5, 6) + return tonumber(r, 16), tonumber(g, 16), tonumber(b, 16) +end +function lib:sortArray(tmp,dir) + wipe(newtmp) + local n = 1 + local cnt = 0 + local maximum = 0 + local first + for k,v in pairs(tmp) do + cnt = cnt + 1 + if(v > maximum) then + maximum = v + 1 + end + first = first or k + end + while(cnt > 0) do + local mx, mn = dir and maximum or 0,first + for k,v in pairs(tmp) do + if(dir) then + if(tonumber(v)<=tonumber(mx)) then + mx = v + mn = k + end + else + if(tonumber(v)>=tonumber(mx)) then + mx = v + mn = k + end + end + end + newtmp[n] = mn + tmp[mn] = nil + cnt = 0 + for k,v in pairs(tmp) do + cnt = cnt + 1 + end + n = n + 1 + mn = 0 + mx = dir and mx or 0 + end + return newtmp +end +function lib:split(s, delim) +-- assert (type (delim) == "string" and string.len (delim) > 0, "bad delimiter") + local start = 1 + local t = {} + while true do + local pos = string.find (s, delim, start, true) + if not pos then break end + table.insert (t, string.sub (s, start, pos - 1)) + start = pos + string.len (delim) + end + table.insert (t, string.sub (s, start)) + return t +end +function lib:round(num, idp) + return math.floor(num * (10^(idp or 0)) + 0.5) / (10^(idp or 0)) +end +function lib:classcolor(text,class) + if(not RAID_CLASS_COLORS[class]) then + class="PRIEST" + end + return string.format("|c%s%s|r",RAID_CLASS_COLORS[tostring(class)]['colorStr'],text) +end +function lib:colorize(text,color) + return string.format("|cff%s%s|r",color and color or 'ffffff',text and text or '') +end +function lib:Print(message) + SELECTED_CHAT_FRAME:AddMessage(tostring(message)) +end +function lib:buildMoneyString(money, color, tab, abrevK, abrevM) + tab = tab or {} + local iconSize = tab['iconSize'] or 12 + local goldicon = tab['goldicon'] or format("\124TInterface\\MoneyFrame\\UI-GoldIcon:%d:%d:1:0\124t", iconSize, iconSize) + local silvericon = tab['silvericon'] or format("\124TInterface\\MoneyFrame\\UI-SilverIcon:%d:%d:1:0\124t", iconSize, iconSize) + local coppericon = tab['coppericon'] or format("\124TInterface\\MoneyFrame\\UI-CopperIcon:%d:%d:1:0\124t", iconSize, iconSize) + + local moneystring = '' + local g,s,c + local neg = false + local abrev = "" + if(abrevM and money >= 10000000000) then + abrev = abrevM + money = lib:round(money / 10000000000,1) * 10000 + elseif(abrevK and money >= 10000000) then + abrev = abrevK + money = lib:round(money / 10000000,1) * 10000 + end + if(money <0) then + neg = true + money = money * -1 + end + if(abrev=="") then + g=floor(money/10000) + s=floor((money-(g*10000))/100) + c=money-s*100-g*10000 + else + g = money/10000 + s = 0 + c = 0 + end + if(money > 0) then + if(g>0) then + moneystring = format("%s%s%s",g,abrev,goldicon) + end + if(s>0) then + moneystring = format("%s%s%s",moneystring,s,silvericon) + end + if(c>0) then + moneystring = format("%s%s%s",moneystring,c,coppericon) + end + else + moneystring = format("%s%s",'0',coppericon) + end + if(neg) then + moneystring = format("-%s",moneystring) + end + if(color) then + if(neg) then + moneystring = self:colorize(moneystring,"ff0000") + elseif(money ~= 0) then + moneystring = self:colorize(moneystring,"44dd44") + end + end + return moneystring +end +function lib:RegisterEventThrottle(storename, event, delay, func) + local found = 0 + if(type(event) ~= 'table') then event = {event} end + for i = 1, #event do + found = 0 + local ev = event[i] + local sn = storename..i + for k = 1, #throttles do + local v = throttles[k] + if(v['name'] == sn) then + found = k + break + end + end + + if(found == 0) then + local f = CreateFrame("Frame") + f:RegisterEvent(ev) + f:SetScript("OnEvent", eventThrottle) +-- lib['RegisterFunc'](ev, "OnEvent", eventThrottle) + end + throttles[#throttles + 1] = { + ['name'] = sn, + ['event'] = ev, + ['delay'] = delay, + ['func'] = func, + ['lastcall'] = GetTime() - delay, + } + end +end +function lib:IsTwink(name) + local realm = GetRealmName() + local _ + if(self['db']['sv']['profileKeys']) then + for k,v in pairs(self['db']['sv']['profileKeys']) do + local n,m = strsplit(" - ",k,2) + _,m = strsplit(" ",m,2) + if(n) then + if(n == name and m == realm) then + return true + end + end + end + end + return false +end +function lib:getItemId(link) + if(link) then + local _, _, itemString = string.find(link, "^|c%x+|H(.+)|h%[.*%]") + local _,id,_ = strsplit(":",itemString) + return tonumber(id) + end +end +function lib:itemInfo(id) + local itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemTexture, itemSellPrice = GetItemInfo(id) + if(itemName) then + return { + ['itemId'] = id, + ['itemName'] = itemName, + ['itemLink'] = itemLink, + ['itemRarity'] = itemRarity, + ['itemLevel'] = itemLevel, + ['itemMinLevel'] = itemMinLevel, + ['itemType'] = itemType, + ['itemSubType'] = itemSubType, + ['itemStackCount'] = itemStackCount, + ['itemEquipLoc'] = itemEquipLoc, + ['itemTexture'] = itemTexture, + ['itemSellPrice'] = itemSellPrice + } + end +end +function lib:startup(name, childName, init, default, defaults) + if(name==childName) then + local addon = self + self['frame'] = self:RegisterFunc({'PLAYER_LOGOUT','ADDON_LOADED','PLAYER_ENTERING_WORLD'},"OnEvent", function(self, event, arg1,...) + if(event=='ADDON_LOADED') then + if(arg1 ~= childName) then return end + addon['db'] = addon['db'] or LibStub("AceDB-3.0"):New(childName.."DB", nil, default) + if(type(defaults) == 'table') then + addon['db']['profile'][childName] = addon['db']['profile'][childName] or CopyTable(defaults) + else + addon['db']['profile'][childName] = addon['db']['profile'][childName] or {} + end + if(self:IsEventRegistered("PLAYER_ENTERING_WORLD") and IsAddOnLoaded("AddonLoader")) then + if(GetAddOnMetadata(name, "X-LoadOn-Always")) then + init(self, event, ...) + self:UnregisterEvent("PLAYER_ENTERING_WORLD") + end + end + addon:HandleFunclist('preloads', event, arg1, ...) + addon['preloads'] = {} + elseif(event=='PLAYER_LOGOUT') then + addon:HandleFunclist('logouts', event, arg1, ...) + elseif(event=='PLAYER_ENTERING_WORLD') then + local found = false + for i = 1, #addon['inits'] do + if(addon['inits'][i] == init) then + found = true + end + end + if(not found) then + init(self, event, ...) + end + addon:HandleFunclist('inits', event, arg1, ...) + addon['inits'] = {} + end + self:UnregisterEvent(event) + if(type(self[event]) == 'function') then + self[event](self, event, arg1, ...) + end + end) + else + self:RegisterBroker(childName,init,default,defaults) + end +end +function lib:IsClassic() + return WOW_PROJECT_ID == WOW_PROJECT_CLASSIC +end +embed(lib) \ No newline at end of file diff --git a/common.xml b/common.xml new file mode 100644 index 0000000..72c2b14 --- /dev/null +++ b/common.xml @@ -0,0 +1,8 @@ + + +