farmbuyer@1
|
1
|
farmbuyer@1
|
2 local addon = CreateFrame("Frame") --select(2,...)
|
farmbuyer@1
|
3 local SV
|
farmbuyer@1
|
4
|
farmbuyer@1
|
5 local DEFAULT_CHAT = 2 -- combat log (no constant predefined for that)
|
farmbuyer@1
|
6
|
farmbuyer@1
|
7 --if GetLocale() == "enUS" then
|
farmbuyer@3
|
8 addon.l10n= {
|
farmbuyer@3
|
9 ["LEFT"] = "Players who have left the guild: ",
|
farmbuyer@3
|
10 ["JOINED"] = "Players who have joined the guild: ",
|
farmbuyer@3
|
11 ["RANK"] = "Players whose rank has changed:",
|
farmbuyer@3
|
12 ["LEVEL"] = "Players whose level has changed:",
|
farmbuyer@3
|
13 ["NOTES"] = "Players whose notes have changed:",
|
farmbuyer@1
|
14
|
farmbuyer@3
|
15 ["Oabbrev"] = "O", -- abbreviation for "Officer", specifically the non-public note
|
farmbuyer@3
|
16 ["FIELD_rank"] = "Rank",
|
farmbuyer@3
|
17 ["FIELD_level"] = "Level",
|
farmbuyer@3
|
18 ["FIELD_notes"] = "Player/Officer notes",
|
farmbuyer@1
|
19
|
farmbuyer@3
|
20 ["NOCHANGE"] = "No changes to tracked fields have been detected.",
|
farmbuyer@3
|
21
|
farmbuyer@3
|
22 -- Something needs to be done about the walls of description text below.
|
farmbuyer@3
|
23 }
|
farmbuyer@1
|
24 --elseif .... end
|
farmbuyer@1
|
25
|
farmbuyer@1
|
26 local guild_selection, log_ever_shown
|
farmbuyer@1
|
27 addon.options = {
|
farmbuyer@1
|
28 name = "Guild Delta",
|
farmbuyer@1
|
29 type = 'group',
|
farmbuyer@3
|
30 childGroups = 'tab',
|
farmbuyer@1
|
31 handler = addon, -- functions listed as strings called as addon:func
|
farmbuyer@1
|
32 args = {
|
farmbuyer@1
|
33 version = {
|
farmbuyer@1
|
34 --name = filled in during OnEnable
|
farmbuyer@1
|
35 type = 'description',
|
farmbuyer@1
|
36 fontSize = "large",
|
farmbuyer@1
|
37 --image = "Interface\\AddOns\\GuildDelta\\test2",
|
farmbuyer@1
|
38 cmdHidden = true,
|
farmbuyer@1
|
39 order = 1,
|
farmbuyer@1
|
40 },
|
farmbuyer@1
|
41 note = {
|
farmbuyer@1
|
42 --name = filled in locals section
|
farmbuyer@1
|
43 type = 'description',
|
farmbuyer@1
|
44 cmdHidden = true,
|
farmbuyer@1
|
45 width = 'full',
|
farmbuyer@1
|
46 order = 2,
|
farmbuyer@1
|
47 },
|
farmbuyer@3
|
48 general = {
|
farmbuyer@3
|
49 name = "General",
|
farmbuyer@3
|
50 desc = "Tracking options",
|
farmbuyer@3
|
51 type = 'group',
|
farmbuyer@3
|
52 order = 10,
|
farmbuyer@3
|
53 args = {
|
farmbuyer@3
|
54 fields = {
|
farmbuyer@3
|
55 name = "Fields",
|
farmbuyer@3
|
56 desc = "Track changes to these player fields",
|
farmbuyer@3
|
57 type = 'multiselect',
|
farmbuyer@3
|
58 order = 10,
|
farmbuyer@3
|
59 -- these need to be of function type rather than string keys of members
|
farmbuyer@3
|
60 values = function(info) return addon:MakeFieldList() end,
|
farmbuyer@3
|
61 get = function(info,x) return SV.fields[x] end,
|
farmbuyer@3
|
62 set = function(info,x,val) SV.fields[x] = val end,
|
farmbuyer@3
|
63 },
|
farmbuyer@3
|
64 nochange = {
|
farmbuyer@3
|
65 name = "No Change",
|
farmbuyer@3
|
66 desc = "Print a message even when no changes are detected",
|
farmbuyer@3
|
67 type = 'toggle',
|
farmbuyer@3
|
68 order = 15,
|
farmbuyer@3
|
69 get = function() return not not SV.notify_nochange end,
|
farmbuyer@3
|
70 set = function(info,val) SV.notify_nochange = val end,
|
farmbuyer@3
|
71 },
|
farmbuyer@3
|
72 spacer2 = {
|
farmbuyer@3
|
73 name = '',
|
farmbuyer@3
|
74 type = 'description',
|
farmbuyer@3
|
75 cmdHidden = true,
|
farmbuyer@3
|
76 width = 'full',
|
farmbuyer@3
|
77 order = 19,
|
farmbuyer@3
|
78 },
|
farmbuyer@3
|
79 guilds = {
|
farmbuyer@3
|
80 name = "Guilds",
|
farmbuyer@3
|
81 desc = "Guilds for which a roster is known",
|
farmbuyer@3
|
82 type = 'select',
|
farmbuyer@3
|
83 order = 20,
|
farmbuyer@3
|
84 width = 'double',
|
farmbuyer@3
|
85 values = function(info) return addon:MakeGuildList() end,
|
farmbuyer@3
|
86 get = function(info) return guild_selection end,
|
farmbuyer@3
|
87 set = function(info,val) guild_selection = val end,
|
farmbuyer@3
|
88 },
|
farmbuyer@3
|
89 clearguild = {
|
farmbuyer@3
|
90 name = "Reset Guild",
|
farmbuyer@3
|
91 desc = "Erase stored data for selected guild; information will be scanned from scratch on next login.",
|
farmbuyer@3
|
92 type = 'execute',
|
farmbuyer@3
|
93 order = 22,
|
farmbuyer@3
|
94 disabled = function() return not guild_selection end,
|
farmbuyer@3
|
95 func = function()
|
farmbuyer@3
|
96 assert(type(guild_selection)=='string')
|
farmbuyer@3
|
97 local g,r = guild_selection:match("<([^>]+)> %- (.*)")
|
farmbuyer@3
|
98 local m = SV.members[r]
|
farmbuyer@3
|
99 if m then
|
farmbuyer@3
|
100 m[g] = nil
|
farmbuyer@3
|
101 else
|
farmbuyer@3
|
102 addon:Print("Hm, error.", r, "can't be matched as a realm name. Please report this as a bug, including the name of the realm and guild.")
|
farmbuyer@3
|
103 end
|
farmbuyer@3
|
104 end,
|
farmbuyer@3
|
105 },
|
farmbuyer@3
|
106 },
|
farmbuyer@1
|
107 },
|
farmbuyer@3
|
108 output = {
|
farmbuyer@3
|
109 name = "Output",
|
farmbuyer@3
|
110 desc = "What and where to print",
|
farmbuyer@3
|
111 type = 'group',
|
farmbuyer@1
|
112 order = 20,
|
farmbuyer@3
|
113 args = {
|
farmbuyer@3
|
114 reset = {
|
farmbuyer@3
|
115 name = "Reset Output",
|
farmbuyer@3
|
116 desc = "Restores default output settings",
|
farmbuyer@3
|
117 type = 'execute',
|
farmbuyer@3
|
118 order = 10,
|
farmbuyer@3
|
119 func = "SetChat",
|
farmbuyer@3
|
120 arg = DEFAULT_CHAT,
|
farmbuyer@3
|
121 },
|
farmbuyer@3
|
122 spacer1 = {
|
farmbuyer@3
|
123 name = '',
|
farmbuyer@3
|
124 type = 'description',
|
farmbuyer@3
|
125 cmdHidden = true,
|
farmbuyer@3
|
126 width = 'full',
|
farmbuyer@3
|
127 order = 11,
|
farmbuyer@3
|
128 },
|
farmbuyer@3
|
129 print_chatframes = {
|
farmbuyer@3
|
130 name = "Print Chatframe Numbers",
|
farmbuyer@3
|
131 desc = "Print each chat window number in its frame, for easy reference in the next slider option",
|
farmbuyer@3
|
132 type = 'execute',
|
farmbuyer@3
|
133 --func = print_chatframes filled in below
|
farmbuyer@3
|
134 order = 20,
|
farmbuyer@3
|
135 },
|
farmbuyer@3
|
136 chatframe_num = {
|
farmbuyer@3
|
137 name = "Output Chatframe",
|
farmbuyer@3
|
138 desc = "Which chat window to prefer for printing all the output during login",
|
farmbuyer@3
|
139 type = 'range',
|
farmbuyer@3
|
140 min = 1,
|
farmbuyer@3
|
141 max = NUM_CHAT_WINDOWS,
|
farmbuyer@3
|
142 step = 1,
|
farmbuyer@3
|
143 get = function() return tonumber(SV.chatframe) or --[[in case of custom name]]DEFAULT_CHAT end,
|
farmbuyer@3
|
144 set = "SetChat",
|
farmbuyer@3
|
145 order = 25,
|
farmbuyer@3
|
146 },
|
farmbuyer@3
|
147 chatframe_name = {
|
farmbuyer@3
|
148 name = "Chatframe Override",
|
farmbuyer@3
|
149 desc = "<Advanced> If blank, uses the numerical slider. If set, it is the NAME of a frame with AddMessage capability to use for output.",
|
farmbuyer@3
|
150 type = 'input',
|
farmbuyer@3
|
151 get = function()
|
farmbuyer@3
|
152 return type(SV.chatframe) == 'string' and SV.chatframe or nil
|
farmbuyer@3
|
153 end,
|
farmbuyer@3
|
154 set = "SetChat",
|
farmbuyer@3
|
155 order = 26,
|
farmbuyer@3
|
156 },
|
farmbuyer@3
|
157 },
|
farmbuyer@1
|
158 },
|
farmbuyer@1
|
159 persist = {
|
farmbuyer@1
|
160 name = "Logging",
|
farmbuyer@3
|
161 desc = "Storing changes for later review",
|
farmbuyer@1
|
162 type = 'group',
|
farmbuyer@3
|
163 order = 30,
|
farmbuyer@1
|
164 args = {
|
farmbuyer@1
|
165 note = {
|
farmbuyer@1
|
166 --name = filled in locals section
|
farmbuyer@1
|
167 type = 'description',
|
farmbuyer@1
|
168 cmdHidden = true,
|
farmbuyer@1
|
169 width = 'full',
|
farmbuyer@3
|
170 order = 10,
|
farmbuyer@1
|
171 },
|
farmbuyer@1
|
172 enable = {
|
farmbuyer@1
|
173 name = "Enable Logging",
|
farmbuyer@1
|
174 desc = [[Accumulate all deltas, including a timestamp. |cffFF0000WARNING|r: if logging was enabled and you turn it off, the log itself will not be saved when exiting the game.]],
|
farmbuyer@1
|
175 type = 'toggle',
|
farmbuyer@3
|
176 order = 15,
|
farmbuyer@1
|
177 get = function() return SV.logging end,
|
farmbuyer@1
|
178 set = function(i,v)
|
farmbuyer@1
|
179 SV.logging = v
|
farmbuyer@1
|
180 log_ever_shown = SV.logging or log_ever_shown
|
farmbuyer@1
|
181 end,
|
farmbuyer@1
|
182 },
|
farmbuyer@1
|
183 clearlog = {
|
farmbuyer@1
|
184 name = "Reset Log",
|
farmbuyer@1
|
185 desc = "Erase accumulated deltas.",
|
farmbuyer@1
|
186 type = 'execute',
|
farmbuyer@3
|
187 order = 20,
|
farmbuyer@1
|
188 hidden = function() return not (SV.logging or log_ever_shown) end,
|
farmbuyer@1
|
189 disabled = function() return not SV.logging end,
|
farmbuyer@1
|
190 func = function()
|
farmbuyer@1
|
191 SV.logtext = nil
|
farmbuyer@1
|
192 end,
|
farmbuyer@1
|
193 },
|
farmbuyer@1
|
194 log = {
|
farmbuyer@1
|
195 name = "Log",
|
farmbuyer@3
|
196 desc = "If you make changes, don't forget to click 'Accept' to save them. Scroll down if needed.",
|
farmbuyer@1
|
197 type = 'input',
|
farmbuyer@3
|
198 order = 25,
|
farmbuyer@1
|
199 multiline = 15,
|
farmbuyer@1
|
200 width = 'full',
|
farmbuyer@1
|
201 hidden = function() return not (SV.logging or log_ever_shown) end,
|
farmbuyer@1
|
202 disabled = function() return not SV.logging end,
|
farmbuyer@1
|
203 get = function() return SV.logtext end,
|
farmbuyer@1
|
204 set = function(i,t) SV.logtext = t end,
|
farmbuyer@1
|
205 },
|
farmbuyer@1
|
206 },
|
farmbuyer@1
|
207 },
|
farmbuyer@1
|
208 }
|
farmbuyer@1
|
209 }
|
farmbuyer@1
|
210
|
farmbuyer@1
|
211
|
farmbuyer@1
|
212 -----------------------------------------------------------------------------
|
farmbuyer@1
|
213 -- other locals
|
farmbuyer@1
|
214 local tinsert, GetGuildRosterInfo = _G.table.insert, _G.GetGuildRosterInfo
|
farmbuyer@1
|
215 local chatframe, fieldlist
|
farmbuyer@1
|
216 local function prt (...)
|
farmbuyer@1
|
217 return chatframe:AddMessage(...)
|
farmbuyer@1
|
218 end
|
farmbuyer@1
|
219 local function cprt (txt)
|
farmbuyer@1
|
220 if SV.logging then addon:AddLogNote(txt) end
|
farmbuyer@1
|
221 return prt(txt, 255/255, 26/255, 160/255)
|
farmbuyer@1
|
222 end
|
farmbuyer@1
|
223
|
farmbuyer@1
|
224 function addon:current_guild_info (N)
|
farmbuyer@1
|
225 local ret = {}
|
farmbuyer@1
|
226 for i = 1, N do
|
farmbuyer@1
|
227 local name,rank_as_string,_,level,_,_,publicnote,officernote = GetGuildRosterInfo(i)
|
farmbuyer@1
|
228 -- This technically does not work out to the same as A?B:C, combined
|
farmbuyer@1
|
229 -- with the logic below. It does, however, still result in the entry
|
farmbuyer@1
|
230 -- not appearing in the returned table.
|
farmbuyer@1
|
231 publicnote = publicnote ~= "" and publicnote or nil
|
farmbuyer@1
|
232 officernote = officernote ~= "" and officernote or nil
|
farmbuyer@1
|
233 if name then -- redundant, but apparently happens on extreme lag
|
farmbuyer@1
|
234 tinsert(ret,
|
farmbuyer@1
|
235 {name = name,
|
farmbuyer@1
|
236 rank = SV.fields.rank and rank_as_string or nil,
|
farmbuyer@1
|
237 level = SV.fields.level and level or nil,
|
farmbuyer@1
|
238 pnote = SV.fields.notes and publicnote or nil,
|
farmbuyer@1
|
239 onote = SV.fields.notes and officernote or nil,
|
farmbuyer@1
|
240 })
|
farmbuyer@1
|
241 end
|
farmbuyer@1
|
242 end
|
farmbuyer@1
|
243 table.sort(ret, function (l,r) return l.name < r.name end)
|
farmbuyer@1
|
244 return ret
|
farmbuyer@1
|
245 end
|
farmbuyer@1
|
246
|
farmbuyer@3
|
247 function addon.options.args.output.args.print_chatframes.func()
|
farmbuyer@1
|
248 for i = 1, NUM_CHAT_WINDOWS do
|
farmbuyer@2
|
249 local cf = _G['ChatFrame'..i]
|
farmbuyer@1
|
250 if not cf then break end
|
farmbuyer@1
|
251 addon:Print(cf, "This is frame number", i)
|
farmbuyer@1
|
252 end
|
farmbuyer@1
|
253 end
|
farmbuyer@1
|
254
|
farmbuyer@1
|
255 addon.options.args.note.name =
|
farmbuyer@1
|
256 "You can use the '/guilddelta' command to open the options window.\n\n"..
|
farmbuyer@1
|
257 "The guild roster has already been scanned by the time you see this. Therefore, "..
|
farmbuyer@1
|
258 "if you make any changes to the Fields section below, you should probably relog "..
|
farmbuyer@1
|
259 "immediately to begin tracking the changed fields. Changes to the contents *OF* "..
|
farmbuyer@3
|
260 "those fields will not be noticed until the first login after *that*.\n"
|
farmbuyer@1
|
261
|
farmbuyer@1
|
262 addon.options.args.persist.args.note.name =
|
farmbuyer@1
|
263 "Enabling logging will accumulate the text of the 'deltas' as you see them. "..
|
farmbuyer@1
|
264 "This can grow large over time, depending on the activity of your guilds, so you "..
|
farmbuyer@1
|
265 "should use the Reset Log button below from time to time.\n\n"..
|
farmbuyer@1
|
266 "If you click inside the text area below, you can use Control-A to select all "..
|
farmbuyer@1
|
267 "the text, and Control-C to copy it to your computer's clipboard. If you make "..
|
farmbuyer@2
|
268 "any changes to the text, the changes will be preserved. (You can remove uninteresting "..
|
farmbuyer@1
|
269 "changes, add reminders to yourself, and so forth.)\n\n"
|
farmbuyer@1
|
270
|
farmbuyer@1
|
271
|
farmbuyer@1
|
272 -----------------------------------------------------------------------------
|
farmbuyer@1
|
273 addon = LibStub("AceAddon-3.0"):NewAddon(addon, "GuildDelta",
|
farmbuyer@3
|
274 "AceConsole-3.0")
|
farmbuyer@1
|
275
|
farmbuyer@1
|
276 function addon:OnInitialize()
|
farmbuyer@1
|
277 if _G.GuildDeltaSV == nil then
|
farmbuyer@1
|
278 -- Defaults need to transition from potential older savedvars
|
farmbuyer@1
|
279 _G.GuildDeltaSV = {
|
farmbuyer@1
|
280 chatframe = _G.GuildDelta_chatframe or DEFAULT_CHAT,
|
farmbuyer@1
|
281 fields = _G.GuildDelta_fields or { rank = true, level = false, notes = true },
|
farmbuyer@3
|
282 members = _G.GuildDelta_memberdata or {},
|
farmbuyer@3
|
283 --notify_nochange = nil by default
|
farmbuyer@3
|
284 --logging = nil by default
|
farmbuyer@1
|
285 }
|
farmbuyer@1
|
286 end
|
farmbuyer@1
|
287 SV = _G.GuildDeltaSV
|
farmbuyer@1
|
288 end
|
farmbuyer@1
|
289
|
farmbuyer@1
|
290 -- Remove anything that normal operation doesn't need after finishing its work.
|
farmbuyer@1
|
291 function addon:cleanup()
|
farmbuyer@1
|
292 prt = nil; cprt = nil
|
farmbuyer@1
|
293 self.current_guild_info = nil
|
farmbuyer@1
|
294 self.cleanup = nil
|
farmbuyer@1
|
295 self.unload = nil
|
farmbuyer@1
|
296 self.logquay = nil
|
farmbuyer@1
|
297 self.AddLogNote = nil
|
farmbuyer@1
|
298 self.FinishLog = nil
|
farmbuyer@1
|
299 end
|
farmbuyer@2
|
300 -- Remove everything.
|
farmbuyer@1
|
301 function addon:unload()
|
farmbuyer@1
|
302 self:cleanup()
|
farmbuyer@1
|
303 LibStub("AceAddon-3.0").addons["GuildDelta"] = nil
|
farmbuyer@3
|
304 addon = nil;
|
farmbuyer@1
|
305 -- put the userdata back so it counts as a Frame object again
|
farmbuyer@1
|
306 local ud = self[0]
|
farmbuyer@1
|
307 table.wipe(self)
|
farmbuyer@1
|
308 self[0] = ud
|
farmbuyer@1
|
309 end
|
farmbuyer@1
|
310
|
farmbuyer@1
|
311 function addon:OnEnable()
|
farmbuyer@1
|
312 if not IsInGuild() then
|
farmbuyer@1
|
313 self:Print("You are not in a guild, not loading.")
|
farmbuyer@1
|
314 return self:unload()
|
farmbuyer@1
|
315 end
|
farmbuyer@1
|
316
|
farmbuyer@3
|
317 self:RegisterEvent("GUILD_ROSTER_UPDATE")
|
farmbuyer@1
|
318 self:SetScript("OnEvent", self.GuildUpdate)
|
farmbuyer@1
|
319
|
farmbuyer@1
|
320 self.options.args.version.name =
|
farmbuyer@1
|
321 "|cff30adffVersion " .. (GetAddOnMetadata("GuildDelta", "Version") or "?") .. "|r"
|
farmbuyer@1
|
322 LibStub("AceConfig-3.0"):RegisterOptionsTable("GuildDelta", self.options)
|
farmbuyer@1
|
323 --[[self.optionsFrame =]] LibStub("AceConfigDialog-3.0"):AddToBlizOptions("GuildDelta", "Guild Delta")
|
farmbuyer@1
|
324 self:RegisterChatCommand("guilddelta", "OnChatCommand")
|
farmbuyer@2
|
325 self:SetChat(self)
|
farmbuyer@1
|
326 log_ever_shown = SV.logging
|
farmbuyer@1
|
327 self.OnEnable = nil
|
farmbuyer@1
|
328 end
|
farmbuyer@1
|
329
|
farmbuyer@1
|
330
|
farmbuyer@1
|
331 function addon:OnChatCommand (input)
|
farmbuyer@1
|
332 if not input or input:trim() == "" then
|
farmbuyer@1
|
333 LibStub("AceConfigDialog-3.0"):Open("GuildDelta")
|
farmbuyer@1
|
334 else
|
farmbuyer@1
|
335 LibStub("AceConfigCmd-3.0").HandleCommand(self, "guilddelta", "GuildDelta", input)
|
farmbuyer@1
|
336 end
|
farmbuyer@1
|
337 end
|
farmbuyer@1
|
338
|
farmbuyer@1
|
339
|
farmbuyer@2
|
340 -- 1 arg: (self) called during startup to initialize
|
farmbuyer@2
|
341 -- (other) resetting via menus to defaults (see arg field)
|
farmbuyer@2
|
342 -- 2 args: setting via menus to new value, number or custom name (see value)
|
farmbuyer@1
|
343 function addon:SetChat (info, value)
|
farmbuyer@1
|
344 local n, nframe
|
farmbuyer@2
|
345 local isauto = info == self
|
farmbuyer@2
|
346 if isauto then
|
farmbuyer@2
|
347 n = SV.chatframe
|
farmbuyer@2
|
348 else -- coming via menu
|
farmbuyer@1
|
349 n = info.arg or value
|
farmbuyer@1
|
350 end
|
farmbuyer@1
|
351 if type(n) == 'number' then
|
farmbuyer@2
|
352 if isauto then
|
farmbuyer@2
|
353 -- start at the preferred number and find a non-minimized and
|
farmbuyer@2
|
354 -- potentially visible frame
|
farmbuyer@2
|
355 n = math.min(n,NUM_CHAT_WINDOWS)
|
farmbuyer@2
|
356 local cf,cft
|
farmbuyer@2
|
357 for i = n, 1, -1 do
|
farmbuyer@2
|
358 cf = _G['ChatFrame'..i]
|
farmbuyer@2
|
359 cft = _G[cf:GetName()..'Tab']
|
farmbuyer@2
|
360 if cft:IsVisible() then
|
farmbuyer@2
|
361 n = i
|
farmbuyer@2
|
362 break
|
farmbuyer@2
|
363 end
|
farmbuyer@2
|
364 end
|
farmbuyer@2
|
365 end
|
farmbuyer@2
|
366 nframe = _G['ChatFrame'..n]
|
farmbuyer@1
|
367 else
|
farmbuyer@2
|
368 nframe = _G[n] -- advanced name
|
farmbuyer@1
|
369 end
|
farmbuyer@1
|
370 if type(nframe) == 'table' and type(nframe.AddMessage) == 'function' then
|
farmbuyer@2
|
371 if not isauto then
|
farmbuyer@2
|
372 SV.chatframe = n
|
farmbuyer@1
|
373 self:Print("Now printing to chat frame", n,
|
farmbuyer@1
|
374 (type(nframe.name)=='string' and ("(".. nframe.name .. ")") or ""))
|
farmbuyer@1
|
375 end
|
farmbuyer@1
|
376 chatframe = nframe
|
farmbuyer@1
|
377 else
|
farmbuyer@1
|
378 self:Printf("EEEEEEEK! '%s' was not a valid chat frame number/name, no change has been made.", n)
|
farmbuyer@1
|
379 end
|
farmbuyer@1
|
380 end
|
farmbuyer@1
|
381
|
farmbuyer@1
|
382
|
farmbuyer@1
|
383 -- Not a "normal" PLAYER_LOGOUT handler; this only fires if the player is in
|
farmbuyer@1
|
384 -- a guild and the update has already run.
|
farmbuyer@1
|
385 function addon:PLAYER_LOGOUT()
|
farmbuyer@1
|
386 if not SV.logging then
|
farmbuyer@1
|
387 SV.logtext = nil
|
farmbuyer@1
|
388 end
|
farmbuyer@1
|
389 end
|
farmbuyer@1
|
390
|
farmbuyer@1
|
391
|
farmbuyer@1
|
392 function addon:GuildUpdate()
|
farmbuyer@1
|
393 local current_n = GetNumGuildMembers(true)
|
farmbuyer@1
|
394 if current_n <= 0 then
|
farmbuyer@1
|
395 -- catch the hell up, servers...
|
farmbuyer@1
|
396 return GuildRoster()
|
farmbuyer@1
|
397 end
|
farmbuyer@1
|
398 self:UnregisterEvent("GUILD_ROSTER_UPDATE")
|
farmbuyer@1
|
399 self:SetScript("OnEvent", self.PLAYER_LOGOUT) -- keepin' it real^H^H^H^Hsmall and kludgey
|
farmbuyer@1
|
400 self:RegisterEvent("PLAYER_LOGOUT")
|
farmbuyer@1
|
401 self.GuildUpdate = nil
|
farmbuyer@1
|
402
|
farmbuyer@2
|
403 if SV.logtext and #SV.logtext > 20000 then
|
farmbuyer@2
|
404 self:Print("Your accumulated logfile has grown rather large; you should consider copying it out and clearing it.")
|
farmbuyer@2
|
405 end
|
farmbuyer@2
|
406
|
farmbuyer@1
|
407 local guild, realm = (GetGuildInfo("player")), GetRealmName()
|
farmbuyer@1
|
408 local members = SV.members
|
farmbuyer@3
|
409 local l10n = self.l10n
|
farmbuyer@1
|
410 if members[realm]
|
farmbuyer@1
|
411 and members[realm][guild]
|
farmbuyer@1
|
412 and #(members[realm][guild]) > 0
|
farmbuyer@1
|
413 then
|
farmbuyer@1
|
414 -- moved the normal case below
|
farmbuyer@1
|
415 else
|
farmbuyer@1
|
416 -- new user, or new guild, or any number of things
|
farmbuyer@1
|
417 self:Print("GuildDelta initializing roster...")
|
farmbuyer@1
|
418 members[realm] = members[realm] or {}
|
farmbuyer@1
|
419 members[realm][guild] = self:current_guild_info(current_n)
|
farmbuyer@2
|
420 return self:cleanup()
|
farmbuyer@1
|
421 end
|
farmbuyer@1
|
422
|
farmbuyer@1
|
423 -- table.insert with notes if available
|
farmbuyer@3
|
424 -- concatentation of string-only args faster than string.format of same
|
farmbuyer@1
|
425 local function tins (t, x)
|
farmbuyer@1
|
426 local s = x.name
|
farmbuyer@1
|
427 if x.onote and (x.onote ~= "") then
|
farmbuyer@1
|
428 s = s .. "(" .. l10n.Oabbrev .. ": " .. x.onote .. ")"
|
farmbuyer@1
|
429 end
|
farmbuyer@1
|
430 if x.pnote and (x.pnote ~= "") then
|
farmbuyer@1
|
431 s = s .. "(" .. x.pnote .. ")"
|
farmbuyer@1
|
432 end
|
farmbuyer@1
|
433 tinsert(t, s)
|
farmbuyer@1
|
434 end
|
farmbuyer@1
|
435
|
farmbuyer@1
|
436 -- build the current list
|
farmbuyer@1
|
437 local previous, current = members[realm][guild],
|
farmbuyer@1
|
438 self:current_guild_info(current_n)
|
farmbuyer@1
|
439 local previous_n = #previous
|
farmbuyer@1
|
440
|
farmbuyer@1
|
441 -- walk both and do equivalence comparison
|
farmbuyer@1
|
442 local joined, left, rank, level, notes = {}, {}, {}, {}, {}
|
farmbuyer@1
|
443 local p, c = 1, 1
|
farmbuyer@1
|
444 while p <= previous_n and c <= current_n do
|
farmbuyer@1
|
445 local P, C = previous[p], current[c]
|
farmbuyer@1
|
446
|
farmbuyer@1
|
447 if P.name == C.name then
|
farmbuyer@1
|
448 -- normal case
|
farmbuyer@1
|
449 p = p + 1
|
farmbuyer@1
|
450 c = c + 1
|
farmbuyer@1
|
451 -- but can now compare details
|
farmbuyer@1
|
452 if C.rank and P.rank and (P.rank ~= C.rank) then
|
farmbuyer@1
|
453 tinsert(rank, {C.name, P.rank.." --> "..C.rank})
|
farmbuyer@1
|
454 end
|
farmbuyer@1
|
455 if C.level and P.level and (P.level ~= C.level) then
|
farmbuyer@1
|
456 tinsert(level, {C.name, P.level.." --> "..C.level})
|
farmbuyer@1
|
457 end
|
farmbuyer@1
|
458 if C.pnote and (P.pnote ~= C.pnote) then
|
farmbuyer@1
|
459 tinsert(notes, {C.name, C.pnote})
|
farmbuyer@1
|
460 end
|
farmbuyer@1
|
461 if C.onote and (P.onote ~= C.onote) then
|
farmbuyer@1
|
462 tinsert(notes, {C.name, "["..l10n.Oabbrev.."]: "..C.onote})
|
farmbuyer@1
|
463 end
|
farmbuyer@1
|
464
|
farmbuyer@1
|
465 elseif P.name < C.name then
|
farmbuyer@1
|
466 -- entry at index p not at c -> somebody has left
|
farmbuyer@1
|
467 tins (left, P)
|
farmbuyer@1
|
468 p = p + 1
|
farmbuyer@1
|
469
|
farmbuyer@1
|
470 else
|
farmbuyer@1
|
471 -- entry at index c not at p -> somebody has joined
|
farmbuyer@1
|
472 tins (joined, C)
|
farmbuyer@1
|
473 c = c + 1
|
farmbuyer@1
|
474 end
|
farmbuyer@1
|
475 end
|
farmbuyer@1
|
476
|
farmbuyer@1
|
477 -- leftovers
|
farmbuyer@1
|
478 for i = p, previous_n do
|
farmbuyer@1
|
479 tins (left, previous[i])
|
farmbuyer@1
|
480 end
|
farmbuyer@1
|
481 for i = c, current_n do
|
farmbuyer@1
|
482 tins (joined, current[i])
|
farmbuyer@1
|
483 end
|
farmbuyer@1
|
484
|
farmbuyer@1
|
485 -- show results
|
farmbuyer@1
|
486 if SV.logging then self.logquay = {} end
|
farmbuyer@3
|
487 local m, changes
|
farmbuyer@1
|
488 if #left > 0 then
|
farmbuyer@3
|
489 changes = true
|
farmbuyer@1
|
490 m = l10n.LEFT .. table.concat(left, ", ")
|
farmbuyer@1
|
491 cprt(m)
|
farmbuyer@1
|
492 end
|
farmbuyer@1
|
493
|
farmbuyer@1
|
494 if #joined > 0 then
|
farmbuyer@3
|
495 changes = true
|
farmbuyer@1
|
496 m = l10n.JOINED .. table.concat(joined, ", ")
|
farmbuyer@1
|
497 cprt(m)
|
farmbuyer@1
|
498 end
|
farmbuyer@1
|
499
|
farmbuyer@1
|
500 if #rank > 0 then
|
farmbuyer@3
|
501 changes = true
|
farmbuyer@1
|
502 cprt(l10n.RANK)
|
farmbuyer@1
|
503 for i = 1, #rank do
|
farmbuyer@1
|
504 cprt(rank[i][1]..': '..rank[i][2])
|
farmbuyer@1
|
505 end
|
farmbuyer@1
|
506 end
|
farmbuyer@1
|
507
|
farmbuyer@1
|
508 if #level > 0 then
|
farmbuyer@3
|
509 changes = true
|
farmbuyer@1
|
510 cprt(l10n.LEVEL)
|
farmbuyer@1
|
511 for i = 1, #level do
|
farmbuyer@1
|
512 cprt(level[i][1]..': '..level[i][2])
|
farmbuyer@1
|
513 end
|
farmbuyer@1
|
514 end
|
farmbuyer@1
|
515
|
farmbuyer@1
|
516 if #notes > 0 then
|
farmbuyer@3
|
517 changes = true
|
farmbuyer@1
|
518 cprt(l10n.NOTES)
|
farmbuyer@1
|
519 for i = 1, #notes do
|
farmbuyer@1
|
520 cprt(notes[i][1]..': "'..notes[i][2]..'"')
|
farmbuyer@1
|
521 end
|
farmbuyer@1
|
522 end
|
farmbuyer@1
|
523
|
farmbuyer@1
|
524 if SV.logging then self:FinishLog(guild,realm) end
|
farmbuyer@3
|
525 if SV.notify_nochange and (not changes) then cprt(l10n.NOCHANGE) end
|
farmbuyer@1
|
526 members[realm][guild] = current
|
farmbuyer@2
|
527 self:cleanup()
|
farmbuyer@1
|
528 end
|
farmbuyer@1
|
529
|
farmbuyer@1
|
530
|
farmbuyer@1
|
531 function addon:MakeFieldList()
|
farmbuyer@1
|
532 if not fieldlist then
|
farmbuyer@1
|
533 fieldlist = {}
|
farmbuyer@1
|
534 for name in pairs(SV.fields) do
|
farmbuyer@3
|
535 fieldlist[name] = self.l10n["FIELD_"..name]
|
farmbuyer@1
|
536 end
|
farmbuyer@1
|
537 end
|
farmbuyer@1
|
538 return fieldlist
|
farmbuyer@1
|
539 end
|
farmbuyer@1
|
540
|
farmbuyer@1
|
541 function addon:MakeGuildList()
|
farmbuyer@1
|
542 local list = {}
|
farmbuyer@1
|
543 local K
|
farmbuyer@1
|
544 for rname,rdata in pairs(SV.members) do
|
farmbuyer@1
|
545 for g in pairs(rdata) do
|
farmbuyer@1
|
546 K = ("<%s> - %s"):format(g,rname)
|
farmbuyer@1
|
547 list[K] = K
|
farmbuyer@1
|
548 end
|
farmbuyer@1
|
549 end
|
farmbuyer@1
|
550 return list
|
farmbuyer@1
|
551 end
|
farmbuyer@1
|
552
|
farmbuyer@1
|
553 function addon:AddLogNote (txt)
|
farmbuyer@1
|
554 tinsert(self.logquay,txt)
|
farmbuyer@1
|
555 end
|
farmbuyer@1
|
556
|
farmbuyer@1
|
557 function addon:FinishLog(g,r)
|
farmbuyer@1
|
558 if #self.logquay > 0 then
|
farmbuyer@1
|
559 Calendar_LoadUI()
|
farmbuyer@1
|
560 local _,M,D,Y = CalendarGetDate()
|
farmbuyer@1
|
561 local h,m = GetGameTime()
|
farmbuyer@1
|
562 local timestamp = ("%.4d/%.2d/%.2d %.2d:%.2d <%s> - %s\n"):format(Y,M,D,h,m,g,r)
|
farmbuyer@1
|
563 SV.logtext = timestamp
|
farmbuyer@1
|
564 .. table.concat(self.logquay, '\n')
|
farmbuyer@1
|
565 .. (SV.logtext and ('\n\n'..SV.logtext) or '')
|
farmbuyer@1
|
566 end
|
farmbuyer@1
|
567 end
|
farmbuyer@1
|
568
|
farmbuyer@1
|
569 -- vim:noet
|