commit 6645664e88f657a8b3ba1563a1561a2265566a02 Author: Sergio Álvarez Date: Sat Nov 1 01:25:03 2014 +0100 first commit 1st! diff --git a/Broker_ConsolidatedBuffs.lua b/Broker_ConsolidatedBuffs.lua new file mode 100644 index 0000000..bdb8ec0 --- /dev/null +++ b/Broker_ConsolidatedBuffs.lua @@ -0,0 +1,64 @@ + +local addonName, addonNS = ... +local ldb = LibStub("LibDataBroker-1.1") + + +local BrokerConsolidatedBuffs = ldb:NewDataObject("Broker_ConsolidatedBuffs", { + type = "data source", + text = "Please wait", + value = 1, + icon = "Interface\\AddOns\\Broker_ConsolidatedBuffs\\BuffConsolidation", + label = "ConsolidatedBuffs", + + OnTooltipShow = function(tooltip) + tooltip:AddLine("Consolidated Buffs") + tooltip:AddLine(" ") + + for i = 1, NUM_LE_RAID_BUFF_TYPES do + local name, rank, texture, duration, expiration, spellId, slot = GetRaidBuffTrayAuraInfo(i) + local r, g, b + + if name then + r, g, b = 0, 1, 0 + else + r, g, b = 1, 0, 0 + end + + tooltip:AddLine(_G["RAID_BUFF_"..i], r, g, b) + end + end, + + OnClick = function(button) + local missing = "" + + for i = 1, NUM_LE_RAID_BUFF_TYPES do + if not GetRaidBuffTrayAuraInfo(i) then + missing = missing .. _G["RAID_BUFF_"..i] ..", " + end + end + + if missing ~= "" then + SendChatMessage(ADDON_MISSING..": "..strsub(missing, 0, strlen(missing)-2), "SAY") + end + end +}) + + +local function updateBuffs(self, event, unitID) + if (unitID == "player" or event == "PLAYER_ENTERING_WORLD") then + local c = 0 + for i = 1, NUM_LE_RAID_BUFF_TYPES do + if GetRaidBuffTrayAuraInfo(i) then + c = c + 1 + end + end + + BrokerConsolidatedBuffs.text = c.."/"..NUM_LE_RAID_BUFF_TYPES + end +end + + +local frame = CreateFrame("Frame") +frame:RegisterEvent("UNIT_AURA") +frame:RegisterEvent("PLAYER_ENTERING_WORLD") +frame:SetScript("OnEvent", updateBuffs) diff --git a/Broker_ConsolidatedBuffs.toc b/Broker_ConsolidatedBuffs.toc new file mode 100644 index 0000000..91c8bbd --- /dev/null +++ b/Broker_ConsolidatedBuffs.toc @@ -0,0 +1,17 @@ +## Interface: 60300 +## Title: Broker_ConsolidatedBuffs +## Notes: Track consolidated buffs +## Author: Gio +## Version: 0.1 +## SavedVariables: + +libs\LibStub\LibStub.lua +libs\CallbackHandler-1.0\CallbackHandler-1.0.xml +libs\libdatabroker-1-1-1.1.4\LibDataBroker-1.1.lua + +Broker_ConsolidatedBuffs.lua + +# Resources: +# http://www.curse.com/addons/wow/broker_raidbuffs (inspiration) +# ElvUI modules/auras/consolidatedBuffs.lua +# http://sethcoder.com/reference/wow/INTERFACE/BUTTONS/ diff --git a/BuffConsolidation.tga b/BuffConsolidation.tga new file mode 100644 index 0000000..0b14cd7 Binary files /dev/null and b/BuffConsolidation.tga differ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..37b155c --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Sergio Álvarez (xergio@hmail.com) @giomoblin @xergio + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ec6147d --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Broker_ConsolidatedBuffs, simple :) \ No newline at end of file diff --git a/libs/CallbackHandler-1.0/CallbackHandler-1.0.toc b/libs/CallbackHandler-1.0/CallbackHandler-1.0.toc new file mode 100644 index 0000000..7104cd5 --- /dev/null +++ b/libs/CallbackHandler-1.0/CallbackHandler-1.0.toc @@ -0,0 +1,15 @@ +## Interface: 60000 +## LoadOnDemand: 1 +## Title: Lib: CallbackHandler-1.0 +## Notes: Callback handling Library, normally embedded inside other libraries +## Author: Ace3 Development Team +## X-Website: http://www.wowace.com/projects/callbackhandler/ +## X-Category: Library +## X-License: BSD-2.0 +## X-Curse-Packaged-Version: 1.0.6.60000 +## X-Curse-Project-Name: CallbackHandler-1.0 +## X-Curse-Project-ID: callbackhandler +## X-Curse-Repository-ID: wow/callbackhandler/mainline + +LibStub\LibStub.lua +CallbackHandler-1.0\CallbackHandler-1.0.xml diff --git a/libs/CallbackHandler-1.0/CallbackHandler-1.0/CallbackHandler-1.0.lua b/libs/CallbackHandler-1.0/CallbackHandler-1.0/CallbackHandler-1.0.lua new file mode 100644 index 0000000..2a64013 --- /dev/null +++ b/libs/CallbackHandler-1.0/CallbackHandler-1.0/CallbackHandler-1.0.lua @@ -0,0 +1,238 @@ +--[[ $Id: CallbackHandler-1.0.lua 18 2014-10-16 02:52:20Z mikk $ ]] +local MAJOR, MINOR = "CallbackHandler-1.0", 6 +local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) + +if not CallbackHandler then return end -- No upgrade needed + +local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end} + +-- Lua APIs +local tconcat = table.concat +local assert, error, loadstring = assert, error, loadstring +local setmetatable, rawset, rawget = setmetatable, rawset, rawget +local next, select, pairs, type, tostring = next, select, pairs, type, tostring + +-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded +-- List them here for Mikk's FindGlobals script +-- GLOBALS: geterrorhandler + +local xpcall = xpcall + +local function errorhandler(err) + return geterrorhandler()(err) +end + +local function CreateDispatcher(argCount) + local code = [[ + local next, xpcall, eh = ... + + local method, ARGS + local function call() method(ARGS) end + + local function dispatch(handlers, ...) + local index + index, method = next(handlers) + if not method then return end + local OLD_ARGS = ARGS + ARGS = ... + repeat + xpcall(call, eh) + index, method = next(handlers, index) + until not method + ARGS = OLD_ARGS + end + + return dispatch + ]] + + local ARGS, OLD_ARGS = {}, {} + for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end + code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", ")) + return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler) +end + +local Dispatchers = setmetatable({}, {__index=function(self, argCount) + local dispatcher = CreateDispatcher(argCount) + rawset(self, argCount, dispatcher) + return dispatcher +end}) + +-------------------------------------------------------------------------- +-- CallbackHandler:New +-- +-- target - target object to embed public APIs in +-- RegisterName - name of the callback registration API, default "RegisterCallback" +-- UnregisterName - name of the callback unregistration API, default "UnregisterCallback" +-- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API. + +function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName) + + RegisterName = RegisterName or "RegisterCallback" + UnregisterName = UnregisterName or "UnregisterCallback" + if UnregisterAllName==nil then -- false is used to indicate "don't want this method" + UnregisterAllName = "UnregisterAllCallbacks" + end + + -- we declare all objects and exported APIs inside this closure to quickly gain access + -- to e.g. function names, the "target" parameter, etc + + + -- Create the registry object + local events = setmetatable({}, meta) + local registry = { recurse=0, events=events } + + -- registry:Fire() - fires the given event/message into the registry + function registry:Fire(eventname, ...) + if not rawget(events, eventname) or not next(events[eventname]) then return end + local oldrecurse = registry.recurse + registry.recurse = oldrecurse + 1 + + Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...) + + registry.recurse = oldrecurse + + if registry.insertQueue and oldrecurse==0 then + -- Something in one of our callbacks wanted to register more callbacks; they got queued + for eventname,callbacks in pairs(registry.insertQueue) do + local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten. + for self,func in pairs(callbacks) do + events[eventname][self] = func + -- fire OnUsed callback? + if first and registry.OnUsed then + registry.OnUsed(registry, target, eventname) + first = nil + end + end + end + registry.insertQueue = nil + end + end + + -- Registration of a callback, handles: + -- self["method"], leads to self["method"](self, ...) + -- self with function ref, leads to functionref(...) + -- "addonId" (instead of self) with function ref, leads to functionref(...) + -- all with an optional arg, which, if present, gets passed as first argument (after self if present) + target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]]) + if type(eventname) ~= "string" then + error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2) + end + + method = method or eventname + + local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten. + + if type(method) ~= "string" and type(method) ~= "function" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2) + end + + local regfunc + + if type(method) == "string" then + -- self["method"] calling style + if type(self) ~= "table" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2) + elseif self==target then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2) + elseif type(self[method]) ~= "function" then + error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2) + end + + if select("#",...)>=1 then -- this is not the same as testing for arg==nil! + local arg=select(1,...) + regfunc = function(...) self[method](self,arg,...) end + else + regfunc = function(...) self[method](self,...) end + end + else + -- function ref with self=object or self="addonId" or self=thread + if type(self)~="table" and type(self)~="string" and type(self)~="thread" then + error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2) + end + + if select("#",...)>=1 then -- this is not the same as testing for arg==nil! + local arg=select(1,...) + regfunc = function(...) method(arg,...) end + else + regfunc = method + end + end + + + if events[eventname][self] or registry.recurse<1 then + -- if registry.recurse<1 then + -- we're overwriting an existing entry, or not currently recursing. just set it. + events[eventname][self] = regfunc + -- fire OnUsed callback? + if registry.OnUsed and first then + registry.OnUsed(registry, target, eventname) + end + else + -- we're currently processing a callback in this registry, so delay the registration of this new entry! + -- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency + registry.insertQueue = registry.insertQueue or setmetatable({},meta) + registry.insertQueue[eventname][self] = regfunc + end + end + + -- Unregister a callback + target[UnregisterName] = function(self, eventname) + if not self or self==target then + error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2) + end + if type(eventname) ~= "string" then + error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2) + end + if rawget(events, eventname) and events[eventname][self] then + events[eventname][self] = nil + -- Fire OnUnused callback? + if registry.OnUnused and not next(events[eventname]) then + registry.OnUnused(registry, target, eventname) + end + end + if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then + registry.insertQueue[eventname][self] = nil + end + end + + -- OPTIONAL: Unregister all callbacks for given selfs/addonIds + if UnregisterAllName then + target[UnregisterAllName] = function(...) + if select("#",...)<1 then + error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2) + end + if select("#",...)==1 and ...==target then + error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2) + end + + + for i=1,select("#",...) do + local self = select(i,...) + if registry.insertQueue then + for eventname, callbacks in pairs(registry.insertQueue) do + if callbacks[self] then + callbacks[self] = nil + end + end + end + for eventname, callbacks in pairs(events) do + if callbacks[self] then + callbacks[self] = nil + -- Fire OnUnused callback? + if registry.OnUnused and not next(callbacks) then + registry.OnUnused(registry, target, eventname) + end + end + end + end + end + end + + return registry +end + + +-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it +-- try to upgrade old implicit embeds since the system is selfcontained and +-- relies on closures to work. + diff --git a/libs/CallbackHandler-1.0/CallbackHandler-1.0/CallbackHandler-1.0.xml b/libs/CallbackHandler-1.0/CallbackHandler-1.0/CallbackHandler-1.0.xml new file mode 100644 index 0000000..876df83 --- /dev/null +++ b/libs/CallbackHandler-1.0/CallbackHandler-1.0/CallbackHandler-1.0.xml @@ -0,0 +1,4 @@ + +