annotate gd.lua @ 4:9527583a842b

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