-- AutoGrats by Krod -- -- version 1.3.1 -- Date 11.10.2005 -- -- Comments to: ram@catsec.com -- -- Sends automatic congrats messages when a guild member dings... function ag_OnLoad() -- register events this:RegisterEvent("GUILD_ROSTER_UPDATE"); this:RegisterEvent("CHAT_MSG_GUILD"); this:RegisterEvent("VARIABLES_LOADED"); waiting_for_update=false; end function ag_OnEvent(event)-- check for initialization if (event == "VARIABLES_LOADED")then -- invoke init once all vars are loaded ag_Init(); end if (event == "GUILD_ROSTER_UPDATE")then -- got a guild roster update event ag_GotRoster(); end if (ag_enabled and event == "CHAT_MSG_GUILD" ) then -- got a guild text event ag_GuildText(arg1, arg2, arg3); end end function ag_Init() -- Initialize slash commands SlashCmdList["autograts"] = ag_Cmd; SLASH_autograts1 = "/grats"; if (ag_enabled==nil) then ag_enabled=true; end ag_Print("Autograts by Krod, type: /grats help for more information"); if (ag_enabled) then ag_Print("Autograts by Krod: Enabled"); else ag_Print("Autograts by Krod: Disabled"); end if (grats==nil) then -- a grats table does not exists - load default ag_Reset(); end if (nicks==nil) then -- no nickname table, needs to create it nicks={}; end ag_Version(); end function ag_Version() -- version update code if (version==nil) then -- no version information, means version is less then 1.1 version=1.0; end if (version<1.2) then -- version if less then 1.2, need to clear players table players={}; version=1.2; end end function ag_GuildText(msg, who, lang) -- analyse guild message to find the word "ding" in it if (string.find(" "..string.lower(string.gsub(msg,"%p+","")).." "," ".."ding".." ") and who~=UnitName("player")) then ag_person=who; ag_lang=lang; waiting_for_update=true; waiting_for_who=false; GuildRoster(); -- ask for guildroster update end end function ag_Cmd(msg) -- process command line if (not msg or msg=="") then msg="help"; end local args=ag_Spliter(msg); -- split command line arguments into words local i; if (strlower(msg)=="off") then -- turn autograts off ag_enabled=false; ag_Print("Autograts Disabled"); elseif (strlower(msg)=="on") then -- turn autograts on ag_enabled=true; ag_Print("Autograts Enabled") elseif (strlower(msg)=="players") then -- show players list ag_Print("Registered players:"); table.foreach(players,function(i,l) ag_Print(i.." ("..l..")") end); elseif (strlower(msg)=="who") then -- show who leveled and update the list waiting_for_who=true; waiting_for_update=false; GuildRoster(); elseif (strlower(msg)=="list") then -- show grats list ag_Print("Showing grats list"); if (grats) then for i=1,table.getn(grats),1 do ag_Print(i..". Level range: "..grats[i][1].." - "..grats[i][2].." : "..grats[i][3]); end else ag_Print("***Empty***"); end elseif (strlower(msg)=="reset") then -- Reset all grats to Defaults ag_Print("Reseting all grats to defaults"); grats=nil; ag_Reset(); elseif (strlower(args[1])=="nick") then -- process nickname commands if (args[2]) then if (strlower(args[2])=="clear") then -- removing all nicknames nicks={}; ag_Print("All nicknames cleared"); elseif (strlower(args[2])=="list") then -- List all nicknames ag_Print("Nicknames:"); table.foreach(nicks,function(p,n) ag_Print("Player: "..p.." is nicknamed: '"..n.."'.") end); elseif (args[3]) then -- Set A players nickname local p=args[2]; local n=args[3]; nicks[p]=n; ag_Print("Player: "..p.." is now nicknamed: '"..n.."'."); else -- No third argument was specified: try to remove the nickname speficied in the second argument local p=args[2]; if (nicks[p]) then -- the Nickname specified in the second argument exists - erase it nicks[p]=nil; ag_Print("Removed nickname for: "..p.."."); else -- the Nickname specified in the second argument do not exist - show error ag_Print("Couldn't remove nickname for: "..p..", Player not found."); end end else ag_Print("Syntax Error, use /grats nick {clear/list/{player name}}"); end elseif (strlower(args[1])=="remove") then -- remove a grats line if (args[2]) then -- a second argument was specified if (strlower(args[2])=="all") then -- removing all grats grats=nil; ag_Print("All grats removed"); else -- remove specific grats line local ln=tonumber(args[2]); if (grats[ln]) then -- found the line number table.remove(grats,ln); ag_Print("Removed Line: "..ln); else -- line number was not found ag_Print("No such line"); end end else ag_Print("syntax error: use /grats remove {all/line number}"); end elseif (strlower(args[1])=="add") then -- add a grats line if (args[2] and args[3] and args[4]) then -- if all command line arguments exists valid=true; errstr=""; -- low level argument (second argument) low=tonumber(args[2]); if (low<1 or low>60) then -- low level bellow or above the range valid=false; errstr="lower level out of range."; end if (grats) then -- a grats table exists for i=1,table.getn(grats) do -- check for valid range for the 'low' argument if (low>=grats[i][1] and low<=grats[i][2]) then -- conflicts found... valid=false; errstr="lower level conflicts with another message (line"..i..")"; end end end high=tonumber(args[3]); -- high level argument (third argument) if (high<1 or high>60 or high=grats[i][1] and high<=grats[i][2]) then -- conflicts found... valid=false; errstr="high level collides with another message (line"..i..")"; end end end if (valid) then -- if the command line is valid insert the new message at the correct spot local place=1; if (grats) then for i=1,table.getn(grats) do if (low>grats[i][1]) then place=i; end end if (place==table.getn(grats)) then table.insert(grats,{low,high,table.concat(args," ",4)}); else table.insert(grats,place,{low,high,table.concat(args," ",4)}); end else grats={[1]={low,high,table.concat(args," ",4)}} end ag_Print("Autograts message added"); else ag_Print("syntax error: "..errstr); end else -- Error in "Add" parameters ag_Print("syntax error: use /grats add {low} {high} {message}"); end else -- show help ag_Print("/grats on - turns autograts on"); ag_Print("/grats off - turns autograts off"); ag_Print("/grats players - list all known players"); ag_Print("/grats list - list all messages"); ag_Print("/grats reset - reset messages to the default ones"); ag_Print("/grats remove all - removes all messages"); ag_Print("/grats remove {line} - removes the specified message line (N=line number"); ag_Print("/grats who - shows you all guild members who leveled since you were last online"); ag_Print("/grats nick {player} {nickname} - sets the {nickname} for {player}"); ag_Print("/grats nick list - lists all nicknames"); ag_Print("/grats nick clear - clears all nicknames"); ag_Print("/grats nick {player} - clears the nickname for {player}"); ag_Print("/grats add {low} {high} {message} - adds a message for the specified level range:"); ag_Print(" in {message} the following will be replaced by autograts:"); ag_Print(" @c will be replaced by the player who dinged Class"); ag_Print(" @p will be replaced by the player who dinged Name or nickname"); ag_Print(" @l will be replaced by the player who dinged Level"); ag_Print(" @t will be replaced by number of levels left till 60"); ag_Print("example: /grats add 1 60 Woohoo @p you are a great @c. will yield: 'Woohoo Krod you are a great Hunter'"); end end function ag_Print(printout) -- print messages DEFAULT_CHAT_FRAME:AddMessage(printout,0.5,1,1); end function ag_GetInfo(guild_member) local g = GetNumGuildMembers(); local i; for i=1,g do local name, rank, rankIndex, level, class, zone, group, note, officernote, online = GetGuildRosterInfo(i); if (name == guild_member) then return level,class; end end return 0, "none"; end function ag_GotRoster() -- invoked when Guild Roster is updated if (waiting_for_who) then -- waiting for the /grats who waiting_for_who=false; local g = GetNumGuildMembers(); local i; local f=false; for i=1,g do local name, rank, rankIndex, level, class, zone, group, note, officernote, online = GetGuildRosterInfo(i); if (players[name]~=level) then players[name]=level; f=true; ag_Print(name.." had leveled since you were last online."); end end if (not f) then ag_Print("No online guild member had leveled since you were last online."); end end if (waiting_for_update) then -- get information on the player (level,class) local l,c=ag_GetInfo(ag_person); local t=60-l; local s; local m=ag_GetMsg(l); -- get the right message to the player's level if (players[ag_person]~=l) then -- if the player does not appear in the table or the players level is NOT the same as registered then send congrats if (m) then -- if a personalized message exists: local s=grats[m][3]; if (nicks[ag_person]) then s=string.gsub(s,"@p",nicks[ag_person]); else s=string.gsub(s,"@p",ag_person); end s=string.gsub(s,"@l",l); s=string.gsub(s,"@t",t); s=string.gsub(s,"@c",c); SendChatMessage(s, "GUILD", ag_lang); -- send the message else -- message does not exist, send default grats SendChatMessage("Grats!", "GUILD", ag_lang); end players[ag_person]=l; end waiting_for_update=false; end end function ag_GetMsg(level) -- get the corresponding message to the players level if (grats==nil) then -- No grats table: return nil return nil; end local i; for i=1,table.getn(grats),1 do -- search grats table a line matching the dingers level local low=grats[i][1]; local high=grats[i][2]; if (level>=low and level<=high) then -- line found, return it return i; end end return nil; -- no level range found, return nil end function ag_Spliter(str) -- split a string into a table local t = {}; for word in string.gfind(str, "%S+") do table.insert(t, word) end return t; end function ag_Reset() -- define default grats table grats={ [1]={1,9,"*cough* Well.. Hmm.. grats I guess. Surely you're the mightiest @c in the world."}, [2]={10,49,"Grats @p, only @t to go :-)"}, [3]={50,59,"WOW! Grats @p, only @t to go ... almost there!"}, [4]={60,60,"WOW! @p, you're 60!!! that calls for a party!"}, } end