local locals = KC_ITEMS_LOCALS.modules.common KC_Common = KC_ItemsModule:new({ type = "common", name = locals.name, desc = locals.description, }) KC_Items:Register(KC_Common) function KC_Common:GetCode(link, long, short) local _, _, code = strfind(link or "", "(%d+:%d+:%d+:%d+)") code = code and gsub(code, "(%d+):(%d+):(%d+):(%d+)", "%1:%2:%3:0") if (code) then local nCode = gsub(code, "(%d+):(%d+):(%d+):(%d+)", "%1!%3"); self:AddCode(nCode) end return (code and (long and code or (short and gsub(code, "(%d+):(%d+):(%d+):(%d+)", "%1") or gsub(code, "(%d+):(%d+):(%d+):(%d+)", "%1!%3"))) or nil) end function KC_Common:GetCodes(id, list) if (list and type(list) ~= "string") then error("Bad String was a " .. type(string), 2) end list = list and list or self:Explode(self.app.db:get(id), ",") if (list and type(list) ~= "string") then error(format("Bad Item Data for %s (%s)", self:GetItemInfo(id).name, id)) end local codes = {self:Explode(list, "!")} tremove(codes, 1) for i,v in codes do codes[i] = format("%s!%s", id, v) end return codes end function KC_Common:Split(string, sep) if (not string or type(string) ~= "string") then error("Bad String was a " .. type(string) .. "value: " .. (string or "nil"), 2) end local x, y = (strfind(string , sep) or 0), (strlen(sep) or 1) return (tonumber(strsub(string, 1, x-1)) or strsub(string, 1, x-1)), (tonumber(strsub(string, x+y)) or strsub(string, x+y)) end function KC_Common:Explode(string, sep) if (not string) then return end if (type(string) ~= "string") then error("Bad String was a " .. type(string) .. "value: " .. (string or "nil"), 2) end local a, b = self:Split(string, sep) if (not b or b == "") then return a; end if (not strfind(b, sep)) then return a, b; end return a, self:Explode(b, sep) end function KC_Common:CharCount(str, char) local count = 0 for i in string.gfind(str, char) do count = count + 1 end return count end function KC_Common:GetHyperlink(code) if (not code) then error("Bad Code, Not A String!", 2) end if (strfind(code, "!")) then return format("item:%s:0:%s:0", self:Split(code, "!")) elseif (strfind(code, ":")) then return ("item:" .. code) else return format("item:%s:0:0:0", code) end end function KC_Common:GetTextLink(code) code = self:GetCode(code) local data = self:GetItemInfo(code) local _,_,_,hex = GetItemQualityColor(data["quality"]) return format("%s|H%s|h[%s]|h|r", hex, self:GetHyperlink(code), data["name"]) end function KC_Common:GetItemInfo(code) if (not code) then error("Bad Code, Not A String!", 2) end local name, link, quality, minlevel, class, subclass, maxstack, location, texture = GetItemInfo(type(code) == "number" and code or self:GetHyperlink(code)) local sell, buy = self:GetItemPrices(code) local r, g, b, hex = GetItemQualityColor(quality or 0); return {name = name, hyperlink = link, quality = quality, minlevel = minlevel, class = class, subclass = subclass, maxstack = maxstack, location = getglobal(location), texture = texture, sell = sell, buy = buy, cname = name and hex..name or nil, squality = 9-(quality or 0), lcode = location} end function KC_Common:AddCode(link, sell, buy) if (not link or tonumber(link)) then return end sell = (sell and sell ~= 0) and sell or nil buy = (buy and buy ~= 0) and buy or nil local code = strfind(link, ":") and self:GetCode(link) or link local id, sub = self:Split(code, "!") local data = self.app.db:get(id) if (data) then local subs, sSell, sBuy = self:Explode(data, ",") if (not strfind(subs,"!" .. sub .."!")) then self.app.db:set(id, format("%s,%d,%d", subs .. sub .. "!", sell or sSell, buy or sBuy)) self:UpdateStats(0, 1, sell and 1 or 0, buy and 1 or 0) elseif (sell or buy) then self.app.db:set(id, format("%s,%d,%d", subs, sell or sSell, buy or sBuy)) self:UpdateStats(0, 0, sell and ((sell == sSell) and 0 or 1), buy and ((buy == sBuy) and 0 or 1)) end else self.app.db:set(id, format("!%d!,%d,%d", sub, sell or 0, buy or 0)) self:UpdateStats(1, 1, sell and 1 or 0, buy and 1 or 0) end end function KC_Common:GetItemPrices(code) if (not code) then return end code = strfind(code, ":") and self:GetCode(code) or code local id, sub = type(code) == "number" and code or self:Split(code, "!") local data = self.app.db:get(id) if (data) then local subs, sell, buy = self:Explode(data, ",") if (sub and not strfind(subs,"!" .. sub .."!")) then self:AddCode(code) end return sell, buy else self:AddCode(code) return 0, 0 end end KC_Common.SetItemPrices = KC_Common.AddCode function KC_Common:GetRealmFactionID(neutrals) return format("%s|%s", ace.char.realm, strfind(neutrals or "", GetRealZoneText()) and "Neutral" or UnitFactionGroup("player")) end function KC_Common:CashTextLetters(cash) cash = floor(cash) local g,s,c = floor(cash/(100*100)),mod(floor(cash/100),100),mod(floor(cash),100) local str="" if(g>0) then str = format("%s%s%s", locals.money.gold.color, g, locals.money.gold.letter) end if(s>0) then if (str == "") then str = format("%s%s%s", locals.money.silver.color, s, locals.money.silver.letter) else str = format("%s %s%s%s", str, locals.money.silver.color, s, locals.money.silver.letter) end end if(c>0) then if (str == "") then str = format("%s%s%s", locals.money.copper.color, c, locals.money.copper.letter) else str = format("%s %s%s%s", str, locals.money.copper.color, c, locals.money.copper.letter) end end return str end function KC_Common:GetCodeFromInv(name, long) for bag = 0, 4 do for item = 1, GetContainerNumSlots(bag) do local id = self:GetCode(GetContainerItemLink(bag, item), long) if (id and self:GetItemInfo(id)["name"] == name) then return id; end end end end function KC_Common:StrMixed(string) string = strlower(string) return(strupper(strsub(string, 1,1)) .. strsub(string, 2)) end function KC_Common:GetCharList(realm, faction) local result = {}; local list = {"bank", "inventory", "equipment"} for i3,v3 in list do if (self.app[v3]) then local db = self.app[v3].db:get() for i, v in db do if (not faction or i == faction) then for i2, v2 in v do local cName, rID = self:Split(i2, locals.of) if (not realm or rID == realm) then result[i2] = {name = cName, realm = rID, faction = faction or i} end end end end end end return result end