Quantcast

Updates to CommandManager, PlayerManager and locales.

F16Gaming [05-08-12 - 16:41]
Updates to CommandManager, PlayerManager and locales.

Cleaned up some whitespace in files.
Moved alias "accept" from AcceptLFG command to AcceptInvite command.
Disabled AcceptLFG command (unless if in debug) since the function it relies on is protected.
The Kick command now takes an override parameter to be able to kick "protected" users (friends/guildies).
Fixed readycheck command, normal users are now able to utilize !rc accept/deny while still being unable to issue new ready checks.
Added new locales.
Filename
CommandManager.lua
PlayerManager.lua
locales/enUS.lua
locales/svSE.lua
diff --git a/CommandManager.lua b/CommandManager.lua
index 0e8f421..d597786 100644
--- a/CommandManager.lua
+++ b/CommandManager.lua
@@ -1,18 +1,18 @@
 --[[
 	* Copyright (c) 2011-2012 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/>.
 --]]
@@ -343,7 +343,7 @@ CM:Register({"ban"}, PM.Access.Groups.Admin.Level, function(args, sender, isChat
 	return PM:BanUser(player)
 end, "CM_BAN_HELP")

-CM:Register({"acceptinvite", "acceptinv", "join", "joingroup"}, PM.Access.Groups.User.Level, function(args, sender, isChat)
+CM:Register({"accept", "acceptinvite", "acceptinv", "join", "joingroup"}, PM.Access.Groups.User.Level, function(args, sender, isChat)
 	if not StaticPopup_Visible("PARTY_INVITE") then
 		return false, "CM_ACCEPTINVITE_NOTACTIVE"
 	elseif GT:IsInGroup() then
@@ -388,7 +388,13 @@ CM:Register({"kick"}, PM.Access.Groups.Op.Level, function(args, sender, isChat)
 		return false, "CM_KICK_USAGE"
 	end
 	local player = PM:GetOrCreatePlayer(args[1])
-	return PM:Kick(player, sender, args[2])
+	local reason = args[2]
+	local override = args[3] ~= nil
+	if (reason:lower() == "override" or reason:lower() == "true") and #args == 2 then
+		reason = nil
+		override = true
+	end
+	return PM:Kick(player, sender, reason, override)
 end, "CM_KICK_HELP")

 CM:Register({"kingme", "givelead"}, PM.Access.Groups.Op.Level, function(args, sender, isChat)
@@ -464,9 +470,17 @@ CM:Register({"leavelfg", "cancellfg", "cancel", "leavelfd", "cancellfd"}, PM.Acc
 	return QM:Cancel()
 end, "CM_LEAVELFG_HELP")

-CM:Register({"acceptlfg", "accept", "acceptlfd", "joinlfg", "joinlfd"}, PM.Access.Groups.User.Level, function(args, sender, isChat)
-	if not QM.QueuedByCommand then
+-- So apparently Blizzard does not allow accepting invites without HW event... Making this command useless...
+-- I'm keeping this command here for the future, if there will ever be a way to make this work.
+CM:Register({"acceptlfg", "acceptlfd", "joinlfg", "joinlfd"}, PM.Access.Groups.User.Level, function(args, sender, isChat)
+	if not C.Settings.DEBUG then
+		return false, "CM_ERR_DISABLED"
+	end
+	local exists = (select(1, GetLFGProposal()))
+	if not QM.QueuedByCommand or then
 		return false, "CM_ACCEPTLFG_FAIL"
+	elseif not exists then
+		return false, "CM_ACCEPTLFG_NOEXIST"
 	end
 	return QM:Accept()
 end, "CM_ACCEPTLFG_HELP")
@@ -579,9 +593,11 @@ CM:Register({"toggledebug", "td", "debug", "d"}, PM.Access.Local, function(args,
 	return C:ToggleDebug()
 end, "CM_TOGGLEDEBUG_HELP")

-CM:Register({"readycheck", "rc"}, PM.Access.Groups.Op.Level, function(args, sender, isChat)
+CM:Register({"readycheck", "rc"}, PM.Access.Groups.User.Level, function(args, sender, isChat)
 	if #args <= 0 then
-		if GT:IsGroupLeader() or GT:IsRaidLeaderOrAssistant() then
+		if PM:GetAccess(sender) > PM.Access.Groups.Op.Level then
+			return "CM_ERR_NOACCESS", {sender.Info.Name, PM.Access.Groups.Op.Level, PM:GetAccess(sender)}
+		elseif GT:IsGroupLeader() or GT:IsRaidLeaderOrAssistant() then
 			C.Data.ReadyCheckRunning = true
 			local name = tostring(sender.Info.Name)
 			DoReadyCheck()
@@ -737,6 +753,9 @@ CM:Register({"raidwarning", "rw", "raid_warning"}, PM.Access.Groups.User.Level,
 		end
 	end
 	Chat:SendMessage(msg, "RAID_WARNING")
+	if isChat then
+		return nil -- "CM_RAIDWARNING_SENT"
+	end
 	return "CM_RAIDWARNING_SENT"
 end, "CM_RAIDWARNING_HELP")

@@ -778,7 +797,11 @@ SlashCmdList[C.Name:upper()] = function(msg, editBox)
 			end
 			C.Logger:Normal(s)
 		end
-	else
-		C.Logger:Error(tostring(err))
+	elseif arg then
+		local s = l[arg]
+		if type(errArg) == "table" then
+			s = s:format(unpack(errArg))
+		end
+		C.Logger:Error(s)
 	end
 end
diff --git a/PlayerManager.lua b/PlayerManager.lua
index 9c831bf..e2ef7ae 100644
--- a/PlayerManager.lua
+++ b/PlayerManager.lua
@@ -621,18 +621,23 @@ end
 --- Kick a player from the group.
 -- @param player Player object of the player to kick.
 -- @param sender Player object of the player who requested the kick.
+-- @param reason Optional reason for the kick.
+-- @param override True to kick even if target is friend.
 -- @return String stating the result of the kick, false if error.
 -- @return Error message if unsuccessful, nil otherwise.
 --
-function PM:Kick(player, sender, reason)
+function PM:Kick(player, sender, reason, override)
 	if player.Info.Name == UnitName("player") then
 		return false, "PM_KICK_SELF"
-	elseif self:IsFriend(player) or self:IsBNFriend(player) then
+	elseif (self:IsFriend(player) or self:IsBNFriend(player)) and not override then
 		return false, "PM_KICK_FRIEND"
 	elseif not GT:IsInGroup(player.Info.Name) then
 		return false, "PM_ERR_NOTINGROUP", {player.Info.Name}
 	end
 	if GT:IsGroupLeader() or GT:IsRaidLeaderOrAssistant() then
+		if GT:IsRaidAssistant() and GT:IsRaidAssistant(player.Info.Name) then
+			return false, "PM_KICK_TARGETASSIST", {player.Info.Name}
+		end
 		KickName = player.Info.Name
 		KickSender = sender.Info.Name
 		KickReason = reason or L("PM_KICK_DEFAULTREASON"):format(KickSender)
diff --git a/locales/enUS.lua b/locales/enUS.lua
index 7c414f2..678ad14 100644
--- a/locales/enUS.lua
+++ b/locales/enUS.lua
@@ -1,18 +1,18 @@
 --[[
 	* Copyright (c) 2011-2012 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/>.
 --]]
@@ -26,18 +26,18 @@ local L = {
 	LOCALE_UPDATE = "Set new locale to: %s",
 	LOCALE_PI_ACTIVE = "Player independent locale settings is now active.",
 	LOCALE_PI_INACTIVE = "Player independent locale settings is now inactive.",
-
+
 	-------------
 	-- General --
 	-------------
-
+
 	YES = "Yes",
 	NO = "No",
-
+
 	----------
 	-- Core --
 	----------
-
+
 	ADDON_LOAD = "AddOn loaded! Use /cmd help or !help for help.",
 	SVARS_OUTDATED = "Saved Variables out of date, resetting...",
 	NEWVERSION_NOTICE = "\124cffFF0000A new version of \124cff00FFFF%s\124cffFF0000 is available! \124cffFFFF00Check the site you downloaded from for the updated version.",
@@ -45,128 +45,130 @@ local L = {
 	DISABLED = "AddOn \124cffFF0000disabled\124r.",
 	DEBUGENABLED = "Debugging \124cff00FF00enabled\124r.",
 	DEBUGDISABLED = "Debugging \124cffFF0000disabled\124r.",
-
+
 	---------------
 	-- AddonComm --
 	---------------
-
+
 	AC_ERR_PREFIX = "[FATAL] Failed to register AddOn prefix %q. Maximum number of prefixes reached on client.",
 	AC_ERR_MSGTYPE = "Invalid message type specified: %s",
 	AC_ERR_MALFORMED_DATA = "Malformed data received from %s. Their AddOn is probably outdated.",
 	AC_ERR_MALFORMED_DATA_SEND = "[AddonComm] Malformed data detected (\"%s\"). Aborting Send...",
-
+
 	AC_GROUP_NORESP = "No response from group, running updater...",
 	AC_GROUP_R_UPDATE = "Updated group members, controller: %s",
 	AC_GROUP_LEFT = "Left group, resetting group variables...",
 	AC_GROUP_WAIT = "Waiting for group response...",
 	AC_GROUP_REMOVE = "Detected that %s is no longer in the group, removing and updating group members...",
 	AC_GROUP_SYNC = "Detected group handlers out of date! Sending sync message...",
-
+
 	AC_GUILD_NORESP = "No response from guild, running updater...",
 	AC_GUILD_R_UPDATE = "Updated guild members, controller: %s",
 	AC_GUILD_WAIT = "Waiting for guild response...",
-
+
 	-----------------
 	-- ChatManager --
 	-----------------
-
+
 	CHAT_ERR_CMDCHAR = "Command char has to be of type string.",
 	CHAT_CMDCHAR_SUCCESS = "Successfully set the command char to: %s",
 	CHAT_HANDLE_NOTCONTROLLER = "Not controller instance for \124cff00FFFF%s\124r, aborting.",
-
+
 	--------------------
 	-- CommandManager --
 	--------------------
-
+
 	CM_ERR_NOTALLOWED = "%s is not allowed to be used, %s.",
 	CM_ERR_NOACCESS = "You do not have permission to use that command, %s. Required access level: %d. Your access level: %d.",
 	CM_ERR_NOTREGGED = "%q is not a registered command.",
 	CM_ERR_NOCMDCHAR = "No command character specified.",
 	CM_ERR_NOCHAT = "This command is not allowed to be used from the chat.",
 	CM_ERR_CHATONLY = "This command can only be used from the chat.",
-
+	CM_ERR_DISABLED = "This command has been permanently disabled.",
+
 	CM_NO_HELP = "No help available.",
-
+
 	CM_DEFAULT_HELP = "Prints this help message.",
 	CM_DEFAULT_CHAT = "Type !commands for a listing of commands available.",
 	CM_DEFAULT_END = "End of help message.",
-
+
 	CM_COMMANDS_HELP = "Print all registered commands.",
-
+
 	CM_VERSION_HELP = "Print the version of Command.",
 	CM_VERSION = "%s",
-
+
 	CM_SET_HELP = "Control the settings of Command.",
 	CM_SET_USAGE = "Usage: set cmdchar|groupinvite|setlocale|locale",
 	CM_SET_GROUPINVITE_USAGE = "Usage: set groupinvite enable|disable|<time>",
 	CM_SET_SETLOCALE_USAGE = "Usage: set setlocale <locale>",
 	CM_SET_LOCALE_USAGE = "Usage: set locale reset|usemaster",
-
+
 	CM_MYLOCALE_HELP = "Let's users set their own locale.",
 	CM_MYLOCALE_SET = "Successfully set your locale to %s.",
-
+
 	CM_LOCK_HELP = "Lock a player.",
 	CM_UNLOCK_HELP = "Unlock a player.",
-
+
 	CM_GETACCESS_HELP = "Get the access level of a user.",
 	CM_GETACCESS_STRING = "%s's access is %d (%s)",
-
+
 	CM_SETACCESS_HELP = "Set the access level of a user.",
 	CM_SETACCESS_USAGE = "Usage: setaccess [player] <group>",
-
+
 	CM_OWNER_HELP = "Promote a player to owner rank.",
-
+
 	CM_ADMIN_HELP = "Promote a player to admin rank.",
 	CM_ADMIN_USAGE = "Usage: admin <name>",
-
+
 	CM_OP_HELP = "Promote a player to op rank.",
-
+
 	CM_USER_HELP = "Promote a player to user rank.",
-
+
 	CM_BAN_HELP = "Ban a player.",
 	CM_BAN_USAGE = "Usage: ban <name>",
-
+
 	CM_ACCEPTINVITE_HELP = "Accepts a pending group invite.",
 	CM_ACCEPTINVITE_NOTACTIVE = "No pending invites active.",
 	CM_ACCEPTINVITE_EXISTS = "I am already in a group.",
 	CM_ACCEPTINVITE_SUCCESS = "Accepted group invite!",
-
+
 	CM_INVITE_HELP = "Invite a player to group.",
-
+
 	CM_INVITEME_HELP = "Player who issued the command will be invited to group.",
-
+
 	CM_DENYINVITE_HELP = "Player issuing this command will no longer be sent invites from this AddOn.",
-
+
 	CM_ALLOWINVITE_HELP = "Player issuing this command will receive invites sent from this AddOn.",
-
+
 	CM_KICK_HELP = "Kick a player from group with optional reason (Requires confirmation).",
 	CM_KICK_USAGE = "Usage: kick <player> [reason]",
-
+
 	CM_KINGME_HELP = "Player issuing this command will be promoted to group leader.",
-
+
 	CM_OPME_HELP = "Player issuing this command will be promoted to raid assistant.",
-
+
 	CM_DEOPME_HELP = "Player issuing this command will be demoted from assistant status.",
-
+
 	CM_LEADER_HELP = "Promote a player to group leader.",
 	CM_LEADER_USAGE = "Usage: leader <name>",
-
+
 	CM_PROMOTE_HELP = "Promote a player to raid assistant.",
 	CM_PROMOTE_USAGE = "Usage: promote <name>",
-
+
 	CM_DEMOTE_HELP = "Demote a player from assistant status.",
 	CM_DEMOTE_USAGE = "Usage: demote <name>",
-
+
 	CM_QUEUE_HELP = "Enter the LFG queue for the specified category.",
 	CM_QUEUE_USAGE = "Usage: queue <type>",
 	CM_QUEUE_INVALID = "No such dungeon type: %q.",
-
+
 	CM_LEAVELFG_HELP = "Leave the LFG queue.",
 	CM_LEAVELFG_FAIL = "Not queued by command, unable to cancel.",
-
+
 	CM_ACCEPTLFG_HELP = "Causes you to accept the LFG invite.",
 	CM_ACCEPTLFG_FAIL = "Not currently queued by command.",
-
+	CM_ACCEPTLFG_NOEXIST = "There is currently no LFG proposal to accept.",
+
 	CM_CONVERT_HELP = "Convert group to party or raid.",
 	CM_CONVERT_USAGE = "Usage: convert party||raid",
 	CM_CONVERT_LFG = "LFG groups cannot be converted.",
@@ -177,34 +179,34 @@ local L = {
 	CM_CONVERT_RAID = "Converted party to raid.",
 	CM_CONVERT_RAIDFAIL = "Group is already a raid.",
 	CM_CONVERT_INVALID = "Invalid group type, only \"party\" or \"raid\" allowed.",
-
+
 	CM_LIST_HELP = "Toggle status of a command on the blacklist/whitelist.",
 	CM_LIST_USAGE = "Usage: list <command>",
-
+
 	CM_LISTMODE_HELP = "Toggle list between being a blacklist and being a whitelist.",
-
+
 	CM_GROUPALLOW_HELP = "Allow a group to use a specific command.",
 	CM_GROUPALLOW_USAGE = "Usage: groupallow <group> <command>",
-
+
 	CM_GROUPDENY_HELP = "Deny a group to use a specific command.",
 	CM_GROUPDENY_USAGE = "Usage: groupdeny <group> <command>",
-
+
 	CM_RESETGROUPACCESS_HELP = "Reset the group's access to a specific command.",
 	CM_RESETGROUPACCESS_USAGE = "Usage: resetgroupaccess <group> <command>",
-
+
 	CM_USERALLOW_HELP = "Allow a user to use a specific command.",
 	CM_USERALLOW_USAGE = "Usage: userallow <player> <command>",
-
+
 	CM_USERDENY_HELP = "Deny a user to use a specific command.",
 	CM_USERDENY_USAGE = "Usage: userdeny <player> <command>",
-
+
 	CM_RESETUSERACCESS_HELP = "Reset the user's access to a specific command.",
 	CM_RESETUSERACCESS_USAGE = "Usage: resetuseraccess <player> <command>",
-
+
 	CM_TOGGLE_HELP = "Toggle AddOn on and off.",
-
+
 	CM_TOGGLEDEBUG_HELP = "Toggle debugging mode on and off.",
-
+
 	CM_READYCHECK_HELP = "Respond to ready check or initiate a new one.",
 	CM_READYCHECK_ISSUED = "%s issued a ready check!",
 	CM_READYCHECK_NOPRIV = "Cannot initiate ready check when not leader or assistant.",
@@ -213,44 +215,44 @@ local L = {
 	CM_READYCHECK_DECLINED = "Declined ready check.",
 	CM_READYCHECK_INVALID = "Invalid argument: %s",
 	CM_READYCHECK_FAIL = "Failed to accept or decline ready check.",
-
+
 	CM_LOOT_HELP = "Provides various loot functions.",
 	CM_LOOT_USAGE = "Usage: loot type||threshold||master||pass",
 	CM_LOOT_LFG = "Cannot use loot command in LFG group.",
 	CM_LOOT_NOMETHOD = "No loot method specified.",
 	CM_LOOT_NOTHRESHOLD = "No loot threshold specified.",
 	CM_LOOT_NOMASTER = "No master looter specified.",
-
+
 	CM_ROLL_HELP = "Provides tools for managing or starting/stopping rolls.",
 	CM_ROLL_USAGE = "Usage: roll [start||stop||pass||time||do||set]",
 	CM_ROLL_START_USAGE = "Usage: roll start <[time] [item]>",
 	CM_ROLL_SET_USAGE = "Usage: roll set min||max||time <amount>",
-
+
 	CM_RAIDWARNING_HELP = "Sends a raid warning.",
 	CM_RAIDWARNING_USAGE = "Usage: raidwarning <message>",
 	CM_RAIDWARNING_NORAID = "Cannot send raid warning when not in a raid group.",
 	CM_RAIDWARNING_NOPRIV = "Cannot send raid warning: Not raid leader or assistant.",
 	CM_RAIDWARNING_SENT = "Sent raid warning.",
-
+
 	------------
 	-- Events --
 	------------
-
+
 	E_LFGPROPOSAL = "Group has been found, type !accept to make me accept the invite.",
 	E_LFGFAIL = "LFG failed, use !queue <type> to requeue.",
 	E_READYCHECK = "%s issued a ready check, type !rc accept to make me accept it or !rc deny to deny it.",
 	E_GROUPINVITE = "Type !acceptinvite to make me accept the group invite.",
-
+
 	------------------
 	-- EventHandler --
 	------------------
-
+
 	EH_REGISTERED = "%q registered.",
-
+
 	----------------------------
 	-- GroupInvite (Core-Sub) --
 	----------------------------
-
+
 	GI_ENABLED = "Group Invite (Announce) enabled.",
 	GI_DISABLED = "Group Invite (Announce) disabled.",
 	GI_DELAY_NUM = "Delay has to be a number.",
@@ -261,24 +263,24 @@ local L = {
 	------------
 	-- Logger --
 	------------
-
+
 	LOGGER_ERR_UNDEFINED = "Undefined logger level passed (%q)",
 	LOGGER_PREFIX_MAIN = "\124cff00FF00[%s]\124r",
 	LOGGER_PREFIX_DEBUG = " \124cffBBBBFFDebug\124r",
 	LOGGER_PREFIX_NORMAL = "",
 	LOGGER_PREFIX_WARNING = " \124cffFFFF00Warning\124r",
 	LOGGER_PREFIX_ERROR = " \124cffFF0000ERROR\124r",
-
+
 	-----------------
 	-- LootManager --
 	-----------------
-
+
 	LOOT_METHOD_GROUP = "Group Loot",
 	LOOT_METHOD_FFA = "Free For All",
 	LOOT_METHOD_MASTER = "Master Looter",
 	LOOT_METHOD_NEEDGREED = "Need Before Greed",
 	LOOT_METHOD_ROUNDROBIN = "Round Robin",
-
+
 	LOOT_THRESHOLD_UNCOMMON = "Uncommon",
 	LOOT_THRESHOLD_RARE = "Rare",
 	LOOT_THRESHOLD_EPIC = "Epic",
@@ -286,37 +288,37 @@ local L = {
 	LOOT_THRESHOLD_ARTIFACT = "Artifact",
 	LOOT_THRESHOLD_HEIRLOOM = "Heirloom",
 	LOOT_THRESHOLD_UNKNOWN = "Unknown",
-
+
 	LOOT_MASTER_NOEXIST = "%q is not in the group and cannot be set as the master looter.",
-
+
 	LOOT_SM_NOLEAD = "Unable to change loot method, not group leader.",
 	LOOT_SM_DUPE = "The loot method is already set to %s!",
 	LOOT_SM_SUCCESS = "Successfully set the loot method to %s!",
 	LOOT_SM_SUCCESSMASTER = "Successfully set the loot method to %s (%s)!",
-
+
 	LOOT_SLM_NOLOEAD = "Unable to change master looter, not group leader.",
 	LOOT_SLM_METHOD = "Cannot set master looter when loot method is set to %s.",
 	LOOT_SLM_SPECIFY = "Master looter not specified.",
 	LOOT_SLM_SUCCESS = "Successfully set %s as the master looter!",
-
+
 	LOOT_ST_NOLEAD = "Unable to change loot threshold, not group leader.",
 	LOOT_ST_INVALID = "Invalid loot threshold specified, please specify a loot threshold between 2 and 7 (inclusive).",
 	LOOT_ST_SUCCESS = "Successfully set the loot threshold to %s!",
-
+
 	LOOT_SP_PASS = "%s is now passing on loot.",
 	LOOT_SP_ROLL = "%s is not passing on loot.",
-
+
 	-------------------
 	-- PlayerManager --
 	-------------------
-
+
 	PM_ERR_NOCOMMAND = "No command specified.",
 	PM_ERR_LOCKED = "Target player is locked and cannot be modified.",
 	PM_ERR_NOTINGROUP = "%s is not in the group.",
-
+
 	PM_ACCESS_ALLOWED = "%q is now allowed for %s.",
 	PM_ACCESS_DENIED = "%q is now denied for %s.",
-
+
 	PM_KICK_REASON = "%s has been kicked on %s's request. (Reason: %s)",
 	PM_KICK = "%s has been kicked on %s's request.",
 	PM_KICK_NOTIFY = "%s was kicked on your request.",
@@ -328,25 +330,26 @@ local L = {
 	PM_KICK_DEFAULTREASON = "%s used !kick command.",
 	PM_KICK_WAIT = "Awaiting confirmation to kick %s...",
 	PM_KICK_NOPRIV = "Unable to kick %s from group. Not group leader or assistant.",
-
+	PM_KICK_TARGETASSIST = "Unable to kick %s, assistants cannot kick other assistants from group.",
+
 	PM_PLAYER_CREATE = "Created player %q with default settings.",
 	PM_PLAYER_UPDATE = "Updated player %q.",
-
+
 	PM_GA_REMOVED = "%q removed from group %s.",
 	PM_GA_EXISTSALLOW = "%q already has that command on the allow list.",
 	PM_GA_EXISTSDENY = "%q already has that command on the deny list.",
-
+
 	PM_PA_REMOVED = "%q removed from %s.",
 	PM_PA_EXISTSALLOW = "%s already has that command on the allow list.",
 	PM_PA_EXISTSDENY = "%s already has that command on the deny list.",
-
+
 	PM_LOCKED = "Player %s has been locked.",
 	PM_UNLOCKED = "Player %s has been unlocked",
-
+
 	PM_SAG_SELF = "Cannot modify my own access level.",
 	PM_SAG_NOEXIST = "No such access group: %q",
 	PM_SAG_SET = "Set the access level of %q to %d (%s).",
-
+
 	PM_INVITE_SELF = "Cannot invite myself to group.",
 	PM_INVITE_INGROUP = "%s is already in the group.",
 	PM_INVITE_FULL = "The group is already full.",
@@ -355,86 +358,86 @@ local L = {
 	PM_INVITE_SUCCESS = "Invited %s to group.",
 	PM_INVITE_BLOCKED = "%s does not wish to be invited.",
 	PM_INVITE_NOPRIV = "Unable to invite %s to group. Not group leader or assistant.",
-
+
 	PM_DI_BLOCKING = "You are now blocking invites, whisper !allowinvites to receive them again.",
 	PM_DI_SUCCESS = "%s is no longer receiving invites.",
 	PM_DI_FAIL = "You are already blocking invites.",
-
+
 	PM_AI_ALLOWING = "You are now allowing invites, whisper !blockinvites to block them.",
 	PM_AI_SUCCESS = "%s is now receiving invites.",
 	PM_AI_FAIL = "You are already allowing invites.",
-
+
 	PM_LEADER_SELF = "Cannot promote myself to leader.",
 	PM_LEADER_DUPE = "%s is already leader.",
 	PM_LEADER_SUCCESS = "Promoted %s to group leader.",
 	PM_LEADER_NOPRIV = "Cannot promote %s to group leader, insufficient permissions.",
-
+
 	PM_ASSIST_SELF = "Cannot promote myself to assistant.",
 	PM_ASSIST_DUPE = "%s is already assistant.",
 	PM_ASSIST_NORAID = "Cannot promote to assistant when not in a raid.",
 	PM_ASSIST_SUCCESS = "Promoted %s to assistant.",
 	PM_ASSIST_NOPRIV = "Cannot promote %s to assistant, insufficient permissions.",
-
+
 	PM_DEMOTE_SELF = "Cannot demote myself.",
 	PM_DEMOTE_INVALID = "%s is not an assistant, can only demote assistants.",
 	PM_DEMOTE_NORAID = "Cannot demote when not in a raid.",
 	PM_DEMOTE_SUCCESS = "Demoted %s.",
 	PM_DEMOTE_NOPRIV = "Cannot demote %s, insufficient permissions.",
-
+
 	PM_LIST_ADDWHITE = "Added %s to whitelist.",
 	PM_LIST_ADDBLACK = "Added %s to blacklist.",
 	PM_LIST_REMOVEWHITE = "Removed %s from whitelist.",
 	PM_LIST_REMOVEBLACK = "Removed %s from blacklist.",
 	PM_LIST_SETWHITE = "Now using list as whitelist.",
 	PM_LIST_SETBLACK = "Now using list as blacklist.",
-
+
 	------------------
 	-- QueueManager --
 	------------------
-
+
 	QM_QUEUE_START = "Starting queue for %s, please select your role(s)... Type !cancel to cancel.",
 	QM_CANCEL = "Left the LFG queue.",
 	QM_ACCEPT = "Accepted LFG invite.",
 	QM_ANNOUNCE_QUEUEING = "Now queueing for %s, type !cancel to cancel.",
 	QM_ANNOUNCE_ROLECANCEL = "Role Check cancelled.",
 	QM_ANNOUNCE_LFGCANCEL = "LFG cancelled.",
-
+
 	-----------------
 	-- RollManager --
 	-----------------
-
+
 	RM_ERR_INVALIDAMOUNT = "Invalid amount passed: %s.",
 	RM_ERR_NOTRUNNING = "No roll is currently in progress.",
 	RM_ERR_INVALIDROLL = "%s specified too high or too low roll region, not including their roll.",
-
+
 	RM_MATCH = "(%w+) rolls (%d+) %((%d+)-(%d+)%)",
-
+
 	RM_ROLLEXISTS = "%s has already rolled! (%d)",
 	RM_ROLLPROGRESS = "%d/%d players have rolled!",
-
+
 	RM_UPDATE_TIMELEFT = "%d seconds left to roll!",
-
+
 	RM_SET_MINFAIL = "Minimum roll number cannot be higher than maximum roll number!",
 	RM_SET_MINSUCCESS = "Successfully set minimum roll number to %d!",
 	RM_SET_MAXFAIL = "Maximum roll number cannot be higher than minimum roll number!",
 	RM_SET_MAXSUCCESS = "Successfully set maximum roll number to %d!",
 	RM_SET_TIMEFAIL = "Amount must be larger than zero (0).",
 	RM_SET_TIMESUCCESS = "Successfully set default roll time to %d!",
-
+
 	RM_START_RUNNING = "A roll is already in progress, wait for it to complete or use roll stop.",
 	RM_START_SENDER = "Could not identify sender: %s. Aborting roll...",
 	RM_START_MEMBERS = "Could not start roll, not enough group members!",
 	RM_START_SUCCESS = "%s started a roll, ends in %d seconds! Type /roll %d %d. Type !roll pass to pass.",
 	RM_START_SUCCESSITEM = "%s started a roll for %s, ends in %d seconds! Type /roll %d %d. Type !roll pass to pass.",
-
+
 	RM_STOP_SUCCESS = "Roll has been stopped.",
-
+
 	RM_DO_SUCCESS = "Done! Executed RandomRoll(%d, %d)",
-
+
 	RM_PASS_SUCCESS = "%s has passed on the roll.",
-
+
 	RM_TIME_LEFT = "%d seconds remaining!",
-
+
 	RM_ANNOUNCE_EXPIRE = "Roll time expired! Results...",
 	RM_ANNOUNCE_FINISH = "Everyone has rolled! Results...",
 	RM_ANNOUNCE_EMPTY = "Noone rolled, there is no winner!",
diff --git a/locales/svSE.lua b/locales/svSE.lua
index 369ccd2..d48f72a 100644
--- a/locales/svSE.lua
+++ b/locales/svSE.lua
@@ -1,18 +1,18 @@
 --[[
 	* Copyright (c) 2011-2012 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/>.
 --]]
@@ -26,18 +26,18 @@ local L = {
 	LOCALE_UPDATE = "Nytt språk inställt till: %s",
 	LOCALE_PI_ACTIVE = "Språkinställningar per-användare är nu aktivt.",
 	LOCALE_PI_INACTIVE = "Språkinställningar per-användare är nu inaktivt.",
-
+
 	-------------
 	-- General --
 	-------------
-
+
 	YES = "Ja",
 	NO = "Nej",
-
+
 	----------
 	-- Core --
 	----------
-
+
 	ADDON_LOAD = "AddOn initialiserad! Använd /cmd help eller !help för hjälp.",
 	SVARS_OUTDATED = "Sparade variabler inaktuella, återställer...",
 	NEWVERSION_NOTICE = "\124cffFF0000En ny version av \124cff00FFFF%s\124cffFF0000 är tillgänglig! \124cffFFFF00Gå till sidan där du laddade ned Command för att installera den.",
@@ -45,128 +45,130 @@ local L = {
 	DISABLED = "AddOn \124cffFF0000avaktiverad\124r.",
 	DEBUGENABLED = "Debugging \124cff00FF00aktiverat\124r.",
 	DEBUGDISABLED = "Debugging \124cffFF0000avaktiverat\124r.",
-
+
 	---------------
 	-- AddonComm --
 	---------------
-
+
 	AC_ERR_PREFIX = "[KRITISK] Misslyckades med att registrera AddOn prefix %q. Maximalt antal prefix har nåtts på klienten.",
 	AC_ERR_MSGTYPE = "Ogiltig meddelandetyp: %s",
 	AC_ERR_MALFORMED_DATA = "Ogiltig data från %s. Deras AddOn är antagligen inaktuell.",
 	AC_ERR_MALFORMED_DATA_SEND = "[AddonComm] Malformed data detected (\"%s\"). Aborting Send...",
-
+
 	AC_GROUP_NORESP = "Inget svar från grupp, uppdaterar...",
 	AC_GROUP_R_UPDATE = "Gruppmedlemmar uppdaterade, kontrollerare: %s",
 	AC_GROUP_LEFT = "Grupp lämnad, återställer gruppvariabler...",
 	AC_GROUP_WAIT = "Väntar på gruppsvar...",
 	AC_GROUP_REMOVE = "Upptäckte att %s inte längre är i gruppen, tar bort och uppdaterar gruppmedlemmar...",
 	AC_GROUP_SYNC = "Grupphanterare inaktuella! Skickar synkmeddelande...",
-
+
 	AC_GUILD_NORESP = "Inget svar från guild, uppdaterar...",
 	AC_GUILD_R_UPDATE = "Guildmedlemmar uppdaterade, kontrollerare: %s",
 	AC_GUILD_WAIT = "Väntar på guildsvar...",
-
+
 	-----------------
 	-- ChatManager --
 	-----------------
-
+
 	CHAT_ERR_CMDCHAR = "Kommandotecken måste vara ett tecken.",
 	CHAT_CMDCHAR_SUCCESS = "Nytt kommandotecken inställt till: %s",
 	CHAT_HANDLE_NOTCONTROLLER = "Ej kontroller för \124cff00FFFF%s\124r, avbryter.",
-
+
 	--------------------
 	-- CommandManager --
 	--------------------
-
+
 	CM_ERR_NOTALLOWED = "%s är inte tillåtet att användas, %s.",
 	CM_ERR_NOACCESS = "Du har inte tillåtelse att använda det kommandot, %s. Behörighet som krävs: %d. Din behörighet: %d.",
 	CM_ERR_NOTREGGED = "%q är inte ett registrerat kommando.",
 	CM_ERR_NOCMDCHAR = "Inget kommandotecken angivet.",
 	CM_ERR_NOCHAT = "Det här kommandot kan inte användas från chatten.",
 	CM_ERR_CHATONLY = "Det här kommandot kan endast användas från chatten.",
-
+	CM_ERR_DISABLED = "Det här kommandot har blivit permanent avstängt.",
+
 	CM_NO_HELP = "Ingen hjälp tillgänglig.",
-
+
 	CM_DEFAULT_HELP = "Visar det här hjälpmeddelandet.",
 	CM_DEFAULT_CHAT = "Skriv !commands för en lista över kommandon.",
 	CM_DEFAULT_END = "Slut på hjälpmeddelandet.",
-
+
 	CM_COMMANDS_HELP = "Visa alla registrerade kommandon.",
-
+
 	CM_VERSION_HELP = "Visa versionen av Command",
 	CM_VERSION = "%s",
-
+
 	CM_SET_HELP = "Ändra inställningarna i Command.",
 	CM_SET_USAGE = "Användning: set cmdchar|groupinvite|setlocale|locale",
 	CM_SET_GROUPINVITE_USAGE = "Användning: set groupinvite enable|disable|<tid>",
 	CM_SET_SETLOCALE_USAGE = "Användning: set setlocale <språk>",
 	CM_SET_LOCALE_USAGE = "Användning: set locale reset|usemaster",
-
+
 	CM_MYLOCALE_HELP = "Låter användare ställa in sitt eget språk.",
 	CM_MYLOCALE_SET = "Ditt språk är nu inställt till %s.",
-
+
 	CM_LOCK_HELP = "Lås en användare.",
 	CM_UNLOCK_HELP = "Lås upp en användare.",
-
+
 	CM_GETACCESS_HELP = "Visa en användares behörighetsnivå.",
 	CM_GETACCESS_STRING = "%ss behörighet är %d (%s)",
-
+
 	CM_SETACCESS_HELP = "Ändra en användares behörighetsnivå/grupp.",
 	CM_SETACCESS_USAGE = "Användning: setaccess [namn] <grupp>",
-
+
 	CM_OWNER_HELP = "Befordra en användare till ägarnivå.",
-
+
 	CM_ADMIN_HELP = "Befordra en användare till adminnivå.",
 	CM_ADMIN_USAGE = "Användning: admin <namn>",
-
+
 	CM_OP_HELP = "Befordra en användare till operatörnivå.",
-
+
 	CM_USER_HELP = "Befordra en användare till användarnivå.",
-
+
 	CM_BAN_HELP = "Bannlys en användare.",
 	CM_BAN_USAGE = "Användning: ban <namn>",
-
+
 	CM_ACCEPTINVITE_HELP = "Accepterar en pågående gruppinbjudan.",
 	CM_ACCEPTINVITE_NOTACTIVE = "Inga aktiva inbjudningar just nu.",
 	CM_ACCEPTINVITE_EXISTS = "Jag är redan i en grupp.",
 	CM_ACCEPTINVITE_SUCCESS = "Accepterade gruppinbjudningen!",
-
+
 	CM_INVITE_HELP = "Bjuder in en användare till gruppen.",
-
+
 	CM_INVITEME_HELP = "Användaren som skickar kommandot bjuds in till gruppen.",
-
+
 	CM_DENYINVITE_HELP = "Användare som använder det här kommandot kommer inte längre att få gruppinbjudningar.",
-
+
 	CM_ALLOWINVITE_HELP = "Användare som använder det här kommandot kommer att få gruppinbjudningar.",
-
+
 	CM_KICK_HELP = "Sparka ut en spelare från gruppen med valfri anledning (Kräver konfirmation).",
 	CM_KICK_USAGE = "Användning: kick <spelare> [anledning]",
-
+
 	CM_KINGME_HELP = "Player issuing this command will be promoted to group leader.",
-
+
 	CM_OPME_HELP = "Player issuing this command will be promoted to raid assistant.",
-
+
 	CM_DEOPME_HELP = "Player issuing this command will be demoted from assistant status.",
-
+
 	CM_LEADER_HELP = "Promote a player to group leader.",
 	CM_LEADER_USAGE = "Usage: leader <name>",
-
+
 	CM_PROMOTE_HELP = "Promote a player to raid assistant.",
 	CM_PROMOTE_USAGE = "Usage: promote <name>",
-
+
 	CM_DEMOTE_HELP = "Demote a player from assistant status.",
 	CM_DEMOTE_USAGE = "Usage: demote <name>",
-
+
 	CM_QUEUE_HELP = "Enter the LFG queue for the specified category.",
 	CM_QUEUE_USAGE = "Usage: queue <type>",
 	CM_QUEUE_INVALID = "No such dungeon type: %q.",
-
+
 	CM_LEAVELFG_HELP = "Lämna LFG-kön.",
 	CM_LEAVELFG_FAIL = "Not queued by command, unable to cancel.",
-
+
 	CM_ACCEPTLFG_HELP = "Causes you to accept the LFG invite.",
 	CM_ACCEPTLFG_FAIL = "Not currently queued by command.",
-
+	CM_ACCEPTLFG_NOEXIST = "There is currently no LFG proposal to accept.",
+
 	CM_CONVERT_HELP = "Convert group to party or raid.",
 	CM_CONVERT_USAGE = "Usage: convert party||raid",
 	CM_CONVERT_LFG = "LFG groups cannot be converted.",
@@ -177,34 +179,34 @@ local L = {
 	CM_CONVERT_RAID = "Converted party to raid.",
 	CM_CONVERT_RAIDFAIL = "Group is already a raid.",
 	CM_CONVERT_INVALID = "Invalid group type, only \"party\" or \"raid\" allowed.",
-
+
 	CM_LIST_HELP = "Toggle status of a command on the blacklist/whitelist.",
 	CM_LIST_USAGE = "Usage: list <command>",
-
+
 	CM_LISTMODE_HELP = "Toggle list between being a blacklist and being a whitelist.",
-
+
 	CM_GROUPALLOW_HELP = "Allow a group to use a specific command.",
 	CM_GROUPALLOW_USAGE = "Usage: groupallow <group> <command>",
-
+
 	CM_GROUPDENY_HELP = "Deny a group to use a specific command.",
 	CM_GROUPDENY_USAGE = "Usage: groupdeny <group> <command>",
-
+
 	CM_RESETGROUPACCESS_HELP = "Reset the group's access to a specific command.",
 	CM_RESETGROUPACCESS_USAGE = "Usage: resetgroupaccess <group> <command>",
-
+
 	CM_USERALLOW_HELP = "Allow a user to use a specific command.",
 	CM_USERALLOW_USAGE = "Usage: userallow <player> <command>",
-
+
 	CM_USERDENY_HELP = "Deny a user to use a specific command.",
 	CM_USERDENY_USAGE = "Usage: userdeny <player> <command>",
-
+
 	CM_RESETUSERACCESS_HELP = "Reset the user's access to a specific command.",
 	CM_RESETUSERACCESS_USAGE = "Usage: resetuseraccess <player> <command>",
-
+
 	CM_TOGGLE_HELP = "Toggle AddOn on and off.",
-
+
 	CM_TOGGLEDEBUG_HELP = "Toggle debugging mode on and off.",
-
+
 	CM_READYCHECK_HELP = "Respond to ready check or initiate a new one.",
 	CM_READYCHECK_ISSUED = "%s issued a ready check!",
 	CM_READYCHECK_NOPRIV = "Cannot initiate ready check when not leader or assistant.",
@@ -213,44 +215,44 @@ local L = {
 	CM_READYCHECK_DECLINED = "Declined ready check.",
 	CM_READYCHECK_INVALID = "Invalid argument: %s",
 	CM_READYCHECK_FAIL = "Failed to accept or decline ready check.",
-
+
 	CM_LOOT_HELP = "Provides various loot functions.",
 	CM_LOOT_USAGE = "Usage: loot type||threshold||master||pass",
 	CM_LOOT_LFG = "Cannot use loot command in LFG group.",
 	CM_LOOT_NOMETHOD = "No loot method specified.",
 	CM_LOOT_NOTHRESHOLD = "No loot threshold specified.",
 	CM_LOOT_NOMASTER = "No master looter specified.",
-
+
 	CM_ROLL_HELP = "Provides tools for managing or starting/stopping rolls.",
 	CM_ROLL_USAGE = "Usage: roll [start||stop||pass||time||do||set]",
 	CM_ROLL_START_USAGE = "Usage: roll start <[time] [item]>",
 	CM_ROLL_SET_USAGE = "Usage: roll set min||max||time <amount>",
-
+
 	CM_RAIDWARNING_HELP = "Sends a raid warning.",
 	CM_RAIDWARNING_USAGE = "Usage: raidwarning <message>",
 	CM_RAIDWARNING_NORAID = "Cannot send raid warning when not in a raid group.",
 	CM_RAIDWARNING_NOPRIV = "Cannot send raid warning: Not raid leader or assistant.",
 	CM_RAIDWARNING_SENT = "Sent raid warning.",
-
+
 	------------
 	-- Events --
 	------------
-
+
 	E_LFGPROPOSAL = "Group has been found, type !accept to make me accept the invite.",
 	E_LFGFAIL = "LFG failed, use !queue <type> to requeue.",
 	E_READYCHECK = "%s issued a ready check, type !rc accept to make me accept it or !rc deny to deny it.",
 	E_GROUPINVITE = "Type !acceptinvite to make me accept the group invite.",
-
+
 	------------------
 	-- EventHandler --
 	------------------
-
+
 	EH_REGISTERED = "%q registered.",
-
+
 	----------------------------
 	-- GroupInvite (Core-Sub) --
 	----------------------------
-
+
 	GI_ENABLED = "Group Invite (Announce) enabled.",
 	GI_DISABLED = "Group Invite (Announce) disabled.",
 	GI_DELAY_NUM = "Delay has to be a number.",
@@ -261,24 +263,24 @@ local L = {
 	------------
 	-- Logger --
 	------------
-
+
 	LOGGER_ERR_UNDEFINED = "Undefined logger level passed (%q)",
 	LOGGER_PREFIX_MAIN = "\124cff00FF00[%s]\124r",
 	LOGGER_PREFIX_DEBUG = " \124cffBBBBFFDebug\124r",
 	LOGGER_PREFIX_NORMAL = "",
 	LOGGER_PREFIX_WARNING = " \124cffFFFF00Warning\124r",
 	LOGGER_PREFIX_ERROR = " \124cffFF0000ERROR\124r",
-
+
 	-----------------
 	-- LootManager --
 	-----------------
-
+
 	LOOT_METHOD_GROUP = "Group Loot",
 	LOOT_METHOD_FFA = "Free For All",
 	LOOT_METHOD_MASTER = "Master Looter",
 	LOOT_METHOD_NEEDGREED = "Need Before Greed",
 	LOOT_METHOD_ROUNDROBIN = "Round Robin",
-
+
 	LOOT_THRESHOLD_UNCOMMON = "Uncommon",
 	LOOT_THRESHOLD_RARE = "Rare",
 	LOOT_THRESHOLD_EPIC = "Epic",
@@ -286,37 +288,37 @@ local L = {
 	LOOT_THRESHOLD_ARTIFACT = "Artifact",
 	LOOT_THRESHOLD_HEIRLOOM = "Heirloom",
 	LOOT_THRESHOLD_UNKNOWN = "Unknown",
-
+
 	LOOT_MASTER_NOEXIST = "%q is not in the group and cannot be set as the master looter.",
-
+
 	LOOT_SM_NOLEAD = "Unable to change loot method, not group leader.",
 	LOOT_SM_DUPE = "The loot method is already set to %s!",
 	LOOT_SM_SUCCESS = "Successfully set the loot method to %s!",
 	LOOT_SM_SUCCESSMASTER = "Successfully set the loot method to %s (%s)!",
-
+
 	LOOT_SLM_NOLOEAD = "Unable to change master looter, not group leader.",
 	LOOT_SLM_METHOD = "Cannot set master looter when loot method is set to %s.",
 	LOOT_SLM_SPECIFY = "Master looter not specified.",
 	LOOT_SLM_SUCCESS = "Successfully set %s as the master looter!",
-
+
 	LOOT_ST_NOLEAD = "Unable to change loot threshold, not group leader.",
 	LOOT_ST_INVALID = "Invalid loot threshold specified, please specify a loot threshold between 2 and 7 (inclusive).",
 	LOOT_ST_SUCCESS = "Successfully set the loot threshold to %s!",
-
+
 	LOOT_SP_PASS = "%s is now passing on loot.",
 	LOOT_SP_ROLL = "%s is not passing on loot.",
-
+
 	-------------------
 	-- PlayerManager --
 	-------------------
-
+
 	PM_ERR_NOCOMMAND = "No command specified.",
 	PM_ERR_LOCKED = "Target player is locked and cannot be modified.",
 	PM_ERR_NOTINGROUP = "%s is not in the group.",
-
+
 	PM_ACCESS_ALLOWED = "%q is now allowed for %s.",
 	PM_ACCESS_DENIED = "%q is now denied for %s.",
-
+
 	PM_KICK_REASON = "%s has been kicked on %s's request. (Reason: %s)",
 	PM_KICK = "%s has been kicked on %s's request.",
 	PM_KICK_NOTIFY = "%s was kicked on your request.",
@@ -328,25 +330,26 @@ local L = {
 	PM_KICK_DEFAULTREASON = "%s used !kick command.",
 	PM_KICK_WAIT = "Awaiting confirmation to kick %s...",
 	PM_KICK_NOPRIV = "Unable to kick %s from group. Not group leader or assistant.",
-
+	PM_KICK_TARGETASSIST = "Unable to kick %s, assistants cannot kick other assistants from group.",
+
 	PM_PLAYER_CREATE = "Created player %q with default settings.",
 	PM_PLAYER_UPDATE = "Updated player %q.",
-
+
 	PM_GA_REMOVED = "%q removed from group %s.",
 	PM_GA_EXISTSALLOW = "%q already has that command on the allow list.",
 	PM_GA_EXISTSDENY = "%q already has that command on the deny list.",
-
+
 	PM_PA_REMOVED = "%q removed from %s.",
 	PM_PA_EXISTSALLOW = "%s already has that command on the allow list.",
 	PM_PA_EXISTSDENY = "%s already has that command on the deny list.",
-
+
 	PM_LOCKED = "Player %s has been locked.",
 	PM_UNLOCKED = "Player %s has been unlocked",
-
+
 	PM_SAG_SELF = "Cannot modify my own access level.",
 	PM_SAG_NOEXIST = "No such access group: %q",
 	PM_SAG_SET = "Set the access level of %q to %d (%s).",
-
+
 	PM_INVITE_SELF = "Cannot invite myself to group.",
 	PM_INVITE_INGROUP = "%s is already in the group.",
 	PM_INVITE_FULL = "The group is already full.",
@@ -355,86 +358,86 @@ local L = {
 	PM_INVITE_SUCCESS = "Invited %s to group.",
 	PM_INVITE_BLOCKED = "%s does not wish to be invited.",
 	PM_INVITE_NOPRIV = "Unable to invite %s to group. Not group leader or assistant.",
-
+
 	PM_DI_BLOCKING = "You are now blocking invites, whisper !allowinvites to receive them again.",
 	PM_DI_SUCCESS = "%s is no longer receiving invites.",
 	PM_DI_FAIL = "You are already blocking invites.",
-
+
 	PM_AI_ALLOWING = "You are now allowing invites, whisper !blockinvites to block them.",
 	PM_AI_SUCCESS = "%s is now receiving invites.",
 	PM_AI_FAIL = "You are already allowing invites.",
-
+
 	PM_LEADER_SELF = "Cannot promote myself to leader.",
 	PM_LEADER_DUPE = "%s is already leader.",
 	PM_LEADER_SUCCESS = "Promoted %s to group leader.",
 	PM_LEADER_NOPRIV = "Cannot promote %s to group leader, insufficient permissions.",
-
+
 	PM_ASSIST_SELF = "Cannot promote myself to assistant.",
 	PM_ASSIST_DUPE = "%s is already assistant.",
 	PM_ASSIST_NORAID = "Cannot promote to assistant when not in a raid.",
 	PM_ASSIST_SUCCESS = "Promoted %s to assistant.",
 	PM_ASSIST_NOPRIV = "Cannot promote %s to assistant, insufficient permissions.",
-
+
 	PM_DEMOTE_SELF = "Cannot demote myself.",
 	PM_DEMOTE_INVALID = "%s is not an assistant, can only demote assistants.",
 	PM_DEMOTE_NORAID = "Cannot demote when not in a raid.",
 	PM_DEMOTE_SUCCESS = "Demoted %s.",
 	PM_DEMOTE_NOPRIV = "Cannot demote %s, insufficient permissions.",
-
+
 	PM_LIST_ADDWHITE = "Added %s to whitelist.",
 	PM_LIST_ADDBLACK = "Added %s to blacklist.",
 	PM_LIST_REMOVEWHITE = "Removed %s from whitelist.",
 	PM_LIST_REMOVEBLACK = "Removed %s from blacklist.",
 	PM_LIST_SETWHITE = "Now using list as whitelist.",
 	PM_LIST_SETBLACK = "Now using list as blacklist.",
-
+
 	------------------
 	-- QueueManager --
 	------------------
-
+
 	QM_QUEUE_START = "Starting queue for %s, please select your role(s)... Type !cancel to cancel.",
 	QM_CANCEL = "Left the LFG queue.",
 	QM_ACCEPT = "Accepted LFG invite.",
 	QM_ANNOUNCE_QUEUEING = "Now queueing for %s, type !cancel to cancel.",
 	QM_ANNOUNCE_ROLECANCEL = "Role Check cancelled.",
 	QM_ANNOUNCE_LFGCANCEL = "LFG cancelled.",
-
+
 	-----------------
 	-- RollManager --
 	-----------------
-
+
 	RM_ERR_INVALIDAMOUNT = "Invalid amount passed: %s.",
 	RM_ERR_NOTRUNNING = "No roll is currently in progress.",
 	RM_ERR_INVALIDROLL = "%s specified too high or too low roll region, not including their roll.",
-
+
 	RM_MATCH = "(%w+) rolls (%d+) %((%d+)-(%d+)%)", -- Same as enUS since svSE has no official client support.
-
+
 	RM_ROLLEXISTS = "%s has already rolled! (%d)",
 	RM_ROLLPROGRESS = "%d/%d spelare har rolled!",
-
+
 	RM_UPDATE_TIMELEFT = "%d seconds left to roll!",
-
+
 	RM_SET_MINFAIL = "Minimum roll number cannot be higher than maximum roll number!",
 	RM_SET_MINSUCCESS = "Successfully set minimum roll number to %d!",
 	RM_SET_MAXFAIL = "Maximum roll number cannot be higher than minimum roll number!",
 	RM_SET_MAXSUCCESS = "Successfully set maximum roll number to %d!",
 	RM_SET_TIMEFAIL = "Amount must be larger than zero (0).",
 	RM_SET_TIMESUCCESS = "Successfully set default roll time to %d!",
-
+
 	RM_START_RUNNING = "A roll is already in progress, wait for it to complete or use roll stop.",
 	RM_START_SENDER = "Could not identify sender: %s. Aborting roll...",
 	RM_START_MEMBERS = "Could not start roll, not enough group members!",
 	RM_START_SUCCESS = "%s started a roll, ends in %d seconds! Type /roll %d %d. Type !roll pass to pass.",
 	RM_START_SUCCESSITEM = "%s started a roll for %s, ends in %d seconds! Type /roll %d %d. Type !roll pass to pass.",
-
+
 	RM_STOP_SUCCESS = "Roll has been stopped.",
-
+
 	RM_DO_SUCCESS = "Done! Executed RandomRoll(%d, %d)",
-
+
 	RM_PASS_SUCCESS = "%s has passed on the roll.",
-
+
 	RM_TIME_LEFT = "%d seconds remaining!",
-
+
 	RM_ANNOUNCE_EXPIRE = "Roll time expired! Results...",
 	RM_ANNOUNCE_FINISH = "Everyone has rolled! Results...",
 	RM_ANNOUNCE_EMPTY = "Noone rolled, there is no winner!",