Mercurial > wow > ouroloot
comparison core.lua @ 89:939569ded66f
- Also include revision numbers when sending/displaying version data.
- Do a tweaked variant of the "ensure useful unique tags" code in _addLootEntry.
- When debugging comms, send to raid *and* guild instead of either.
- Remove flaky optimization in fixup_unique_replacements. Thanks to Hyndron
for helping me test this with genuine non-contrived data.
| author | Farmbuyer of US-Kilrogg <farmbuyer@gmail.com> |
|---|---|
| date | Thu, 28 Jun 2012 19:44:53 +0000 |
| parents | c9f955f9a285 |
| children | 92e0db376858 |
comparison
equal
deleted
inserted
replaced
| 88:c9f955f9a285 | 89:939569ded66f |
|---|---|
| 163 ['artifact'] = 6, | 163 ['artifact'] = 6, |
| 164 --['heirloom'] = 7, | 164 --['heirloom'] = 7, |
| 165 } | 165 } |
| 166 local my_name = UnitName('player') | 166 local my_name = UnitName('player') |
| 167 local comm_cleanup_ttl = 4 -- seconds in the communications cache | 167 local comm_cleanup_ttl = 4 -- seconds in the communications cache |
| 168 local revision_large = nil -- defaults to 1, possibly changed by revision | 168 local version_large = nil -- defaults to 1, possibly changed by version |
| 169 local g_LOOT_ITEM_ss, g_LOOT_ITEM_MULTIPLE_sss, g_LOOT_ITEM_SELF_s, g_LOOT_ITEM_SELF_MULTIPLE_ss | 169 local g_LOOT_ITEM_ss, g_LOOT_ITEM_MULTIPLE_sss, g_LOOT_ITEM_SELF_s, g_LOOT_ITEM_SELF_MULTIPLE_ss |
| 170 | 170 |
| 171 | 171 |
| 172 ------ Addon member data | 172 ------ Addon member data |
| 173 local flib = LibStub("LibFarmbuyer") | 173 local flib = LibStub("LibFarmbuyer") |
| 175 | 175 |
| 176 -- Play cute games with namespaces here just to save typing. WTB Lua 5.2 PST. | 176 -- Play cute games with namespaces here just to save typing. WTB Lua 5.2 PST. |
| 177 do local _G = _G setfenv (1, addon) | 177 do local _G = _G setfenv (1, addon) |
| 178 | 178 |
| 179 commrev = '17' | 179 commrev = '17' |
| 180 revision = _G.GetAddOnMetadata(nametag,"Version") or "?" -- "x.yy.z", etc | 180 version = _G.GetAddOnMetadata(nametag,"Version") or "?" -- "x.yy.z", etc |
| 181 ident = "OuroLoot2" | 181 ident = "OuroLoot2" |
| 182 identTg = "OuroLoot2Tg" | 182 identTg = "OuroLoot2Tg" |
| 183 status_text = nil | 183 status_text = nil |
| 184 revision = "@project-revision@" | |
| 185 --@debug@ | |
| 186 revision = "DEVEL" | |
| 187 --@end-debug@ | |
| 184 | 188 |
| 185 tekdebug = nil | 189 tekdebug = nil |
| 186 if _G.tekDebug then | 190 if _G.tekDebug then |
| 187 local tdframe = _G.tekDebug:GetFrame("Ouro Loot") | 191 local tdframe = _G.tekDebug:GetFrame("Ouro Loot") |
| 188 function tekdebug (txt) | 192 function tekdebug (txt) |
| 381 | 385 |
| 382 -- Try to extract numbers from the .toc "Version" and munge them into an | 386 -- Try to extract numbers from the .toc "Version" and munge them into an |
| 383 -- integral form for comparison. The result doesn't need to be meaningful as | 387 -- integral form for comparison. The result doesn't need to be meaningful as |
| 384 -- long as we can reliably feed two of them to "<" and get useful answers. | 388 -- long as we can reliably feed two of them to "<" and get useful answers. |
| 385 -- | 389 -- |
| 386 -- This makes/reinforces an assumption that revision_large of release packages | 390 -- This makes/reinforces an assumption that version_large of release packages |
| 387 -- (e.g., 2016001) will always be higher than those of development packages | 391 -- (e.g., 2016001) will always be higher than those of development packages |
| 388 -- (e.g., 87), due to the tagging system versus subversion file revs. This | 392 -- (e.g., 87), due to the tagging system versus subversion file revs. This |
| 389 -- is good, as local dev code will never trigger a false positive update | 393 -- is good, as local dev code will never trigger a false positive update |
| 390 -- warning for other users. | 394 -- warning for other users. |
| 391 do | 395 do |
| 392 local r = 0 | 396 local r = 0 |
| 393 for d in addon.revision:gmatch("%d+") do | 397 for d in addon.version:gmatch("%d+") do |
| 394 r = 1000*r + d | 398 r = 1000*r + d |
| 395 end | 399 end |
| 396 -- If it's a big enough number to obviously be a release, then make | 400 -- If it's a big enough number to obviously be a release, then make |
| 397 -- sure it's big enough to overcome many small previous point releases. | 401 -- sure it's big enough to overcome many small previous point releases. |
| 398 while r > 2000 and r < 2000000 do | 402 while r > 2000 and r < 2000000 do |
| 399 r = 1000*r | 403 r = 1000*r |
| 400 end | 404 end |
| 401 revision_large = math.max(r,1) | 405 version_large = math.max(r,1) |
| 402 end | 406 end |
| 403 | 407 |
| 404 -- Hypertext support, inspired by DBM broadcast pizza timers | 408 -- Hypertext support, inspired by DBM broadcast pizza timers |
| 405 do | 409 do |
| 406 local hypertext_format_str = "|HOuroLoot:%d|h%s[%s]|r|h" | 410 local hypertext_format_str = "|HOuroLoot:%d|h%s[%s]|r|h" |
| 870 end | 874 end |
| 871 if dirty then self:Print("Saved data has been massaged into shape.") end | 875 if dirty then self:Print("Saved data has been massaged into shape.") end |
| 872 end | 876 end |
| 873 | 877 |
| 874 _init(self) | 878 _init(self) |
| 875 self.dprint('flow', "version strings:", revision_large, self.status_text) | 879 self.dprint('flow', "version strings:", version_large, self.revision, self.status_text) |
| 876 self.load_assert = nil | 880 self.load_assert = nil |
| 877 self.OnInitialize = nil -- free up ALL the things! | 881 self.OnInitialize = nil -- free up ALL the things! |
| 878 end | 882 end |
| 879 | 883 |
| 880 function addon:OnEnable() | 884 function addon:OnEnable() |
| 1047 -- Fires before the plugin's own OnEnable (inherited or otherwise). | 1051 -- Fires before the plugin's own OnEnable (inherited or otherwise). |
| 1048 --function addon:OnModuleCreated (plugin) | 1052 --function addon:OnModuleCreated (plugin) |
| 1049 -- print("created plugin", plugin:GetName()) | 1053 -- print("created plugin", plugin:GetName()) |
| 1050 --end | 1054 --end |
| 1051 | 1055 |
| 1052 local olrev = tonumber("@project-revision@") or 0 | |
| 1053 local err = [[Module '%s' cannot register itself because it failed a required condition: '%s']] | 1056 local err = [[Module '%s' cannot register itself because it failed a required condition: '%s']] |
| 1054 function addon:ConstrainedNewModule (modname, minrev, mincomm, mindata) | 1057 function addon:ConstrainedNewModule (modname, minrev, mincomm, mindata) |
| 1055 if not addon.author_debug then | 1058 if not addon.author_debug then |
| 1056 if minrev and minrev > olrev then | 1059 if minrev and tonumber(minrev) > (tonumber(self.revision) or math.huge) then |
| 1057 self:Print(err,modname, | 1060 self:Print(err,modname, |
| 1058 "revision "..olrev.." older than minimum "..minrev) | 1061 "revision "..self.revision.." older than minimum "..minrev) |
| 1059 return false | 1062 return false |
| 1060 end | 1063 end |
| 1061 if mincomm and mincomm > tonumber(self.commrev) then | 1064 if mincomm and tonumber(mincomm) > tonumber(self.commrev) then |
| 1062 self:Print(err,modname, | 1065 self:Print(err,modname, |
| 1063 "commrev "..self.commrev.." older than minimum "..mincomm) | 1066 "commrev "..self.commrev.." older than minimum "..mincomm) |
| 1064 return false | 1067 return false |
| 1065 end | 1068 end |
| 1066 if mindata and mindata > opts.datarev then | 1069 if mindata and tonumber(mindata) > opts.datarev then |
| 1067 self:Print(err,modname, | 1070 self:Print(err,modname, |
| 1068 "datarev "..opts.datarev.." older than minimum "..mindata) | 1071 "datarev "..opts.datarev.." older than minimum "..mindata) |
| 1069 return false | 1072 return false |
| 1070 end | 1073 end |
| 1071 end | 1074 end |
| 1541 if not itemstring then | 1544 if not itemstring then |
| 1542 itemstring = msg:match(g_LOOT_ITEM_SELF_s) | 1545 itemstring = msg:match(g_LOOT_ITEM_SELF_s) |
| 1543 end | 1546 end |
| 1544 end | 1547 end |
| 1545 | 1548 |
| 1549 if not itemstring then return end -- "PlayerX selected Greed", etc, not looting | |
| 1546 self.dprint('loot', "CHAT_MSG_LOOT, person is", person, | 1550 self.dprint('loot', "CHAT_MSG_LOOT, person is", person, |
| 1547 ", itemstring is", itemstring, ", count is", count) | 1551 ", itemstring is", itemstring, ", count is", count) |
| 1548 if not itemstring then return end -- "PlayerX selected Greed", etc, not looting | |
| 1549 | 1552 |
| 1550 -- Name might be colorized, remove the highlighting | 1553 -- Name might be colorized, remove the highlighting |
| 1551 if person then | 1554 if person then |
| 1552 person = person:match("|c%x%x%x%x%x%x%x%x(%S+)") or person | 1555 person = person:match("|c%x%x%x%x%x%x%x%x(%S+)") or person |
| 1553 else | 1556 else |
| 1735 self:SetThreshold (opt_threshold, --[[quiet_p=]]true) | 1738 self:SetThreshold (opt_threshold, --[[quiet_p=]]true) |
| 1736 end | 1739 end |
| 1737 self:Print("Now %s; threshold currently %s.", | 1740 self:Print("Now %s; threshold currently %s.", |
| 1738 self.enabled and "tracking" or "only broadcasting", | 1741 self.enabled and "tracking" or "only broadcasting", |
| 1739 self.thresholds[self.threshold]) | 1742 self.thresholds[self.threshold]) |
| 1740 self:broadcast('revcheck',revision_large) | 1743 self:broadcast('revcheck',version_large) |
| 1741 end | 1744 end |
| 1742 | 1745 |
| 1743 -- Note: running '/loot off' will also avoid the popup reminder when | 1746 -- Note: running '/loot off' will also avoid the popup reminder when |
| 1744 -- joining a raid, but will not change the saved option setting. | 1747 -- joining a raid, but will not change the saved option setting. |
| 1745 function addon:Deactivate() | 1748 function addon:Deactivate() |
| 1845 local e = g_loot[index] | 1848 local e = g_loot[index] |
| 1846 if not e then | 1849 if not e then |
| 1847 -- how did this happen? | 1850 -- how did this happen? |
| 1848 return | 1851 return |
| 1849 end | 1852 end |
| 1853 if source == my_name then | |
| 1854 source = _G.UNIT_YOU | |
| 1855 end | |
| 1850 local from_text, to_text | 1856 local from_text, to_text |
| 1851 if from_whom then | 1857 if from_whom then |
| 1858 if from_whom == my_name then | |
| 1859 from_whom = _G.UNIT_YOU | |
| 1860 end | |
| 1852 from_text = addon:colorize (from_whom, from_class) | 1861 from_text = addon:colorize (from_whom, from_class) |
| 1853 to_text = addon:colorize (e.person, e.person_class) | 1862 to_text = e.person == my_name and _G.UNIT_YOU or e.person |
| 1863 to_text = addon:colorize (to_text, e.person_class) | |
| 1854 else | 1864 else |
| 1855 if olddisp then | 1865 if olddisp then |
| 1856 from_text = addon.disposition_colors[olddisp].text | 1866 from_text = addon.disposition_colors[olddisp].text |
| 1857 else | 1867 else |
| 1858 olddisp = "normal" | 1868 olddisp = "normal" |
| 1908 function addon:DoPing() | 1918 function addon:DoPing() |
| 1909 self:Print("Give me a ping, Vasili. One ping only, please.") | 1919 self:Print("Give me a ping, Vasili. One ping only, please.") |
| 1910 self.sender_list.active = {} | 1920 self.sender_list.active = {} |
| 1911 self.sender_list.names = {} | 1921 self.sender_list.names = {} |
| 1912 self:broadcast('ping') | 1922 self:broadcast('ping') |
| 1913 self:broadcast('revcheck',revision_large) | 1923 self:broadcast('revcheck',version_large) |
| 1914 end | 1924 end |
| 1915 | 1925 |
| 1916 function addon:_check_revision (otherrev) | 1926 function addon:_check_version (otherrev) |
| 1917 self.dprint('comm', "revchecking against", otherrev) | 1927 self.dprint('comm', "revchecking against", otherrev) |
| 1918 otherrev = tonumber(otherrev) | 1928 otherrev = tonumber(otherrev) |
| 1919 if otherrev == revision_large then | 1929 if otherrev == version_large then |
| 1920 -- normal case | 1930 -- normal case |
| 1921 | 1931 |
| 1922 elseif otherrev < revision_large then | 1932 elseif otherrev < version_large then |
| 1923 self.dprint('comm', "ours is newer, notifying") | 1933 self.dprint('comm', "ours is newer, notifying") |
| 1924 self:broadcast('revcheck',revision_large) | 1934 self:broadcast('revcheck',version_large) |
| 1925 | 1935 |
| 1926 else | 1936 else |
| 1927 self.dprint('comm', "ours is older, (possibly) yammering") | 1937 self.dprint('comm', "ours is older, (possibly) yammering") |
| 1928 if newer_warning then | 1938 if newer_warning then |
| 1929 local pop = addon.format_hypertext ([[click here]], ITEM_QUALITY_UNCOMMON, | 1939 local pop = addon.format_hypertext ([[click here]], ITEM_QUALITY_UNCOMMON, |
| 2041 end | 2051 end |
| 2042 if possible_st then | 2052 if possible_st then |
| 2043 possible_st:SetData(g_loot) | 2053 possible_st:SetData(g_loot) |
| 2044 end | 2054 end |
| 2045 | 2055 |
| 2046 self.status_text = ("%s communicating as ident %s commrev %s"): | 2056 self.status_text = ("%s(r%s) communicating as ident %s commrev %s"): |
| 2047 format (self.revision, self.ident, self.commrev) | 2057 format (self.version, self.revision, self.ident, self.commrev) |
| 2048 self:RegisterComm(self.ident) | 2058 self:RegisterComm(self.ident) |
| 2049 self:RegisterComm(self.identTg, "OnCommReceivedNocache") | 2059 self:RegisterComm(self.identTg, "OnCommReceivedNocache") |
| 2050 | 2060 |
| 2051 if self.author_debug then | 2061 if self.author_debug then |
| 2052 _G.Oloot = g_loot | 2062 _G.Oloot = g_loot |
| 2327 end | 2337 end |
| 2328 addon:_fill_out_eoi_data(1) | 2338 addon:_fill_out_eoi_data(1) |
| 2329 end | 2339 end |
| 2330 | 2340 |
| 2331 -- Adding anything original to g_loot goes through this routine. | 2341 -- Adding anything original to g_loot goes through this routine. |
| 2342 -- More precisely, anything new on the EOI tab hits this; it does not | |
| 2343 -- necessarily need to be a looted item. | |
| 2332 function addon._addLootEntry (e) | 2344 function addon._addLootEntry (e) |
| 2333 setmetatable(e,loot_entry_mt) | 2345 setmetatable(e,loot_entry_mt) |
| 2334 | 2346 |
| 2335 if not done_todays_date then do_todays_date() end | 2347 if not done_todays_date then do_todays_date() end |
| 2336 | 2348 |
| 2338 --local localuptime = math.floor(GetTime()) | 2350 --local localuptime = math.floor(GetTime()) |
| 2339 local time_t = _G.time() | 2351 local time_t = _G.time() |
| 2340 e.hour = h | 2352 e.hour = h |
| 2341 e.minute = m | 2353 e.minute = m |
| 2342 e.stamp = time_t --localuptime | 2354 e.stamp = time_t --localuptime |
| 2355 if e.kind == 'loot' then | |
| 2356 if (not e.unique) or (#e.unique==0) then | |
| 2357 e.unique = e.id .. (e.disposition or e.person) .. _G.date("%Y/%m/%d %H:%M",e.stamp) | |
| 2358 end | |
| 2359 end | |
| 2343 local index = #g_loot + 1 | 2360 local index = #g_loot + 1 |
| 2344 g_loot[index] = e | 2361 g_loot[index] = e |
| 2345 return index | 2362 return index |
| 2346 end | 2363 end |
| 2347 | 2364 |
| 2461 winning_index = i | 2478 winning_index = i |
| 2462 end | 2479 end |
| 2463 info[i] = nil | 2480 info[i] = nil |
| 2464 end | 2481 end |
| 2465 pprint('improv', "final:", winner[1], winner[2]) | 2482 pprint('improv', "final:", winner[1], winner[2]) |
| 2466 --@debug@ | |
| 2467 -- purely a sanity check | |
| 2468 if winning_index == 1 then | |
| 2469 if winner[2] ~= info.LOCAL then | |
| 2470 pprint('improv', | |
| 2471 "things locally generated are not locally generated?", | |
| 2472 info.LOCAL, winner[2]) | |
| 2473 end | |
| 2474 end | |
| 2475 --@end-debug@ | |
| 2476 --[[ | 2483 --[[ |
| 2477 A: winner was generated locally | 2484 A: winner was generated locally |
| 2478 >winning_index == 1 | 2485 >winning_index == 1 |
| 2479 >g_loot and history already has the replacement value | 2486 >g_loot and history already has the replacement value |
| 2480 B: winner was generated remotely | 2487 B: winner was generated remotely |
| 2481 >need to scan and replace | 2488 >need to scan and replace |
| 2482 Detecting A is strictly an optimization. We should be able to do | 2489 Detecting A is strictly an optimization. We should be able to do |
| 2483 this code safely in all cases. | 2490 this code safely in all cases. Important to note: a local winner |
| 2491 will always be at index 1, but a winner at index 1 does not necessarily | |
| 2492 mean it was locally generated (e.g., if the local itemfilter drops | |
| 2493 it but a remote player does an improv). Just do the general case | |
| 2494 until/unless this becomes a problem. | |
| 2484 ]] | 2495 ]] |
| 2485 if | 2496 --XXX this branch still needs to be tested with live data |
| 2486 --@debug@ | 2497 local cache = g_uniques:SEARCH(exist) |
| 2487 true or | 2498 local looti,hi,ui = cache.loot, cache.history, cache.history_may |
| 2488 --@end-debug@ | 2499 |
| 2489 winning_index ~= 1 then | 2500 -- Active loot |
| 2490 --XXX this branch still needs to be tested with live data | 2501 if looti and g_loot[looti].unique == exist then |
| 2491 local cache = g_uniques:SEARCH(exist) | 2502 pprint('improv', "found and replaced loot entry", looti) |
| 2492 local looti,hi,ui = cache.loot, cache.history, cache.history_may | 2503 g_loot[looti].unique = winner[2] |
| 2493 | 2504 else |
| 2494 -- Active loot | 2505 -- If sharded, filtered, or the improv was done by the local |
| 2495 if looti and g_loot[looti].unique == exist then | 2506 -- player, then the "previous" unique would not have made it |
| 2496 pprint('improv', "found and replaced loot entry", looti) | 2507 -- into the tables to begin with. So don't flag an error. |
| 2497 g_loot[looti].unique = winner[2] | 2508 pprint('improv', "No active loot found", looti, |
| 2509 looti and g_loot[looti].unique, winning_index) | |
| 2510 end | |
| 2511 | |
| 2512 -- History | |
| 2513 if hi ~= g_uniques.NOTFOUND then | |
| 2514 hi = addon.history.byname[hi] | |
| 2515 local hist = addon.history[hi] | |
| 2516 if ui and hist.unique[ui] == exist then | |
| 2517 -- ui is valid | |
| 2498 else | 2518 else |
| 2499 -- If winning_index == 1, the "previous" unique would not | 2519 ui = nil |
| 2500 -- have made it into the tables to begin with. So don't | 2520 for i,ui2 in ipairs(hist.unique) do |
| 2501 -- flag an error. Still should be looked at. | 2521 if ui2 == exist then |
| 2502 pprint('improv', "Um.", looti, g_loot[looti].unique, winning_index) | 2522 ui = i |
| 2503 end | 2523 break |
| 2504 | |
| 2505 -- History | |
| 2506 if hi ~= g_uniques.NOTFOUND then | |
| 2507 hi = addon.history.byname[hi] | |
| 2508 local hist = addon.history[hi] | |
| 2509 if ui and hist.unique[ui] == exist then | |
| 2510 -- ui is valid | |
| 2511 else | |
| 2512 ui = nil | |
| 2513 for i,ui2 in ipairs(hist.unique) do | |
| 2514 if ui2 == exist then | |
| 2515 ui = i | |
| 2516 break | |
| 2517 end | |
| 2518 end | 2524 end |
| 2519 end | 2525 end |
| 2520 if ui then | 2526 end |
| 2521 pprint('improv', "found and replacing history entry", hi, | 2527 if ui then |
| 2522 ui, hist.name) | 2528 pprint('improv', "found and replacing history entry", hi, |
| 2523 assert(exist ~= winner[2]) | 2529 ui, hist.name) |
| 2524 hist.when[winner[2]] = hist.when[exist] | 2530 assert(exist ~= winner[2]) |
| 2525 hist.id[winner[2]] = hist.id[exist] | 2531 hist.when[winner[2]] = hist.when[exist] |
| 2526 hist.count[winner[2]] = hist.count[exist] | 2532 hist.id[winner[2]] = hist.id[exist] |
| 2527 hist.unique[ui] = winner[2] | 2533 hist.count[winner[2]] = hist.count[exist] |
| 2528 hist.when[exist] = nil | 2534 hist.unique[ui] = winner[2] |
| 2529 hist.id[exist] = nil | 2535 hist.when[exist] = nil |
| 2530 hist.count[exist] = nil | 2536 hist.id[exist] = nil |
| 2531 end | 2537 hist.count[exist] = nil |
| 2532 end | 2538 end |
| 2533 end | 2539 end |
| 2540 | |
| 2534 pprint('improv', "finished with", exist, "into", winner[2]) | 2541 pprint('improv', "finished with", exist, "into", winner[2]) |
| 2535 flib.del(winner) | 2542 flib.del(winner) |
| 2536 flib.del(info) | 2543 flib.del(info) |
| 2537 gur.replacements[exist] = nil | 2544 gur.replacements[exist] = nil |
| 2538 end | 2545 end |
| 2815 pprint(hmmm) -- more? | 2822 pprint(hmmm) -- more? |
| 2816 -- try to simply fix up errors as we go | 2823 -- try to simply fix up errors as we go |
| 2817 g_uniques[e.unique] = { loot = i, history = g_uniques.NOTFOUND } | 2824 g_uniques[e.unique] = { loot = i, history = g_uniques.NOTFOUND } |
| 2818 end | 2825 end |
| 2819 else | 2826 else |
| 2827 -- The usual cause: when only source is from an older client | |
| 2828 -- and the disposition did not trigger addhistory, then not | |
| 2829 -- even a stub history entry happens. Code has now been added | |
| 2830 -- to try harder to prevent this, but it's still best to not | |
| 2831 -- simple ignore it. | |
| 2820 trouble = true | 2832 trouble = true |
| 2821 pprint('loot', "ERROR precache loop found bad unique tag!", | 2833 pprint('loot', "ERROR precache loop found missing/outdated unique tag!", |
| 2822 i, "tag", tostring(e.unique), "from?", tostring(e.bcast_from)) | 2834 i, "tag <"..tostring(e.unique).."> from?", tostring(e.bcast_from)) |
| 2823 end | 2835 end |
| 2824 end | 2836 end |
| 2825 UpdateAddOnMemoryUsage() | 2837 UpdateAddOnMemoryUsage() |
| 2826 local after = GetAddOnMemoryUsage(nametag) | 2838 local after = GetAddOnMemoryUsage(nametag) |
| 2827 self:Print("Pre-scanning history for faster loot handling on %s used %.2f MB of memory across %d entries.", | 2839 self:Print("Pre-scanning history for faster loot handling on %s used %.2f MB of memory across %d entries.", |
| 2828 self.history.realm, (after-before)/1024, count) | 2840 self.history.realm, (after-before)/1024, count) |
| 2829 if trouble then | 2841 if trouble then |
| 2830 self:Print("Note that there were inconsistencies in the data;", | 2842 self:Print("Note that there were inconsistencies in the data;", |
| 2831 "you should consider submitting a bug report (including your", | 2843 "you should consider submitting a bug report (including your", |
| 2832 "SavedVariables file), and regenerating or preening this", | 2844 "SavedVariables file), and regenerating or preening this", |
| 2833 "realm's loot history.") | 2845 "realm's loot history. If you keep seeing this message, type", |
| 2846 "'/ouroloot fix ?' and try some of those actions.") | |
| 2834 end | 2847 end |
| 2835 g_uniques:SETMODE('probe') | 2848 g_uniques:SETMODE('probe') |
| 2836 self._cache_history_uniques = nil | 2849 self._cache_history_uniques = nil |
| 2837 end | 2850 end |
| 2838 | 2851 |
| 3343 local function assemble(t,...) | 3356 local function assemble(t,...) |
| 3344 local n = select('#',...) | 3357 local n = select('#',...) |
| 3345 if n > 0 then | 3358 if n > 0 then |
| 3346 local msg = {t,...} | 3359 local msg = {t,...} |
| 3347 -- tconcat requires strings, but T is known to be one already | 3360 -- tconcat requires strings, but T is known to be one already |
| 3348 -- can't use #msg since there might be holes | 3361 -- can't use #msg since there might be nil holes |
| 3349 for i = 2, n+1 do | 3362 for i = 2, n+1 do |
| 3350 msg[i] = tostring(msg[i] or "") | 3363 msg[i] = tostring(msg[i] or "") |
| 3351 end | 3364 end |
| 3352 return tconcat (msg, '\a') | 3365 return tconcat (msg, '\a') |
| 3353 end | 3366 end |
| 3360 return self:broadcast(self.commrev..tag,...) | 3373 return self:broadcast(self.commrev..tag,...) |
| 3361 end | 3374 end |
| 3362 function addon:broadcast(tag,...) | 3375 function addon:broadcast(tag,...) |
| 3363 local msg = assemble(tag,...) | 3376 local msg = assemble(tag,...) |
| 3364 self.dprint('comm', "<broadcast>:", msg) | 3377 self.dprint('comm', "<broadcast>:", msg) |
| 3365 -- the "GUILD" here is just so that we can also pick up on it | 3378 self:SendCommMessage(self.ident, msg, "RAID") |
| 3366 self:SendCommMessage(self.ident, msg, self.debug.comm and "GUILD" or "RAID") | 3379 -- this is what lets us debug our own message traffic: |
| 3380 if self.debug.comm then | |
| 3381 self:SendCommMessage(self.ident, msg, "GUILD") | |
| 3382 end | |
| 3367 end | 3383 end |
| 3368 -- whispercast(<to>, 'tag', <stuff>) | 3384 -- whispercast(<to>, 'tag', <stuff>) |
| 3369 function addon:whispercast(to,...) | 3385 function addon:whispercast(to,...) |
| 3370 local msg = assemble(...) | 3386 local msg = assemble(...) |
| 3371 self.dprint('comm', "<whispercast>@", to, ":", msg) | 3387 self.dprint('comm', "<whispercast>@", to, ":", msg) |
| 3382 -- player is not tracking loot, so test for that when appropriate. | 3398 -- player is not tracking loot, so test for that when appropriate. |
| 3383 local OCR_funcs = {} | 3399 local OCR_funcs = {} |
| 3384 | 3400 |
| 3385 OCR_funcs.ping = function (sender) | 3401 OCR_funcs.ping = function (sender) |
| 3386 pprint('comm', "incoming ping from", sender) | 3402 pprint('comm', "incoming ping from", sender) |
| 3387 addon:whispercast (sender, 'pong', addon.revision, | 3403 local what = addon.enabled and "tracking" or |
| 3388 addon.enabled and "tracking" or (addon.rebroadcast and "broadcasting" or "disabled")) | 3404 (addon.rebroadcast and "broadcasting" or "disabled") |
| 3389 end | 3405 addon:whispercast (sender, 'pong', addon.version, what, addon.revision) |
| 3390 OCR_funcs.pong = function (sender, _, rev, status) | 3406 end |
| 3391 local s = ("|cff00ff00%s|r %s is |cff00ffff%s|r"):format(sender,rev,status) | 3407 OCR_funcs.pong = function (sender, _, ver, status, opt_rev) |
| 3408 local s = ("|cff00ff00%s|r %s(r%s) is |cff00ffff%s|r"): | |
| 3409 format (sender, ver, opt_rev or "?", status) | |
| 3392 addon:Print("Echo: ", s) | 3410 addon:Print("Echo: ", s) |
| 3393 adduser (sender, s, status=="tracking" or status=="broadcasting" or nil) | 3411 adduser (sender, s, status=="tracking" or status=="broadcasting" or nil) |
| 3394 end | 3412 end |
| 3395 OCR_funcs.revcheck = function (sender, _, revlarge) | 3413 OCR_funcs.revcheck = function (sender, _, revlarge) |
| 3396 addon.dprint('comm', "revcheck, sender", sender) | 3414 addon.dprint('comm', "revcheck, sender", sender) |
| 3397 addon:_check_revision (revlarge) | 3415 addon:_check_version (revlarge) |
| 3398 end | 3416 end |
| 3399 | 3417 |
| 3400 OCR_funcs['17improv'] = function (sender, _, senderid, existing, replace) | 3418 OCR_funcs['17improv'] = function (sender, _, senderid, existing, replace) |
| 3401 addon.dprint('comm', "DOTimprov/17, sender", sender, "id", senderid, | 3419 addon.dprint('comm', "DOTimprov/17, sender", sender, "id", senderid, |
| 3402 "existing", existing, "replace", replace) | 3420 "existing", existing, "replace", replace) |
| 3503 local n = select('#',...) | 3521 local n = select('#',...) |
| 3504 for i = 1, n do | 3522 for i = 1, n do |
| 3505 local d = select(i,...) | 3523 local d = select(i,...) |
| 3506 OCR_data[i] = (d ~= "") and d or nil | 3524 OCR_data[i] = (d ~= "") and d or nil |
| 3507 end | 3525 end |
| 3508 addon.dprint('comm', ":... processing", tag, "from", sender, "with arg count", n) | 3526 addon.dprint('comm', ":...processing", tag, "from", sender, "with arg count", n) |
| 3509 return f(sender,tag,unpack(OCR_data,1,n)) | 3527 return f(sender,tag,unpack(OCR_data,1,n)) |
| 3510 end | 3528 end |
| 3511 addon.dprint('comm', "unknown comm message", tag, "from", sender) | 3529 addon.dprint('comm', "unknown comm message", tag, "from", sender) |
| 3512 end | 3530 end |
| 3513 -- Recent message cache (this can be accessed via advanced options panel) | 3531 -- Recent message cache (this can be accessed via advanced options panel) |
