farmbuyer@1: local addon = select(2,...) farmbuyer@67: if addon.NOLOAD then return end farmbuyer@1: farmbuyer@1: --[[ Generator: farmbuyer@1: boolean FUNC (ttype, loot, last_printed, generated, cache) farmbuyer@1: in TTYPE: the registered text type as passed to register_text_generator farmbuyer@1: in LOOT: pointer to g_loot table farmbuyer@1: in LAST_PRINTED: index into loot most recently formatted by this routine farmbuyer@1: in GENERATED.TTYPE: (string) FIFO buffer for text created by this routine; farmbuyer@1: other parts of the GUI copy and nil out this string. Do not change farmbuyer@1: this string, only examine it if needed. If the generator is called farmbuyer@1: more than once between GUI updates, text will build up here. farmbuyer@1: in/out GENERATED.TTYPE_pos: if non-nil, this is the saved cursor position in farmbuyer@1: the text window (so that it stays where the user last left it). farmbuyer@1: Move it if you're doing something strange with the displayed text. farmbuyer@47: tmp GENERATED.loc_TTYPE_*: Fields with this pattern free to use as needed. farmbuyer@1: out CACHE: Empty output table. Accumulate generated lines here, one entry farmbuyer@1: per visible line. Do not terminate with a newline unless you want farmbuyer@1: an extra blank line there. farmbuyer@1: farmbuyer@1: Preconditions: farmbuyer@1: + LAST_PRINTED < #LOOT farmbuyer@1: + all "display-relevant" information for the main Loot tab has been filled farmbuyer@1: out (e.g., LOOT[i].cols[3] might have extra text, etc) farmbuyer@1: + LOOT.TTYPE is a non-nil string containing all text in the text box (and farmbuyer@1: if the user has edited the text box, this string will be updated). Do not farmbuyer@1: change this, but like GENERATED.TTYPE it is available for examination. farmbuyer@1: farmbuyer@1: Return true if text was created, false if nothing was done. farmbuyer@1: ]] farmbuyer@1: farmbuyer@1: --[[ Optional special widgets: farmbuyer@1: FUNC (ttype, editbox, container, mkbutton) farmbuyer@1: TTYPE: see above farmbuyer@1: EDITBOX: the MultiLineEditBox widget farmbuyer@1: CONTAINER: widget container (already has 'Regenerate' button in it) farmbuyer@1: MKBUTTON: function to create more AceGUI widgets, as follows: farmbuyer@1: farmbuyer@65: mkbutton ("WidgetType", 'display key', "Text On Widget", "mouseover text") farmbuyer@65: mkbutton ( [Button] 'display key', "Text On Widget", "mouseover text") farmbuyer@65: mkbutton ( [Button] [text] "Text On Widget", "mouseover text") farmbuyer@1: farmbuyer@65: The 'display key' parameter will almost certainly be specified as nil for farmbuyer@65: these functions. farmbuyer@1: ]] farmbuyer@1: farmbuyer@1: local forum_warned_heroic farmbuyer@1: local warning_text farmbuyer@1: do farmbuyer@1: local red = '|cffff0505' farmbuyer@11: local green = ITEM_QUALITY_COLORS[ITEM_QUALITY_UNCOMMON].hex farmbuyer@66: warning_text = ([[%sWARNING:|r Heroic (and Raid Finder) items sharing the same name as normal items often display incorrectly on forums that use the item name as the identifier. Recommend you change the %sItem markup|r dropdown in the right-hand side to %s"[item] by ID"|r (or some other format that uses $I) and regenerate this loot.]]):format(red, green, green) farmbuyer@1: end farmbuyer@1: farmbuyer@1: local function forum (_, loot, last_printed, generated, cache) farmbuyer@1: local fmt = OuroLootSV_opts.forum[OuroLootSV_opts.forum_current] or "" farmbuyer@1: -- if it's capable of handling heroic items, consider them warned already farmbuyer@1: forum_warned_heroic = forum_warned_heroic or fmt:find'%$I' farmbuyer@1: farmbuyer@1: for i = last_printed+1, #loot do farmbuyer@1: local e = loot[i] farmbuyer@1: farmbuyer@1: if e.kind == 'loot' then farmbuyer@1: -- Assuming nobody names a toon "offspec" or "gvault" farmbuyer@65: -- 16Apr2011: armory finds 20 Gvaults and 77 Offspecs... hulk smash. farmbuyer@1: local disp = e.disposition or e.person farmbuyer@1: if disp == 'offspec' then farmbuyer@1: disp = e.person .. " " .. 'offspec' farmbuyer@1: elseif disp == 'gvault' then farmbuyer@1: --disp = "guild vault (".. e.person .. ")" farmbuyer@1: disp = "guild vault" farmbuyer@1: end farmbuyer@1: if e.extratext_byhand then farmbuyer@1: disp = disp .. " -- " .. e.extratext farmbuyer@1: end farmbuyer@66: if e.variant and not forum_warned_heroic then farmbuyer@1: forum_warned_heroic = true farmbuyer@1: addon:Print(warning_text) farmbuyer@1: end farmbuyer@1: local t = fmt:gsub('%$I', e.id) farmbuyer@1: :gsub('%$N', e.itemname) farmbuyer@1: :gsub('%$X', e.count or "") farmbuyer@1: :gsub('%$T', disp) farmbuyer@1: cache[#cache+1] = t farmbuyer@1: farmbuyer@1: elseif e.kind == 'boss' and e.reason == 'kill' then farmbuyer@65: -- The first boss in an instance gets an instance tag, others farmbuyer@65: -- get a blank line farmbuyer@1: if generated.last_instance == e.instance then farmbuyer@1: cache[#cache+1] = "" farmbuyer@1: else farmbuyer@1: cache[#cache+1] = "\n[b]" .. e.instance .. "[/b]" farmbuyer@1: generated.last_instance = e.instance farmbuyer@1: end farmbuyer@55: cache[#cache+1] = "[i]" .. e.bossname .. "[/i]" farmbuyer@1: farmbuyer@1: elseif e.kind == 'time' then farmbuyer@1: cache[#cache+1] = "[b]" .. e.startday.text .. "[/b]" farmbuyer@1: farmbuyer@1: end farmbuyer@1: end farmbuyer@61: return #cache > 0 farmbuyer@1: end farmbuyer@1: farmbuyer@1: local function forum_specials (_,_, container, mkbutton) farmbuyer@1: local map,current = {} farmbuyer@1: for label,format in pairs(OuroLootSV_opts.forum) do farmbuyer@1: table.insert(map,label) farmbuyer@1: if label == OuroLootSV_opts.forum_current then farmbuyer@1: current = #map farmbuyer@1: end farmbuyer@1: end farmbuyer@1: farmbuyer@1: local dd, editbox farmbuyer@1: dd = mkbutton("Dropdown", nil, "", farmbuyer@1: [[Chose specific formatting of loot items. See Help tab for more. Regenerate to take effect.]]) farmbuyer@1: dd:SetFullWidth(true) farmbuyer@1: dd:SetLabel("Item markup") farmbuyer@1: dd:SetList(map) farmbuyer@1: dd:SetValue(current) farmbuyer@1: dd:SetCallback("OnValueChanged", function(_dd,event,choice) farmbuyer@1: OuroLootSV_opts.forum_current = map[choice] farmbuyer@1: forum_warned_heroic = nil farmbuyer@1: editbox:SetDisabled(map[choice] ~= "Custom...") farmbuyer@1: end) farmbuyer@1: container:AddChild(dd) farmbuyer@1: farmbuyer@1: editbox = mkbutton("EditBox", nil, OuroLootSV_opts.forum["Custom..."], farmbuyer@1: [[Format described in Help tab (Generated Text -> Forum Markup).]]) farmbuyer@1: editbox:SetFullWidth(true) farmbuyer@1: editbox:SetLabel("Custom:") farmbuyer@1: editbox:SetCallback("OnEnterPressed", function(_e,event,value) farmbuyer@1: OuroLootSV_opts.forum["Custom..."] = value farmbuyer@1: _e.editbox:ClearFocus() farmbuyer@1: end) farmbuyer@1: editbox:SetDisabled(OuroLootSV_opts.forum_current ~= "Custom...") farmbuyer@1: container:AddChild(editbox) farmbuyer@1: end farmbuyer@1: farmbuyer@1: addon:register_text_generator ("forum", [[Forum Markup]], [[BBcode ready for Ouroboros forums]], forum, forum_specials) farmbuyer@1: farmbuyer@1: farmbuyer@56: local ingroups, outgroups = {}, {} farmbuyer@56: local function do_attendance (raidertable, max_group_number) farmbuyer@56: local tins, wipe, tsort, tconcat = farmbuyer@56: table.insert, table.wipe, table.sort, table.concat farmbuyer@56: farmbuyer@56: -- Assumption: everybody is packed into the first N groups. farmbuyer@56: if raidertable then for name,info in pairs(raidertable) do farmbuyer@56: if info.online ~= 3 then -- 3 == left the raid farmbuyer@68: if (info.subgroup or (NUM_RAID_GROUPS+1)) <= max_group_number then farmbuyer@56: tins (ingroups, name) farmbuyer@56: else farmbuyer@56: tins (outgroups, name) farmbuyer@56: end farmbuyer@56: end farmbuyer@56: end end farmbuyer@56: if #ingroups > 0 then farmbuyer@56: tsort(ingroups) farmbuyer@56: else farmbuyer@56: ingroups[1] = [[Nobody recorded as inside the instance.]] farmbuyer@56: end farmbuyer@56: if #outgroups > 0 then farmbuyer@56: tsort(outgroups) farmbuyer@56: else farmbuyer@56: outgroups[1] = [[Nobody recorded as outside the instance.]] farmbuyer@56: end farmbuyer@56: local i,o = tconcat(ingroups,", "), tconcat(outgroups,", ") farmbuyer@56: wipe(ingroups) farmbuyer@56: wipe(outgroups) farmbuyer@56: return i,o farmbuyer@56: end farmbuyer@56: farmbuyer@1: local function att (_, loot, last_printed, _, cache) farmbuyer@1: for i = last_printed+1, #loot do farmbuyer@1: local e = loot[i] farmbuyer@1: farmbuyer@1: if e.kind == 'boss' and e.reason == 'kill' then farmbuyer@56: -- This could, concievably, be different on a per-boss basis farmbuyer@56: -- (e.g., "we're dropping to 10-man for the PvP boss") farmbuyer@56: local i,o = do_attendance (e.raidersnap, e.maxsize / MEMBERS_PER_RAID_GROUP) farmbuyer@56: farmbuyer@65: cache[#cache+1] = ("\n%s -- %s\n{+} %s\n{-} %s\n"): farmbuyer@65: format(e.instance, e.bossname, i, o) farmbuyer@1: farmbuyer@1: elseif e.kind == 'time' then farmbuyer@1: cache[#cache+1] = e.startday.text farmbuyer@1: farmbuyer@1: end farmbuyer@1: end farmbuyer@61: return #cache > 0 farmbuyer@1: end farmbuyer@1: farmbuyer@1: local function att_specials (_, editbox, container, mkbutton) farmbuyer@1: local w = mkbutton("Take Attendance", farmbuyer@1: [[Take attendance now (will continue to take attendance on each boss kill).]]) farmbuyer@1: w:SetFullWidth(true) farmbuyer@1: w:SetCallback("OnClick", function(_w) farmbuyer@61: local ss,max,instance = addon:snapshot_raid (--[[inraid=]]true) farmbuyer@61: local i,o = do_attendance (ss, max / MEMBERS_PER_RAID_GROUP) farmbuyer@1: local h, m = GetGameTime() farmbuyer@56: farmbuyer@61: local additional = ("Attendance for %s at %.2d:%.2d:\n{+} %s\n{-} %s"): farmbuyer@61: format(instance, h, m, i, o) farmbuyer@1: editbox:SetText(editbox:GetText() .. '\n' .. additional) farmbuyer@1: end) farmbuyer@1: container:AddChild(w) farmbuyer@1: end farmbuyer@1: farmbuyer@1: addon:register_text_generator ("attend", [[Attendance]], [[Attendance list for each kill]], att, att_specials) farmbuyer@1: farmbuyer@1: -- vim:noet