vanilla-wow-addons – Rev 1
?pathlinks?
-- 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<maxcnt) or maxcnt==0) then -- found?
table.insert(list, strsub(text, pos, first-1))
pos = last+1
cnt=cnt+1
else
table.insert(list, strsub(text, pos))
cnt=cnt+1
break
end
end
return cnt,list
end
function Chatr_tremovebyval(tab, val)
for k,v in tab do
if v==val then
tremove(tab, k);
return k;
end
end
return false;
end
function Chatr_tidx(tab, val)
for k,v in tab do
if v==val then
return k;
end
end
return nil;
end
function Chatr_Hyperlink(arg1,arg2,arg3)
if ChatFrame_OnHyperlinkShow~=nil then -- EnhTooltip/Auctioneer hack (not like THAT'd ever be nil, but..)
ChatFrame_OnHyperlinkShow(arg1,arg2,arg3)
else
SetItemRef(arg1,arg2,arg3)
end
end
function Chatr_ShowOptions()
if not ChatrOptions:IsShown() then
ChatrOptionsFmt:SetText(Chatr_TextFormat);
ChatrOptionsFmt2:SetText(Chatr_NoteFormat);
ChatrOptionsAutoDock:SetChecked(Chatr_AutoDock);
ChatrOptionsAllowFade:SetChecked(Chatr_AllowFade);
ChatrOptionsVertDock:SetChecked(Chatr_DockMode);
ChatrOptionsAutoWho:SetChecked(Chatr_AutoWho);
ChatrOptionsSavePer:SetChecked(Chatr_SavePerChar);
ChatrOptionsMinInCombat:SetChecked(Chatr_MinInCombat);
ChatrOptionsEntryInside:SetChecked(Chatr_EntryInside);
ChatrOptionsFontSize:SetValue(Chatr_FontSize);
ChatrOptions:Show();
Chatr_DoCallMe("ShowSettings",nil);
Chatr_SaveSettings("_backup");
end
end
function Chatr_Cmd(arg1)
local cmd,parts,partn,st,i;
if arg1=="" then
Chatr_ShowOptions();
return;
end
partn,parts=Chatr_Split(" ",arg1,0);
cmd=parts[1];
if cmd=="help" then
Chatr_Print("/chatr debug - toggle debugging mode");
Chatr_Print("/chatr reset - resets all options for all profiles");
Chatr_Print("/chatr t - opens testing boxes");
Chatr_Print("/chatr clear - closes all boxes");
Chatr_Print("/chatr size <w> <h> - sets default size to <w> x <h>");
Chatr_Print("/chatr pos <x> <y> - sets default position to <x>,<y> (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])<strlen(status) or status~=strsub(Chatr_Statuses[name],1,3))) then
Chatr_Statuses[name]=status;
end
else
Chatr_Statuses[name]=nil;
end
if strsub(msg,1,3)=="/me" then
vars={["$text"]=name.." "..strsub(msg,5)};
fmtd=Chatr_Fmt(Chatr_NoteFormat,vars);
else
vars={["$name"]=name,["$text"]=msg};
fmtd=Chatr_Fmt(Chatr_TextFormat,vars);
end
if Chatr_Statuses[name]~=nil then
chatr.chatBox:AddMessage(fmtd,Chatr_AFKTextColor[1],Chatr_AFKTextColor[2],Chatr_AFKTextColor[3]);
else
chatr.chatBox:AddMessage(fmtd,Chatr_NormalTextColor[1],Chatr_NormalTextColor[2],Chatr_NormalTextColor[3]);
end
Chatr_UpdateWin(chatr);
if chatr.minimized==1 then
chatr:SetBackdropColor(1,0.75,0,1);
end
if chatr.docked==1 then
getglobal("ChatrDockBtn"..(chatr.id)):SetTextColor(1,1,0);
end
Chatr_UpdateWin(chatr);
if Chatr_AutoWho==1 and (Chatr_WhoInfo[name]==nil or time()-Chatr_WhoInfo[name][1]>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
Generated by GNU Enscript 1.6.5.90.