Mercurial > wow > icu
diff ICU.lua @ 0:98c6f55e6619
First commit
author | Xiiph |
---|---|
date | Sat, 05 Feb 2011 16:45:02 +0100 |
parents | |
children | 6af2d0a0c537 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ICU.lua Sat Feb 05 16:45:02 2011 +0100 @@ -0,0 +1,364 @@ +local L = LibStub("AceLocale-3.0"):GetLocale("ICU") +if not L then return end + +local icu = LibStub("AceAddon-3.0"):NewAddon("ICU", "AceEvent-3.0", "AceTimer-3.0"); + +-- Accepted flasks +local flaskID = { + 79469, -- Flask of Steelskin + 79470, -- Flask of the Draconic Mind + 79471, -- Flask of the Winds + 79472, -- Flask of Titanic Strength + 94160, -- Flask of Flowing Water + }; + +-- Accepted well-fed buffs +local foodID = { + 87545, -- 90 Strength + 87546, -- 90 Agility + 87547, -- 90 Intellect + 87548, -- 90 Spirit + 87549, -- 90 Mastery + 87550, -- 90 Hit + 87551, -- 90 Crit + 87552, -- 90 Haste + }; + + +local minFlaskDuration = 10; +local noFlask, noFood, hasLowDuration = {},{},{}; + +local defaults = { + profile = { + checkFlask = true, + checkFood = true, + checkLowFlaskDuration = true, + remindRaider = true, + reportResults = true, + reportDestination = "OFFICER", + manualCheckOnly = false, + checkAfterFinish = true, + advertiseICU = true, + noFoodMessage = L["Well Fed reminder!"], + noFlaskMessage = L["Flask reminder!"], + lowFlaskDurationMessage = L["Your Flask runs out in less than 10 minutes!"], + } +} + +function icu:OnInitialize() + self.db = LibStub("AceDB-3.0"):New("icuDB", defaults, true) + + self.db.RegisterCallback(self, "OnProfileChanged", "refreshConfig") + self.db.RegisterCallback(self, "OnProfileCopied", "refreshConfig") + self.db.RegisterCallback(self, "OnProfileReset", "refreshConfig") + + self.options = self:getOptions() + + local AceConfig = LibStub("AceConfig-3.0") + local AceConfigDialog = LibStub("AceConfigDialog-3.0") + + AceConfig:RegisterOptionsTable("ICU", self.options, {"icu"}) + + AceConfigDialog:AddToBlizOptions("ICU", nil, nil, "general") + AceConfigDialog:AddToBlizOptions("ICU", "Profiles","ICU","profile") +end + +function icu:refreshConfig() + --print("ICU: Config refreshing ..."); + + if self.db.profile.manualCheckOnly then + icu:UnregisterEvent("READY_CHECK"); + else + icu:RegisterEvent("READY_CHECK"); + end + + --print("ICU: Config refreshed!"); +end + +function icu:config() + InterfaceOptionsFrame_OpenToCategory("ICU") +end + +function icu:getOptions() + local options = { + handler = icu, + type = 'group', + args = { + config = { + name = L["Options"], + desc = L["Shows the blizzard addon configuration window"], + type = 'execute', + func = "config", + hidden = true, + cmdHidden = false, + }, + check = { + name = L["Raid Check"], + desc = L["Checks the raid for flask/food buffs"], + type = 'execute', + func = function() self:inspectRaid(false) end, + hidden = true, + cmdHidden = false, + }, + quiet = { + name = L["Raid Check (Silent)"], + desc = L["Checks the raid for flask/food buffs, but does not remind raiders, regardless of other settings."], + type = 'execute', + func = function() self:inspectRaid(true) end, + hidden = true, + cmdHidden = false, + }, + general = { + name = L["General Settings"], + type = 'group', + args = { + checkFlask = { + type = 'toggle', + name = L["Check for Flask"], + desc = L["Checks the raid for valid flasks and reports results"], + set = function(o,v,...) self.db.profile.checkFlask = v end, + get = function() return self.db.profile.checkFlask end, + }, + checkLowFlaskDuration = { + type = 'toggle', + name = L["Flask expiration"], + desc = L["Check for soon to expire flask buffs"], + set = function(o,v,...) self.db.profile.checkLowFlaskDuration = v end, + get = function() return self.db.profile.checkLowFlaskDuration end, + }, + checkFood = { + type = 'toggle', + name = L["Check for Food"], + desc = L["Checks the raid for valid food buffs and reports results"], + set = function(o,v,...) self.db.profile.checkFood = v end, + get = function() return self.db.profile.checkFood end, + }, + advertiseICU = { + type = 'toggle', + name = L["Advertise ICU"], + desc = L["Let everyone know you are using ICU! Prefixes whispers and reports"], + set = function(o,v,...) self.db.profile.advertiseICU = v end, + get = function() return self.db.profile.advertiseICU end, + }, + remindRaider = { + type = 'toggle', + name = L["Raid reminder"], + desc = L["Whisper the raider lacking (or soon to expire, if enabled) food/flask buff a reminder"], + set = function(o,v,...) self.db.profile.remindRaider = v end, + get = function() return self.db.profile.remindRaider end, + }, + reportResults = { + type = 'toggle', + name = L["Report results"], + desc = L["Report the results after finishing"], + set = function(o,v,...) self.db.profile.reportResults = v end, + get = function() return self.db.profile.reportResults end, + }, + reportDestination = { + type = 'select', + style = "dropdown", + name = L["Report Destination"], + desc = L["Report the results to the following channel"], + values = { + ["OFFICER"] = L["Officer"], + ["SAY"] = L["Say"], + ["RAID"] = L["Raid"], + ["GUILD"] = L["Guild"], + ["SELF"] = L["Self"], + }, + set = function(o,v,...) self.db.profile.reportDestination = v end, + get = function() return self.db.profile.reportDestination end, + }, + manualCheckOnly = { + type = 'toggle', + name = L["Manual checks only"], + desc = L["Only perform buff checks if initiated manually (via /icu check)"], + set = function(o,v,...) self.db.profile.manualCheckOnly = v; self:refreshConfig() end, + get = function() return self.db.profile.manualCheckOnly end, + }, + checkAfterFinish = { + type = 'toggle', + name = L["Check after readycheck"], + desc = L["Don't check buffs until ready check has finished (or timed out)"], + set = function(o,v,...) self.db.profile.checkAfterFinish = v end, + get = function() return self.db.profile.checkAfterFinish end, + }, + noFlaskMessage = { + type = 'input', + name = L["Flask reminder"], + desc = L["Message whispered to raiders missing a cataclysm flask"], + set = function(o,v,...) self.db.profile.noFlaskMessage = v end, + get = function() return self.db.profile.noFlaskMessage end, + }, + lowFlaskDurationMessage = { + type = 'input', + name = L["Flask expiration"], + desc = L["Message whispered to raiders with less than 10 minutes left on their flask"], + set = function(o,v,...) self.db.profile.lowFlaskDurationMessage = v end, + get = function() return self.db.profile.lowFlaskDurationMessage end, + }, + noFoodMessage = { + type = 'input', + name = L["Food reminder"], + desc = L["Message whispered to raiders missing the well-fed buff"], + set = function(o,v,...) self.db.profile.noFoodMessage = v end, + get = function() return self.db.profile.noFoodMessage end, + }, + + } + }, + profile = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db), + }, + } + return options +end + +function icu:inspectRaid(silent) + -- Not in a raid group + local icuAd = ""; + + if GetNumRaidMembers() == 0 then + return true + end + + if self.db.profile.advertiseICU then + icuAd = L["ICU"] .. ": "; + else + icuAd = ""; + end + + for i = 1, GetNumRaidMembers() do + local raider = GetRaidRosterInfo(i); + if raider then + + local hasFood, hasFlask, hasLowDuration = icu:validateBuffs(i); + + if not hasFood and self.db.profile.checkFood then + noFood[#noFood+1] = raider; + -- Tell player + if self.db.profile.remindRaider and not silent then + SendChatMessage(icuAd .. self.db.profile.noFoodMessage,"WHISPER",nil,raider); + end + end + + if not hasFlask and self.db.profile.checkFlask then + noFlask[#noFlask+1] = raider; + -- Tell player + if self.db.profile.remindRaider and not silent then + SendChatMessage(icuAd .. self.db.profile.noFlaskMessage,"WHISPER",nil,raider); + end + elseif hasLowDuration and not silent then + if self.db.profile.remindRaider and self.db.profile.checkLowFlaskDuration then + SendChatMessage(icuAd .. self.db.profile.lowFlaskDurationMessage,"WHISPER",nil,raider); + end + end + end + + end + + if self.db.profile.reportResults and (#noFlask > 0 or #noFood > 0) and self.db.profile.advertiseICU and self.db.profile.reportDestination ~= "SELF" then + SendChatMessage("---- "..L["ICU"].." "..L["Report"].." ----",self.db.profile.reportDestination,nil,nil); + end + + if self.db.profile.reportResults then + if #noFlask > 0 and self.db.profile.checkFlask then + local reportFlaskMessage = L["Missing Flask"]..": " .. table.concat(noFlask, ", "); + + if self.db.profile.reportDestination == "SELF" then + DEFAULT_CHAT_FRAME:AddMessage(reportFlaskMessage); + else + SendChatMessage(reportFlaskMessage,self.db.profile.reportDestination,nil,nil); + end + end + + if #noFood > 0 and self.db.profile.checkFood then + local reportFoodMessage = L["Missing Food"]..": " .. table.concat(noFood, ", "); + + if self.db.profile.reportDestination == "SELF" then + DEFAULT_CHAT_FRAME:AddMessage(reportFoodMessage); + else + SendChatMessage(reportFoodMessage,self.db.profile.reportDestination,nil,nil); + end + end + end + + noFlask, noFood, hasLowDuration = {},{},{}; +end + +function icu:validateBuffs(playerIndex) + local i = 1; + local hasFood, hasFlask, hasLowDuration = false, false, false; + local name, _, _, _, _, _, expirationTime, _, _, _, spellId = UnitBuff("raid"..playerIndex,i); + + while name do + -- Check for food + if not hasFood then + for k,v in ipairs(foodID) do + if v == spellId then + hasFood = true; + end + end + end + -- Check for flask + if not hasFlask then + for k,v in ipairs(flaskID) do + if v == spellId then + hasFlask = true; + -- Check if low duration + if expirationTime and ((expirationTime-GetTime())/60) <= minFlaskDuration then + hasLowDuration = true; + end + end + end + end + i = i + 1; + name, _, _, _, _, _, expirationTime, _, _, _, spellId = UnitBuff("raid"..playerIndex,i); + end + + return hasFood, hasFlask, hasLowDuration; +end + +function icu:READY_CHECK() + --print("Ready check init!"); + if self.db.profile.manualCheckOnly then + icu:UnregisterEvent("READY_CHECK"); + return true; + end + + if not self.db.profile.checkAfterFinish then + self:inspectRaid(); + else + self:ScheduleTimer("READY_CHECK_FINISHED", 30); + self:RegisterEvent("READY_CHECK_FINISHED"); + end +end + +function icu:READY_CHECK_FINISHED() + --print("Ready check finish!"); + self:UnregisterEvent("READY_CHECK_FINISHED"); + self:CancelAllTimers(); + self:inspectRaid(); +end + +function icu:filterChat(self, event, msg) + if msg == self.db.profile.noFoodMessage or msg == self.db.profile.noFlaskMessage or msg == self.db.profile.lowFlaskDurationMessage or msg == L["ICU"]..": "..self.db.profile.noFoodMessage or msg == L["ICU"]..": "..self.db.profile.noFlaskMessage or msg == L["ICU"]..": "..self.db.profile.lowFlaskDurationMessage then return true end +end +ChatFrame_AddMessageEventFilter("CHAT_MSG_WHISPER_ICU_INFORM", icu:filterChat) + +icu:RegisterEvent("READY_CHECK"); + +--@do-not-package@ +function icu:test(cond) + if true and not cond then + print("First.") + else + print("Second.") + end +end + +function icu:grabVar(var) + print(self.db.profile[var]) +end + +_G.icu = icu; +--@end-do-not-package@ \ No newline at end of file