--[[ MailTo: Mailbox management system, Written by Vincent of Blackhand, (copyright (c) 2005-2006 by D.A.Down) Version history: 1.10 - WoW 1.11 update. 1.9.7 - Added money counting to open mail window. 1.9.6 - Fixed mailbox close on walk-away bug. 1.9.5 - Updated French localization (from Assutourix). 1.9.4 - Fixed '/mtl' searches that included a '-'. 1.9.3 - Fixed problem with sendee name getting erased. 1.9.2 - Added 'coin' option for including g/s/c in money. 1.9.1 - Split received cash into sales and refunds 1.9 - Added recieved item/money logging option (per char). 1.8.8 - Added '/mtn' to check for newly delivered mail. 1.8.7 - Fixed duplicate money counting. 1.8.6 - Added configurable expiration times. 1.8.5 - Makes sure New Mail icon is hidden when empty. 1.8.4 - Added color-coded item count to Inbox menu names. 1.8.3 - Converted Inbox server menu to 2 levels. 1.8.2 - Added "(possible new mail)" expiration 1.8.1 - Fixed right-click on chat playername problem. 1.8 - WoW 1.10 update. 1.7.5 - Auction shift right-click now sells 1 from stack. 1.7.4 - Added remove character to inbox list. 1.7.3 - auto-add of new character to sendee list. 1.7.2 - Always selects the sendee name. 1.7.1 - Added shading to color-code inbox items. 1.7 - Added /mtn command to list new inbox items. 1.6.3 - Shift right-click on empty inv. does AH recipe search. 1.6.2 - Fixed chat click reference. 1.6.1 - Added link support to locate command. 1.6 - WoW 1.9 update. 1.5.1 - Added auction search for chat right-click. 1.5 - Added locate command for inbox and CV items. 1.4.4 - Added total cash received on mailboc close. 1.4.3 - Fix for dynamic auction loading in WoW 1.8 1.4.2 - Added check for missing log field. 1.4.1 - Fixed error on sender being deleted. 1.4 - Added right-click support for Trade window. 1.3.1 - Fixed notification bug for non-alt. sendee. 1.3 - Added 'From' and 'Expires' to MT inbox tooltip. 1.2.2 - Right-click fix, delivery updates empty inbox. 1.2.1 - WoW 1.7 update. 1.2 - Delivered alt. mail is added to MailTo inbox. 1.1.3 - Added server option to MailTo inbox. 1.1.2 - Added options to disable right-click features. 1.1.1 - Added server name to log entries. 1.1 - Added support for AIOI, enhanced auction right-click. 1.0.1 - Cleaned up inbox tooltip and right-click. 1.0 - Added mail Inbox summary window, key bindings. 0.8.8 - Added /mailfrom command, formatted money. 0.8.7 - RightClick on inbox item to retrieve or delete empty. 0.8.6 - Shift-RightClick on item sends to current sendee. 0.8.5 - Added options for button position and no 'ding'. 0.8.4 - Enhanced inbox tooltip of attachment or message. 0.8.3 - (1600), uses current chat window, auction right-click. 0.8.2 - Login expiration check, Chinese localizaion. 0.8.1 - French localization bug-fix. 0.8 - Inbox package expiration. 0.7 - Package tracking, limited MailMod support. 0.6 - French localization, send item right-click. 0.5.1 - German localization. 0.5 - Initial public release. ]] -- Local local FCr = "|cffff4040" -- Red local FCy = "|cffffff10" -- Yellow local FCo = "|cffff8040" -- Orange local FCg = "|cff50c050" -- Green local FCs = "|cffe0e0e0" -- silver local FCw = "|cffffffff" -- White local FCe = "|r" -- End local TCr = {r=0.85, g=0.25, b=0.25} local TCy = {r=0.85, g=0.85, b=0.25} local TCg = {r=0.25, g=0.85, b=0.25} local TCw = {r=1.00, g=1.00, b=1.00} local MailTo_Selected, MailTo_Name, MailTo_SavedName local Server,Player,Mail,Mail_server,Mail_name,Cash local Startup,MailCount,Last_Click = true,false,0 local DELAY = 61*60 -- item delivery delay local DAY = 24*60*60 local MAIL_DAYS = 30 local MAIL_EXP = MAIL_DAYS*DAY local COD_EXP = 3*DAY local defIcon = "Interface\\Icons\\INV_Misc_Note_01.blp" local QmkIcon = "Interface\\Icons\\INV_Misc_QuestionMark" local function EXP(code) return DAY*(MailTo_Option[code] or MAILTO_DAYS[code]) end -- GetTime rollover ~ 4.5 days -- Global MailTo_Sendee = {} MailTo_Inbox = {} MailTo_List = {} MailTo_Mail = {} MailTo_Log = {} MailTo_Option = {} MailTo_Time = 0 local function print(msg) SELECTED_CHAT_FRAME:AddMessage("MailTo: "..msg, 0.0, 0.9, 0.9) end local function sorted_index(table) local index = {} for key in table do tinsert(index,key) end sort(index) return index end -- Convert money to gold/silver/copper local function add2d(str,fc,n,c) if MailTo_Option.nocoin then c = '' elseif n==0 and str~='' then return str end if n==0 and not str then return end if not str or str=='' then return fc..tostring(n)..c end return format("%s%s%02d%s",str,fc,n,c) end local function gsc(n) local str = add2d(nil,FCy,floor(n/10000),'g') str = add2d(str,FCs,mod(floor(n/100),100),'s') str = add2d(str or '',FCo,mod(n,100),'c') return str..FCe end function MailTo_Init() if(MailTo_Option.nologin) then Startup = false end MailTo_Timer(8) UIPanelWindows["MailTo_InFrame"] = {area="left", pushable=9} -- add our chat command SlashCmdList["MAILTO"] = MailTo_command SLASH_MAILTO1 = "/mailto" SLASH_MAILTO2 = "/mt" SlashCmdList["MAILTOEX"] = MailTo_expire SLASH_MAILTOEX1 = "/mtex" SlashCmdList["MAILTOLOC"] = MailTo_locate SLASH_MAILTOLOC1 = "/mtl" SlashCmdList["MAILTONEW"] = MailTo_new SLASH_MAILTONEW1 = "/mtn" SlashCmdList["MAILFROM"] = MailFrom_command SLASH_MAILFROM1 = "/mailfrom" SLASH_MAILFROM2 = "/mf" SlashCmdList["INBOX"] = MailTo_inbox SLASH_INBOX1 = "/inbox" Player = UnitName("player") Server = GetCVar("realmName") if(MailTo_Inbox[Server]) then if(not MailTo_Inbox[Server][Player] and not MailTo_InList(Player)) then MailTo_ListAdd(Player) end else MailTo_Inbox[Server]={} end if(not MailTo_List[Server]) then MailTo_List[Server]={} end if(not MailTo_Mail[Server]) then MailTo_Mail[Server]={} end local ix = next(MailTo_Mail) if(next(MailTo_Mail,ix)) then MailTo_InFrameServerButton:Show() MailTo_InFrameServerButton:SetChecked(MailTo_Option.server) end Mail = MailTo_Mail[Server] MailTo_SavedName = MailTo_Sendee[Server] MailTo_InFrame_DropDown.displayMode = "MENU" MailToDropDownMenu.displayMode = "MENU" -- hook inventory item use MailTo_InvUse_Save = UseContainerItem UseContainerItem = MailTo_InvUse -- hook send mail name select MailTo_SendName_Save = SendMailNameEditBox:GetScript('OnEditFocusGained') SendMailNameEditBox:SetScript('OnEditFocusGained',MailTo_SendName) -- hook send mail MailTo_SendMail_Save = SendMailFrame_SendMail SendMailFrame_SendMail = MailTo_SendMail -- hook Inbox mouseover MailTo_InboxItem_Save = InboxFrameItem_OnEnter InboxFrameItem_OnEnter = MailTo_InboxItem -- hook Inbox click MailTo_InboxItem_OnClick_Save = InboxFrame_OnClick InboxFrame_OnClick = MailTo_InboxItem_OnClick -- hook Inbox money click MailTo_InboxMoney_OnClick_Save = OpenMailMoneyButton:GetScript('OnClick') OpenMailMoneyButton:SetScript('OnClick',MailTo_InboxMoney_OnClick) -- hook Chat OnCLick MailTo_ChatOnClick_Save = ChatFrame_OnHyperlinkShow ChatFrame_OnHyperlinkShow = MailTo_ChatOnClick -- hook MailMod MailTo_MailMod_Save = MailFrameTab_OnClick MailFrameTab_OnClick = MailTo_MailMod -- Window position of MailTo button if(GetLocale()=="frFR" or GetLocale()=='deDE' or MailTo_Option.pos) then local pos = MailTo_Option.pos and MailTo_Option.pos or -12 MailToDropDownMenu:SetPoint("RIGHT","SendMailNameEditBox","RIGHT",pos,0) end end -- Add to tooltip if money is involved local function tip_money(money) if(money>0) then GameTooltip:AddLine(ENCLOSED_MONEY) SetTooltipMoney(GameTooltip,money) elseif(money<0) then GameTooltip:AddLine(COD_AMOUNT,1,0.3,0.3) SetTooltipMoney(GameTooltip,-money) end end -- Handle Inbox mouseover function MailTo_InboxItem() MailTo_InboxItem_Save() local item,icon,from,sub,money,cod,dl,hi,read = GetInboxHeaderInfo(this.index) GameTooltip:SetOwner(this, "ANCHOR_RIGHT") if(IsControlKeyDown() or read and not item) then GameTooltip:SetText(sub) local text = GetInboxText(this.index) if(text) then GameTooltip:AddLine(text,1,1,1,1) end local iType,item,buyer,bid,bo,dep,cut = GetInboxInvoiceInfo(this.index) if(iType=='seller') then GameTooltip:AddLine(format(MAILTO_SALE,buyer,item,gsc(bid),gsc(bid-cut)),1,1,1) end elseif(item) then GameTooltip:SetInboxItem(this.index) end if(money>0) then tip_money(money) elseif(cod>0) then tip_money(-cod) end GameTooltip:Show() end -- Handle Inbox click local function Count_Cash(from,sub,money) Cash.total = Cash.total+money if strfind(sub,MAILTO_OUTBID) or strfind(sub,MAILTO_CANCEL) then Cash.refund = Cash.refund+money elseif strfind(sub,MAILTO_SOLD) then Cash.sales = Cash.sales+money else Cash.other = Cash.other+money end print(format(MAILTO_RECEIVED,gsc(money),from,sub)) end function MailTo_InboxItem_OnClick(ix) if(arg1=="RightButton") then local item,icon,from,sub,money,cod,dl,hi,read = GetInboxHeaderInfo(ix) if(not from) then from = '?'; end local delete = InboxItemCanDelete(ix) local single = not IsAltKeyDown() local skip if(money>0) then GetInboxText(ix) -- force read to access invoice CheckInbox() if not read then Count_Cash(from,sub,money) end local iType,item,buyer,bid,bo,dep,cut = GetInboxInvoiceInfo(ix) if(iType=='seller') then print(format(MAILTO_SALE,buyer,item,gsc(bid),gsc(bid-cut))) end if(delete) then GetInboxText(ix) end TakeInboxMoney(ix) if(single) then skip = true end end if(item and not skip) then item,hi,dl = GetInboxItem(ix) print(format(MAILTO_RECEIVED,item,from,sub)) if(delete) then GetInboxText(ix) end TakeInboxItem(ix) if(single) then skip = true end end local text,str,flag = GetInboxText(ix); if not skip and (read or not flag) then DeleteInboxItem(ix) end if read or not MailTo_ReceivedLog then return end if money==0 and not item or strfind(from,' ') then return end local log = format("%s,%d,%s,%d,%s",from,money,item or '',dl,sub) print('MailTo_ReceivedLog: '..log) MailTo_ReceivedLog[time()] = log else MailTo_InboxItem_OnClick_Save(ix) end end function MailTo_InboxMoney_OnClick() if OpenMailFrame.money then local item,icon,from,sub,money = GetInboxHeaderInfo(InboxFrame.openMailID) Count_Cash(from,sub,money) end MailTo_InboxMoney_OnClick_Save() end -- Handle auction browse searching local function AuctionSearch(link) if MailTo_Option.noauction then return end if not AuctionFrameBrowse or not AuctionFrameBrowse:IsVisible() then return end if link and not strfind(link,"item:") then return end BrowseMinLevel:SetText('') BrowseMaxLevel:SetText('') UIDropDownMenu_SetText('',BrowseDropDown) UIDropDownMenu_SetSelectedName(BrowseDropDown) local name,il,ir,iml,class,sub if link then local i,j,name = strfind(link,"%[(.+)%]") BrowseName:SetText(name) BrowseName:HighlightText(0,-1) IsUsableCheckButton:SetChecked(false) if(MailTo_Option.noshift or not IsShiftKeyDown()) then return 1 end local i,j,item = strfind(link,"(item:%d+:%d+:%d+:%d+)") name,il,ir,iml,class,sub = GetItemInfo(item) else BrowseName:SetText('') IsUsableCheckButton:SetChecked(true) if(MailTo_Option.noshift or not IsShiftKeyDown()) then return 1 end class = 'Recipe'; sub = class end AuctionFrameBrowse.selectedClass = class for ix,name in CLASS_FILTERS do if name==class then AuctionFrameBrowse.selectedClassIndex = ix i = ix break end end if class~=sub then AuctionFrameBrowse.selectedSubclass = HIGHLIGHT_FONT_COLOR_CODE..sub..FONT_COLOR_CODE_CLOSE for ix,name in {GetAuctionItemSubClasses(i)} do if name==sub then AuctionFrameBrowse.selectedSubclassIndex = ix break end end else AuctionFrameBrowse.selectedSubclass = nil AuctionFrameBrowse.selectedSubclassIndex = nil end AuctionFrameBrowse.selectedInvtype = nil AuctionFrameBrowse.selectedInvtypeIndex = nil AuctionFrameFilters_Update() BrowseSearchButton:Click() return 1 end -- Handle Chat OnClick events function MailTo_ChatOnClick(item,link,button) if button=="RightButton" and not IsControlKeyDown() and not IsAltKeyDown() then if AuctionSearch(link) then return end end MailTo_ChatOnClick_Save(item,link,button) end -- Handle Inventory Use events function MailTo_InvUse(ParentID,ItemID) if(not CursorHasItem() and not IsControlKeyDown() and not IsAltKeyDown() and not MailTo_Option.noclick) then if(GetTime()-Last_Click<0.5) then return end Last_Click = GetTime() local doshift = IsShiftKeyDown() and not MailTo_Option.noshift if(SendMailFrame:IsVisible()) then PickupContainerItem(ParentID,ItemID) ClickSendMailItemButton() if(doshift) then SendMailMailButton:Click() this:Enable() end return end if(TradeFrame:IsVisible()and not MailTo_Option.notrade) then PickupContainerItem(ParentID,ItemID) local slot = TradeFrame_GetAvailableSlot() if slot then ClickTradeButton(slot) end return end if((AuctionFrameAuctions and AuctionFrameAuctions:IsVisible()) and not MailTo_Option.noauction) then if doshift then for slot = 1,16 do if(not GetContainerItemInfo(0,slot)) then SplitContainerItem(ParentID,ItemID,1) PickupContainerItem(0,slot) MailTo_Slot = slot return end end print(MAILTO_BACKPACK) return end PickupContainerItem(ParentID,ItemID) ClickAuctionSellItemButton() return end if AuctionSearch(GetContainerItemLink(ParentID,ItemID)) then return end end MailTo_InvUse_Save(ParentID,ItemID) end function MailTo_SendName() if(MailTo_SendName_Save) then MailTo_SendName_Save() end local sendee = SendMailNameEditBox:GetText() if(MailTo_SavedName and (not sendee or sendee=="")) then SendMailNameEditBox:SetText(MailTo_SavedName) SendMailNameEditBox:HighlightText(0,-1) SendMailNameEditBox:ClearFocus() return end SendMailNameEditBox:HighlightText(0,-1) MailTo_SavedName = sendee end -- Handle clicks on the Send button function MailTo_SendMail() MailTo_SavedName = SendMailNameEditBox:GetText() local name,tex,nr = GetSendMailItem() if(name) then local log = {to=MailTo_SavedName,from=Player,sv=Server,item=name,date=date(),due=GetTime()+DELAY} if(Mail[MailTo_SavedName]) then log.tex = tex log.sub = SendMailSubjectEditBox:GetText() log.nr = nr local copper = MoneyInputFrame_GetCopper(SendMailMoney) if(SendMailCODButton:GetChecked()) then copper = -copper; end log.mon = copper; end log.cod = SendMailCODButton:GetChecked() if(MailTo_Time==0) then MailTo_Timer(DELAY) end table.insert(MailTo_Log,log) elseif(Mail[MailTo_SavedName]) then local copper = MoneyInputFrame_GetCopper(SendMailMoney) if(SendMailCODButton:GetChecked()) then copper = -copper; end name = SendMailSubjectEditBox:GetText() local mail = {mon=copper,from=Player,exp=time()+MAIL_EXP,name=name,new=1} tinsert(Mail[MailTo_SavedName],1,mail) end MailTo_Sendee[Server] = MailTo_SavedName SendMailNameEditBox:ClearFocus() MailTo_SendMail_Save() end function MailTo_MailMod(tab) if(not tab) then tab = this:GetID() end if(tab==3 and CT_MailNameEditBox and MailTo_SavedName) then CT_MailNameEditBox:SetText(MailTo_SavedName) CT_MailNameEditBox:HighlightText(0,-1) end MailTo_MailMod_Save(tab) end -- Process events function MailTo_Event(event) if event=="BAG_UPDATE" then if(MailTo_Slot) then PickupContainerItem(0,MailTo_Slot) ClickAuctionSellItemButton() MailTo_Slot = nil end return end if event=="MAIL_SHOW" then Cash = {total=0,sales=0,refund=0,other=0} HideUIPanel(MailTo_InFrame) return end if event=="MAIL_CLOSED" then if(MailCount and Cash.total>0) then print(format(MAILTO_CASH,gsc(Cash.total),gsc(Cash.sales),gsc(Cash.refund),gsc(Cash.other))) end MailCount = nil return end local nbr = GetInboxNumItems() if event~="MAIL_INBOX_UPDATE" or MailCount==nbr then return end MailCount = nbr local nbr = GetInboxNumItems() local days = MAIL_DAYS local exp = floor(time()+days*DAY) local inbox = {pkg=0,exp=exp} local mail = {} if(nbr>0) then local pkg,from,desc,mny,nm,tx,nr = 0 local pi,si,sndr,sub,mon,cod,left,item for i = 1,nbr do pi,si,sndr,sub,mon,cod,left,item = GetInboxHeaderInfo(i) if(cod>0) then mon = -cod; end if(item and left<=days) then nm,tx,nr = GetInboxItem(i) pkg=i; days=left; from=sndr; desc=sub; mny=mon end if(not pi and si~=defIcon) then pi = si end exp = floor(time()+left*DAY) mail[i] = {tex=pi; name=sub; from=sndr; mon=mon; nr=nr; exp=exp} end if(pkg>0) then exp = floor(time()+days*DAY) inbox = {pkg=pkg; from=from; desc=desc; mon=mny; exp=exp} end else MiniMapMailFrame:Hide() end Mail[Player] = mail MailTo_Inbox[Server][Player] = inbox end -- Handle our /mailto commands function MailTo_command(msg) if msg=='' then if(table.getn(MailTo_Log)==0) then print(MAILTO_LOGEMPTY) return end MailTo_CheckLog(true) return end if MAILTO_OPTION[msg] then local option = MAILTO_OPTION[msg] MailTo_Option[option.flag] = not MailTo_Option[option.flag] print(format(MailTo_Option[option.flag] and MAILTO_OFF or MAILTO_ON,option.name)) return end if msg=="log" then MailTo_ReceivedLog = not MailTo_ReceivedLog and {} or nil print(format(MailTo_ReceivedLog and MAILTO_ON or MAILTO_OFF,'MailTo_ReceivedLog')) return end if msg=="clear" then MailTo_List[Server] = {} print(MAILTO_CLEARED) return end local _,_,pos = strfind(msg,"pos (%-?%d+)") if(pos) then print("pos = "..pos) MailTo_Option.pos = pos MailToDropDownMenu:SetPoint("RIGHT","SendMailNameEditBox","RIGHT",pos,0) return end if msg~="list" then print(FCr..MAILTO_UNDEFINED..msg) return end local list = '' for i,name in MailTo_List[Server] do if list~='' then list = list..', ' end list = list..name end if list=='' then print(FCr..MAILTO_LISTEMPTY) else print(list) end end -- Handle our /mailfrom commands function MailFrom_command(msg) local i,j,from,desc if(msg and msg~='') then i,j,from = strfind(msg,"^(%a+)$") if(not from) then i,j,from,desc = strfind(msg,"^(%a+) (.+)$") end end if not from then print(FCr..MAILTO_NONAME) return end if not desc then print(FCr..MAILTO_NODESC) return end local log = {from=from,to=Player,sv=Server,item=desc,sub=desc,mon=0,date=date(),due=GetTime()+DELAY} if(MailTo_Time==0) then MailTo_Timer(DELAY) end table.insert(MailTo_Log,log) MailTo_Format(log) end -- Handle our /mtex commands function MailTo_expire(msg) local _,_,word,days,hr = strfind(msg,"(%l+) (%d+)(h?)") if(word and MAILTO_DAYS[word]) then MailTo_Option[word] = days/(hr=='h' and 24 or 1) print(format(MAILTO_TIME,word,SecondsToTime(MailTo_Option[word]*DAY))) elseif(msg=="all" or msg=="active" or msg=="soon" or msg=="expired") then local cnt = 0 for server,list in MailTo_Inbox do for player,inbox in list do if(msg=="all" or inbox.pkg>0 and (msg=="active" or msg=="soon" and inbox.exp-time()0 and inbox.exp-time()EXP'new') then msg = MAILTO_NOITEMS else local desc = inbox.desc or MAILTO_NEWMAIL local from = inbox.from or '?' msg = format(MAILTO_INBOX, inbox.pkg, desc, from) if exp0) then tex = GetCoinIcon(mail[i].mon) else tex = defIcon end end SetItemButtonTexture(button,tex) tex = getglobal("MailTo_InFrameCol"..cn.."Item"..rn.."IconTexture") setColor(tex,mail[i].exp,mail[i].new) else exp = MailTo_Inbox[Mail_server][Mail_name].exp if i==1 and exp and exp-time()7 then cn=1; rn=rn+1 end end end function AC_Server_OnClick() MailTo_Option.server = MailTo_InFrameServerButton:GetChecked() end local function InFrame_Select() HideDropDownMenu(1) local value = this.value if value then if(Mail_name==value.n and Mail_server==value.s) then return end Mail_name,Mail_server = value.n,value.s; UIDropDownMenu_SetText(Mail_name,MailTo_InFrame_DropDown) MailTo_InFrame_Fill() end end function MailTo_InFrame_Remove() local name = this.value MailTo_Inbox[name.s][name.n] = nil if(not next(MailTo_Inbox[name.s])) then MailTo_Inbox[name.s] = nil; end MailTo_Mail[name.s][name.n] = nil if(not next(MailTo_Mail[name.s])) then MailTo_Mail[name.s] = nil; end for i,n in MailTo_List[Server] do if n==name.n then tremove(MailTo_List[Server],i) break end end if(not next(MailTo_List[value.s])) then MailTo_List[name.s] = nil; end print(format(MAILTO_REMOVE2,name.n,name.s)) HideUIPanel(MailTo_InFrame) end local function add_names(server,count,level) local Mail,Inbox,text,fc,exp = MailTo_Mail[server],MailTo_Inbox[server] for ix2,name in sorted_index(Mail) do count = count + 1 if count>UIDROPDOWNMENU_MAXBUTTONS then return end fc = '' exp = Inbox[name].exp if exp then exp = exp-time() if exp0 then if Mail[name][1].new then fc = FCg end elseif exp1 then add_names(this:GetParent().value,0,2) return end local count = 0 if(Server~=Mail_server or Player~=Mail_name) then local info = {notCheckable=1,func=MailTo_InFrame_Remove} info.value = {n=Mail_name,s=Mail_server} info.text = string.format(MAILTO_F_REMOVE,Mail_name) UIDropDownMenu_AddButton(info) count = 1 end if MailTo_Option.server then for ix,server in sorted_index(MailTo_Mail) do count = count + 1; if count>UIDROPDOWNMENU_MAXBUTTONS-1 then return end info = {text=server;value=server;notClickable=1;hasArrow=1} if server==Mail_server then info.checked = 1 end UIDropDownMenu_AddButton(info) end else add_names(Server,count) end end -- Mouseover of MailTo inbox function MailTo_InFrame_OnEnter() local mail = this.mail if not mail then return end local name,money = mail.name, mail.mon if(money==0 and not name) then return end -- sanity GameTooltip:SetOwner(this, "ANCHOR_RIGHT") if(not IsShiftKeyDown() or not mail.link) then if name then GameTooltip:SetText(name,1,1,1) end if mail.from then GameTooltip:AddLine(MAILTO_FROM..mail.from) end if money then tip_money(money) end if mail.exp then local exp = mail.exp-time() local c = expnow+DELAY then log.due = now; end -- Sanity! if log.due0 then return end if MailTo_CheckLog(nil,MailTo_Option.alert) and not MailTo_Option.noding then PlaySound("AuctionWindowOpen") end local log = MailTo_Log[1] if log then MailTo_Timer(log.due-GetTime()) else MailTo_Frame:Hide() -- Stop the timer MailTo_Time = 0 end end function MailTo_Format(log) local ss = log.sv==nil or log.sv==Server local to = ss and log.to==Player and FCy..MAILTO_YOU..FCe or log.to local from = ss and log.from==Player and FCy..MAILTO_YOU..FCe or log.from local now,due = GetTime() if log.due>now then local min = math.ceil((log.due-now)/60) due = format(MAILTO_DUE,min) else due = FCg..MAILTO_DELIVERED; end local item = FCw..log.item..FCe if log.sv and log.sv~=Server then item = '('..log.sv..') '..item end print(format(MAILTO_SENT,item,to,from,due)) end local lcs local function LocList(player,loc,list) local txt = '' for name,nr in list do if txt~='' then txt = txt..', ' end txt = txt..name..'='..nr end if txt~='' then print(format("%s(%s%s%s): %s",player,FCy,loc,FCe,txt)) end end local function BagList(bag,cnt,list) local name,nr for i = 1,cnt do if bag[i] and bag[i].L then name = GetItemInfo(bag[i].L) if(name and strfind(strlower(name),lcs,1,true)) then nr = bag[i].C or 1 if list[name] then nr = nr+list[name] end list[name] = nr end end end return list end function MailTo_locate(str) if str=='' then print(MAILTO_NONAME); return end local i,j,id,name = strfind(str,"item:(%d+):.+%[(.+)%]") if name then str = name; end lcs = strlower(str) local list,s,e,name,txt,nr,CV,data,inbox; if CharactersViewerProfile then CV = CharactersViewerProfile[Server] end print(FCw..format(MAILTO_LOCATE,lcs)) for x,player in sorted_index(Mail) do inbox = Mail[player] list = {} for ix,data in inbox do name = data.name s,e,txt,nr = strfind(name,"^(.+) %((%d+)%)$") if s then name = txt; end if data.nr then nr = data.nr end if nr then if strfind(strlower(name),lcs,1,true) then if list[name] then nr = nr+list[name] end list[name] = tonumber(nr) end end end LocList(player,MAILTO_MAIL,list) if CV and CV[player] then data = CV[player] list = {}; for ix,bag in data.Bag do list = BagList(bag,bag.size,list) end LocList(player,MAILTO_INV,list) if data.Bank then list = {} for ix,bag in data.Bank do if type(bag)=='table' then nr = ix=='Main' and 24 or bag.size; list = BagList(bag,nr,list) end end end LocList(player,MAILTO_BANK,list) end end end -- Check for new mail local function print_new(mail,server) local nr = 0 local svr = server and '('..server..') ' or '' for name,inbox in mail do for i,item in inbox do if item.new then print(format(MAILTO_NEW,svr,item.name,item.from,name)) nr = nr+1 end end end return nr end function MailTo_new(msg) local nr = 0 if msg=='all' then for server,mail in MailTo_Mail do nr = nr+print_new(mail,server) end else nr = print_new(MailTo_Mail[Server]) end if nr==0 then print(MAILTO_NONEW) end end