comparison core.lua @ 67:c01875b275ca

Do not use UnitName on other people during RAID_ROSTER_UPDATE, as they may be a weed (thank you Calvieri for unknowingly eating a lifegiving seed and exposing this bug). Be more informative to the user about errors during load. Do not try to run other files if a load-time error happens, as it only generates cascading noise.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Tue, 08 May 2012 02:41:23 +0000
parents 43913e02a1ef
children 3bed6d51e077
comparison
equal deleted inserted replaced
66:43913e02a1ef 67:c01875b275ca
243 end 243 end
244 244
245 addon = LibStub("AceAddon-3.0"):NewAddon(addon, "Ouro Loot", 245 addon = LibStub("AceAddon-3.0"):NewAddon(addon, "Ouro Loot",
246 "AceTimer-3.0", "AceComm-3.0", "AceConsole-3.0", "AceEvent-3.0") 246 "AceTimer-3.0", "AceComm-3.0", "AceConsole-3.0", "AceEvent-3.0")
247 247
248 -- if given, MSG should be a complete-ish sentence
249 function addon:load_assert (cond, msg, ...)
250 if cond then
251 return cond, msg, ...
252 end
253 msg = msg or "load-time assertion failed!"
254 self.NOLOAD = msg
255 self:Printf([[|cffff1010ERROR:|r <|cff00ff00%s|r> Ouro Loot cannot finish loading. You will need to type |cff30adff%s|r once these problems are resolved, and try again.]], msg, _G.SLASH_RELOAD1)
256 SLASH_ACECONSOLE_OUROLOOT1 = nil
257 SLASH_ACECONSOLE_OUROLOOT2 = nil
258 _G.error (msg, --[[level=]]2)
259 end
260
261 -- Seriously? ORLY?
262 -- YARLY. Go ahead and guess what was involved in tracking this down. If
263 -- more such effects are added in the future, the "id==xxxxx" will need to
264 -- change into a probe of a table of known-problematic IDs.
265 for i = 1, 40 do -- BUFF_MAX_DISPLAY==32, enh
266 local id = select(11,UnitAura('player', i, 'HELPFUL'))
267 if id == 88715 then
268 -- What I really want to do is pause until the thing is clicked off,
269 -- then continue with the rest of the file. No can do. Could also
270 -- just set some hooks and then re-OnInit/OnEnable after the aura
271 -- expires, but that's a hassle. GAH. Punt.
272 local text = UnitAura('player', i, 'HELPFUL')
273 text = ([[Cannot initialize while |cff71d5ff|Hspell:88715|h[%s]|h|cff00ff00 is active!]]):
274 format(text)
275 addon:load_assert(nil,text)
276 return -- were this C code running through lint, I'd put NOTREACHED
277 end
278 end
279
248 280
249 ------ Globals 281 ------ Globals
250 local g_loot = nil 282 local g_loot = nil
251 local g_restore_p = nil 283 local g_restore_p = nil
252 local g_wafer_thin = nil -- for prompting for additional rebroadcasters 284 local g_wafer_thin = nil -- for prompting for additional rebroadcasters
451 end 483 end
452 484
453 485
454 ------ Ace3 framework stuff 486 ------ Ace3 framework stuff
455 function addon:OnInitialize() 487 function addon:OnInitialize()
488 if self.author_debug then
489 _G.OL = self
490 end
456 _log = OuroLootSV_log 491 _log = OuroLootSV_log
457 492
458 -- VARIABLES_LOADED has fired by this point; test if we're doing something like 493 -- VARIABLES_LOADED has fired by this point; test if we're doing something like
459 -- relogging during a raid and already have collected loot data 494 -- relogging during a raid and already have collected loot data
460 g_restore_p = OuroLootSV ~= nil 495 g_restore_p = OuroLootSV ~= nil
505 end 540 end
506 end 541 end
507 542
508 -- get item filter table if needed 543 -- get item filter table if needed
509 if opts.itemfilter == nil then 544 if opts.itemfilter == nil then
510 opts.itemfilter = addon.default_itemfilter 545 opts.itemfilter = self.default_itemfilter
511 end 546 end
512 addon.default_itemfilter = nil 547 self.default_itemfilter = nil
513 548
514 self:RegisterChatCommand("ouroloot", "OnSlash") 549 self:RegisterChatCommand("ouroloot", "OnSlash")
515 if opts.register_slashloot then 550 if opts.register_slashloot then
516 -- NOTA BENE: do not use /loot in the LoadOn list, ChatTypeInfo gets confused 551 -- NOTA BENE: do not use /loot in the LoadOn list, ChatTypeInfo gets confused
517 -- maybe try to detect if this command is already in use... 552 -- maybe try to detect if this command is already in use...
518 SLASH_ACECONSOLE_OUROLOOT2 = "/loot" 553 SLASH_ACECONSOLE_OUROLOOT2 = "/loot"
519 end 554 end
520 555
521 self.history_all = self.history_all or OuroLootSV_hist or {} 556 self.history_all = self.history_all or OuroLootSV_hist or {}
522 local r = assert(GetRealmName()) 557 local r = self:load_assert (GetRealmName(), "how the freak does GetRealmName() fail?")
523 self.history_all[r] = self:_prep_new_history_category (self.history_all[r], r) 558 self.history_all[r] = self:_prep_new_history_category (self.history_all[r], r)
524 self.history = self.history_all[r] 559 self.history = self.history_all[r]
525 if (not InCombatLockdown()) and OuroLootSV_hist and 560 if (not InCombatLockdown()) and OuroLootSV_hist and
526 (OuroLootSV_hist.HISTFORMAT == nil) -- restored data but it's older 561 (OuroLootSV_hist.HISTFORMAT == nil) -- restored data but it's older
527 then 562 then
597 if dirty then self:Print("Saved data has been massaged into shape.") end 632 if dirty then self:Print("Saved data has been massaged into shape.") end
598 end 633 end
599 634
600 _init(self) 635 _init(self)
601 self.dprint('flow', "version strings:", revision_large, self.status_text) 636 self.dprint('flow', "version strings:", revision_large, self.status_text)
637 self.load_assert = nil
602 self.OnInitialize = nil -- free up ALL the things! 638 self.OnInitialize = nil -- free up ALL the things!
603 end 639 end
604 640
605 function addon:OnEnable() 641 function addon:OnEnable()
606 self:RegisterEvent("PLAYER_LOGOUT") 642 self:RegisterEvent("PLAYER_LOGOUT")
821 end 857 end
822 OuroLootSV_log = #OuroLootSV_log > 0 and OuroLootSV_log or nil 858 OuroLootSV_log = #OuroLootSV_log > 0 and OuroLootSV_log or nil
823 end 859 end
824 860
825 do 861 do
826 local IsInInstance, UnitName, UnitIsConnected, UnitClass, UnitRace, UnitSex, 862 local IsInInstance, UnitIsConnected, UnitClass, UnitRace, UnitSex,
827 UnitLevel, UnitInRaid, UnitIsVisible, GetGuildInfo, GetRaidRosterInfo = 863 UnitLevel, UnitInRaid, UnitIsVisible, GetGuildInfo, GetRaidRosterInfo =
828 IsInInstance, UnitName, UnitIsConnected, UnitClass, UnitRace, UnitSex, 864 IsInInstance, UnitIsConnected, UnitClass, UnitRace, UnitSex,
829 UnitLevel, UnitInRaid, UnitIsVisible, GetGuildInfo, GetRaidRosterInfo 865 UnitLevel, UnitInRaid, UnitIsVisible, GetGuildInfo, GetRaidRosterInfo
830 local time, difftime = time, difftime 866 local time, difftime = time, difftime
831 local R_ACTIVE, R_OFFLINE, R_LEFT = 1, 2, 3 867 local R_ACTIVE, R_OFFLINE, R_LEFT = 1, 2, 3
832 868
833 local lastevent, now = 0, 0 869 local lastevent, now = 0, 0
861 redo_count = redo_count + 1 897 redo_count = redo_count + 1
862 end 898 end
863 redo = false 899 redo = false
864 for i = 1, GetNumRaidMembers() do 900 for i = 1, GetNumRaidMembers() do
865 local unit = 'raid'..i 901 local unit = 'raid'..i
866 local name = UnitName(unit) 902 -- We grab a bunch of return values here, but only pay attention to
903 -- them under specific circumstances.
904 local name, connected, subgroup, level, class, _
905 name, _, subgroup, level, _, class, connected = GetRaidRosterInfo(i)
867 -- No, that's not my typo, it really is "uknownbeing" in Blizzard's code. 906 -- No, that's not my typo, it really is "uknownbeing" in Blizzard's code.
868 if name and name ~= UNKNOWN and name ~= UNKNOWNOBJECT and name ~= UKNOWNBEING then 907 if name and name ~= UNKNOWN and name ~= UNKNOWNOBJECT and name ~= UKNOWNBEING then
869 if not g_loot.raiders[name] then 908 if not g_loot.raiders[name] then
870 g_loot.raiders[name] = { needinfo=true } 909 g_loot.raiders[name] = { needinfo=true }
871 end 910 end
872 local r = g_loot.raiders[name] 911 local r = g_loot.raiders[name]
873 -- We grab a bunch of return values here, but only pay attention to
874 -- them under specific circumstances.
875 local grri_name, connected, subgroup, level, class, _
876 grri_name, _, subgroup, level, _, class, connected = GetRaidRosterInfo(i)
877 if name ~= grri_name then
878 error("UnitName ("..tostring(name)..") =/= grri_name ("..
879 tostring(grri_name)..") of same raidindex ("..i..")")
880 end
881 r.subgroup = subgroup 912 r.subgroup = subgroup
882 if r.needinfo and UnitIsVisible(unit) then 913 if r.needinfo and UnitIsVisible(unit) then
883 r.needinfo = nil 914 r.needinfo = nil
884 r.class = class --select(2,UnitClass(unit)) 915 r.class = class --select(2,UnitClass(unit))
885 r.race = select(2,UnitRace(unit)) 916 r.race = select(2,UnitRace(unit))
1498 self.status_text = ("%s communicating as ident %s commrev %s"):format(self.revision,self.ident,self.commrev) 1529 self.status_text = ("%s communicating as ident %s commrev %s"):format(self.revision,self.ident,self.commrev)
1499 self:RegisterComm(self.ident) 1530 self:RegisterComm(self.ident)
1500 self:RegisterComm(self.identTg, "OnCommReceivedNocache") 1531 self:RegisterComm(self.identTg, "OnCommReceivedNocache")
1501 1532
1502 if self.author_debug then 1533 if self.author_debug then
1503 _G.OL = self
1504 _G.Oloot = g_loot 1534 _G.Oloot = g_loot
1505 end 1535 end
1506 end 1536 end
1507 1537
1508 -- Raid roster snapshots 1538 -- Raid roster snapshots