Mercurial > wow > ouroloot
comparison core.lua @ 101:f7162a1cadc7
Unify remote/local change notifications, and allow option toggles for each. When passing entry tables to the registered callbacks, make proxies for them first (the goal is to prevent accidents, not fraud).
| author | Farmbuyer of US-Kilrogg <farmbuyer@gmail.com> |
|---|---|
| date | Wed, 01 Aug 2012 06:51:52 +0000 |
| parents | a57133ee3c9b |
| children | fe04f5c4114a |
comparison
equal
deleted
inserted
replaced
| 100:a57133ee3c9b | 101:f7162a1cadc7 |
|---|---|
| 132 ['forum_current'] = '[item] by name', | 132 ['forum_current'] = '[item] by name', |
| 133 ['display_disabled_LODs'] = false, | 133 ['display_disabled_LODs'] = false, |
| 134 ['display_bcast_from'] = true, | 134 ['display_bcast_from'] = true, |
| 135 ['precache_history_uniques'] = false, | 135 ['precache_history_uniques'] = false, |
| 136 ['chatty_on_remote_changes'] = false, | 136 ['chatty_on_remote_changes'] = false, |
| 137 ['chatty_on_remote_changes_frame'] = 1, | 137 ['chatty_on_local_changes'] = false, |
| 138 ['chatty_on_changes_frame'] = 1, | |
| 138 ['itemfilter'] = {}, | 139 ['itemfilter'] = {}, |
| 139 ['itemvault'] = {}, | 140 ['itemvault'] = {}, |
| 140 } } | 141 } } |
| 141 local virgin = "First time loaded? Hi! Use the /ouroloot command" | 142 local virgin = "First time loaded? Hi! Use the /ouroloot command" |
| 142 .." to show the main display. You should probably browse the instructions" | 143 .." to show the main display. You should probably browse the instructions" |
| 390 local GetNumRaidMembers = _G.GetNumGroupMembers or _G.GetNumRaidMembers | 391 local GetNumRaidMembers = _G.GetNumGroupMembers or _G.GetNumRaidMembers |
| 391 local IsInRaid = _G.IsInRaid or (function() return GetNumRaidMembers() > 0 end) | 392 local IsInRaid = _G.IsInRaid or (function() return GetNumRaidMembers() > 0 end) |
| 392 -- En masse forward decls of symbols defined inside local blocks | 393 -- En masse forward decls of symbols defined inside local blocks |
| 393 local _register_bossmod, makedate, create_new_cache, _init, _log, _do_loot_metas | 394 local _register_bossmod, makedate, create_new_cache, _init, _log, _do_loot_metas |
| 394 local _history_by_loot_id, _setup_unique_replace, _unavoidable_collision | 395 local _history_by_loot_id, _setup_unique_replace, _unavoidable_collision |
| 395 local _notify_about_change, _notify_about_remote | 396 local _notify_about_change |
| 396 | 397 |
| 397 -- Try to extract numbers from the .toc "Version" and munge them into an | 398 -- Try to extract numbers from the .toc "Version" and munge them into an |
| 398 -- integral form for comparison. The result doesn't need to be meaningful as | 399 -- integral form for comparison. The result doesn't need to be meaningful as |
| 399 -- long as we can reliably feed two of them to "<" and get useful answers. | 400 -- long as we can reliably feed two of them to "<" and get useful answers. |
| 400 -- | 401 -- |
| 955 self:_cache_history_uniques() | 956 self:_cache_history_uniques() |
| 956 end | 957 end |
| 957 | 958 |
| 958 self:_scan_LOD_modules() | 959 self:_scan_LOD_modules() |
| 959 | 960 |
| 960 self:_set_remote_change_chatframe (opts.chatty_on_remote_changes_frame, --[[silent_p=]]true) | 961 self:_set_chatty_change_chatframe (opts.chatty_on_changes_frame, --[[silent_p=]]true) |
| 961 | 962 |
| 962 if self.debug.flow then self:Print"is in control-flow debug mode." end | 963 if self.debug.flow then self:Print"is in control-flow debug mode." end |
| 963 end | 964 end |
| 964 --function addon:OnDisable() end | 965 --function addon:OnDisable() end |
| 965 | 966 |
| 1056 -- after the interesting event: cleanups/fixups, improvs from network, etc. | 1057 -- after the interesting event: cleanups/fixups, improvs from network, etc. |
| 1057 -- So firing a callback is delayed ever so briefly by human standards. | 1058 -- So firing a callback is delayed ever so briefly by human standards. |
| 1058 -- | 1059 -- |
| 1059 -- Can't *quite* use the expiring caches for this, but that's okay. | 1060 -- Can't *quite* use the expiring caches for this, but that's okay. |
| 1060 do | 1061 do |
| 1062 local mtnewindex = function() error("This table is read-only", 3) end | |
| 1063 local function make_readonly (t) | |
| 1064 return _G.setmetatable({}, { | |
| 1065 __newindex = mtnewindex, | |
| 1066 __index = t, | |
| 1067 __metatable = false, | |
| 1068 }) | |
| 1069 end | |
| 1070 | |
| 1061 local unpack = _G.unpack | 1071 local unpack = _G.unpack |
| 1062 local function F (t) | 1072 local function F (t) |
| 1063 addon.callbacks:Fire (unpack(t)) | 1073 addon.callbacks:Fire (unpack(t)) |
| 1064 flib.del(t) | 1074 flib.del(t) |
| 1065 end | 1075 end |
| 1066 function addon:Fire (...) | 1076 function addon:Fire (...) |
| 1067 self.dprint('callback', ...) | 1077 self.dprint('callback', ...) |
| 1068 local capture = flib.new(...) | 1078 local capture = flib.new(...) |
| 1079 for k,v in ipairs(capture) do if type(v) == 'table' then | |
| 1080 capture[k] = make_readonly(v) | |
| 1081 end end | |
| 1069 self:ScheduleTimer (F, 1.2, capture) | 1082 self:ScheduleTimer (F, 1.2, capture) |
| 1070 end | 1083 end |
| 1071 end | 1084 end |
| 1072 | 1085 |
| 1073 | 1086 |
| 1814 end | 1827 end |
| 1815 end | 1828 end |
| 1816 | 1829 |
| 1817 -- Routines for printing changes made by remote users. | 1830 -- Routines for printing changes made by remote users. |
| 1818 do | 1831 do |
| 1819 local remote_change_chatframe | 1832 local change_chatframe |
| 1820 | 1833 |
| 1821 function addon:_set_remote_change_chatframe (arg, silent_p) | 1834 function addon:_set_chatty_change_chatframe (arg, silent_p) |
| 1822 local frame | 1835 local frame |
| 1823 if type(arg) == 'number' then | 1836 if type(arg) == 'number' then |
| 1824 arg = _G.math.min (arg, _G.NUM_CHAT_WINDOWS) | 1837 arg = _G.math.min (arg, _G.NUM_CHAT_WINDOWS) |
| 1825 frame = _G['ChatFrame'..arg] | 1838 frame = _G['ChatFrame'..arg] |
| 1826 elseif type(arg) == 'string' then | 1839 elseif type(arg) == 'string' then |
| 1827 frame = _G[arg] | 1840 frame = _G[arg] |
| 1828 end | 1841 end |
| 1829 if type(frame) == 'table' and type(frame.AddMessage) == 'function' then | 1842 if type(frame) == 'table' and type(frame.AddMessage) == 'function' then |
| 1830 remote_change_chatframe = frame | 1843 change_chatframe = frame |
| 1831 if not silent_p then | 1844 if not silent_p then |
| 1832 local msg = "Now printing to chat frame " .. arg | 1845 local msg = "Now printing to chat frame " .. arg |
| 1833 if frame.GetName then | 1846 if frame.GetName then |
| 1834 msg = msg .. " (" .. tostring(frame:GetName()) .. ")" | 1847 msg = msg .. " (" .. tostring(frame:GetName()) .. ")" |
| 1835 end | 1848 end |
| 1842 else | 1855 else |
| 1843 self:Print("'%s' was not a valid chat frame number/name, no change has been made.", arg) | 1856 self:Print("'%s' was not a valid chat frame number/name, no change has been made.", arg) |
| 1844 end | 1857 end |
| 1845 end | 1858 end |
| 1846 | 1859 |
| 1847 function _notify_about_change (chatframe, source, index, olddisp, from_whom, from_class) | 1860 local function _notify (chatframe, source, index, olddisp, from_whom, from_class) |
| 1848 local e = g_loot[index] | 1861 local e = g_loot[index] |
| 1849 if not e then | 1862 if not e then |
| 1850 -- how did this happen? | 1863 -- how did this happen? |
| 1851 return | 1864 return |
| 1852 end | 1865 end |
| 1884 e.itemlink, from_text, to_text) | 1897 e.itemlink, from_text, to_text) |
| 1885 addon:CFPrint (chatframe, remote_chatty, source, index, | 1898 addon:CFPrint (chatframe, remote_chatty, source, index, |
| 1886 e.itemlink, from_text, to_text) | 1899 e.itemlink, from_text, to_text) |
| 1887 end | 1900 end |
| 1888 | 1901 |
| 1889 function _notify_about_remote (sender, index, olddisp, from_whom, from_class) | 1902 function _notify_about_change (sender, index, olddisp, from_whom, from_class) |
| 1890 _notify_about_change (remote_change_chatframe, sender, index, olddisp, from_whom, from_class) | 1903 _notify (change_chatframe, sender, index, olddisp, from_whom, from_class) |
| 1891 end | 1904 end |
| 1892 end | 1905 end |
| 1893 | 1906 |
| 1894 -- Adds indices to traverse the tables in a nice sorted order. | 1907 -- Adds indices to traverse the tables in a nice sorted order. |
| 1895 do | 1908 do |
| 3158 or select(2,_G.UnitClass(to_name)) | 3171 or select(2,_G.UnitClass(to_name)) |
| 3159 self.hist_clean = nil | 3172 self.hist_clean = nil |
| 3160 self.loot_clean = nil | 3173 self.loot_clean = nil |
| 3161 | 3174 |
| 3162 if how == "local" then | 3175 if how == "local" then |
| 3163 _notify_about_change (_G.DEFAULT_CHAT_FRAME, _G.UNIT_YOU, index, | 3176 if opts.chatty_on_local_changes then |
| 3164 nil, from_name, from_person_class) | 3177 _notify_about_change (_G.UNIT_YOU, index, nil, from_name, from_person_class) |
| 3178 end | |
| 3165 self:vbroadcast('reassign', unique, id, from_name, to_name) | 3179 self:vbroadcast('reassign', unique, id, from_name, to_name) |
| 3166 elseif opts.chatty_on_remote_changes then | 3180 elseif opts.chatty_on_remote_changes then |
| 3167 _notify_about_remote (sender, index, nil, from_name, from_person_class) | 3181 _notify_about_change (sender, index, nil, from_name, from_person_class) |
| 3168 end | 3182 end |
| 3169 if self.display then | 3183 if self.display then |
| 3170 self.display:GetUserData("GUI state").eoiST:OuroLoot_Refresh(index) | 3184 self.display:GetUserData("GUI state").eoiST:OuroLoot_Refresh(index) |
| 3171 self:redisplay() | 3185 self:redisplay() |
| 3172 end | 3186 end |
| 3371 self.hist_clean = nil | 3385 self.hist_clean = nil |
| 3372 self.loot_clean = nil | 3386 self.loot_clean = nil |
| 3373 -- A unique tag has been set by this point. | 3387 -- A unique tag has been set by this point. |
| 3374 if how == "local" then | 3388 if how == "local" then |
| 3375 unique = assert(e.unique) | 3389 unique = assert(e.unique) |
| 3390 if opts.chatty_on_local_changes then | |
| 3391 _notify_about_change (_G.UNIT_YOU, index, olddisp) | |
| 3392 end | |
| 3376 self:vbroadcast('mark', unique, id, olddisp, newdisp) | 3393 self:vbroadcast('mark', unique, id, olddisp, newdisp) |
| 3377 end | 3394 end |
| 3378 self:Fire ('MarkAs', unique, id, e, olddisp or 'normal', newdisp or 'normal') | 3395 self:Fire ('MarkAs', unique, id, e, olddisp or 'normal', newdisp or 'normal') |
| 3379 return index | 3396 return index |
| 3380 end | 3397 end |
| 3465 addon.dprint('comm', "DOTmark/17, sender", sender, "unique", unique, | 3482 addon.dprint('comm', "DOTmark/17, sender", sender, "unique", unique, |
| 3466 "item", item, "from old", old, "to new", new) | 3483 "item", item, "from old", old, "to new", new) |
| 3467 local index = addon:loot_mark_disposition ("remote", sender, unique, item, old, new) | 3484 local index = addon:loot_mark_disposition ("remote", sender, unique, item, old, new) |
| 3468 --if not addon.enabled then return end -- hmm | 3485 --if not addon.enabled then return end -- hmm |
| 3469 if index and opts.chatty_on_remote_changes then | 3486 if index and opts.chatty_on_remote_changes then |
| 3470 _notify_about_remote (sender, index, old) | 3487 _notify_about_change (sender, index, old) |
| 3471 end | 3488 end |
| 3472 end | 3489 end |
| 3473 | 3490 |
| 3474 OCR_funcs['17reassign'] = function (sender, _, unique, item, from, to) | 3491 OCR_funcs['17reassign'] = function (sender, _, unique, item, from, to) |
| 3475 addon.dprint('comm', "DOTreassign/17, sender", sender, "unique", unique, | 3492 addon.dprint('comm', "DOTreassign/17, sender", sender, "unique", unique, |
