local AH_MAILCOLLECT_DEFAULT_OPTIONS = { dbNames = {}, displayMail = TRUE, summaryMail = TRUE, itemsMail = TRUE, deleteAllMail = false, auctionMail = false, } --[[-------------------------------------------------------------------------------- Class Setup -----------------------------------------------------------------------------------]] AH_MailCollect = AceAddon:new({ name = AH_MailCollectLocals.Name, description = AH_MailCollectLocals.Description, -- Optional Ace will use the .toc Notes text version = AH_MailCollectLocals.Version, releaseDate = AH_MailCollectLocals.ReleaseDate, aceCompatible = "102", author = "Tain", email = "tain.dev@gmail.com", website = "http://tain.wowinterface.com", category = "inventory", db = AceDatabase:new("AH_MailCollectDB"), defaults = AH_MAILCOLLECT_DEFAULT_OPTIONS, cmd = AceChatCmd:new(AH_MailCollectLocals.ChatCmd, AH_MailCollectLocals.ChatOpt) }) function AH_MailCollect:Initialize() self.GetOpt = function(var) local v=self.db:get(self.profilePath,var) return v end self.SetOpt = function(var,val) self.db:set(self.profilePath,var,val) end self.TogOpt = function(var) return self.db:toggle(self.profilePath,var) end self.TogMsg = function(text, val) self.cmd:status(text, val, ACEG_MAP_ONOFF) end self.Ins = function(db, val) return self.db:insert(self.profilePath, db, val) end end --[[-------------------------------------------------------------------------------- Addon Enabling/Disabling -----------------------------------------------------------------------------------]] function AH_MailCollect:Enable() self:RegisterEvent("MAIL_INBOX_UPDATE") self:RegisterEvent("MAIL_SHOW") self:RegisterEvent("MAIL_CLOSED") self:RegisterEvent("PLAYER_MONEY") self:RegisterEvent("BAG_UPDATE") self:Hook("InboxFrame_OnClick", "InboxFrameOnClick") self.TotalCashMsg = 0 end function AH_MailCollect:InboxFrameOnClick(mailIndex) local _, _, sender, subject, money, CODAmount, _, hasItem, _, _, _, _= GetInboxHeaderInfo(mailIndex) if CODAmount == 0 then if money>0 then ace:print(format(AH_MailCollectLocals.GAINED_MSG, Ace.CashTextLetters(money))) TakeInboxMoney(mailIndex) end if hasItem then if self.GetOpt("itemsMail") then if AH_MailCollect:CheckFreeInventory() then ace:print(format(AH_MailCollectLocals.GAINED_MSG, GetInboxItem(mailIndex))) TakeInboxItem(mailIndex) else error(AH_MailCollectLocals.TEXT_INV_FULL, 2) end end end -- if (self.GetOpt("deleteAllMail") and (not money) and (not hasItem)) then -- DeleteInboxItem(mailIndex) -- end end -- return self:CallHook("InboxFrame_OnClick",mailIndex) return self.Hooks["InboxFrame_OnClick"].orig(mailIndex) end function AH_MailCollect:MAIL_SHOW() self.FirstFire = TRUE self.TotalCashMsg = 0 self.TotalItemMsg = 0 self.Collecting = FALSE self.FreeBagSlot = -1 self.BagNumber = -1 self.cash = GetMoney() -- Save initial starting cash if self.GetOpt("summaryMail") then self.cashOnOpen = GetMoney() end end function AH_MailCollect:MAIL_CLOSED() local mailNumber = GetInboxNumItems(); if mailNumber == 0 then MiniMapMailFrame:Hide(); end if self.cashOnOpen and (self.cashOnOpen ~= GetMoney()) then self:DisplaySummary() end self.cashOnOpen = nil end function AH_MailCollect:PLAYER_MONEY() if InboxFrame:IsVisible() then self.Collecting = FALSE self:TriggerEvent("MAIL_INBOX_UPDATE") end end function AH_MailCollect:BAG_UPDATE() if InboxFrame:IsVisible() then if self.BagNumber and self.FreeBagSlot then texture = GetContainerItemInfo(self.BagNumber,self.FreeBagSlot) else return end if texture == nil then return else self.Collecting = FALSE self.FreeBagSlot = -1 self.BagNumber = -1 end self:TriggerEvent("MAIL_INBOX_UPDATE") end end function AH_MailCollect:MAIL_INBOX_UPDATE() self.cash = self.cash or GetMoney() if self.FirstFire == TRUE then self.FirstFire = FALSE updateCount = 0 self.inboxItem = GetInboxNumItems() if self.inboxItem > 0 then AH_MailCollect:ScanMailBox() end end cashNow = GetMoney() cashStr = abs(cashNow - self.cash) if cashStr ~= 0 then if self.GetOpt("displayMail") then if cashNow > self.cash then ace:print(format(AH_MailCollectLocals.GAINED_MSG, Ace.CashTextLetters(cashStr))) elseif cashNow < self.cash then ace:print(format(AH_MailCollectLocals.LOST_CASH_MSG, Ace.CashTextLetters(cashStr))) end end self.cash = cashNow end if self.Collecting == FALSE then if self.TotalCashMsg > 0 then AH_MailCollect:CollectMoney() end if self.GetOpt("auctionMail") and self.TotalItemMsg > 0 then AH_MailCollect:CollectItems() end end end function AH_MailCollect:DisplaySummary() cashNow = GetMoney() cashStr = abs(cashNow - self.cashOnOpen) if cashStr ~= 0 then if cashNow > self.cashOnOpen then ace:print(format(AH_MailCollectLocals.GAINED_SUM_MSG, Ace.CashTextLetters(cashStr))) elseif cashNow < self.cashOnOpen then ace:print(format(AH_MailCollectLocals.LOST_SUM_MSG, Ace.CashTextLetters(cashStr))) end self.cashOnOpen = nil end end function AH_MailCollect:ToggleGainLossDisplayMail() self.TogMsg(AH_MailCollectLocals.TEXT_DISPLAY_MAIL, self.TogOpt("displayMail")) end function AH_MailCollect:ToggleGainLossSummaryMail() self.TogMsg(AH_MailCollectLocals.TEXT_SUM_MAIL, self.TogOpt("summaryMail")) end function AH_MailCollect:ToggleDeleteAllMail() self.TogMsg(AH_MailCollectLocals.TEXT_DELETE_ALL, self.TogOpt("deleteAllMail")) end function AH_MailCollect:ToggleLootItems() self.TogMsg(AH_MailCollectLocals.TEXT_LOOT_ITEMS, self.TogOpt("itemsMail")) end function AH_MailCollect:ToggleAuctionItems() self.TogMsg(AH_MailCollectLocals.TEXT_AUCTION_ITEMS, self.TogOpt("auctionMail")) end function AH_MailCollect:Report() self.cmd:report({ {text=AH_MailCollectLocals.TEXT_DISPLAY_MAIL, val=self.GetOpt("displayMail"), map=ACEG_MAP_ONOFF}, {text=AH_MailCollectLocals.TEXT_SUM_MAIL, val=self.GetOpt("summaryMail"), map=ACEG_MAP_ONOFF}, {text=AH_MailCollectLocals.TEXT_LOOT_ITEMS, val=self.GetOpt("itemsMail"), map=ACEG_MAP_ONOFF}, {text=AH_MailCollectLocals.TEXT_DELETE_ALL, val=self.GetOpt("deleteAllMail"), map=ACEG_MAP_ONOFF}, {text=AH_MailCollectLocals.TEXT_AUCTION_ITEMS, val=self.GetOpt("auctionMail"), map=ACEG_MAP_ONOFF}, }) end function AH_MailCollect:ScanMailBox() self.SetOpt("MsgsWithCash", {}) self.SetOpt("MsgsWithItem", {}) for inbox_item_index = 1, self.inboxItem do _, _, _, msgSubject, msgMoney, _, _, msgItem, msgRead, _, _, _ = GetInboxHeaderInfo(inbox_item_index) if string.find(msgSubject, string.sub(AUCTION_SOLD_MAIL_SUBJECT,1,10)) or string.find(msgSubject, string.sub(AUCTION_OUTBID_MAIL_SUBJECT,1,10)) or string.find(msgSubject, string.sub(AUCTION_REMOVED_MAIL_SUBJECT,1,10)) then msgMoneyIndex = inbox_item_index self.Ins("MsgsWithCash",msgMoneyIndex) self.TotalCashMsg = (self.TotalCashMsg + 1) elseif string.find(msgSubject, string.sub(AUCTION_EXPIRED_MAIL_SUBJECT,1,10)) or string.find(msgSubject, string.sub(AUCTION_WON_MAIL_SUBJECT ,1,10)) then msgItemIndex = inbox_item_index self.Ins("MsgsWithItem",msgItemIndex) self.TotalItemMsg = self.TotalItemMsg + 1 end end -- ace:print(format("self.TotalItems start %s", self.TotalItems)) end function AH_MailCollect:CollectMoney() self.Collecting = TRUE -- if (self.Collecting) then -- ace:print(format("self.Collecting is true.")) -- end msgMoneyIndex = self.GetOpt("MsgsWithCash")[self.TotalCashMsg] _, _, _, msgSubject, msgMoney, _, _, msgItem, msgRead, _, _, _ = GetInboxHeaderInfo(msgMoneyIndex) if msgMoney > 0 then TakeInboxMoney(msgMoneyIndex) ace:print(format(msgSubject)) -- else -- DeleteInboxItem(msgMoneyIndex) -- self.Collecting = FALSE end self.TotalCashMsg = self.TotalCashMsg - 1 end function AH_MailCollect:CollectItems() self.Collecting = TRUE -- if (self.Collecting) then -- ace:print(format("self.Collecting is true.")) -- end msgItemIndex = self.GetOpt("MsgsWithItem")[self.TotalItemMsg] _, _, _, msgSubject, msgMoney, _, _, msgItem, msgRead, _, _, _ = GetInboxHeaderInfo(msgItemIndex) if msgItem then if AH_MailCollect:CheckFreeInventory() then TakeInboxItem(msgItemIndex) ace:print(format(msgSubject)) else error(AH_MailCollectLocals.TEXT_INV_FULL, 2) return end end self.TotalItemMsg = self.TotalItemMsg - 1 end function AH_MailCollect:CheckFreeInventory() for bags=0,4 do for bagSlot=1,GetContainerNumSlots(bags) do texture = GetContainerItemInfo(bags,bagSlot); if texture == nil then self.FreeBagSlot = bagSlot self.BagNumber = bags return TRUE end end end return FALSE end --[[-------------------------------------------------------------------------------- Register the Addon -----------------------------------------------------------------------------------]] AH_MailCollect:RegisterForLoad()