Quantcast

Implemented addon communication.

F16Gaming [02-10-12 - 17:47]
Implemented addon communication.

Checks for newer versions.
Prevents two AddOn instances in the same group/guild from handling a command twice.
Filename
AddonComm.lua
ChatManager.lua
Command.lua
CommandManager.lua
Events_Chat.lua
GroupTools.lua
RollManager.lua
load.xml
diff --git a/AddonComm.lua b/AddonComm.lua
new file mode 100644
index 0000000..74d64a3
--- /dev/null
+++ b/AddonComm.lua
@@ -0,0 +1,101 @@
+--[[
+	* Copyright (c) 2011 by Adam Hellberg.
+	*
+	* This file is part of Command.
+	*
+	* Command is free software: you can redistribute it and/or modify
+	* it under the terms of the GNU General Public License as published by
+	* the Free Software Foundation, either version 3 of the License, or
+	* (at your option) any later version.
+	*
+	* Command is distributed in the hope that it will be useful,
+	* but WITHOUT ANY WARRANTY; without even the implied warranty of
+	* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	* GNU General Public License for more details.
+	*
+	* You should have received a copy of the GNU General Public License
+	* along with Command. If not, see <http://www.gnu.org/licenses/>.
+--]]
+
+local C = Command
+
+local GT = C.GroupTools
+local CES = C.Extensions.String
+local CET = C.Extensions.Table
+
+local log = C.Logger
+
+C.AddonComm = {
+	GroupMaster = true, -- Whether or not we are currently the "master" instance in group
+	GuildMaster = true, -- Whether or not we are currently the "master" instance in guild
+	Type = {
+		VersionUpdate = "COMM_VU",
+		HandleCommand = "COMM_DO"
+	},
+	Format = {
+		VersionUpdate = "%s",
+		HandleCommand = "%s;&%s;&%s"
+	},
+	Last = {
+		Sender = nil,
+		Message = nil,
+		Channel = nil
+	}
+}
+
+local AC = C.AddonComm
+
+function AC:Init()
+	--self:LoadSavedVars()
+	for _,v in pairs(self.Type) do
+		RegisterAddonMessagePrefix(v)
+	end
+end
+
+function AC:LoadSavedVars()
+
+end
+
+function AC:Receive(msgType, msg, channel, sender)
+	if msgType == self.Type.VersionUpdate then
+		local t = CES:Split(msg, ":")
+		if #t < 1 then return end
+		local ver = tonumber(t[1])
+		if type(t[1]) ~= "number" then return end
+		C:CheckVersion(ver)
+	elseif msgType == self.Type.HandleCommand then
+		local t = CES:Split(msg, ";&")
+		if #t < 3 then return end
+		local name = tostring(t[1])
+		local sent = tostring(t[2])
+		local chan = tostring(t[3])
+		if type(t[1]) ~= "string" or type(t[2]) ~= "string" or type(t[3]) ~= "string" then return end
+		self.Last.Sender = name
+		self.Last.Message = sent
+		self.Last.Channel = chan
+	end
+end
+
+function AC:Send(msgType, msg, channel, target)
+	channel = channel or "RAID"
+	if not CET:HasValue(self.Type, msgType) then
+		error("Invalid Message Type specified: " .. tostring(msgType))
+		return
+	end
+	SendAddonMessage(msgType, msg, channel, target)
+end
+
+function AC:Handled(msg, sender, channel)
+	if channel == "WHISPER" then return end
+	if self:IsHandled(msg, sender, channel) then return false end
+	self:Send(self.Type.HandleCommand, self.Format.HandleCommand:format(sender, msg, channel), channel)
+	return true
+end
+
+function AC:IsHandled(msg, sender, channel)
+	if channel == "WHISPER" then return false end
+	if tostring(msg) == self.Last.Message and tostring(sender) == self.Last.Sender and tostring(channel) == self.Last.Channel then
+		return true
+	end
+	return false
+end
diff --git a/ChatManager.lua b/ChatManager.lua
index 11950c0..e4a006c 100644
--- a/ChatManager.lua
+++ b/ChatManager.lua
@@ -41,6 +41,7 @@ C.ChatManager = {
 local CM = C.ChatManager
 local PM = C.PlayerManager
 local GT = C.GroupTools
+local AC = C.AddonComm
 local CCM = C.CommandManager
 local CES = C.Extensions.String

@@ -167,6 +168,7 @@ function CM:HandleMessage(msg, sender, channel, target, isBN)
 		C.Logger:Normal("Battle.Net convos/whispers are not supported yet")
 		return
 	end
+	local raw = msg
 	msg = CES:Trim(msg)
 	local args = self:ParseMessage(msg)
 	if not self:IsCommand(args[1]) then return end
@@ -174,12 +176,24 @@ function CM:HandleMessage(msg, sender, channel, target, isBN)
 	self.LastTarget = target
 	local cmd = self:ParseCommand(args[1])
 	if not CCM:HasCommand(cmd) then return end
+	if channel ~= "WHISPER" and not AC:Handled(raw, sender, channel) then
+		C.Logger:Normal("Request already handled by another instance of Command, aborting...")
+		return
+	end
 	local t = {}
 	if #args > 1 then
 		for i=2,#args do
 			table.insert(t, args[i])
 		end
 	end
+
+	--[[
+	if channel ~= "WHISPER" and AC:IsHandled(msg, sender) then
+		C.Logger:Normal("Request already handled by other instance of Command, aborting...")
+		return
+	end
+	]]
+
 	local player = PM:GetOrCreatePlayer(sender)
 	local result, err = CCM:HandleCommand(cmd, t, true, player)
 	if result then
diff --git a/Command.lua b/Command.lua
index 2df62f7..90208fb 100644
--- a/Command.lua
+++ b/Command.lua
@@ -32,6 +32,8 @@
 Command = {
 	Name = "Command",
 	Version = GetAddOnMetadata("Command", "Version"),
+	VersionNum = 1, -- Increment on every release
+	VersionChecked = false, -- Prevent spam of "New Version" notice
 	Loaded = false,
 	VarVersion = 2,
 	Global = {},
@@ -45,6 +47,7 @@ local Cmd
 local CM
 local PM
 local RM
+local AC
 local log

 --- Initialize Command.
@@ -57,6 +60,7 @@ function C:Init()
 	CM = self.ChatManager
 	PM = self.PlayerManager
 	RM = self.RollManager
+	AC = self.AddonComm
 	log = self.Logger
 	self:LoadSavedVars()
 	log:Normal("AddOn loaded! Use /cmd help or !help for help. !!NYI!!")
@@ -90,11 +94,21 @@ function C:LoadSavedVars()
 	CM:Init()
 	PM:Init()
 	RM:Init()
+	AC:Init()
 	Cmd:Init()
 	log:SetDebug(self.Settings.DEBUG)
 	self.Global.VERSION = self.VarVersion
 end

+function C:CheckVersion(ver)
+	if self.VersionChecked then return end
+	ver = ver or 0
+	if ver > self.VersionNum then
+		log:Normal("A new version of " .. self.Name .. " is available! Check the site you downloaded from for the updated version.")
+		self.VersionChecked = true
+	end
+end
+
 --- Control AddOn state.
 -- @param enabled Boolean indicating enabled or disabled state.
 --
diff --git a/CommandManager.lua b/CommandManager.lua
index 28a47b6..b99678e 100644
--- a/CommandManager.lua
+++ b/CommandManager.lua
@@ -34,7 +34,6 @@ C.CommandManager = {
 	Commands = {}
 }

-
 local CM = C.CommandManager
 local PM = C.PlayerManager
 local QM = C.QueueManager
@@ -110,7 +109,9 @@ end
 function CM:GetCommands(all) -- NOTE: Only returns the NAMES, not the actual command function
 	local t = {}
 	for k,v in pairs(self.Commands) do
-		table.insert(t, k)
+		if k ~= "__DEFAULT__" or all then
+			table.insert(t, k)
+		end
 		if all and #v.Alias > 0 then
 			for _,a in pairs(v.Alias) do
 				table.insert(t, a)
@@ -155,15 +156,15 @@ CM:Register({"__DEFAULT__", "help", "h"}, PM.Access.Local, function(args, sender
 	return "End of help message."
 end, "Prints this help message.")

-CM:Register({"commands", "cmds", "cmdlist", "listcmds", "listcommands", "commandlist", PM.Access.Groups.User.Level, function(args, sender, isChat)
+CM:Register({"commands", "cmds", "cmdlist", "listcmds", "listcommands", "commandlist"}, PM.Access.Groups.User.Level, function(args, sender, isChat)
 	local all
 	if #args > 0 then
 		all = args[1] == "all"
 	end
-	local cmds = self:GetCommands(all)
+	local cmds = CM:GetCommands(all)
 	local msg = ""
 	for _,v in pairs(cmds) do
-		msg = msg .. ", " .. v
+		msg = msg .. v .. ", "
 	end
 	return CES:Cut(msg, 240)
 end, "Print all registered commands.")
@@ -529,6 +530,8 @@ CM:Register({"roll", "r"}, PM.Access.Groups.Op.Level, function(args, sender, isC
 			return RM:SetMin(tonumber(args[3]))
 		elseif args[2] == "max" then
 			return RM:SetMax(tonumber(args[3]))
+		elseif args[2] == "time" then
+			return RM:SetTime(tonumber(args[3]))
 		else
 			return false, "Usage: roll set <min||max> <amount>"
 		end
@@ -550,7 +553,7 @@ SlashCmdList[C.Name:upper()] = function(msg, editBox)
 			table.insert(t, args[i])
 		end
 	end
-	local result, err = CM:HandleCommand(cmd, t, false, nil)
+	local result, err = CM:HandleCommand(cmd, t, false, PM:GetOrCreatePlayer(UnitName("player")))
 	if result then
 		C.Logger:Normal(tostring(result))
 	else
diff --git a/Events_Chat.lua b/Events_Chat.lua
index 25ac1aa..ae33714 100644
--- a/Events_Chat.lua
+++ b/Events_Chat.lua
@@ -19,6 +19,7 @@

 local C = Command
 local CM = C.ChatManager
+local AC = C.AddonComm

 function C.Events.CHAT_MSG_SYSTEM(self, event, ...)
 	if C.RollManager.Running then
@@ -26,6 +27,14 @@ function C.Events.CHAT_MSG_SYSTEM(self, event, ...)
 	end
 end

+function C.Events.CHAT_MSG_ADDON(self, event, ...)
+	local msgType = (select(1, ...))
+	local msg = (select(2, ...))
+	local channel = (select(3, ...))
+	local sender = (select(4, ...))
+	AC:Receive(msgType, msg, channel, sender)
+end
+
 --[[
 function C.Events.CHAT_MSG_BATTLEGROUND(self, event, ...)
 	local chan = CM:GetRespondChannelByEvent(event)
diff --git a/GroupTools.lua b/GroupTools.lua
index dd8da07..9181e9e 100644
--- a/GroupTools.lua
+++ b/GroupTools.lua
@@ -82,7 +82,7 @@ function GT:IsGroupFull()
 	local num = 0
 	local max = self.RaidMax
 	if self:IsRaid() then
-		num = GetNumRaidMembers() + 1
+		num = GetNumRaidMembers()
 	elseif self:IsGroup() then
 		num = GetNumPartyMembers() + 1
 		max = self.PartyMax
diff --git a/RollManager.lua b/RollManager.lua
index a7bccc0..338f001 100644
--- a/RollManager.lua
+++ b/RollManager.lua
@@ -108,6 +108,17 @@ function RM:SetMax(amount)
 	return "Sucessfully set maximum roll number to " .. amount .. "!"
 end

+function RM:SetTime(amount)
+	if type(amount) ~= "number" then
+		return false, "Invalid amount passed: " .. tostring(amount)
+	end
+	if amount <= 0 then
+		return false, "Amount must be larger than zero (0)."
+	end
+	self.Settings.DEFAULT_TIME = amount
+	return "Successfully set default roll time to " .. amount .. "!"
+end
+
 function RM:StartRoll(sender, item, time)
 	time = tonumber(time) or self.Settings.DEFAULT_TIME
 	RollTimer.Time = time
diff --git a/load.xml b/load.xml
index d2d81c6..cada1d3 100644
--- a/load.xml
+++ b/load.xml
@@ -27,6 +27,7 @@
 	<Script file="PlayerManager.lua" />
 	<Script file="QueueManager.lua" />
 	<Script file="RollManager.lua" />
+	<Script file="AddonComm.lua" />
 	<Script file="CommandManager.lua" />
 	<Script file="ChatManager.lua" />
 	<Script file="Events.lua" />