annotate gd.lua @ 25:61dcb912058b tip

Added tag 7.0 for changeset 93878af3e81d
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Sat, 23 Jul 2016 16:42:16 -0400
parents 5efaeb3ef4b1
children
rev   line source
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