comparison core.lua @ 2:fe437e761ef8

More safety checks for itemfilter validity. Factor out DBM callbacks into semi-generalized boss mod registration (todo: selection gui).
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Fri, 22 Apr 2011 01:34:47 +0000
parents 822b6ca3ef89
children 05caaf17b3ca
comparison
equal deleted inserted replaced
1:822b6ca3ef89 2:fe437e761ef8
50 ['scroll_to_bottom'] = true, 50 ['scroll_to_bottom'] = true,
51 ['chatty_on_kill'] = false, 51 ['chatty_on_kill'] = false,
52 ['no_tracking_wipes'] = false, 52 ['no_tracking_wipes'] = false,
53 ['snarky_boss'] = true, 53 ['snarky_boss'] = true,
54 ['keybinding'] = false, 54 ['keybinding'] = false,
55 ['bossmod'] = "DBM",
55 ['keybinding_text'] = 'CTRL-SHIFT-O', 56 ['keybinding_text'] = 'CTRL-SHIFT-O',
56 ['forum'] = { 57 ['forum'] = {
57 ['[url]'] = '[url=http://www.wowhead.com/?item=$I]$N[/url]$X - $T', 58 ['[url]'] = '[url=http://www.wowhead.com/?item=$I]$N[/url]$X - $T',
58 ['[item] by name'] = '[item]$N[/item]$X - $T', 59 ['[item] by name'] = '[item]$N[/item]$X - $T',
59 ['[item] by ID'] = '[item]$I[/item]$X - $T', 60 ['[item] by ID'] = '[item]$I[/item]$X - $T',
126 -- This is an amalgamation of all four LOOT_ITEM_* patterns. 127 -- This is an amalgamation of all four LOOT_ITEM_* patterns.
127 -- Captures: 1 person/You, 2 itemstring, 3 rest of string after final |r until '.' 128 -- Captures: 1 person/You, 2 itemstring, 3 rest of string after final |r until '.'
128 -- Can change 'loot' to 'item' to trigger on, e.g., extracting stuff from mail. 129 -- Can change 'loot' to 'item' to trigger on, e.g., extracting stuff from mail.
129 loot_pattern = "(%S+) receives? loot:.*|cff%x+|H(.-)|h.*|r(.*)%.$" 130 loot_pattern = "(%S+) receives? loot:.*|cff%x+|H(.-)|h.*|r(.*)%.$"
130 131
131 dbm_registered = nil 132 bossmod_registered = nil
133 bossmods = {}
134
132 requesting = nil -- for prompting for additional rebroadcasters 135 requesting = nil -- for prompting for additional rebroadcasters
133 136
134 thresholds, quality_hexes = {}, {} 137 thresholds, quality_hexes = {}, {}
135 for i = 0,6 do 138 for i = 0,6 do
136 local hex = _G.select(4,_G.GetItemQualityColor(i)) 139 local hex = _G.select(4,_G.GetItemQualityColor(i))
157 local pairs, ipairs, tinsert, tremove, tonumber = pairs, ipairs, table.insert, table.remove, tonumber 160 local pairs, ipairs, tinsert, tremove, tonumber = pairs, ipairs, table.insert, table.remove, tonumber
158 161
159 local pprint, tabledump = addon.pprint, flib.tabledump 162 local pprint, tabledump = addon.pprint, flib.tabledump
160 163
161 -- En masse forward decls of symbols defined inside local blocks 164 -- En masse forward decls of symbols defined inside local blocks
162 local _registerDBM -- break out into separate file 165 local _register_bossmod
163 local makedate, create_new_cache, _init 166 local makedate, create_new_cache, _init
164 167
165 -- Hypertext support, inspired by DBM broadcast pizza timers 168 -- Hypertext support, inspired by DBM broadcast pizza timers
166 do 169 do
167 local hypertext_format_str = "|HOuroRaid:%s|h%s[%s]|r|h" 170 local hypertext_format_str = "|HOuroRaid:%s|h%s[%s]|r|h"
376 btn:SetAttribute("type", "macro") 379 btn:SetAttribute("type", "macro")
377 btn:SetAttribute("macrotext", "/ouroloot toggle") 380 btn:SetAttribute("macrotext", "/ouroloot toggle")
378 if SetBindingClick(opts.keybinding_text, "OuroLootBindingOpen") then 381 if SetBindingClick(opts.keybinding_text, "OuroLootBindingOpen") then
379 SaveBindings(GetCurrentBindingSet()) 382 SaveBindings(GetCurrentBindingSet())
380 else 383 else
381 self:Print("Error registering '%s' as a keybinding, check spelling!", 384 self:Print("Error registering '%s' as a keybinding, check spelling!", opts.keybinding_text)
382 opts.keybinding_text)
383 end 385 end
384 end 386 end
385 387
386 if self.debug.flow then self:Print"is in control-flow debug mode." end 388 if self.debug.flow then self:Print"is in control-flow debug mode." end
387 end 389 end
422 return self.dprint('flow', "got RRU event but in pvp zone, bailing") 424 return self.dprint('flow', "got RRU event but in pvp zone, bailing")
423 end 425 end
424 if event == "Activate" then 426 if event == "Activate" then
425 -- dispatched manually from Activate 427 -- dispatched manually from Activate
426 self:RegisterEvent "CHAT_MSG_LOOT" 428 self:RegisterEvent "CHAT_MSG_LOOT"
427 _registerDBM(self) 429 _register_bossmod(self)
428 elseif event == "RAID_ROSTER_UPDATE" then 430 elseif event == "RAID_ROSTER_UPDATE" then
429 -- event registration from onload, joined a raid, maybe show popup 431 -- event registration from onload, joined a raid, maybe show popup
430 if opts.popup_on_join and not self.popped then 432 if opts.popup_on_join and not self.popped then
431 self.popped = StaticPopup_Show "OUROL_REMIND" 433 self.popped = StaticPopup_Show "OUROL_REMIND"
432 self.popped.data = self 434 self.popped.data = self
636 self.popped = true 638 self.popped = true
637 if GetNumRaidMembers() > 0 then 639 if GetNumRaidMembers() > 0 then
638 self:RAID_ROSTER_UPDATE("Activate") 640 self:RAID_ROSTER_UPDATE("Activate")
639 elseif self.debug.notraid then 641 elseif self.debug.notraid then
640 self:RegisterEvent "CHAT_MSG_LOOT" 642 self:RegisterEvent "CHAT_MSG_LOOT"
641 _registerDBM(self) 643 _register_bossmod(self)
642 elseif g_restore_p then 644 elseif g_restore_p then
643 g_restore_p = nil 645 g_restore_p = nil
644 if #g_loot == 0 then return end -- only saved texts, not worth verbage 646 if #g_loot == 0 then return end -- only saved texts, not worth verbage
645 self:Print("Ouro Raid Loot restored previous data, but not in a raid", 647 self:Print("Ouro Raid Loot restored previous data, but not in a raid",
646 "and 5-person mode not active. |cffff0505NOT tracking loot|r;", 648 "and 5-person mode not active. |cffff0505NOT tracking loot|r;",
944 e.reason = 'kill' 946 e.reason = 'kill'
945 e.attempts = attempts 947 e.attempts = attempts
946 self.loot_clean = first or index-1 948 self.loot_clean = first or index-1
947 end 949 end
948 950
949 local GetRaidRosterInfo = GetRaidRosterInfo 951 function addon:register_boss_mod (name, registration_func, deregistration_func)
950 function addon:DBMBossCallback (reason, mod, ...) 952 assert(type(name)=='string')
951 if (not self.rebroadcast) and (not self.enabled) then return end 953 assert(type(registration_func)=='function')
952 954 if deregistration_func ~= nil then assert(type(deregistration_func)=='function') end
953 local name 955 self.bossmods[#self.bossmods+1] = {
954 if mod.combatInfo and mod.combatInfo.name then 956 n = name,
955 name = mod.combatInfo.name 957 r = registration_func,
956 elseif mod.id then 958 d = deregistration_func,
957 name = mod.id 959 }
960 end
961
962 function _register_bossmod (self, force_p)
963 local x = self.bossmod_registered and self.bossmods[self.bossmod_registered]
964 if x then
965 if x.n == opts.bossmod and not force_p then
966 -- trying to register with already-registered boss mod
967 return
968 else
969 -- deregister
970 if x.d then x.d(self) end
971 end
972 end
973
974 x = nil
975 for k,v in ipairs(self.bossmods) do
976 if v.n == opts.bossmod then
977 x = k
978 break
979 end
980 end
981
982 if not x then
983 self.status_text = "|cffff1010No boss-mod found!|r"
984 self:Print(self.status_text)
985 return
986 end
987
988 if self.bossmods[x].r (self, _do_boss) then
989 self.bossmod_registered = x
958 else 990 else
959 name = "Unknown Boss" 991 self:Print("|cffff1010Boss mod registration failed|r")
960 end 992 end
961 993 end
962 local it = location or instance_tag() 994 end
963 location = nil
964
965 local duration = 0
966 if mod.combatInfo and mod.combatInfo.pull then
967 duration = math.floor (GetTime() - mod.combatInfo.pull)
968 end
969
970 -- attendance: maybe put people in groups 6,7,8 into a "backup/standby"
971 -- list? probably too specific to guild practices.
972 local raiders = {}
973 for i = 1, GetNumRaidMembers() do
974 tinsert(raiders, (GetRaidRosterInfo(i)))
975 end
976 table.sort(raiders)
977
978 return _do_boss (self, reason, name, it, duration, raiders)
979 end
980
981 local callback = function(...) addon:DBMBossCallback(...) end
982 function _registerDBM(self)
983 if DBM then
984 if not self.dbm_registered then
985 local rev = tonumber(DBM.Revision) or 0
986 if rev < 1503 then
987 self.status_text = "|cffff1010Deadly Boss Mods must be version 1.26 or newer to work with Ouro Loot.|r"
988 return
989 end
990 local r = DBM:RegisterCallback("kill", callback)
991 DBM:RegisterCallback("wipe", callback)
992 DBM:RegisterCallback("pull", function() location = instance_tag() end)
993 self.dbm_registered = r > 0
994 end
995 else
996 self.status_text = "|cffff1010Ouro Loot cannot find Deadly Boss Mods, loot will not be grouped by boss.|r"
997 end
998 end
999 end -- DBM tie-ins
1000 995
1001 -- Adding entries to the loot record, and tracking the corresponding timestamp. 996 -- Adding entries to the loot record, and tracking the corresponding timestamp.
1002 do 997 do
1003 -- This shouldn't be required. /sadface 998 -- This shouldn't be required. /sadface
1004 local loot_entry_mt = { 999 local loot_entry_mt = {