--[[ * 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/>. --]] -- Upvalues local type = type local floor = math.floor local tostring = tostring -- API Upvalues local CreateFrame = CreateFrame local CancelSummon = CancelSummon local ConfirmSummon = ConfirmSummon local StaticPopup_Hide = StaticPopup_Hide local StaticPopup_Visible = StaticPopup_Visible local GetSummonConfirmSummoner = GetSummonConfirmSummoner local GetSummonConfirmAreaName = GetSummonConfirmAreaName local GetSummonConfirmTimeLeft = GetSummonConfirmTimeLeft local C = Command C.SummonManager = { VarVersion = 1 } local L = C.LocaleManager local SM = C.SummonManager local CM local GT = C.GroupTools local CEN = C.Extensions.Number local DEFAULT_DELAY = 5 local MAX_DELAY = 110 -- 1 minute 50 seconds, summons expire after 2 minutes (usually) local LastSummoner function SM:Init() CM = C.ChatManager LastSummoner = L("UNKNOWN") self:LoadSavedVars() end function SM:LoadSavedVars() if type(C.Global["SUMMON_MANAGER"]) ~= "table" then C.Global["SUMMON_MANAGER"] = {} end self.Settings = C.Global["SUMMON_MANAGER"] if not self.Settings.VERSION or self.Settings.VERSION < self.VarVersion then wipe(self.Settings) end if type(self.Settings.ENABLED) ~= "boolean" then self.Settings.ENABLED = true end if type(self.Settings.ANNOUNCE) ~= "boolean" then self.Settings.ANNOUNCE = true end if type(self.Settings.DELAY) ~= "number" then self.Settings.DELAY = DEFAULT_DELAY end self.Settings.VERSION = self.VarVersion end function SM:OnSummon() if self.DelayActive then return end if self.Settings.DELAY > 0 then self.DelayActive = true local frame = CreateFrame("Frame") frame.Time = 0 -- Current time frame.Delay = self.Settings.DELAY -- Delay to wait frame:SetScript("OnUpdate", function(self, elapsed) self.Time = self.Time + elapsed if self.Time >= self.Delay then self:SetScript("OnUpdate", nil) SM.DelayActive = false if SM:HasSummon() then SM:Announce() end end end) else self:Announce() end end function SM:Announce() if not self:HasSummon() or not self.Settings.ANNOUNCE then return end local name = GetSummonConfirmSummoner() local area = GetSummonConfirmAreaName() local left = GetSummonConfirmTimeLeft() if not name or not area or not left or left <= 0 then return end left = CEN:FormatSeconds(left) LastSummoner = name local channel = "SMART" if not GT:IsGroup() then channel = "WHISPER" end CM:SendMessage(L("SM_ONSUMMON"):format(area, name, left), channel, name) end function SM:AcceptSummon() if not self:HasSummon() then return false, "SM_ERR_NOSUMMON" end ConfirmSummon() if StaticPopup_Visible("CONFIRM_SUMMON") then StaticPopup_Hide("CONFIRM_SUMMON") end return "SM_ACCEPTED", {LastSummoner} end function SM:DeclineSummon() if not self:HasSummon() then return false, "SM_ERR_NOSUMMON" end CancelSummon() if StaticPopup_Visible("CONFIRM_SUMMON") then StaticPopup_Hide("CONFIRM_SUMMON") end return "SM_DECLINED", {LastSummoner} end function SM:HasSummon() return GetSummonConfirmTimeLeft() > 0 and StaticPopup_Visible("CONFIRM_SUMMON") end function SM:IsEnabled() return self.Settings.ENABLED end function SM:Enable() self.Settings.ENABLED = true return "SM_ENABLED" end function SM:Disable() self.Settings.ENABLED = false return "SM_DISABLED" end function SM:Toggle() if self:IsEnabled() then return self:Disable() end return self:Enable() end function SM:EnableAnnounce() self.Settings.ANNOUNCE = true return "SM_ANNOUNCE_ENABLED" end function SM:DisableAnnounce() self.Settings.ANNOUNCE = false return "SM_ANNOUNCE_DISABLED" end function SM:ToggleAnnounce() if self:IsAnnounceEnabled() then return self:DisableAnnounce() end return self:EnableAnnounce() end function SM:IsAnnounceEnabled() return self.Settings.ANNOUNCE end function SM:GetDelay() return FormatSeconds(self:GetRawDelay()) end function SM:GetRawDelay() return self.Settings.DELAY end function SM:SetDelay(amount) if amount < 0 then amount = 0 elseif amount > MAX_DELAY then amount = MAX_DELAY end self.Settings.DELAY = amount if amount > 0 then return "SM_SETDELAY_SUCCESS", {CEN:FormatSeconds(amount)} end return "SM_SETDELAY_INSTANT" end