-- Constants Chatr_Version=GetAddOnMetadata("Chatr","Title"); -- 1.11 savvy Chatr_VerQuote="\"These bloodhounds... they move in a group, they're Bloodhound Gang!\""; Chatr_Max=15; BINDING_HEADER_CHATR="Chatr"; BINDING_NAME_CHATR_REPLY="Focus Last Clicked Chat"; BINDING_NAME_CHATR_QUICKTOGGLE="QuickToggle"; BINDING_NAME_CHATR_REPLYDOCK="Dock: Focus Current Tab"; BINDING_NAME_CHATR_NEXTCHAT="Dock: Next Tab"; BINDING_NAME_CHATR_PREVCHAT="Dock: Previous Tab"; BINDING_NAME_CHATR_CLOSETAB="Dock: Close Tab"; -- Saved Chatr_Options={}; -- Not Saved Chatr_Ready=0; Chatr_HookNames={"ContainerFrameItemButton_OnClick","PaperDollItemSlotButton_OnClick","BankFrameItemButtonGeneric_OnClick","SetItemRef"}; Chatr_HookedFuncs={}; Chatr_WhoInfo={}; Chatr_Statuses={}; Chatr_LastPositions={}; Chatr_DockedIds={}; Chatr_DockSelected=0; Chatr_Debugging=0; Chatr_FontSize=12; Chatr_EditFocus=nil; Chatr_LastFocused=nil; Chatr_InboundFilters={}; Chatr_OutboundFilters={}; Chatr_Filters={}; Chatr_Whoed=0; Chatr_QuickToggled=0; Chatr_LastPluginButton=nil; Chatr_CallMes={}; -- %a Locale's abbreviated weekday name. -- %A Locale's full weekday name. -- %b Locale's abbreviated month name. -- %B Locale's full month name. -- %c Locale's appropriate date and time representation. -- %d Day of the month as a decimal number [01,31]. -- %H Hour (24-hour clock) as a decimal number [00,23]. -- %I Hour (12-hour clock) as a decimal number [01,12]. -- %j Day of the year as a decimal number [001,366]. -- %m Month as a decimal number [01,12]. -- %M Minute as a decimal number [00,59]. -- %p Locale's equivalent of either AM or PM. (1) -- %S Second as a decimal number [00,61]. (2) -- %U Week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Sunday are considered to be in week 0. (3) -- %w Weekday as a decimal number [0(Sunday),6]. -- %W Week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0. (3) -- %x Locale's appropriate date representation. -- %X Locale's appropriate time representation. -- %y Year without century as a decimal number [00,99]. -- %Y Year with century as a decimal number. -- %Z Time zone name (no characters if no time zone exists). -- %% A literal "%" character. Chatr_TextFormat="%H:%M <$name> $text"; Chatr_NoteFormat="%H:%M $text"; Chatr_NormalTextColor={1,1,1}; Chatr_AFKTextColor={1,1,0.7}; Chatr_SelfTextColor={0.8,1,0.4}; Chatr_NoteTextColor={0.4,0.8,1}; Chatr_BGColor={0,0,0,1}; Chatr_BorderColor={1,1,1,1}; Chatr_AutoDock=0; Chatr_AutoWho=0; Chatr_AllowFade=1; Chatr_DockMode=0; Chatr_EntryInside=0; Chatr_MinInCombat=0; Chatr_PlaySound=1; Chatr_DefaultSize={250,150}; Chatr_DefaultPos={0,0}; Chatr_ExecSlash=0; Chatr_SavePerChar=0; -- Prints a message. function Chatr_Print(msg) DEFAULT_CHAT_FRAME:AddMessage(tostring(msg),0.2,0.7,0.9); end -- Prints a debug. function Chatr_Debug(msg) if Chatr_Debugging==1 then DEFAULT_CHAT_FRAME:AddMessage("# "..msg,0.2,0.7,0.9); end end -- Shows a tooltip. function Chatr_Tip(text,attach) if text==nil then GameTooltip:Hide(); else if attach==nil then GameTooltip_SetDefaultAnchor(GameTooltip, UIParent); else GameTooltip_SetDefaultAnchor(GameTooltip, attach); end GameTooltip:SetText(text,1,1,1,1,1); GameTooltip:Show(); end end function Chatr_Split(delimiter, text,maxcnt) -- Edited from http://lua-users.org/wiki/SplitJoin local list = {} local pos = 1 local cnt = 0 if text==nil or delimiter==nil or text=="" or delimiter=="" then return 0,list end while 1 do local first, last = strfind(text, delimiter, pos) if first and ((maxcnt>0 and cnt - sets default size to x "); Chatr_Print("/chatr pos - sets default position to , (0,0 is CENTER)"); return; end if cmd=="debug" then Chatr_Debugging=1-Chatr_Debugging; Chatr_Print("Debug: "..Chatr_Debugging); return; end if cmd=="reset" then Chatr_Options={}; Chatr_Print("Options have been reset. Reload your UI with /console reloadui before setting new options."); return; end if cmd=="clear" then Chatr_Clear(); return; end if cmd=="t" then for i=1,5 do Chatr_OpenFor("Bot"..random(10000,99999)); end return; end if cmd=="size" then local w=tonumber(parts[2]); local h=tonumber(parts[3]); if w and h then Chatr_DefaultSize={w,h}; end Chatr_Print("Default size: ("..Chatr_DefaultSize[1].." x "..Chatr_DefaultSize[2]..")"); return; end if cmd=="pos" then local x=tonumber(parts[2]); local y=tonumber(parts[3]); if x and y then Chatr_DefaultPos={x,y}; end Chatr_Print("Default position: ("..Chatr_DefaultPos[1]..", "..Chatr_DefaultPos[2]..")"); return; end end function Chatr_FindFree() local i; for i = 1,Chatr_Max do if getglobal("Chatr"..i).open==0 then return i; end end return -1; end function Chatr_FindByName(name) local i,c; for i = 1,Chatr_Max do c=getglobal("Chatr"..i) if c.open==1 and c.target==name then return i; end end return -1; end function Chatr_OnUpdate(elapsed) if Chatr_Ready==1 then end end function Chatr_Clear() for i=1,Chatr_Max do Chatr_Close(getglobal("Chatr"..i)); end end function Chatr_Close(chatr) local a,b,c,d,e,v; if chatr.docked==0 then a,b,c,d,e=chatr:GetPoint("TOPLEFT"); Chatr_LastPositions[chatr.target]={a,c,d,e,chatr:GetWidth(),chatr:GetHeight()}; else Chatr_LastPositions[chatr.target]={"CENTER","CENTER",0,0,chatr:GetWidth(),chatr:GetHeight()}; end Chatr_AbandonEntry(chatr); if chatr:IsShown() then chatr:Hide(); end chatr.docked=0; chatr.open=0; Chatr_UpdateDock(); ChatrMenu:Hide(); Chatr_DoCallMe("CloseChatr",chatr); end function Chatr_Minimize(chatr) if chatr.docked==1 then Chatr_Undock(chatr); else if chatr.minimized==1 then chatr.minimized=0; chatr.editBox:Show(); chatr.chatBox:Show(); chatr.sizer:Show(); chatr.menu:Show(); chatr:SetWidth(chatr.preMinW); chatr:SetHeight(chatr.preMinH); elseif chatr.docked==0 then chatr.minimized=1; chatr.editBox:Hide(); chatr.chatBox:Hide(); chatr.sizer:Hide(); chatr.menu:Hide(); chatr.preMinW=chatr:GetWidth(); chatr.preMinH=chatr:GetHeight(); chatr:SetWidth(90); chatr:SetHeight(30); end end Chatr_UpdateWin(chatr); if Chatr_BGColor~=nil then -- iambio chatr:SetBackdropColor(Chatr_BGColor[1],Chatr_BGColor[2],Chatr_BGColor[3],Chatr_BGColor[4]); else chatr:SetBackdropColor(0,0,0,1); end end function Chatr_CloseOrMinimize(chatr) if IsAltKeyDown() then if chatr.docked==1 then Chatr_Undock(chatr); else Chatr_Dock(chatr); end elseif IsShiftKeyDown() or arg1~="LeftButton" or chatr.minimized==1 then Chatr_Minimize(chatr); else Chatr_Close(chatr); end end function Chatr_Show(chatr) chatr:Show(); chatr.editBox:SetAlpha(0.33); chatr:ClearAllPoints(); chatr:SetBackdropColor(Chatr_BGColor[1],Chatr_BGColor[2],Chatr_BGColor[3],Chatr_BGColor[4]); chatr:SetBackdropBorderColor(Chatr_BorderColor[1],Chatr_BorderColor[2],Chatr_BorderColor[3],Chatr_BorderColor[4]); if Chatr_LastPositions[chatr.target]~=nil then local ap1,ap2,x,y,w,h=unpack(Chatr_LastPositions[chatr.target]); chatr:SetPoint(ap1,UIParent,ap2,x,y); chatr:SetWidth(w); chatr:SetHeight(h); else chatr:SetPoint("CENTER",UIParent,"CENTER",Chatr_DefaultPos[1]+random(-30,30),Chatr_DefaultPos[2]+random(-30,30)); chatr:SetWidth(Chatr_DefaultSize[1]); chatr:SetHeight(Chatr_DefaultSize[2]); end end function Chatr_EBEnter(eb) eb:SetAlpha(1); end function Chatr_EBLeave(eb) if eb.hasFocus==0 then eb:SetAlpha(0.33); end end function Chatr_AbandonEntry(chatr) chatr.editBox:ClearFocus(); chatr.editBox:SetText(""); Chatr_EBLeave(chatr.editBox); Chatr_Leave(chatr); end function Chatr_EntryChar() local _temp; if FLT_ChatEdit_OnChar~=nil then -- GFWL support if FLT_Orig_ChatEdit_OnChar then _temp=FLT_Orig_ChatEdit_OnChar; FLT_Orig_ChatEdit_OnChar=nil; end FLT_ChatEdit_OnChar(); if _temp then FLT_Orig_ChatEdit_OnChar=_temp; end end end function Chatr_ProcessSlash(chatr,text) -- Blatantly stolen from Blizzard. I should play a rogue. local command = gsub(text, "/([^%s]+)%s(.*)", "/%1", 1); local msg = ""; if command ~= text then msg = strsub(text, strlen(command) + 2); end command = strupper(gsub(command, "%s+", "")); for index, value in SlashCmdList do local i = 1; local cmdString = getglobal("SLASH_"..index..i); while cmdString do cmdString = strupper(cmdString); if cmdString == command then value(msg); Chatr_AbandonEntry(chatr); return 1; end i=i+1; cmdString = getglobal("SLASH_"..index..i); end end return nil; end function Chatr_Send(chatr) local target=chatr.target; local msg=chatr.editBox:GetText(); local msgl=strlower(msg); if msg~="" then chatr.editBox:AddHistoryLine(msg); if msgl=="/invite" then InviteByName(target); elseif msgl=="/who" then Chatr_Who(target); elseif strsub(msgl,1,1)=="/" and Chatr_ExecSlash==1 then if Chatr_ProcessSlash(chatr,msg)~=1 then Chatr_Print("Unknown slash command."); end else Chatr_Debug("Sent <"..msg.."> to "..target); SendChatMessage(msg, "WHISPER", nil, target); end end Chatr_AbandonEntry(chatr); end function Chatr_FocusLast() local c; if Chatr_LastFocused~=nil then c=getglobal("Chatr"..Chatr_LastFocused); if c.docked==1 then Chatr_DockSelected=Chatr_LastFocused; Chatr_UpdateDock(1); end if c.open==1 then c.editBox:SetFocus(); c.editBox:SetText(""); end end end function Chatr_FocusDock() local c; if ChatrDock:IsShown() then if Chatr_DockSelected~=0 then c=getglobal("Chatr"..Chatr_DockSelected); if c.open==1 then c.editBox:SetFocus(); c.editBox:SetText(""); end end else Chatr_FocusLast(); end end function Chatr_NextTab() local t; Chatr_UpdateDockIds(); if Chatr_DockedIds[1]~=nil then t=Chatr_tidx(Chatr_DockedIds,Chatr_DockSelected)+1; if Chatr_DockedIds[t]==nil then Chatr_DockSelected=Chatr_DockedIds[1]; else Chatr_DockSelected=Chatr_DockedIds[t]; end end Chatr_UpdateDock(); end function Chatr_CloseTab() if Chatr_DockSelected and Chatr_DockSelected>0 then Chatr_Close(getglobal("Chatr"..Chatr_DockSelected)); end end function Chatr_PrevTab() local t; Chatr_UpdateDockIds(); if Chatr_DockedIds[1]~=nil then t=Chatr_tidx(Chatr_DockedIds,Chatr_DockSelected)-1; if Chatr_DockedIds[t]==nil then Chatr_DockSelected=Chatr_DockedIds[getn(Chatr_DockedIds)]; else Chatr_DockSelected=Chatr_DockedIds[t]; end end Chatr_UpdateDock(); end function Chatr_Who(s) FriendsFrame:UnregisterEvent("WHO_LIST_UPDATE"); SetWhoToUI(1); SendWho(s); Chatr_Whoed=1; end function Chatr_OpenFor(name) local frame,i,fn,fs,ff; i=Chatr_FindFree(); if i<0 then Chatr_Print("No free chatrbox for "..name); return -1; end frame=getglobal("Chatr"..i); frame.target=name; frame.opened=time(); frame.editBox=getglobal("Chatr"..i.."EditBox"); frame.chatBox=getglobal("Chatr"..i.."ChatBox"); frame.title=getglobal("Chatr"..i.."Title"); frame.close=getglobal("Chatr"..i.."Close"); frame.sizer=getglobal("Chatr"..i.."Sizer"); frame.menu=getglobal("Chatr"..i.."MenuButton"); if Chatr_AutoWho==1 then Chatr_Who(name); end frame.editBox:ClearAllPoints(); if Chatr_EntryInside==1 then frame.editBox:SetPoint("TOPLEFT",frame,"BOTTOMLEFT",2,21); frame.editBox:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-2,1); frame.chatBox:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-5,24); else frame.editBox:SetPoint("TOPLEFT",frame,"BOTTOMLEFT",2,4); frame.editBox:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-2,-16); frame.chatBox:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-5,7); end Chatr_UpdateWin(frame); frame.editBox:SetMaxLetters(250); frame.editBox:SetAltArrowKeyMode(false); frame.editBox.hasFocus=0; frame.chatBox:Clear(); frame.editBox:Show(); frame.chatBox:Show(); frame.menu:SetAlpha(0.4); frame:GetTitleRegion():SetAllPoints(); frame:SetMovable(true); fn,fs,ff=frame.chatBox:GetFont(); frame.chatBox:SetFont(fn,Chatr_FontSize,ff); -- Hey, if you happen to be a WoW developer, could you puh-lease -- add "EditBox:ClearHistoryLines()"? Pleeeeeease? It'd keep the kittens happy! for i=1,frame.editBox:GetHistoryLines() do frame.editBox:AddHistoryLine(""); end frame.minimized=0; frame.combatmind=0; frame.docked=0; frame.open=1; Chatr_Debug("Opened for "..name..": "..i); Chatr_Show(frame); if Chatr_AutoDock==1 then Chatr_Dock(frame); end Chatr_DoCallMe("OpenChatr",frame); return i; end function Chatr_ChatWheel(chatframe, value) if IsShiftKeyDown() then if value>0 then chatframe:ScrollToTop(); elseif value<0 then chatframe:ScrollToBottom(); end else if value>0 then chatframe:ScrollUp(); elseif value<0 then chatframe:ScrollDown(); end end end function Chatr_MakeTitle(name,minimized,small) local s; if Chatr_Statuses[name]~=nil and minimized~=1 then if small==1 then s="<"..strsub(Chatr_Statuses[name],1,3)..">"..name; else s="<"..Chatr_Statuses[name]..">"..name; end else s=name; end if Chatr_WhoInfo[name]~=nil and minimized~=1 then if small==1 then s=s..":"..Chatr_WhoInfo[name][3]..strsub(Chatr_WhoInfo[name][4],1,2)..strsub(Chatr_WhoInfo[name][5],1,4).." "..gsub(Chatr_WhoInfo[name][6]," ",""); else s=s..": "..Chatr_WhoInfo[name][3].." "..Chatr_WhoInfo[name][4].." "..Chatr_WhoInfo[name][5].." - "..Chatr_WhoInfo[name][6]; if Chatr_WhoInfo[name][2]~="" then s=s.." <"..Chatr_WhoInfo[name][2]..">" end; end if time()-Chatr_WhoInfo[name][1]>300 then s=s.." (?)"; end end return s; end function Chatr_UpdateWin(chatr) if (chatr:GetWidth())<250 then chatr.title:SetText(Chatr_MakeTitle(chatr.target,chatr.minimized,1)); else chatr.title:SetText(Chatr_MakeTitle(chatr.target,chatr.minimized)); end chatr:SetAlpha(1); end function Chatr_Fmt(fmt,vars) s=date(fmt); for k,v in vars do s=gsub(s,k,v); end return s; end function Chatr_AddWhisper(name,msg,status) local i,chatr; i=Chatr_FindByName(name); if i==-1 then Chatr_Debug("Opening window for "..name.." on incoming whisper"); i=Chatr_OpenFor(name); if i==-1 then return false; end end chatr=getglobal("Chatr"..i); if status=="DND" or status=="AFK" then if Chatr_Statuses[name]==nil or (Chatr_Statuses[name]~=nil and (strlen(Chatr_Statuses[name])450) then Chatr_Who(name); end Chatr_DoCallMe("IncomingWhisper",chatr,name,msg,fmtd); return true; end function Chatr_AddWhisperTo(name,msg) local i,chatr; i=Chatr_FindByName(name); if i==-1 then Chatr_Debug("Opening window for "..name.." on outgoing whisper"); i=Chatr_OpenFor(name); if i==-1 then return false; end end chatr=getglobal("Chatr"..i); uname=UnitName("player"); if strsub(msg,1,3)=="/me" then vars={["$text"]=uname.." "..strsub(msg,5)}; fmtd=Chatr_Fmt(Chatr_NoteFormat,vars); else vars={["$name"]=uname,["$text"]=msg}; fmtd=Chatr_Fmt(Chatr_TextFormat,vars); end chatr.chatBox:AddMessage(fmtd,Chatr_SelfTextColor[1],Chatr_SelfTextColor[2],Chatr_SelfTextColor[3]); Chatr_UpdateWin(chatr); Chatr_DoCallMe("OutgoingWhisper",chatr,name,msg,fmtd); return true; end function Chatr_AddNote(name,msg,allowOpen) local i,chatr,vars,fmtd; i=Chatr_FindByName(name); if i==-1 then if allowOpen==1 then Chatr_Debug("Opening window for "..name.." on info"); i=Chatr_OpenFor(name); if i==-1 then return false; end else return false; end end chatr=getglobal("Chatr"..i); vars={["$text"]=msg}; fmtd=Chatr_Fmt(Chatr_NoteFormat,vars) chatr.chatBox:AddMessage(fmtd,Chatr_NoteTextColor[1],Chatr_NoteTextColor[2],Chatr_NoteTextColor[1]); Chatr_UpdateWin(chatr); Chatr_DoCallMe("Note",chatr,name,msg,fmtd); return true; end function Chatr_Enter(chatr) chatr:SetAlpha(1); end function Chatr_Leave(chatr) if Chatr_AllowFade==1 then chatr:SetAlpha(0.5); end end function Chatr_UpdateDockIds() Chatr_DockedIds={}; for i=1,Chatr_Max do if getglobal("Chatr"..i).docked==1 then tinsert(Chatr_DockedIds,i); end end end function Chatr_UpdateDock(noClearColor) local last,i,v,b,id,c,n,openTo; last=nil; Chatr_UpdateDockIds(); if Chatr_tidx(Chatr_DockedIds,Chatr_DockSelected)==nil then Chatr_DockSelected=Chatr_DockedIds[1]; end if ChatrDock:GetLeft()<=GetScreenWidth()/2.0 then openTo=0; else openTo=1; end n=0; for i=1,Chatr_Max do id="ChatrDockBtn"..i; b=getglobal(id) c=getglobal("Chatr"..i) if c.open==1 and c.docked==1 then b:ClearAllPoints(); if last==nil then if openTo==1 then b:SetPoint("TOPRIGHT","ChatrDock","TOPLEFT",-5,4); else b:SetPoint("TOPLEFT","ChatrDock","TOPLEFT",5,4); end else if Chatr_DockMode~=1 then -- normal dock if openTo==1 then b:SetPoint("TOPRIGHT",last,"TOPLEFT"); else b:SetPoint("TOPLEFT",last,"TOPRIGHT"); end else b:SetPoint("TOPLEFT",last,"BOTTOMLEFT",0,4); end end if ChatrDock.minimized==1 then b:Hide(); else b:Show(); end b:SetText(strsub(c.target,1,8)); last=id; c:ClearAllPoints(); if Chatr_DockMode~=1 then -- normal dock if openTo==1 then c:SetPoint("TOPRIGHT","ChatrDock","BOTTOMLEFT",5,2); else c:SetPoint("TOPLEFT","ChatrDock","BOTTOMLEFT",5,2); end else if openTo==1 then c:SetPoint("TOPRIGHT","ChatrDock","TOPLEFT",-65,0); else c:SetPoint("TOPLEFT","ChatrDock","TOPLEFT",65,0); end end if ChatrDock.minimized==1 then c:Hide(); else if Chatr_DockSelected==i then c:Show(); if noClearColor==nil then b:SetTextColor(1,1,1,1); end else c:Hide(); if noClearColor==nil then b:SetTextColor(1,1,1,0.66); end end end n=n+1; else b:Hide(); end end if n>0 then ChatrDock:Show() else ChatrDock:Hide() end end function Chatr_DockClick(id) ChatrMenu:Hide(); Chatr_DockSelected=id; Chatr_UpdateDock(); end function Chatr_Dock(chatr) chatr.docked=1; Chatr_DockSelected=chatr.id; chatr:GetTitleRegion():ClearAllPoints(); chatr:SetMovable(false); Chatr_DockClick(chatr.id); end function Chatr_Undock(chatr) chatr.docked=0; chatr:ClearAllPoints(); chatr:SetPoint("CENTER","UIParent"); chatr:GetTitleRegion():SetAllPoints(); chatr:SetMovable(true); Chatr_UpdateDock(); end function Chatr_DockClose(st) if st~=nil then ChatrDock.minimized=st; else ChatrDock.minimized=1-ChatrDock.minimized; end if ChatrDock.minimized==1 then ChatrDockClose:SetAlpha(1); else ChatrDockClose:SetAlpha(0.33); end ChatrDockText:SetText(""); Chatr_UpdateDock(1); end function Chatr_ContainerFrameItemButton_OnClick(button, igm) if Chatr_EditFocus~=nil and (IsShiftKeyDown() and not igm) then Chatr_EditFocus:Insert(GetContainerItemLink(this:GetParent():GetID(),this:GetID())); return end Chatr_HookedFuncs["ContainerFrameItemButton_OnClick"](button,igm) end function Chatr_PaperDollItemSlotButton_OnClick(button, igm) if Chatr_EditFocus~=nil and (IsShiftKeyDown() and not igm) then Chatr_EditFocus:Insert(GetInventoryItemLink("player", this:GetID())); return end Chatr_HookedFuncs["PaperDollItemSlotButton_OnClick"](button,igm) end function Chatr_BankFrameItemButtonGeneric_OnClick(button) if Chatr_EditFocus~=nil and IsShiftKeyDown() then Chatr_EditFocus:Insert(GetContainerItemLink(BANK_CONTAINER, this:GetID())); return end Chatr_HookedFuncs["BankFrameItemButtonGeneric_OnClick"](button) end function Chatr_SetItemRef(arg1,arg2,arg3) if Chatr_EditFocus~=nil and IsShiftKeyDown() then Chatr_EditFocus:Insert(arg2); return end Chatr_HookedFuncs["SetItemRef"](arg1,arg2,arg3) end function Chatr_ColorFunc() local R,G,B = ColorPickerFrame:GetColorRGB(); if ColorPickerFrame.hasOpacity==true then setglobal(Chatr_UpdatingColor,{R,G,B,1.0-OpacitySliderFrame:GetValue()}); else setglobal(Chatr_UpdatingColor,{R,G,B}); end end function Chatr_ColorCancelFunc(prevvals) setglobal(Chatr_UpdatingColor,Chatr_ColorBackup); end function Chatr_OptSetColor(name) local tab=getglobal(name); local R,G,B = tab[1],tab[2],tab[3]; if tab[4]~=nil then ColorPickerFrame.opacity = 1.0-tab[4]; ColorPickerFrame.hasOpacity = true; else ColorPickerFrame.hasOpacity = false; end Chatr_UpdatingColor=name; Chatr_ColorBackup=getglobal(name); ColorPickerFrame.func = Chatr_ColorFunc; ColorPickerFrame.cancelFunc = Chatr_ColorCancelFunc; ColorPickerFrame:Show(); ColorPickerFrame:SetColorRGB(R, G, B); end function Chatr_Menu(chatr) if ChatrMenu:IsShown() then ChatrMenu:Hide(); else ChatrMenu.chatr=chatr; ChatrMenu:ClearAllPoints(); if chatr:GetLeft()<=GetScreenWidth()/2.0 then ChatrMenu:SetPoint("TOPLEFT",chatr,"TOPRIGHT"); else ChatrMenu:SetPoint("TOPRIGHT",chatr,"TOPLEFT"); end ChatrMenu:Show(); end end function Chatr_CheckFilter(tab,name,msg) for _,v in tab do name,msg=v(name,msg); if name==0 or msg==0 then return nil; end end return name,msg; end function Chatr_QuickToggle() if Chatr_QuickToggled==0 then for i=1,Chatr_Max do chatr=getglobal("Chatr"..i); chatr.combatmind=0; if chatr.docked==0 and chatr.minimized==0 and chatr.open==1 then Chatr_Minimize(chatr); end end Chatr_DockClose(1); else for i=1,Chatr_Max do chatr=getglobal("Chatr"..i); if chatr.docked==0 and chatr.minimized==1 and chatr.open==1 then Chatr_Minimize(chatr); end end Chatr_DockClose(0); end Chatr_QuickToggled=1-Chatr_QuickToggled; end function Chatr_Event() local n,i, charname, guildname, level, race, class, zone, u,chatr; if event=="CHAT_MSG_WHISPER" and strsub(arg1,1,4)~="$CH#" then name,msg=Chatr_CheckFilter(Chatr_InboundFilters,arg2,arg1); if name then if Chatr_PlaySound==1 then PlaySound("TellMessage"); end Chatr_AddWhisper(name,msg,arg6); if ChatrDock.minimized==1 then ChatrDockText:SetText("New message: "..name); end end return; end if event=="CHAT_MSG_WHISPER_INFORM" and strsub(arg1,1,4)~="$CH#" then name,msg=Chatr_CheckFilter(Chatr_OutboundFilters,arg2,arg1); if name then Chatr_AddWhisperTo(name,msg); end return; end if event=="CHAT_MSG_DND" or event=="CHAT_MSG_AFK" then g=strsub(event,-3); newStatus=g..": "..arg1; if newStatus~=Chatr_Statuses[arg2] then Chatr_Statuses[arg2]=newStatus; Chatr_AddNote(arg2,arg2..": "..newStatus,0); end return; end if event=="WHO_LIST_UPDATE" then if Chatr_Whoed==1 then Chatr_Debug("Reverting who frame"); FriendsFrame:Hide(); FriendsFrame:RegisterEvent("WHO_LIST_UPDATE"); SetWhoToUI(0); Chatr_Whoed=0; end n,_=GetNumWhoResults(); Chatr_Debug("Updating who info, "..n.." entries"); for i=1,n do charname, guildname, level, race, class, zone = GetWhoInfo(i); Chatr_WhoInfo[charname]={time(),guildname, level, race, class, zone}; u=Chatr_FindByName(charname); if u>-1 then Chatr_UpdateWin(getglobal("Chatr"..u)); end end end if event=="VARIABLES_LOADED" then Chatr_LoadSettings(); Chatr_Print(Chatr_Version.." loaded - /chatr for options."); Chatr_Ready=1; end if event=="PLAYER_REGEN_DISABLED" and Chatr_MinInCombat==1 then for i=1,Chatr_Max do chatr=getglobal("Chatr"..i); if chatr.docked==0 and chatr.minimized==0 and chatr.open==1 then Chatr_Minimize(chatr); chatr.combatmind=1; end end Chatr_DockClose(1); end if event=="PLAYER_REGEN_ENABLED" and Chatr_MinInCombat==1 then for i=1,Chatr_Max do chatr=getglobal("Chatr"..i); if chatr.docked==0 and chatr.minimized==1 and chatr.open==1 and chatr.combatmind==1 then Chatr_Minimize(chatr); chatr.combatmind=0; end end Chatr_DockClose(0); end end Chatr_SettingNames={ "TextFormat","NoteFormat", "NormalTextColor","AFKTextColor","SelfTextColor", "NoteTextColor","BGColor","BorderColor", "AutoDock","AllowFade","AutoWho", "FontSize","MinInCombat","DockMode","EntryInside", "PlaySound","DefaultSize"}; function Chatr_LoadSettings(whom) local id,k; if whom==nil then id=UnitName("player").."@"..GetRealmName(); Chatr_Debug("trying to load settings "..id); Chatr_SavePerChar=1; for k,_ in Chatr_Options do Chatr_Debug("Key: "..k); end if Chatr_Options[id]==nil then id="global"; Chatr_SavePerChar=0; end else id=whom; end if Chatr_Options[id]~=nil then for _,k in Chatr_SettingNames do if Chatr_Options[id][k]~=nil then setglobal("Chatr_"..k,Chatr_Options[id][k]); end end if getn(Chatr_BGColor)==3 then Chatr_BGColor={Chatr_BGColor[1],Chatr_BGColor[2],Chatr_BGColor[3],1}; end else Chatr_Print("Chatr loaded default settings - id "..id.." was not found."); end Chatr_DoCallMe("SettingsLoaded",nil); end function Chatr_SaveSettings(as) local v; if as==nil then Chatr_SavePerChar=ChatrOptionsSavePer:GetChecked(); if Chatr_SavePerChar==nil then Chatr_SavePerChar=0; end if Chatr_SavePerChar==1 then id=UnitName("player").."@"..GetRealmName(); else id="global"; end else id=as; end Chatr_Options[id]={}; for _,k in Chatr_SettingNames do v=getglobal("Chatr_"..k); if v==nil then v=0; end Chatr_Options[id][k]=v; end if as==nil then Chatr_Print("Settings saved ("..id..")"); end end function Chatr_AddPluginButton(button) button:ClearAllPoints(); if Chatr_LastPluginButton==nil then button:SetPoint("TOPRIGHT",ChatrOptions,"TOPLEFT",-5,0); else button:SetPoint("TOPRIGHT",Chatr_LastPluginButton,"BOTTOMRIGHT",0,0); end Chatr_LastPluginButton=button; end function Chatr_SaveThis(...) local _,v; for _,v in arg do tinsert(Chatr_SettingNames,v); end end function Chatr_CallMe(when,func) if Chatr_CallMes[when]==nil then Chatr_CallMes[when]={}; end tinsert(Chatr_CallMes[when],func); end function Chatr_DontCallMe(when,func) if Chatr_CallMes[when]==nil then return; end Chatr_tremovebyval(Chatr_CallMes[when],func); end function Chatr_DoCallMe(...) local _,v; if getn(arg)<1 then return; end when=arg[1]; if Chatr_CallMes[when]==nil then return; end for _,v in Chatr_CallMes[when] do if v(arg)=="break" then return; end end end function Chatr_Init() local chatr,i,k; SlashCmdList["CHATRCMD"] = Chatr_Cmd; SLASH_CHATRCMD1 = "/chatr"; for i=1,Chatr_Max do chatr=getglobal("Chatr"..i); if chatr~=nil then chatr:Hide(); chatr.id=i; chatr.open=0; else Chatr_Print("Nil: "..i); end end for _,k in Chatr_HookNames do of=getglobal(k); nf=getglobal("Chatr_"..k); if of==nil then Chatr_Print("Hooked function "..k.." does not exist"); elseif nf==nil then Chatr_Print("Hook function replacement for "..k.." does not exist"); else Chatr_HookedFuncs[k]=of; setglobal(k,nf); Chatr_Debug("Hooked "..k); end end ChatrDock.minimized=0; ChatrOptionsQuote:SetText(Chatr_Version.." (C) AKX 2006\n"..Chatr_VerQuote.."\nCheck /chatr help for some more options"); ChatrOptionsQuote:SetFont("Fonts/ARIALN.ttf",11,""); end