oRA_Core = {} oRA_Core.Checks = {} oRA_Core.ShortHandList = {} local Checks = oRA_Core.Checks local ShortHandList = oRA_Core.ShortHandList oRA_Core = AceAddonClass:new({ name = oRA_CORE_CONST.Title, description = oRA_CORE_CONST.Desc, version = "1.1." .. string.sub("$Revision: 1894 $", 12, -3), releaseDate = string.sub("$Date: 2006-05-17 15:32:16 +0200 (on, 17 maj 2006) $", 8, 17), aceCompatible = 103, author = "Haste", email = "haste@haste3k.net", website = "http://www.haste3k.net", category = "raid", db = AceDbClass:new("oRADB"), cmd = AceChatCmdClass:new(oRA_CORE_CONST.ChatCmd,oRA_CORE_CONST.ChatOpt), RosterInfo = {}, Register = function(self, module) if( not self.modules ) then self.modules = {} end self.modules[module.type] = module self[module.type] = module module.app = self module:Register() if( module.cmdOptions ) then module.cmdOptions.handler = module tinsert(module.cmdOptions.args or {}, 1, oRA_CORE_TOGGLE) tinsert(self.cmd.options, module.cmdOptions) end end, ---------------------------- -- Module Loadup -- ---------------------------- GetOpt = function(self, path, var) if (not var) then var = path; path = nil; end local profilePath = path and {self.profilePath, path} or self.profilePath; return self.db:get(profilePath, var) end, SetOpt = function(self, path, var, val) if (not val) then val = var; var = path; path = nil; end local profilePath = path and {self.profilePath, path} or self.profilePath; return self.db:set(profilePath, var, val) end, TogOpt = function(self, path, var) if (not var) then var = path; path = nil; end local profilePath = path and {self.profilePath, path} or self.profilePath; return self.db:toggle(profilePath, var) end, SetModState = function(self, mod, state) self.db:set({self.profilePath, "modules"}, mod.type, ace.toggle(state)) end, ModEnabled = function(self, mod) return ace.toggle(self.db:get({self.profilePath, "modules"}, mod.type)) end, Initialize = function(self) self.metro = Metrognome:GetInstance("1") self.metro:Register("oRA Channel", self.CheckChannel, 10, self) self.metro:Register("oRA Raid", self.updateRoster, 7, self) self:RegisterEvent("MEETINGSTONE_CHANGED") end, Enable = function(self) self:RegisterEvent("CHAT_MSG_RAID", "raidParser") self:RegisterEvent("RA_SEND_VERSION","raidDistributeVersion") self:RegisterEvent("RA_UPDATE_AFK_OR_DND") self:AddCheck("RA_SEND_VERSION","SR") self:AddCheck("RA_UPDATE_AFK_OR_DND","AFK") self:AddCheck("RA_UPDATE_AFK_OR_DND","UNAFK") self:AddCheck("RA_UPDATE_AFK_OR_DND","DND") self:AddCheck("RA_UPDATE_AFK_OR_DND","UNDND") self:RegisterShortHand( "rabc", oRA_Core["BroadcastShortHand"] ) self:RegisterShortHand( "rabroadcast", oRA_Core["BroadcastShortHand"] ) end, MEETINGSTONE_CHANGED = function(self) self.metro:Start("oRA Channel") end, RAID_ROSTER_UPDATE = function(self) self.metro:Start("oRA Raid") end, RA_UPDATE_AFK_OR_DND = function(self, a1, a2, a3, a4, a5, a6, a7, a8, a9) local msg = self:Clean(a1) local nick = a2 local member = self.RosterInfo[nick] if ( not member ) then return end if ( msg == "AFK" ) then member.afk = true elseif ( msg == "DND" ) then member.dnd = true elseif ( msg == "UNAFK" ) then member.afk = nil elseif ( msg == "UNDND" ) then member.dnd = nil end end, CheckChannel = function(self) self.metro:Stop("oRA Channel") if(not self:GetOpt("autoleave") and self:GetOpt("channel")) then self:JoinChannel() return end if(UnitInRaid("player") and self:GetOpt("channel")) then self:JoinChannel() elseif(self:GetOpt("channel") and not UnitInRaid("player")) then self:LeaveChannel() end self:UnregisterEvent("MEETINGSTONE_CHANGED") end, raidParser = function(self) local start, endd, chan = string.find(arg1, oRA_CORE_CT_CHANNEL_BROADCAST .. "(.+)") if(chan~=nil) then if(not self:GetOpt("channel")) then self:SetOpt("channel", chan) self:JoinChannel() elseif(self:GetOpt("channel") and self:GetOpt("channel")~=chan) then self:LeaveChannel() self:SetOpt("channel", chan) self:JoinChannel() else self:raidDistributeVersion() end end end, raidDistributeVersion = function(self) self:Send("V ".. oRA_CORE_CONST.RAVersion) end, JoinChannel = function(self) self:RegisterEvent("CHAT_MSG_CHANNEL", "raidParseMessage") self:RegisterEvent("CHAT_MSG_SYSTEM", "SystemMessageParser") self:RegisterEvent("RAID_ROSTER_UPDATE") JoinChannelByName(self:GetOpt("channel")) CT_RA_Channel=self:GetOpt("channel") self:raidDistributeVersion() self:updateRoster() self:Msg("Channel set to: ".. CT_RA_Channel) self:TriggerEvent("RA_JOIN_CHANNEL") end, LeaveChannel = function(self) self:UnregisterEvent("CHAT_MSG_CHANNEL") self:UnregisterEvent("CHAT_MSG_SYSTEM") self:updateRoster() local chan = self:GetOpt("channel") or nil if (chan==nil) then return end if (self:GetOpt("autoleave")) then CT_RA_Channel=nil LeaveChannelByName(chan) self:Msg("Left channel: "..chan) self:TriggerEvent("RA_LEFT_CHANNEL") self:SetOpt("channel", nil) end end, raidParseMessage = function(self) if self.RosterInfo[arg2] then local a1,a2,a3,a4,a5,a6,a7,a8,a9 = arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 local chans = self:GetOpt("channel") if ( chans and strlower(a9) == strlower(chans) and a1 and type(a1) == "string" ) then if ( not arg1 ) then return end local msg = self:Clean(a1) if ( string.find(msg, "#") ) then local arr = self:Split(msg, "#") for c, b in arr do local cmd = self:Split(b, " ") if Checks[cmd[1]] then self:TriggerEvent(Checks[cmd[1]].event, b, a2, a3, a4, a5, a6, a7, a8, a9) end end else local cmd = self:Split(msg, " ") if Checks[cmd[1]] then self:TriggerEvent(Checks[cmd[1]].event, a1, a2, a3, a4, a5, a6, a7, a8, a9) end end end end end, Split = function(self, msg, char) local arr = { }; while (string.find(msg, char) ) do local iStart, iEnd = string.find(msg, char); tinsert(arr, strsub(msg, 1, iStart-1)); msg = strsub(msg, iEnd+1, strlen(msg)); end if ( strlen(msg) > 0 ) then tinsert(arr, msg); end return arr; end, SystemMessageParser = function(self) if(string.find(arg1, ERR_RAID_YOU_LEFT)) then self:TriggerEvent("RA_LEFT_RAID") self:LeaveChannel() elseif(string.find(arg1, oRA_CORE_MARKED_AFK_PATTERN)) then self:Send("AFK") elseif(string.find(arg1, oRA_CORE_MARKED_DND_PATTERN)) then self:Send("DND") elseif(string.find(arg1, oRA_CORE_CLEARED_AFK_PATTERN)) then local RememberAFK = GetCVar("autoClearAFK") SetCVar("autoClearAFK", 0) self:Send("UNAFK") SetCVar("autoClearAFK", RememberAFK) elseif(string.find(arg1, oRA_CORE_CLEARED_DND_PATTERN)) then self:Send("UNDND") end end, IsPromoted = function(self, sMsg) if(IsRaidLeader() or IsRaidOfficer()) then return TRUE elseif (sMsg) then self:Msg(oRA_CORE_CONST.chat.RaidLeaderOnly) end end, isValidRequest = function(self, name, norank) if ( self.RosterInfo[name] ) then if (norank) then return TRUE elseif (self.RosterInfo[name]["rank"]>0) then return true end else return FALSE end end, Send = function(self, msg) if(not self:GetOpt("channel")) then return end msg = string.gsub(msg, "|Hitem:%d+:%d+:%d+:%d+|h(%[[^%|]+%])|h", "%1") msg = string.gsub(msg, "|c%w%w%w%w%w%w%w%w([^%|]+)|r", "%1") msg = string.gsub(msg, "s", "$") msg = string.gsub(msg, "S", "§") SendChatMessage(msg, "CHANNEL", nil, GetChannelName(self:GetOpt("channel"))) end, Clean = function(self, sMsg) msg = string.gsub(sMsg, "%$", "s") msg = string.gsub(msg, "§", "S") if ( strsub(msg, strlen(msg)-7) == " ...hic!") then msg = strsub(msg, 1, strlen(msg)-8) end return msg end, RegisterShortHand = function(self, shorthand, func, system ) if( shorthand ~= nil and shorthand ~= "" ) then if( self:GetOpt("shorthands") ) then local type = "ORA_SHORTHAND_"..strupper(shorthand) SlashCmdList[type] = func setglobal("SLASH_"..type.."1", "/"..strlower(shorthand)) end if( not system ) then ShortHandList[shorthand] = func end end end, UnregisterShortHand = function( self, shorthand ) if( shorthand ~= nil and shorthand ~= "" ) then for s,f in ShortHandList do if( s == shorthand ) then local type = "ORA_SHORTHAND_"..strupper(s) SlashCmdList[type] = nil setglobal("SLASH_"..type.."1", nil) ShortHandList[s] = nil end end end end, BroadcastShortHand = function( channel) oRA_Core:chatBroadcast(channel) end, updateRoster = function(self) local i, name, rank for i = 1, GetNumRaidMembers(), 1 do name, rank, _, _, _, _, _, _, _ = GetRaidRosterInfo(i) if ( not self.RosterInfo[name] ) then self.RosterInfo[name] = {} end self.RosterInfo[name]["rank"] = rank self.RosterInfo[name]["updated"] = true end -- Remove members not present in the raid anymore for name in self.RosterInfo do if ( self.RosterInfo[name]["updated"] == false ) then self.RosterInfo[name] = nil else self.RosterInfo[name]["updated"] = false end end end, ---------------------------- -- Chat -- ---------------------------- chatShortHands = function( self ) self:TogOpt("shorthands") self:Msg(oRA_CORE_CONST.Chat.ShortHands, ACEG_MAP_ONOFF[self:GetOpt("shorthands") or 0]) if( self:GetOpt( "shorthands" ) ) then for s,f in ShortHandList do self:RegisterShortHand( s, f, TRUE ) end else for s,f in ShortHandList do local type = "ORA_SHORTHAND_"..strupper(s) SlashCmdList[type] = nil setglobal("SLASH_"..type.."1", nil) end end end, chatBroadcast = function(self, channel) if(not self:IsPromoted()) then return end if(channel=="" and not self:GetOpt("channel")) then return end if(channel=="") then -- SendChatMessage(" This is an automatic message sent by CT_RaidAssist. Channel changed to: "..self:GetOpt("channel"), "RAID") SendChatMessage( oRA_CORE_CT_CHANNEL_BROADCAST ..self:GetOpt("channel"), "RAID") else -- SendChatMessage(" This is an automatic message sent by CT_RaidAssist. Channel changed to: "..channel, "RAID") SendChatMessage( oRA_CORE_CT_CHANNEL_BROADCAST ..channel, "RAID") end end, chatStatusRequest = function(self) if(not self:GetOpt("channel")) then return end self:Msg(oRA_CORE_CONST.Chat.SR) self:Send("SR") end, chatAutoLeave = function(self) self:TogOpt("autoleave") self:Msg(oRA_CORE_CONST.Chat.ALeave, ACEG_MAP_ONOFF[self:GetOpt("autoleave") or 0]) end, chatForceJoin = function(self, channel) if (channel=="") then return end self:SetOpt("channel", channel) self:JoinChannel() end, -- Command Reporting Closures Msg = function(self, ...) self.cmd:result(oRA_CORE_MSG_COLOR, unpack(arg)) end, Result = function(self, text, val, map) if( map ) then val = map[val or 0] or val end self.cmd:result(oRA_CORE_MSG_COLOR, text, " ", ACEG_TEXT_NOW_SET_TO, " ", format(oRA_CORE_DISPLAY_OPTION, val or ACE_CMD_REPORT_NO_VAL) ) end, TogMsg = function(self, var, text) local val = self:TogOpt(var) self:Result(text, val, ACEG_MAP_ONOFF) return val end, Error = function(self, ...) self.cmd:result(ORA_CORE_MSG_COLOR, format(unpack(arg))) end, -- Command Handlers Report = function(self) if( self.modules ) then local rpt, mod, _ = {} for _, mod in self.modules do tinsert(rpt, {text=mod.name, val=ace.toggle(mod.disabled), map=ACEG_MAP_ENABLED}) end self.cmd:report(oRA_CORE_RPT_HDR_MODULES, rpt) else self:Msg(oRA_CORE_TEXT_NO_MODULES) end end, AddCheck = function(self, e, r) if self:DupeCheck(e,r) then return end Checks[r] = { ["event"] = e } end, RemoveCheck = function(self, r) if Checks[k] then Checks[k] = nil end end, DupeCheck = function(self, e,r) for k,v in Checks do if v.event == e and k == r then return TRUE end end end, }) ---------------------------------- -- Load this bitch up! -- ---------------------------------- oRA_Core:RegisterForLoad()