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