farmbuyer@1: farmbuyer@1: local addon = CreateFrame("Frame") --select(2,...) farmbuyer@1: local SV farmbuyer@1: farmbuyer@1: local DEFAULT_CHAT = 2 -- combat log (no constant predefined for that) farmbuyer@1: farmbuyer@1: --if GetLocale() == "enUS" then farmbuyer@3: addon.l10n= { farmbuyer@3: ["LEFT"] = "Players who have left the guild: ", farmbuyer@3: ["JOINED"] = "Players who have joined the guild: ", farmbuyer@3: ["RANK"] = "Players whose rank has changed:", farmbuyer@3: ["LEVEL"] = "Players whose level has changed:", farmbuyer@3: ["NOTES"] = "Players whose notes have changed:", farmbuyer@1: farmbuyer@3: ["Oabbrev"] = "O", -- abbreviation for "Officer", specifically the non-public note farmbuyer@3: ["FIELD_rank"] = "Rank", farmbuyer@3: ["FIELD_level"] = "Level", farmbuyer@3: ["FIELD_notes"] = "Player/Officer notes", farmbuyer@1: farmbuyer@3: ["NOCHANGE"] = "No changes to tracked fields have been detected.", farmbuyer@3: farmbuyer@3: -- Something needs to be done about the walls of description text below. farmbuyer@3: } farmbuyer@1: --elseif .... end farmbuyer@1: farmbuyer@1: local guild_selection, log_ever_shown farmbuyer@1: addon.options = { farmbuyer@1: name = "Guild Delta", farmbuyer@1: type = 'group', farmbuyer@3: childGroups = 'tab', farmbuyer@1: handler = addon, -- functions listed as strings called as addon:func farmbuyer@1: args = { farmbuyer@1: version = { farmbuyer@1: --name = filled in during OnEnable farmbuyer@1: type = 'description', farmbuyer@1: fontSize = "large", farmbuyer@1: --image = "Interface\\AddOns\\GuildDelta\\test2", farmbuyer@1: cmdHidden = true, farmbuyer@1: order = 1, farmbuyer@1: }, farmbuyer@1: note = { farmbuyer@1: --name = filled in locals section farmbuyer@1: type = 'description', farmbuyer@1: cmdHidden = true, farmbuyer@1: width = 'full', farmbuyer@1: order = 2, farmbuyer@1: }, farmbuyer@3: general = { farmbuyer@3: name = "General", farmbuyer@3: desc = "Tracking options", farmbuyer@3: type = 'group', farmbuyer@3: order = 10, farmbuyer@3: args = { farmbuyer@3: fields = { farmbuyer@3: name = "Fields", farmbuyer@3: desc = "Track changes to these player fields", farmbuyer@3: type = 'multiselect', farmbuyer@3: order = 10, farmbuyer@3: -- these need to be of function type rather than string keys of members farmbuyer@3: values = function(info) return addon:MakeFieldList() end, farmbuyer@3: get = function(info,x) return SV.fields[x] end, farmbuyer@3: set = function(info,x,val) SV.fields[x] = val end, farmbuyer@3: }, farmbuyer@3: nochange = { farmbuyer@3: name = "No Change", farmbuyer@3: desc = "Print a message even when no changes are detected", farmbuyer@3: type = 'toggle', farmbuyer@3: order = 15, farmbuyer@3: get = function() return not not SV.notify_nochange end, farmbuyer@3: set = function(info,val) SV.notify_nochange = val end, farmbuyer@3: }, farmbuyer@3: spacer2 = { farmbuyer@3: name = '', farmbuyer@3: type = 'description', farmbuyer@3: cmdHidden = true, farmbuyer@3: width = 'full', farmbuyer@3: order = 19, farmbuyer@3: }, farmbuyer@3: guilds = { farmbuyer@3: name = "Guilds", farmbuyer@3: desc = "Guilds for which a roster is known", farmbuyer@3: type = 'select', farmbuyer@3: order = 20, farmbuyer@3: width = 'double', farmbuyer@3: values = function(info) return addon:MakeGuildList() end, farmbuyer@3: get = function(info) return guild_selection end, farmbuyer@3: set = function(info,val) guild_selection = val end, farmbuyer@3: }, farmbuyer@3: clearguild = { farmbuyer@3: name = "Reset Guild", farmbuyer@3: desc = "Erase stored data for selected guild; information will be scanned from scratch on next login.", farmbuyer@3: type = 'execute', farmbuyer@3: order = 22, farmbuyer@3: disabled = function() return not guild_selection end, farmbuyer@3: func = function() farmbuyer@3: assert(type(guild_selection)=='string') farmbuyer@3: local g,r = guild_selection:match("<([^>]+)> %- (.*)") farmbuyer@3: local m = SV.members[r] farmbuyer@3: if m then farmbuyer@3: m[g] = nil farmbuyer@3: else farmbuyer@3: 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: end farmbuyer@3: end, farmbuyer@3: }, farmbuyer@3: }, farmbuyer@1: }, farmbuyer@3: output = { farmbuyer@3: name = "Output", farmbuyer@3: desc = "What and where to print", farmbuyer@3: type = 'group', farmbuyer@1: order = 20, farmbuyer@3: args = { farmbuyer@3: reset = { farmbuyer@3: name = "Reset Output", farmbuyer@3: desc = "Restores default output settings", farmbuyer@3: type = 'execute', farmbuyer@3: order = 10, farmbuyer@3: func = "SetChat", farmbuyer@3: arg = DEFAULT_CHAT, farmbuyer@3: }, farmbuyer@3: spacer1 = { farmbuyer@3: name = '', farmbuyer@3: type = 'description', farmbuyer@3: cmdHidden = true, farmbuyer@3: width = 'full', farmbuyer@3: order = 11, farmbuyer@3: }, farmbuyer@3: print_chatframes = { farmbuyer@3: name = "Print Chatframe Numbers", farmbuyer@3: desc = "Print each chat window number in its frame, for easy reference in the next slider option", farmbuyer@3: type = 'execute', farmbuyer@3: --func = print_chatframes filled in below farmbuyer@3: order = 20, farmbuyer@3: }, farmbuyer@3: chatframe_num = { farmbuyer@3: name = "Output Chatframe", farmbuyer@3: desc = "Which chat window to prefer for printing all the output during login", farmbuyer@3: type = 'range', farmbuyer@3: min = 1, farmbuyer@3: max = NUM_CHAT_WINDOWS, farmbuyer@3: step = 1, farmbuyer@3: get = function() return tonumber(SV.chatframe) or --[[in case of custom name]]DEFAULT_CHAT end, farmbuyer@3: set = "SetChat", farmbuyer@3: order = 25, farmbuyer@3: }, farmbuyer@3: chatframe_name = { farmbuyer@3: name = "Chatframe Override", farmbuyer@3: desc = " If blank, uses the numerical slider. If set, it is the NAME of a frame with AddMessage capability to use for output.", farmbuyer@3: type = 'input', farmbuyer@3: get = function() farmbuyer@3: return type(SV.chatframe) == 'string' and SV.chatframe or nil farmbuyer@3: end, farmbuyer@3: set = "SetChat", farmbuyer@3: order = 26, farmbuyer@3: }, farmbuyer@3: }, farmbuyer@1: }, farmbuyer@1: persist = { farmbuyer@1: name = "Logging", farmbuyer@3: desc = "Storing changes for later review", farmbuyer@1: type = 'group', farmbuyer@3: order = 30, farmbuyer@1: args = { farmbuyer@1: note = { farmbuyer@1: --name = filled in locals section farmbuyer@1: type = 'description', farmbuyer@1: cmdHidden = true, farmbuyer@1: width = 'full', farmbuyer@3: order = 10, farmbuyer@1: }, farmbuyer@1: enable = { farmbuyer@1: name = "Enable Logging", farmbuyer@1: 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: type = 'toggle', farmbuyer@3: order = 15, farmbuyer@1: get = function() return SV.logging end, farmbuyer@1: set = function(i,v) farmbuyer@1: SV.logging = v farmbuyer@1: log_ever_shown = SV.logging or log_ever_shown farmbuyer@1: end, farmbuyer@1: }, farmbuyer@1: clearlog = { farmbuyer@1: name = "Reset Log", farmbuyer@1: desc = "Erase accumulated deltas.", farmbuyer@1: type = 'execute', farmbuyer@3: order = 20, farmbuyer@1: hidden = function() return not (SV.logging or log_ever_shown) end, farmbuyer@1: disabled = function() return not SV.logging end, farmbuyer@1: func = function() farmbuyer@1: SV.logtext = nil farmbuyer@1: end, farmbuyer@1: }, farmbuyer@1: log = { farmbuyer@1: name = "Log", farmbuyer@3: desc = "If you make changes, don't forget to click 'Accept' to save them. Scroll down if needed.", farmbuyer@1: type = 'input', farmbuyer@3: order = 25, farmbuyer@1: multiline = 15, farmbuyer@1: width = 'full', farmbuyer@1: hidden = function() return not (SV.logging or log_ever_shown) end, farmbuyer@1: disabled = function() return not SV.logging end, farmbuyer@1: get = function() return SV.logtext end, farmbuyer@1: set = function(i,t) SV.logtext = t end, farmbuyer@1: }, farmbuyer@1: }, farmbuyer@1: }, farmbuyer@1: } farmbuyer@1: } farmbuyer@1: farmbuyer@1: farmbuyer@1: ----------------------------------------------------------------------------- farmbuyer@1: -- other locals farmbuyer@1: local tinsert, GetGuildRosterInfo = _G.table.insert, _G.GetGuildRosterInfo farmbuyer@1: local chatframe, fieldlist farmbuyer@1: local function prt (...) farmbuyer@1: return chatframe:AddMessage(...) farmbuyer@1: end farmbuyer@1: local function cprt (txt) farmbuyer@1: if SV.logging then addon:AddLogNote(txt) end farmbuyer@1: return prt(txt, 255/255, 26/255, 160/255) farmbuyer@1: end farmbuyer@1: farmbuyer@1: function addon:current_guild_info (N) farmbuyer@1: local ret = {} farmbuyer@1: for i = 1, N do farmbuyer@1: local name,rank_as_string,_,level,_,_,publicnote,officernote = GetGuildRosterInfo(i) farmbuyer@1: -- This technically does not work out to the same as A?B:C, combined farmbuyer@1: -- with the logic below. It does, however, still result in the entry farmbuyer@1: -- not appearing in the returned table. farmbuyer@1: publicnote = publicnote ~= "" and publicnote or nil farmbuyer@1: officernote = officernote ~= "" and officernote or nil farmbuyer@1: if name then -- redundant, but apparently happens on extreme lag farmbuyer@1: tinsert(ret, farmbuyer@1: {name = name, farmbuyer@1: rank = SV.fields.rank and rank_as_string or nil, farmbuyer@1: level = SV.fields.level and level or nil, farmbuyer@1: pnote = SV.fields.notes and publicnote or nil, farmbuyer@1: onote = SV.fields.notes and officernote or nil, farmbuyer@1: }) farmbuyer@1: end farmbuyer@1: end farmbuyer@1: table.sort(ret, function (l,r) return l.name < r.name end) farmbuyer@1: return ret farmbuyer@1: end farmbuyer@1: farmbuyer@3: function addon.options.args.output.args.print_chatframes.func() farmbuyer@1: for i = 1, NUM_CHAT_WINDOWS do farmbuyer@2: local cf = _G['ChatFrame'..i] farmbuyer@1: if not cf then break end farmbuyer@1: addon:Print(cf, "This is frame number", i) farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: addon.options.args.note.name = farmbuyer@1: "You can use the '/guilddelta' command to open the options window.\n\n".. farmbuyer@1: "The guild roster has already been scanned by the time you see this. Therefore, ".. farmbuyer@1: "if you make any changes to the Fields section below, you should probably relog ".. farmbuyer@1: "immediately to begin tracking the changed fields. Changes to the contents *OF* ".. farmbuyer@3: "those fields will not be noticed until the first login after *that*.\n" farmbuyer@1: farmbuyer@1: addon.options.args.persist.args.note.name = farmbuyer@1: "Enabling logging will accumulate the text of the 'deltas' as you see them. ".. farmbuyer@1: "This can grow large over time, depending on the activity of your guilds, so you ".. farmbuyer@1: "should use the Reset Log button below from time to time.\n\n".. farmbuyer@1: "If you click inside the text area below, you can use Control-A to select all ".. farmbuyer@1: "the text, and Control-C to copy it to your computer's clipboard. If you make ".. farmbuyer@2: "any changes to the text, the changes will be preserved. (You can remove uninteresting ".. farmbuyer@1: "changes, add reminders to yourself, and so forth.)\n\n" farmbuyer@1: farmbuyer@1: farmbuyer@1: ----------------------------------------------------------------------------- farmbuyer@1: addon = LibStub("AceAddon-3.0"):NewAddon(addon, "GuildDelta", farmbuyer@3: "AceConsole-3.0") farmbuyer@1: farmbuyer@1: function addon:OnInitialize() farmbuyer@1: if _G.GuildDeltaSV == nil then farmbuyer@1: -- Defaults need to transition from potential older savedvars farmbuyer@1: _G.GuildDeltaSV = { farmbuyer@1: chatframe = _G.GuildDelta_chatframe or DEFAULT_CHAT, farmbuyer@1: fields = _G.GuildDelta_fields or { rank = true, level = false, notes = true }, farmbuyer@3: members = _G.GuildDelta_memberdata or {}, farmbuyer@3: --notify_nochange = nil by default farmbuyer@3: --logging = nil by default farmbuyer@1: } farmbuyer@1: end farmbuyer@1: SV = _G.GuildDeltaSV farmbuyer@1: end farmbuyer@1: farmbuyer@1: -- Remove anything that normal operation doesn't need after finishing its work. farmbuyer@1: function addon:cleanup() farmbuyer@1: prt = nil; cprt = nil farmbuyer@1: self.current_guild_info = nil farmbuyer@1: self.cleanup = nil farmbuyer@1: self.unload = nil farmbuyer@1: self.logquay = nil farmbuyer@1: self.AddLogNote = nil farmbuyer@1: self.FinishLog = nil farmbuyer@1: end farmbuyer@2: -- Remove everything. farmbuyer@1: function addon:unload() farmbuyer@1: self:cleanup() farmbuyer@1: LibStub("AceAddon-3.0").addons["GuildDelta"] = nil farmbuyer@3: addon = nil; farmbuyer@1: -- put the userdata back so it counts as a Frame object again farmbuyer@1: local ud = self[0] farmbuyer@1: table.wipe(self) farmbuyer@1: self[0] = ud farmbuyer@1: end farmbuyer@1: farmbuyer@1: function addon:OnEnable() farmbuyer@1: if not IsInGuild() then farmbuyer@1: self:Print("You are not in a guild, not loading.") farmbuyer@1: return self:unload() farmbuyer@1: end farmbuyer@1: farmbuyer@3: self:RegisterEvent("GUILD_ROSTER_UPDATE") farmbuyer@1: self:SetScript("OnEvent", self.GuildUpdate) farmbuyer@1: farmbuyer@1: self.options.args.version.name = farmbuyer@1: "|cff30adffVersion " .. (GetAddOnMetadata("GuildDelta", "Version") or "?") .. "|r" farmbuyer@1: LibStub("AceConfig-3.0"):RegisterOptionsTable("GuildDelta", self.options) farmbuyer@1: --[[self.optionsFrame =]] LibStub("AceConfigDialog-3.0"):AddToBlizOptions("GuildDelta", "Guild Delta") farmbuyer@1: self:RegisterChatCommand("guilddelta", "OnChatCommand") farmbuyer@2: self:SetChat(self) farmbuyer@1: log_ever_shown = SV.logging farmbuyer@1: self.OnEnable = nil farmbuyer@1: end farmbuyer@1: farmbuyer@1: farmbuyer@1: function addon:OnChatCommand (input) farmbuyer@1: if not input or input:trim() == "" then farmbuyer@1: LibStub("AceConfigDialog-3.0"):Open("GuildDelta") farmbuyer@1: else farmbuyer@1: LibStub("AceConfigCmd-3.0").HandleCommand(self, "guilddelta", "GuildDelta", input) farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: farmbuyer@2: -- 1 arg: (self) called during startup to initialize farmbuyer@2: -- (other) resetting via menus to defaults (see arg field) farmbuyer@2: -- 2 args: setting via menus to new value, number or custom name (see value) farmbuyer@1: function addon:SetChat (info, value) farmbuyer@1: local n, nframe farmbuyer@2: local isauto = info == self farmbuyer@2: if isauto then farmbuyer@2: n = SV.chatframe farmbuyer@2: else -- coming via menu farmbuyer@1: n = info.arg or value farmbuyer@1: end farmbuyer@1: if type(n) == 'number' then farmbuyer@2: if isauto then farmbuyer@2: -- start at the preferred number and find a non-minimized and farmbuyer@2: -- potentially visible frame farmbuyer@2: n = math.min(n,NUM_CHAT_WINDOWS) farmbuyer@2: local cf,cft farmbuyer@2: for i = n, 1, -1 do farmbuyer@2: cf = _G['ChatFrame'..i] farmbuyer@2: cft = _G[cf:GetName()..'Tab'] farmbuyer@2: if cft:IsVisible() then farmbuyer@2: n = i farmbuyer@2: break farmbuyer@2: end farmbuyer@2: end farmbuyer@2: end farmbuyer@2: nframe = _G['ChatFrame'..n] farmbuyer@1: else farmbuyer@2: nframe = _G[n] -- advanced name farmbuyer@1: end farmbuyer@1: if type(nframe) == 'table' and type(nframe.AddMessage) == 'function' then farmbuyer@2: if not isauto then farmbuyer@2: SV.chatframe = n farmbuyer@1: self:Print("Now printing to chat frame", n, farmbuyer@1: (type(nframe.name)=='string' and ("(".. nframe.name .. ")") or "")) farmbuyer@1: end farmbuyer@1: chatframe = nframe farmbuyer@1: else farmbuyer@1: self:Printf("EEEEEEEK! '%s' was not a valid chat frame number/name, no change has been made.", n) farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: farmbuyer@1: -- Not a "normal" PLAYER_LOGOUT handler; this only fires if the player is in farmbuyer@1: -- a guild and the update has already run. farmbuyer@1: function addon:PLAYER_LOGOUT() farmbuyer@1: if not SV.logging then farmbuyer@1: SV.logtext = nil farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: farmbuyer@1: function addon:GuildUpdate() farmbuyer@1: local current_n = GetNumGuildMembers(true) farmbuyer@1: if current_n <= 0 then farmbuyer@1: -- catch the hell up, servers... farmbuyer@1: return GuildRoster() farmbuyer@1: end farmbuyer@1: self:UnregisterEvent("GUILD_ROSTER_UPDATE") farmbuyer@1: self:SetScript("OnEvent", self.PLAYER_LOGOUT) -- keepin' it real^H^H^H^Hsmall and kludgey farmbuyer@1: self:RegisterEvent("PLAYER_LOGOUT") farmbuyer@1: self.GuildUpdate = nil farmbuyer@1: farmbuyer@2: if SV.logtext and #SV.logtext > 20000 then farmbuyer@2: self:Print("Your accumulated logfile has grown rather large; you should consider copying it out and clearing it.") farmbuyer@2: end farmbuyer@2: farmbuyer@1: local guild, realm = (GetGuildInfo("player")), GetRealmName() farmbuyer@1: local members = SV.members farmbuyer@3: local l10n = self.l10n farmbuyer@1: if members[realm] farmbuyer@1: and members[realm][guild] farmbuyer@1: and #(members[realm][guild]) > 0 farmbuyer@1: then farmbuyer@1: -- moved the normal case below farmbuyer@1: else farmbuyer@1: -- new user, or new guild, or any number of things farmbuyer@1: self:Print("GuildDelta initializing roster...") farmbuyer@1: members[realm] = members[realm] or {} farmbuyer@1: members[realm][guild] = self:current_guild_info(current_n) farmbuyer@2: return self:cleanup() farmbuyer@1: end farmbuyer@1: farmbuyer@1: -- table.insert with notes if available farmbuyer@3: -- concatentation of string-only args faster than string.format of same farmbuyer@1: local function tins (t, x) farmbuyer@1: local s = x.name farmbuyer@1: if x.onote and (x.onote ~= "") then farmbuyer@1: s = s .. "(" .. l10n.Oabbrev .. ": " .. x.onote .. ")" farmbuyer@1: end farmbuyer@1: if x.pnote and (x.pnote ~= "") then farmbuyer@1: s = s .. "(" .. x.pnote .. ")" farmbuyer@1: end farmbuyer@1: tinsert(t, s) farmbuyer@1: end farmbuyer@1: farmbuyer@1: -- build the current list farmbuyer@1: local previous, current = members[realm][guild], farmbuyer@1: self:current_guild_info(current_n) farmbuyer@1: local previous_n = #previous farmbuyer@1: farmbuyer@1: -- walk both and do equivalence comparison farmbuyer@1: local joined, left, rank, level, notes = {}, {}, {}, {}, {} farmbuyer@1: local p, c = 1, 1 farmbuyer@1: while p <= previous_n and c <= current_n do farmbuyer@1: local P, C = previous[p], current[c] farmbuyer@1: farmbuyer@1: if P.name == C.name then farmbuyer@1: -- normal case farmbuyer@1: p = p + 1 farmbuyer@1: c = c + 1 farmbuyer@1: -- but can now compare details farmbuyer@1: if C.rank and P.rank and (P.rank ~= C.rank) then farmbuyer@1: tinsert(rank, {C.name, P.rank.." --> "..C.rank}) farmbuyer@1: end farmbuyer@1: if C.level and P.level and (P.level ~= C.level) then farmbuyer@1: tinsert(level, {C.name, P.level.." --> "..C.level}) farmbuyer@1: end farmbuyer@1: if C.pnote and (P.pnote ~= C.pnote) then farmbuyer@1: tinsert(notes, {C.name, C.pnote}) farmbuyer@1: end farmbuyer@1: if C.onote and (P.onote ~= C.onote) then farmbuyer@1: tinsert(notes, {C.name, "["..l10n.Oabbrev.."]: "..C.onote}) farmbuyer@1: end farmbuyer@1: farmbuyer@1: elseif P.name < C.name then farmbuyer@1: -- entry at index p not at c -> somebody has left farmbuyer@1: tins (left, P) farmbuyer@1: p = p + 1 farmbuyer@1: farmbuyer@1: else farmbuyer@1: -- entry at index c not at p -> somebody has joined farmbuyer@1: tins (joined, C) farmbuyer@1: c = c + 1 farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: -- leftovers farmbuyer@1: for i = p, previous_n do farmbuyer@1: tins (left, previous[i]) farmbuyer@1: end farmbuyer@1: for i = c, current_n do farmbuyer@1: tins (joined, current[i]) farmbuyer@1: end farmbuyer@1: farmbuyer@1: -- show results farmbuyer@1: if SV.logging then self.logquay = {} end farmbuyer@3: local m, changes farmbuyer@1: if #left > 0 then farmbuyer@3: changes = true farmbuyer@1: m = l10n.LEFT .. table.concat(left, ", ") farmbuyer@1: cprt(m) farmbuyer@1: end farmbuyer@1: farmbuyer@1: if #joined > 0 then farmbuyer@3: changes = true farmbuyer@1: m = l10n.JOINED .. table.concat(joined, ", ") farmbuyer@1: cprt(m) farmbuyer@1: end farmbuyer@1: farmbuyer@1: if #rank > 0 then farmbuyer@3: changes = true farmbuyer@1: cprt(l10n.RANK) farmbuyer@1: for i = 1, #rank do farmbuyer@1: cprt(rank[i][1]..': '..rank[i][2]) farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: if #level > 0 then farmbuyer@3: changes = true farmbuyer@1: cprt(l10n.LEVEL) farmbuyer@1: for i = 1, #level do farmbuyer@1: cprt(level[i][1]..': '..level[i][2]) farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: if #notes > 0 then farmbuyer@3: changes = true farmbuyer@1: cprt(l10n.NOTES) farmbuyer@1: for i = 1, #notes do farmbuyer@1: cprt(notes[i][1]..': "'..notes[i][2]..'"') farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: if SV.logging then self:FinishLog(guild,realm) end farmbuyer@3: if SV.notify_nochange and (not changes) then cprt(l10n.NOCHANGE) end farmbuyer@1: members[realm][guild] = current farmbuyer@2: self:cleanup() farmbuyer@1: end farmbuyer@1: farmbuyer@1: farmbuyer@1: function addon:MakeFieldList() farmbuyer@1: if not fieldlist then farmbuyer@1: fieldlist = {} farmbuyer@1: for name in pairs(SV.fields) do farmbuyer@3: fieldlist[name] = self.l10n["FIELD_"..name] farmbuyer@1: end farmbuyer@1: end farmbuyer@1: return fieldlist farmbuyer@1: end farmbuyer@1: farmbuyer@1: function addon:MakeGuildList() farmbuyer@1: local list = {} farmbuyer@1: local K farmbuyer@1: for rname,rdata in pairs(SV.members) do farmbuyer@1: for g in pairs(rdata) do farmbuyer@1: K = ("<%s> - %s"):format(g,rname) farmbuyer@1: list[K] = K farmbuyer@1: end farmbuyer@1: end farmbuyer@1: return list farmbuyer@1: end farmbuyer@1: farmbuyer@1: function addon:AddLogNote (txt) farmbuyer@1: tinsert(self.logquay,txt) farmbuyer@1: end farmbuyer@1: farmbuyer@1: function addon:FinishLog(g,r) farmbuyer@1: if #self.logquay > 0 then farmbuyer@1: Calendar_LoadUI() farmbuyer@1: local _,M,D,Y = CalendarGetDate() farmbuyer@1: local h,m = GetGameTime() farmbuyer@1: local timestamp = ("%.4d/%.2d/%.2d %.2d:%.2d <%s> - %s\n"):format(Y,M,D,h,m,g,r) farmbuyer@1: SV.logtext = timestamp farmbuyer@1: .. table.concat(self.logquay, '\n') farmbuyer@1: .. (SV.logtext and ('\n\n'..SV.logtext) or '') farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: -- vim:noet