Mercurial > wow > ouroloot
comparison core.lua @ 107:35b55c6f5551
Cleanups and reminders to myself.
author | Farmbuyer of US-Kilrogg <farmbuyer@gmail.com> |
---|---|
date | Mon, 06 Aug 2012 13:14:38 -0400 |
parents | 095ee38508e8 |
children | 04ccd12c2a41 |
comparison
equal
deleted
inserted
replaced
106:095ee38508e8 | 107:35b55c6f5551 |
---|---|
374 local opts = nil | 374 local opts = nil |
375 | 375 |
376 local error = addon.error | 376 local error = addon.error |
377 local assert = addon.assert | 377 local assert = addon.assert |
378 | 378 |
379 -- for speeding up local loads, not because I think _G will change | 379 local type, select, next, pairs, ipairs, tinsert, tremove, tostring, tonumber, wipe = |
380 local _G = _G | 380 type, select, next, pairs, ipairs, table.insert, table.remove, tostring, tonumber, table.wipe |
381 local type = _G.type | |
382 local select = _G.select | |
383 local pairs = _G.pairs | |
384 local ipairs = _G.ipairs | |
385 local tinsert = _G.table.insert | |
386 local tremove = _G.table.remove | |
387 local tostring = _G.tostring | |
388 local tonumber = _G.tonumber | |
389 local wipe = _G.table.wipe | |
390 | 381 |
391 local pprint, tabledump = addon.pprint, flib.tabledump | 382 local pprint, tabledump = addon.pprint, flib.tabledump |
392 local CopyTable = _G.CopyTable | 383 local CopyTable = CopyTable |
393 local GetNumRaidMembers = _G.GetNumGroupMembers or _G.GetNumRaidMembers | 384 local GetNumRaidMembers = GetNumGroupMembers or GetNumRaidMembers |
394 local IsInRaid = _G.IsInRaid or (function() return GetNumRaidMembers() > 0 end) | 385 local IsInRaid = IsInRaid or (function() return GetNumRaidMembers() > 0 end) |
395 -- En masse forward decls of symbols defined inside local blocks | 386 -- En masse forward decls of symbols defined inside local blocks |
396 local _register_bossmod, makedate, create_new_cache, _init, _log, _do_loot_metas | 387 local _register_bossmod, makedate, create_new_cache, _init, _log, _do_loot_metas |
397 local _history_by_loot_id, _setup_unique_replace, _unavoidable_collision | 388 local _history_by_loot_id, _setup_unique_replace, _unavoidable_collision |
398 local _notify_about_change | 389 local _notify_about_change |
399 | 390 |
421 | 412 |
422 -- Hypertext support, inspired by DBM broadcast pizza timers | 413 -- Hypertext support, inspired by DBM broadcast pizza timers |
423 do | 414 do |
424 local hypertext_format_str = "|HOuroLoot:%d|h%s[%s]|r|h" | 415 local hypertext_format_str = "|HOuroLoot:%d|h%s[%s]|r|h" |
425 local func_map = {} --_G.setmetatable({}, {__mode = 'k'}) | 416 local func_map = {} --_G.setmetatable({}, {__mode = 'k'}) |
426 local text_map = {} _G.setmetatable({}, {__mode = 'v'}) | 417 local text_map = setmetatable({}, {__mode = 'v'}) |
427 local base = _G.newproxy(true) | 418 local base = newproxy(true) |
428 _G.getmetatable(base).__tostring = function(ud) return text_map[ud] end | 419 getmetatable(base).__tostring = function(ud) return text_map[ud] end |
429 --@debug@ | 420 --@debug@ |
430 -- auto collecting these tokens is an interesting micro-optimization but not yet | 421 -- auto collecting these tokens is an interesting micro-optimization but not yet |
431 _G.getmetatable(base).__index = { | 422 getmetatable(base).__index = { |
432 ['done'] = function (ud) | 423 ['done'] = function (ud) |
433 text_map[ud] = nil | 424 text_map[ud] = nil |
434 func_map[ud] = nil | 425 func_map[ud] = nil |
435 end, | 426 end, |
436 } | 427 } |
437 _G.getmetatable(base).__gc = function(ud) | 428 getmetatable(base).__gc = function(ud) |
438 print("Collecting hyperlink object <",tostring(ud),">") | 429 print("Collecting hyperlink object <",tostring(ud),">") |
439 end | 430 end |
440 --@end-debug@ | 431 --@end-debug@ |
441 | 432 |
442 -- TEXT will automatically be surrounded by brackets | 433 -- TEXT will automatically be surrounded by brackets |
448 -- in chat. The MethodName and raw function callbacks will both be | 439 -- in chat. The MethodName and raw function callbacks will both be |
449 -- passed the addon table and the same matching number. | 440 -- passed the addon table and the same matching number. |
450 -- | 441 -- |
451 -- This is largely an excuse to fool around with Lua data constructs. | 442 -- This is largely an excuse to fool around with Lua data constructs. |
452 function addon.format_hypertext (text, color, func) | 443 function addon.format_hypertext (text, color, func) |
453 local ret = _G.newproxy(base) | 444 local ret = newproxy(base) |
454 local num = #text_map + 1 | 445 local num = #text_map + 1 |
455 text_map[ret] = hypertext_format_str:format (num, | 446 text_map[ret] = hypertext_format_str:format (num, |
456 type(color)=='number' and ITEM_QUALITY_COLORS[color].hex or color, | 447 type(color)=='number' and ITEM_QUALITY_COLORS[color].hex or color, |
457 text) | 448 text) |
458 text_map[num] = ret | 449 text_map[num] = ret |
466 mousebutton: "LeftButton", "MiddleButton", "RightButton" | 457 mousebutton: "LeftButton", "MiddleButton", "RightButton" |
467 | 458 |
468 amusingly, print()'ing the fullstring below as a debugging aid yields | 459 amusingly, print()'ing the fullstring below as a debugging aid yields |
469 another clickable link, yay data reproducability | 460 another clickable link, yay data reproducability |
470 ]] | 461 ]] |
471 local strsplit = _G.strsplit | 462 local strsplit = strsplit |
472 DEFAULT_CHAT_FRAME:HookScript("OnHyperlinkClick", function(self, link, fullstring, mousebutton) | 463 DEFAULT_CHAT_FRAME:HookScript("OnHyperlinkClick", function(self, link, fullstring, mousebutton) |
473 local ltype, arg = strsplit(":",link) | 464 local ltype, arg = strsplit(":",link) |
474 if ltype ~= "OuroLoot" then return end | 465 if ltype ~= "OuroLoot" then return end |
475 arg = tonumber(arg) | 466 arg = tonumber(arg) |
476 local f = func_map[text_map[arg]] | 467 local f = func_map[text_map[arg]] |
620 | 611 |
621 -- If unique keys ever change into objects instead of strings, change | 612 -- If unique keys ever change into objects instead of strings, change |
622 -- this into a weakly-keyed table. | 613 -- this into a weakly-keyed table. |
623 mt = { __metatable = 'Should be using setmode.' } | 614 mt = { __metatable = 'Should be using setmode.' } |
624 | 615 |
625 g_uniques = _G.setmetatable (m_reset{}, mt) | 616 g_uniques = setmetatable (m_reset{}, mt) |
626 end | 617 end |
627 | 618 |
628 | 619 |
629 ------ Expiring caches | 620 ------ Expiring caches |
630 --[[ | 621 --[[ |
646 end | 637 end |
647 end | 638 end |
648 ]] | 639 ]] |
649 do | 640 do |
650 local caches = {} | 641 local caches = {} |
651 local cleanup_group = _G.AnimTimerFrame:CreateAnimationGroup() | 642 local cleanup_group = AnimTimerFrame:CreateAnimationGroup() |
652 local time, next = _G.time, _G.next | 643 local time, next = time, next |
653 local new, del = flib.new, flib.del | 644 local new, del = flib.new, flib.del |
654 cleanup_group:SetLooping("REPEAT") | 645 cleanup_group:SetLooping("REPEAT") |
655 cleanup_group:SetScript("OnLoop", function(cg) | 646 cleanup_group:SetScript("OnLoop", function(cg) |
656 addon.dprint('cache',"OnLoop firing") | 647 addon.dprint('cache',"OnLoop firing") |
657 local now = time() | 648 local now = time() |
731 function addon:OnInitialize() | 722 function addon:OnInitialize() |
732 if self.author_debug then | 723 if self.author_debug then |
733 _G.OL = self | 724 _G.OL = self |
734 _G.g_uniques = g_uniques | 725 _G.g_uniques = g_uniques |
735 end | 726 end |
736 _log = _G.OuroLootSV_log | 727 _log = OuroLootSV_log |
737 | 728 |
738 -- VARIABLES_LOADED has fired by this point; test if we're doing something like | 729 -- VARIABLES_LOADED has fired by this point; test if we're doing something like |
739 -- relogging during a raid and already have collected loot data | 730 -- relogging during a raid and already have collected loot data |
740 local OuroLootSV = _G.OuroLootSV | 731 local OuroLootSV = OuroLootSV |
741 g_restore_p = OuroLootSV ~= nil | 732 g_restore_p = OuroLootSV ~= nil |
742 self.dprint('flow', "oninit sets restore as", g_restore_p) | 733 self.dprint('flow', "oninit sets restore as", g_restore_p) |
743 | 734 |
744 -- Primarily for plugins, but can be of use to me also... | 735 -- Primarily for plugins, but can be of use to me also... |
745 self.callbacks = _G.LibStub("CallbackHandler-1.0"):New(self) | 736 self.callbacks = LibStub("CallbackHandler-1.0"):New(self) |
746 --function self.callbacks:OnUsed (target_aka_self, eventname) end | 737 --function self.callbacks:OnUsed (target_aka_self, eventname) end |
747 --function self.callbacks:OnUnused (target_aka_self, eventname) end | 738 --function self.callbacks:OnUnused (target_aka_self, eventname) end |
748 | 739 |
749 if _G.OuroLootOptsDB == nil then | 740 if _G.OuroLootOptsDB == nil then |
750 local vclick = self.format_hypertext ([[click here]], ITEM_QUALITY_UNCOMMON, 'help') | 741 local vclick = self.format_hypertext ([[click here]], ITEM_QUALITY_UNCOMMON, 'help') |
759 virgin = nil | 750 virgin = nil |
760 end,10,self) | 751 end,10,self) |
761 else | 752 else |
762 virgin = nil | 753 virgin = nil |
763 end | 754 end |
764 self.db = _G.LibStub("AceDB-3.0"):New("OuroLootOptsDB", option_defaults , --[[Default=]]true) | 755 self.db = LibStub("AceDB-3.0"):New("OuroLootOptsDB", option_defaults , --[[Default=]]true) |
765 self.db.RegisterCallback (self, "OnNewProfile", function() | 756 self.db.RegisterCallback (self, "OnNewProfile", function() |
766 self:Print(new_profile_warning) | 757 self:Print(new_profile_warning) |
767 end) | 758 end) |
768 self.db.RegisterCallback (self, "OnProfileChanged", "DBProfileRefresh") | 759 self.db.RegisterCallback (self, "OnProfileChanged", "DBProfileRefresh") |
769 self.db.RegisterCallback (self, "OnProfileCopied", "DBProfileRefresh") | 760 self.db.RegisterCallback (self, "OnProfileCopied", "DBProfileRefresh") |
788 n = n + 1 | 779 n = n + 1 |
789 end | 780 end |
790 end | 781 end |
791 | 782 |
792 self.history_all = self.history_all or _G.OuroLootSV_hist or {} | 783 self.history_all = self.history_all or _G.OuroLootSV_hist or {} |
793 local r = self:load_assert (_G.GetRealmName(), "how the freak does GetRealmName() fail?") | 784 local r = self:load_assert (GetRealmName(), "how the freak does GetRealmName() fail?") |
794 self.history_all[r] = self:_prep_new_history_category (self.history_all[r], r) | 785 self.history_all[r] = self:_prep_new_history_category (self.history_all[r], r) |
795 self.history = self.history_all[r] | 786 self.history = self.history_all[r] |
796 | 787 |
797 local histformat = self.history_all.HISTFORMAT | 788 local histformat = self.history_all.HISTFORMAT |
798 self.history_all.HISTFORMAT = nil -- don't keep this in live data | 789 self.history_all.HISTFORMAT = nil -- don't keep this in live data |
958 | 949 |
959 ??? do something with LOOT_ITEM_WHILE_PLAYER_INELIGIBLE for locked LFRs? | 950 ??? do something with LOOT_ITEM_WHILE_PLAYER_INELIGIBLE for locked LFRs? |
960 ]] | 951 ]] |
961 | 952 |
962 -- LOOT_ITEM = "%s receives loot: %s." --> (.+) receives loot: (.+)%. | 953 -- LOOT_ITEM = "%s receives loot: %s." --> (.+) receives loot: (.+)%. |
963 g_LOOT_ITEM_ss = _G.LOOT_ITEM:gsub('%.$','%%.'):gsub('%%s','(.+)') | 954 g_LOOT_ITEM_ss = LOOT_ITEM:gsub('%.$','%%.'):gsub('%%s','(.+)') |
964 | 955 |
965 -- LOOT_ITEM_MULTIPLE = "%s receives loot: %sx%d." --> (.+) receives loot: (.+)(x%d+)%. | 956 -- LOOT_ITEM_MULTIPLE = "%s receives loot: %sx%d." --> (.+) receives loot: (.+)(x%d+)%. |
966 g_LOOT_ITEM_MULTIPLE_sss = _G.LOOT_ITEM_MULTIPLE:gsub('%.$','%%.'):gsub('%%s','(.+)'):gsub('x%%d','(x%%d+)') | 957 g_LOOT_ITEM_MULTIPLE_sss = LOOT_ITEM_MULTIPLE:gsub('%.$','%%.'):gsub('%%s','(.+)'):gsub('x%%d','(x%%d+)') |
967 | 958 |
968 -- LOOT_ITEM_SELF = "You receive loot: %s." --> You receive loot: (.+)%. | 959 -- LOOT_ITEM_SELF = "You receive loot: %s." --> You receive loot: (.+)%. |
969 g_LOOT_ITEM_SELF_s = _G.LOOT_ITEM_SELF:gsub('%.$','%%.'):gsub('%%s','(.+)') | 960 g_LOOT_ITEM_SELF_s = LOOT_ITEM_SELF:gsub('%.$','%%.'):gsub('%%s','(.+)') |
970 | 961 |
971 -- LOOT_ITEM_SELF_MULTIPLE = "You receive loot: %sx%d." --> You receive loot: (.+)(x%d+)%. | 962 -- LOOT_ITEM_SELF_MULTIPLE = "You receive loot: %sx%d." --> You receive loot: (.+)(x%d+)%. |
972 g_LOOT_ITEM_SELF_MULTIPLE_ss = _G.LOOT_ITEM_SELF_MULTIPLE:gsub('%.$','%%.'):gsub('%%s','(.+)'):gsub('x%%d','(x%%d+)') | 963 g_LOOT_ITEM_SELF_MULTIPLE_ss = LOOT_ITEM_SELF_MULTIPLE:gsub('%.$','%%.'):gsub('%%s','(.+)'):gsub('x%%d','(x%%d+)') |
973 | 964 |
974 --[[ | 965 --[[ |
975 Stick something in the Blizzard addons options list, where most users | 966 Stick something in the Blizzard addons options list, where most users |
976 will probably look these days. Try to be conservative about needless | 967 will probably look these days. Try to be conservative about needless |
977 frame creation. | 968 frame creation. |
981 bliz:SetScript("OnShow", function(_b) | 972 bliz:SetScript("OnShow", function(_b) |
982 local button = CreateFrame("Button",nil,_b,"UIPanelButtonTemplate") | 973 local button = CreateFrame("Button",nil,_b,"UIPanelButtonTemplate") |
983 button:SetWidth(150) | 974 button:SetWidth(150) |
984 button:SetHeight(22) | 975 button:SetHeight(22) |
985 button:SetScript("OnClick", function() | 976 button:SetScript("OnClick", function() |
986 _G.InterfaceOptionsFrameCancel:Click() | 977 InterfaceOptionsFrameCancel:Click() |
987 _G.HideUIPanel(GameMenuFrame) | 978 HideUIPanel(GameMenuFrame) |
988 addon:OpenMainDisplayToTab"Options" | 979 addon:OpenMainDisplayToTab"Options" |
989 end) | 980 end) |
990 button:SetText('"/ouroloot opt"') | 981 button:SetText('"/ouroloot opt"') |
991 button:SetPoint("TOPLEFT",20,-20) | 982 button:SetPoint("TOPLEFT",20,-20) |
992 _b:SetScript("OnShow",nil) | 983 _b:SetScript("OnShow",nil) |
993 end) | 984 end) |
994 _G.InterfaceOptions_AddCategory(bliz) | 985 InterfaceOptions_AddCategory(bliz) |
995 | 986 |
996 -- Maybe load up g_uniques now? | 987 -- Maybe load up g_uniques now? |
997 if opts.precache_history_uniques then | 988 if opts.precache_history_uniques then |
998 self:_cache_history_uniques() | 989 self:_cache_history_uniques() |
999 end | 990 end |
1153 -- etc. So firing a callback is delayed ever so briefly by human scales. | 1144 -- etc. So firing a callback is delayed ever so briefly by human scales. |
1154 -- | 1145 -- |
1155 -- For data safety, we replace any table arguments with read-only proxies | 1146 -- For data safety, we replace any table arguments with read-only proxies |
1156 -- before passing them to the callbacks. The goal is to prevent accidents, | 1147 -- before passing them to the callbacks. The goal is to prevent accidents, |
1157 -- not fraud. | 1148 -- not fraud. |
1158 local unpack, setmetatable = _G.unpack, _G.setmetatable | 1149 local unpack, setmetatable = unpack, setmetatable |
1159 local mtnewindex = function() --[[local]]error("This table is read-only", 3) end | 1150 local mtnewindex = function() --[[local]]error("This table is read-only", 3) end |
1160 local function make_readonly (t) | 1151 local function make_readonly (t) |
1161 return setmetatable({}, { | 1152 return setmetatable({}, { |
1162 __newindex = mtnewindex, | 1153 __newindex = mtnewindex, |
1163 __index = t, | 1154 __index = t, |
1189 _G.OuroLootSV = nil | 1180 _G.OuroLootSV = nil |
1190 _G.OuroLootSV_saved = nil | 1181 _G.OuroLootSV_saved = nil |
1191 _G.OuroLootOptsDB = nil | 1182 _G.OuroLootOptsDB = nil |
1192 _G.OuroLootSV_hist = nil | 1183 _G.OuroLootSV_hist = nil |
1193 _G.OuroLootSV_log = nil | 1184 _G.OuroLootSV_log = nil |
1194 _G.ReloadUI() | 1185 ReloadUI() |
1195 end | 1186 end |
1196 function addon:PLAYER_LOGOUT() | 1187 function addon:PLAYER_LOGOUT() |
1197 self:UnregisterEvent(RAID_ROSTER_UPDATE_EVENT) | 1188 self:UnregisterEvent(RAID_ROSTER_UPDATE_EVENT) |
1198 self:UnregisterEvent("PLAYER_ENTERING_WORLD") | 1189 self:UnregisterEvent("PLAYER_ENTERING_WORLD") |
1199 | 1190 |
1200 local worth_saving = #g_loot > 0 or _G.next(g_loot.raiders) | 1191 local worth_saving = #g_loot > 0 or next(g_loot.raiders) |
1201 if not worth_saving then for text in self:registered_textgen_iter() do | 1192 if not worth_saving then for text in self:registered_textgen_iter() do |
1202 worth_saving = worth_saving or g_loot.printed[text] > 0 | 1193 worth_saving = worth_saving or g_loot.printed[text] > 0 |
1203 end end | 1194 end end |
1204 if worth_saving then | 1195 if worth_saving then |
1205 opts.autoshard = self.sharder | 1196 opts.autoshard = self.sharder |
1413 if not g_unique_replace then _setup_unique_replace() end | 1404 if not g_unique_replace then _setup_unique_replace() end |
1414 g_unique_replace.new_entry (g_unique_replace.me, existing, replace, 'improv') | 1405 g_unique_replace.new_entry (g_unique_replace.me, existing, replace, 'improv') |
1415 addon:vbroadcast('improv', g_unique_replace.me, existing, replace) | 1406 addon:vbroadcast('improv', g_unique_replace.me, existing, replace) |
1416 end | 1407 end |
1417 | 1408 |
1418 local random = _G.math.random | 1409 local random = math.random |
1419 local function _many_uniques_handle_it (u, prefix) | 1410 local function _many_uniques_handle_it (u, prefix) |
1420 if u then | 1411 if u then |
1421 -- Check and alert for an existing value. | 1412 -- Check and alert for an existing value. |
1422 u = tostring(u) | 1413 u = tostring(u) |
1423 if g_uniques[u].history ~= g_uniques.NOTFOUND then | 1414 if g_uniques[u].history ~= g_uniques.NOTFOUND then |
1493 wipe(candidates) | 1484 wipe(candidates) |
1494 wipe(sigmap) | 1485 wipe(sigmap) |
1495 end | 1486 end |
1496 local recent_loot = create_new_cache ('loot', comm_cleanup_ttl+3, prefer_local_loots) | 1487 local recent_loot = create_new_cache ('loot', comm_cleanup_ttl+3, prefer_local_loots) |
1497 | 1488 |
1498 local strsplit, GetItemInfo, GetItemIcon, UnitClass = | 1489 local strsplit, GetItemInfo, GetItemIcon, UnitClass = strsplit, GetItemInfo, GetItemIcon, UnitClass |
1499 _G.strsplit, _G.GetItemInfo, _G.GetItemIcon, _G.UnitClass | |
1500 | 1490 |
1501 -- 'from' only present if this is triggered by a broadcast | 1491 -- 'from' only present if this is triggered by a broadcast |
1502 function _do_loot (self, local_override, recipient, unique, itemid, count, from, extratext) | 1492 function _do_loot (self, local_override, recipient, unique, itemid, count, from, extratext) |
1503 local prefix = "_do_loot[" .. counter() .. "]" | 1493 local prefix = "_do_loot[" .. counter() .. "]" |
1504 local itexture = GetItemIcon(itemid) | 1494 local itexture = GetItemIcon(itemid) |
1745 end | 1735 end |
1746 self:Print "Baron Steamroller has been slain. Congratulations on your rug." | 1736 self:Print "Baron Steamroller has been slain. Congratulations on your rug." |
1747 | 1737 |
1748 elseif cmd == "debug" then | 1738 elseif cmd == "debug" then |
1749 if arg then | 1739 if arg then |
1750 self.is_guilded = _G.IsInGuild() | 1740 self.is_guilded = IsInGuild() |
1751 self.debug[arg] = not self.debug[arg] | 1741 self.debug[arg] = not self.debug[arg] |
1752 _G.print(arg,self.debug[arg]) | 1742 print(arg,self.debug[arg]) |
1753 if self.debug[arg] then self.DEBUG_PRINT = true end | 1743 if self.debug[arg] then self.DEBUG_PRINT = true end |
1754 else | 1744 else |
1755 self.DEBUG_PRINT = not self.DEBUG_PRINT | 1745 self.DEBUG_PRINT = not self.DEBUG_PRINT |
1756 end | 1746 end |
1757 | 1747 |
1881 self.dprint('flow', "Clear: display visible but eoiST not set??") | 1871 self.dprint('flow', "Clear: display visible but eoiST not set??") |
1882 end | 1872 end |
1883 self.display:Hide() | 1873 self.display:Hide() |
1884 end | 1874 end |
1885 g_restore_p = nil | 1875 g_restore_p = nil |
1886 _G.OuroLootSV = nil | 1876 OuroLootSV = nil |
1887 self:_reset_timestamps() | 1877 self:_reset_timestamps() |
1888 if verbose_p then | 1878 if verbose_p then |
1889 if (_G.OuroLootSV_saved and #_G.OuroLootSV_saved>0) then | 1879 if (OuroLootSV_saved and #OuroLootSV_saved>0) then |
1890 self:Print("Current loot data cleared, %d saved sets remaining.", #_G.OuroLootSV_saved) | 1880 self:Print("Current loot data cleared, %d saved sets remaining.", #OuroLootSV_saved) |
1891 else | 1881 else |
1892 self:Print("Current loot data cleared.") | 1882 self:Print("Current loot data cleared.") |
1893 end | 1883 end |
1894 end | 1884 end |
1895 _init(self,st) | 1885 _init(self,st) |
1907 -- 1) logging happens, followed by reload or logout/login | 1897 -- 1) logging happens, followed by reload or logout/login |
1908 -- 2) _log points to SV_log | 1898 -- 2) _log points to SV_log |
1909 -- 3) VARIABLES_LOADED replaces SV_log pointer with restored version | 1899 -- 3) VARIABLES_LOADED replaces SV_log pointer with restored version |
1910 -- 4) logging happens to _log table (now with no other references) | 1900 -- 4) logging happens to _log table (now with no other references) |
1911 -- 5) at logout, nothing new has been entered in the table being saved | 1901 -- 5) at logout, nothing new has been entered in the table being saved |
1912 local date = _G.date | 1902 local date = date |
1913 function addon:log_with_timestamp (msg) | 1903 function addon:log_with_timestamp (msg) |
1914 tinsert (_log, date('%m/%d %H:%M:%S ')..msg) | 1904 tinsert (_log, date('%m/%d %H:%M:%S ')..msg) |
1915 end | 1905 end |
1916 end | 1906 end |
1917 | 1907 |
1937 local change_chatframe | 1927 local change_chatframe |
1938 | 1928 |
1939 function addon:_set_chatty_change_chatframe (arg, silent_p) | 1929 function addon:_set_chatty_change_chatframe (arg, silent_p) |
1940 local frame | 1930 local frame |
1941 if type(arg) == 'number' then | 1931 if type(arg) == 'number' then |
1942 arg = _G.math.min (arg, _G.NUM_CHAT_WINDOWS) | 1932 arg = math.min (arg, _G.NUM_CHAT_WINDOWS) |
1943 frame = _G['ChatFrame'..arg] | 1933 frame = _G['ChatFrame'..arg] |
1944 elseif type(arg) == 'string' then | 1934 elseif type(arg) == 'string' then |
1945 frame = _G[arg] | 1935 frame = _G[arg] |
1946 end | 1936 end |
1947 if type(frame) == 'table' and type(frame.AddMessage) == 'function' then | 1937 if type(frame) == 'table' and type(frame.AddMessage) == 'function' then |
2015 local byindex, temp = {}, {} | 2005 local byindex, temp = {}, {} |
2016 local function sort (src, dest) | 2006 local function sort (src, dest) |
2017 for k in pairs(src) do | 2007 for k in pairs(src) do |
2018 temp[#temp+1] = k | 2008 temp[#temp+1] = k |
2019 end | 2009 end |
2020 _G.table.sort(temp) | 2010 table.sort(temp) |
2021 wipe(dest) | 2011 wipe(dest) |
2022 for i = 1, #temp do | 2012 for i = 1, #temp do |
2023 dest[i] = src[temp[i]] | 2013 dest[i] = src[temp[i]] |
2024 end | 2014 end |
2025 end | 2015 end |
2095 if not closest_boss then | 2085 if not closest_boss then |
2096 fencepost = closest_time | 2086 fencepost = closest_time |
2097 elseif not closest_time then | 2087 elseif not closest_time then |
2098 fencepost = closest_boss | 2088 fencepost = closest_boss |
2099 else | 2089 else |
2100 fencepost = _G.math.min(closest_time,closest_boss) | 2090 fencepost = math.min(closest_time,closest_boss) |
2101 end | 2091 end |
2102 end | 2092 end |
2103 return fencepost | 2093 return fencepost |
2104 end | 2094 end |
2105 | 2095 |
2189 do | 2179 do |
2190 function addon:snapshot_raid (only_inraid_p) | 2180 function addon:snapshot_raid (only_inraid_p) |
2191 local ss = CopyTable(g_loot.raiders) | 2181 local ss = CopyTable(g_loot.raiders) |
2192 local instance,maxsize = instance_tag() | 2182 local instance,maxsize = instance_tag() |
2193 if only_inraid_p then | 2183 if only_inraid_p then |
2194 for name,info in _G.next, ss do | 2184 for name,info in next, ss do |
2195 if info.online == 3 then | 2185 if info.online == 3 then |
2196 ss[name] = nil | 2186 ss[name] = nil |
2197 end | 2187 end |
2198 end | 2188 end |
2199 end | 2189 end |
2200 return ss, maxsize, instance, _G.time() | 2190 return ss, maxsize, instance, time() |
2201 end | 2191 end |
2202 end | 2192 end |
2203 | 2193 |
2204 -- Tie-in with Deadly Boss Mods (or other such addons) | 2194 -- Tie-in with Deadly Boss Mods (or other such addons) |
2205 do | 2195 do |
2382 end | 2372 end |
2383 end | 2373 end |
2384 | 2374 |
2385 -- Adding entries to the loot record, and tracking the corresponding timestamp. | 2375 -- Adding entries to the loot record, and tracking the corresponding timestamp. |
2386 do | 2376 do |
2387 local rawget, setmetatable = _G.rawget, _G.setmetatable | 2377 local rawget, setmetatable = rawget, setmetatable |
2388 | 2378 |
2389 --@debug@ | 2379 --@debug@ |
2390 local tos = {} | 2380 local tos = {} |
2391 tos.time = function (e) | 2381 tos.time = function (e) |
2392 return e.startday.text | 2382 return e.startday.text |
2498 function addon._addLootEntry (e) | 2488 function addon._addLootEntry (e) |
2499 setmetatable(e,loot_entry_mt) | 2489 setmetatable(e,loot_entry_mt) |
2500 | 2490 |
2501 if not done_todays_date then do_todays_date() end | 2491 if not done_todays_date then do_todays_date() end |
2502 | 2492 |
2503 local h, m = _G.GetGameTime() | 2493 local h, m = GetGameTime() |
2504 --local localuptime = math.floor(GetTime()) | 2494 --local localuptime = math.floor(GetTime()) |
2505 local time_t = _G.time() | 2495 local time_t = time() |
2506 e.hour = h | 2496 e.hour = h |
2507 e.minute = m | 2497 e.minute = m |
2508 e.stamp = time_t --localuptime | 2498 e.stamp = time_t --localuptime |
2509 if e.kind == 'loot' then | 2499 if e.kind == 'loot' then |
2510 if (not e.unique) or (#e.unique==0) then | 2500 if (not e.unique) or (#e.unique==0) then |
2511 e.unique = e.id .. (e.disposition or e.person) .. _G.date("%Y/%m/%d %H:%M",e.stamp) | 2501 e.unique = e.id .. (e.disposition or e.person) .. date("%Y/%m/%d %H:%M",e.stamp) |
2512 end | 2502 end |
2513 addon:Fire ('NewLootEntry', e) | 2503 addon:Fire ('NewLootEntry', e) |
2514 end | 2504 end |
2515 local index = #g_loot + 1 | 2505 local index = #g_loot + 1 |
2516 g_loot[index] = e | 2506 g_loot[index] = e |
2721 end | 2711 end |
2722 | 2712 |
2723 function _setup_unique_replace () | 2713 function _setup_unique_replace () |
2724 gur = {} | 2714 gur = {} |
2725 gur.cache = create_new_cache ('improv', 10, fixup_unique_replacements) | 2715 gur.cache = create_new_cache ('improv', 10, fixup_unique_replacements) |
2726 gur.me = tonumber(_G.UnitGUID('player'):sub(-7),16) | 2716 gur.me = tonumber(UnitGUID('player'):sub(-7),16) |
2727 gur.replacements = {} | 2717 gur.replacements = {} |
2728 gur.new_entry = new_entry | 2718 gur.new_entry = new_entry |
2729 gur.get_previous_replacement = get_previous_replacement | 2719 gur.get_previous_replacement = get_previous_replacement |
2730 g_unique_replace = gur | 2720 g_unique_replace = gur |
2731 _setup_unique_replace = nil | 2721 _setup_unique_replace = nil |
2757 clicky = addon.format_hypertext( | 2747 clicky = addon.format_hypertext( |
2758 [[ SYSTEM FAILURE -- RELEASE RINZLER ]], "|cffff0000", | 2748 [[ SYSTEM FAILURE -- RELEASE RINZLER ]], "|cffff0000", |
2759 function() StaticPopup_Show "OUROL_ARGH" end) | 2749 function() StaticPopup_Show "OUROL_ARGH" end) |
2760 end | 2750 end |
2761 StaticPopupDialogs["OUROL_ARGH"].text = horrible_error_text:format(err_msg) | 2751 StaticPopupDialogs["OUROL_ARGH"].text = horrible_error_text:format(err_msg) |
2762 _G.PlaySoundFile ([[Interface\AddOns\Ouro_Loot\sfrr.ogg]], "Master") | 2752 PlaySoundFile ([[Interface\AddOns\Ouro_Loot\sfrr.ogg]], "Master") |
2763 addon:Print (" ") | 2753 addon:Print (" ") |
2764 addon:Print (" ", clicky) | 2754 addon:Print (" ", clicky) |
2765 addon:Print (" ") | 2755 addon:Print (" ") |
2766 end | 2756 end |
2767 | 2757 |
2773 end | 2763 end |
2774 | 2764 |
2775 | 2765 |
2776 ------ Saved texts | 2766 ------ Saved texts |
2777 function addon:check_saved_table(silent_p) | 2767 function addon:check_saved_table(silent_p) |
2778 local s = _G.OuroLootSV_saved | 2768 local s = OuroLootSV_saved |
2779 if s and (#s > 0) then return s end | 2769 if s and (#s > 0) then return s end |
2780 _G.OuroLootSV_saved = nil | 2770 OuroLootSV_saved = nil |
2781 if not silent_p then self:Print("There are no saved loot texts.") end | 2771 if not silent_p then self:Print("There are no saved loot texts.") end |
2782 end | 2772 end |
2783 | 2773 |
2784 function addon:save_list() | 2774 function addon:save_list() |
2785 local s = self:check_saved_table(); if not s then return end | 2775 local s = self:check_saved_table(); if not s then return end |
2787 self:Print("#%d %s %d entries %s", i, t.date, t.count, t.name) | 2777 self:Print("#%d %s %d entries %s", i, t.date, t.count, t.name) |
2788 end | 2778 end |
2789 end | 2779 end |
2790 | 2780 |
2791 function addon:save_saveas(name) | 2781 function addon:save_saveas(name) |
2792 _G.OuroLootSV_saved = _G.OuroLootSV_saved or {} | 2782 OuroLootSV_saved = OuroLootSV_saved or {} |
2793 local SV = _G.OuroLootSV_saved | 2783 local SV = OuroLootSV_saved |
2794 local n = #SV + 1 | 2784 local n = #SV + 1 |
2795 local save = { | 2785 local save = { |
2796 name = name, | 2786 name = name, |
2797 date = makedate(), | 2787 date = makedate(), |
2798 count = #g_loot, | 2788 count = #g_loot, |
2874 local new_uniques, uniques_bywhen, when_array = {}, {}, {} | 2864 local new_uniques, uniques_bywhen, when_array = {}, {}, {} |
2875 for u,tstamp in pairs(p.when) do | 2865 for u,tstamp in pairs(p.when) do |
2876 uniques_bywhen[tstamp] = u | 2866 uniques_bywhen[tstamp] = u |
2877 when_array[#when_array+1] = tstamp | 2867 when_array[#when_array+1] = tstamp |
2878 end | 2868 end |
2879 _G.table.sort (when_array, compare_timestamps) | 2869 table.sort (when_array, compare_timestamps) |
2880 for i,tstamp in ipairs(when_array) do | 2870 for i,tstamp in ipairs(when_array) do |
2881 new_uniques[i] = uniques_bywhen[tstamp] | 2871 new_uniques[i] = uniques_bywhen[tstamp] |
2882 end | 2872 end |
2883 p.unique = new_uniques | 2873 p.unique = new_uniques |
2884 end | 2874 end |
2966 count = count + 1 | 2956 count = count + 1 |
2967 end | 2957 end |
2968 end | 2958 end |
2969 for i,e in self:filtered_loot_iter('loot') do | 2959 for i,e in self:filtered_loot_iter('loot') do |
2970 if e.unique and e.unique ~= "" then | 2960 if e.unique and e.unique ~= "" then |
2971 local hmmm = _G.rawget(g_uniques,e.unique) | 2961 local hmmm = rawget(g_uniques,e.unique) |
2972 if hmmm then | 2962 if hmmm then |
2973 hmmm.loot = i | 2963 hmmm.loot = i |
2974 elseif e.disposition == 'shard' or e.disposition == 'gvault' then | 2964 elseif e.disposition == 'shard' or e.disposition == 'gvault' then |
2975 g_uniques[e.unique] = { loot = i, history = g_uniques.NOTFOUND } | 2965 g_uniques[e.unique] = { loot = i, history = g_uniques.NOTFOUND } |
2976 count = count + 1 | 2966 count = count + 1 |
3272 -- Blessed be the lookup cache of the loot master. | 3262 -- Blessed be the lookup cache of the loot master. |
3273 g_uniques[U] = { loot = index, history = to_name } | 3263 g_uniques[U] = { loot = index, history = to_name } |
3274 end | 3264 end |
3275 local from_person_class = e.person_class or from_h.person_class | 3265 local from_person_class = e.person_class or from_h.person_class |
3276 or (g_loot.raiders[from_name] and g_loot.raiders[from_name].class) | 3266 or (g_loot.raiders[from_name] and g_loot.raiders[from_name].class) |
3277 or select(2,_G.UnitClass(from_name)) | 3267 or select(2,UnitClass(from_name)) |
3278 e.person = to_name | 3268 e.person = to_name |
3279 e.person_class = to_h.person_class | 3269 e.person_class = to_h.person_class |
3280 or (g_loot.raiders[to_name] and g_loot.raiders[to_name].class) | 3270 or (g_loot.raiders[to_name] and g_loot.raiders[to_name].class) |
3281 or select(2,_G.UnitClass(to_name)) | 3271 or select(2,UnitClass(to_name)) |
3282 self.hist_clean = nil | 3272 self.hist_clean = nil |
3283 self.loot_clean = nil | 3273 self.loot_clean = nil |
3284 | 3274 |
3285 if how == "local" then | 3275 if how == "local" then |
3286 if opts.chatty_on_local_changes then | 3276 if opts.chatty_on_local_changes then |