local name, addon = ... local parentName = addon['parentName'] or "BrokerPack" local childName = "zz_AltMail" local defaults = { } local options = { } local db local realm = GetRealmName() local function GetUName() local name = UnitName("player") return name.."-"..realm end addon.GetUName = GetUName local itemTypes = {} local itemSubtypes = {} local function populate() --[[ for k, v in pairs(_G) do if strsub(k, 1, 12) == 'NUM_LE_ITEM_' then print(k, v) end end]] local types = {} for i = 1, NUM_LE_ITEM_CLASSS do local n = 1 local subclassName = '' local className = GetItemClassInfo(i - 1) if(className) then itemTypes[className] = i itemSubtypes[className] = itemSubtypes[className] or {} types[i] = { ['name'] = className, ['subtypes'] = {} } while(subclassName) do subclassName = GetItemSubClassInfo(i - 1, n - 1) if(subclassName and strlen(subclassName) > 0) then itemSubtypes[className][subclassName] = n types[i]['subtypes'][n] = subclassName n = n + 1 end if(subclassName and strlen(subclassName) < 1) then subclassName = nil end end end end return types end local function IsSoulbound(bag, slot) local item = ItemLocation:CreateFromBagAndSlot(bag, slot) if(item) then return C_Item.IsBound(item) end end local function GetDestination(bag,slot) local item = ItemLocation:CreateFromBagAndSlot(bag, slot) if(C_Item.IsBound(item)) then return end local quality = C_Item.GetItemQuality(item) local itemLink = C_Item.GetItemLink(item) -- local texture, itemCount, locked, quality, readable, lootable, itemLink, isFiltered, noValue, itemID = GetContainerItemInfo(bag, slot) if(itemLink) then local typ = string.match(itemLink, "^(.-):") if(typ~="battlepet" and quality<5 and quality>0) then local itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemTexture, itemSellPrice, itemClassID, itemSubClassID, bindType, expacID, itemSetID, isCraftingReagent = GetItemInfo(itemLink) if(itemName) then -- itemType = LibBabbleDBR[itemType] -- itemSubType = LibBabbleDBR[itemSubType] -- print(itemType.."-"..itemSubType.."-"..itemLink) if(db['itemdb'][realm] and db['itemdb'][realm][itemClassID] and db['itemdb'][realm][itemClassID][itemSubClassID]) then local tmp = db['itemdb'][realm][itemClassID][itemSubClassID] sort(tmp, function(a,b) return (a['order'] or 0) < (b['order'] or 0) end) for dest,destInfo in pairs(tmp) do if(type(destInfo) == 'table') then local doSkip = false -- print(dest,destInfo['skip']) for _,skip in ipairs(destInfo['skip']) do if(skip == GetUName()) then doSkip=true end end if(not doSkip) then return dest end end end end end end end end local function GetNumMailboxItems() local count = 0 for i = 1, ATTACHMENTS_MAX_SEND do local name, texture, count, quality = GetInboxItem(i) if(name) then count = count + 1 end end return count end local function sout(target) SendMail(target, "Post",nil) SELECTED_CHAT_FRAME:AddMessage("Sending "..target) end local sf_new = function() if(not SendMailFrame:IsVisible()) then return end local a,b = 0,0 local tab = {} while(a<=NUM_BAG_SLOTS) do b = 1 while(b<=GetContainerNumSlots(a)) do local _, _, _, _, _, _, itemLink = GetContainerItemInfo(a, b) if(itemLink) then local itemName, itemLink, _, _, _, itemType, itemSubType, _, _, _, _, classID, subclassID, _, _, _, _ = GetItemInfo(itemLink) if(classID) then local it = db['itemtypes'][classID + 1]['name'] if(subclassID and it) then itemType = it local ist = db['itemtypes'][classID + 1]['subtypes'][subclassID + 1] if(ist) then itemSubType = ist tab[classID] = tab[classID] or {} tab[classID][subclassID] = tab[classID][subclassID] or {} tab[classID][subclassID][#tab[classID][subclassID] + 1] = { ['bag'] = a, ['slot'] = b, } else print("no itemsubtype for "..itemName) end else print("no itemtype for "..itemName) end end end b = b + 1 end a = a + 1 end local mailout = {} db['itemdb'][realm] = db['itemdb'][realm] or {} local realmdb = db['itemdb'][realm] for t, v in pairs(tab) do if(t) then realmdb[t] = realmdb[t] or { ['Default'] = { [GetUName()] = { ['order'] = 1, ['skip'] = {}, } } } local typedb = db['itemdb'][realm][t] for s,d in pairs(v) do if(s) then typedb[s] = typedb[s] or CopyTable(typedb['Default']) local subtypedb = typedb[s] for g,h in pairs(d) do local target = GetDestination(tonumber(h['bag']),tonumber(h['slot'])) if(target and subtypedb[target] and subtypedb[target]['active']) then mailout[target] = mailout[target] or {} mailout[target][#mailout[target] + 1] = { ['bag'] = h['bag'], ['slot'] = h['slot'] } end end end end end end mailout[GetUName()] = nil for k,v in pairs(mailout) do local c = 0 for a,b in pairs(v) do c = c + 1 UseContainerItem(tonumber(b['bag']),tonumber(b['slot'])) if(c >= 12) then break end end if(c > 0) then sout(k) break end end end SendMailFrame:HookScript("OnShow", function() C_Timer.After(0.25, sf_new) end) local function OnEvent(self, event, arg1, ...) if(event == "MAIL_SEND_SUCCESS") then C_Timer.After(1,sf_new) end end local function OnText(message) addon:OnText(childName, message) end local function getPref(pref) return db[pref[#pref]] end local function setPref(pref,value) db[pref[#pref]] = value end local function getPrefI(pref) --[[ print("3",pref[#pref]) -- pref name print("2",pref[#pref-1]) -- dest name print("1",pref[#pref-2]) -- subtype name print("0",pref[#pref-3]) -- type name ]] if(pref[#pref-2] ~= 'Default') then -- print("D", db['itemdb'][realm][itemTypes[pref[#pref-3]] - 1][itemSubtypes[pref[#pref-3]][pref[#pref-2]] - 1]) return db['itemdb'][realm][itemTypes[pref[#pref-3]] - 1][itemSubtypes[pref[#pref-3]][pref[#pref-2]] - 1][pref[#pref-1]][pref[#pref]] else return db['itemdb'][realm][itemTypes[pref[#pref-3]] - 1]['Default'][pref[#pref-1]][pref[#pref]] end end local function setPrefI(pref,value) if(pref[#pref-2] ~= 'Default') then db['itemdb'][realm][itemTypes[pref[#pref-3]] - 1][itemSubtypes[pref[#pref-3]][pref[#pref-2]] - 1][pref[#pref-1]][pref[#pref]] = value else db['itemdb'][realm][itemTypes[pref[#pref-3]] - 1]['Default'][pref[#pref-1]][pref[#pref]] = value end end local function getPrefDest(pref) --[[print("3",pref[#pref]) -- pref name print("2",pref[#pref-1]) -- subtype name print("1",pref[#pref-2]) -- type name]] local t = itemTypes[pref[#pref-2]] - 1 local s = pref[#pref-1]=='Default' and 'Default' or itemSubtypes[pref[#pref-2]][pref[#pref-1]] - 1 if(t and s) then for k, v in pairs(db['itemdb'][realm][t][s]) do if(type(v) == 'table') then return k end end end end local function setPrefDest(pref, value) local old = getPrefDest(pref) --print(old, ">",value) --[[print("3",pref[#pref]) -- pref name print("2",pref[#pref-1]) -- subtype name print("1",pref[#pref-2]) -- type name]] local t = itemTypes[pref[#pref-2]] - 1 local s = pref[#pref-1]=='Default' and 'Default' or itemSubtypes[pref[#pref-2]][pref[#pref-1]] - 1 db['itemdb'][realm][t][s][value] = db['itemdb'][realm][t][s][old] db['itemdb'][realm][t][s][old] = nil addon:updatePrefs() end local function buildSelectAll() local sel = {} local n,m,_ if(addon['db']['sv']['profileKeys']) then for k,v in pairs(addon['db']['sv']['profileKeys']) do n,_,m = strsplit(' ',k,3) sel[format("%s-%s",n,m)] = format("%s-%s",n,m) end end return sel end function addon:updatePrefs() db['itemdb'] = db['itemdb'] or {} db['itemdb'][realm] = db['itemdb'][realm] or {} local itemdb = db['itemdb'][realm] db['itemtypes'] = populate() local a,b = 0,0 local curName = GetUName() while(a<=NUM_BAG_SLOTS) do b = 1 while(b<=GetContainerNumSlots(a)) do local _, _, _, _, _, _, itemLink = GetContainerItemInfo(a, b) if(itemLink) then local _, _, _, _, _, itemType, itemSubType, _, _, _, _, classID, subclassID, _, _, _, _ = GetItemInfo(itemLink) if(classID and subclassID) then itemdb[classID] = itemdb[classID] or { ['name'] = itemType, ['Default'] = { ['name'] = 'Default', [curName] = { ['order'] = 1, ['skip'] = {}, } } } local classdb = itemdb[classID] classdb['name'] = itemType classdb[subclassID] = classdb[subclassID] or CopyTable(classdb['Default']) classdb[subclassID]['name'] = itemSubType end end b = b + 1 end a = a + 1 end local p = addon['options']['args']['Types']['args'] for classID, v in pairs(db['itemdb'][realm]) do if(v['name']) then p[v['name']] = { ['type'] = 'group', ['childGroups'] = 'tree', ['name'] = v['name'], ['args'] = {}, } for subclassID, b in pairs(v) do if(type(b) == 'table' and b['name']) then p[v['name']]['args'][b['name']]={ ['type'] = 'group', ['name'] = b['name'], ['get'] = getPrefI, ['set'] = setPrefI, ['args'] = {}, } local c = p[v['name']]['args'][b['name']]['args'] c['dest'] = { ['name'] = "Destination", ['type'] = "select", ['values'] = buildSelectAll, ['get'] = getPrefDest, ['set'] = setPrefDest } for d,e in pairs(b) do if(d ~= 'name') then c[d] = { ['name'] = d, ['type'] = "group", ['args'] = {}, } local f = c[d]['args'] f['active'] = { ['name'] = "active", ['type'] = "toggle", } end end end end end end end local function init() realm = GetRealmName() options = addon:InitConfig(childName, true, { ['type'] = "launcher", }, getPref, setPref) db = addon['db']['profile'][childName] db['itemdb'] = db['itemdb'] or {} db['itemdb'][realm] = db['itemdb'][realm] or {} addon:AddConfigMenu({ ['name'] = "Types", ['order'] = 2, ['childGroups'] = 'tree', ['menuGet'] = getPref, ['menuSet'] = setPref, }, addon['options']) addon:updatePrefs() end addon:startup(name, childName, init, true, defaults) addon:RegisterFunc({'MAIL_SEND_SUCCESS'},"OnEvent", OnEvent)