annotate text_tabs.lua @ 70:cdee65c1bd8c

Implement a list of items to be automatically marked as sent to the guild vault. List controlled on the Options tab like the existing filter. Default list is Cataclysm crafting material drops.
author Farmbuyer of US-Kilrogg <farmbuyer@gmail.com>
date Fri, 11 May 2012 03:56:21 +0000
parents 8442272a8418
children ba5ff82dcf19
rev   line source
farmbuyer@1 1 local addon = select(2,...)
farmbuyer@67 2 if addon.NOLOAD then return end
farmbuyer@1 3
farmbuyer@1 4 --[[ Generator:
farmbuyer@1 5 boolean FUNC (ttype, loot, last_printed, generated, cache)
farmbuyer@1 6 in TTYPE: the registered text type as passed to register_text_generator
farmbuyer@1 7 in LOOT: pointer to g_loot table
farmbuyer@1 8 in LAST_PRINTED: index into loot most recently formatted by this routine
farmbuyer@1 9 in GENERATED.TTYPE: (string) FIFO buffer for text created by this routine;
farmbuyer@1 10 other parts of the GUI copy and nil out this string. Do not change
farmbuyer@1 11 this string, only examine it if needed. If the generator is called
farmbuyer@1 12 more than once between GUI updates, text will build up here.
farmbuyer@1 13 in/out GENERATED.TTYPE_pos: if non-nil, this is the saved cursor position in
farmbuyer@1 14 the text window (so that it stays where the user last left it).
farmbuyer@1 15 Move it if you're doing something strange with the displayed text.
farmbuyer@47 16 tmp GENERATED.loc_TTYPE_*: Fields with this pattern free to use as needed.
farmbuyer@1 17 out CACHE: Empty output table. Accumulate generated lines here, one entry
farmbuyer@1 18 per visible line. Do not terminate with a newline unless you want
farmbuyer@1 19 an extra blank line there.
farmbuyer@1 20
farmbuyer@1 21 Preconditions:
farmbuyer@1 22 + LAST_PRINTED < #LOOT
farmbuyer@1 23 + all "display-relevant" information for the main Loot tab has been filled
farmbuyer@1 24 out (e.g., LOOT[i].cols[3] might have extra text, etc)
farmbuyer@1 25 + LOOT.TTYPE is a non-nil string containing all text in the text box (and
farmbuyer@1 26 if the user has edited the text box, this string will be updated). Do not
farmbuyer@1 27 change this, but like GENERATED.TTYPE it is available for examination.
farmbuyer@1 28
farmbuyer@1 29 Return true if text was created, false if nothing was done.
farmbuyer@1 30 ]]
farmbuyer@1 31
farmbuyer@1 32 --[[ Optional special widgets:
farmbuyer@1 33 FUNC (ttype, editbox, container, mkbutton)
farmbuyer@1 34 TTYPE: see above
farmbuyer@1 35 EDITBOX: the MultiLineEditBox widget
farmbuyer@1 36 CONTAINER: widget container (already has 'Regenerate' button in it)
farmbuyer@1 37 MKBUTTON: function to create more AceGUI widgets, as follows:
farmbuyer@1 38
farmbuyer@65 39 mkbutton ("WidgetType", 'display key', "Text On Widget", "mouseover text")
farmbuyer@65 40 mkbutton ( [Button] 'display key', "Text On Widget", "mouseover text")
farmbuyer@65 41 mkbutton ( [Button] [text] "Text On Widget", "mouseover text")
farmbuyer@1 42
farmbuyer@65 43 The 'display key' parameter will almost certainly be specified as nil for
farmbuyer@65 44 these functions.
farmbuyer@1 45 ]]
farmbuyer@1 46
farmbuyer@1 47 local forum_warned_heroic
farmbuyer@1 48 local warning_text
farmbuyer@1 49 do
farmbuyer@1 50 local red = '|cffff0505'
farmbuyer@11 51 local green = ITEM_QUALITY_COLORS[ITEM_QUALITY_UNCOMMON].hex
farmbuyer@66 52 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 53 end
farmbuyer@1 54
farmbuyer@1 55 local function forum (_, loot, last_printed, generated, cache)
farmbuyer@1 56 local fmt = OuroLootSV_opts.forum[OuroLootSV_opts.forum_current] or ""
farmbuyer@1 57 -- if it's capable of handling heroic items, consider them warned already
farmbuyer@1 58 forum_warned_heroic = forum_warned_heroic or fmt:find'%$I'
farmbuyer@1 59
farmbuyer@1 60 for i = last_printed+1, #loot do
farmbuyer@1 61 local e = loot[i]
farmbuyer@1 62
farmbuyer@1 63 if e.kind == 'loot' then
farmbuyer@1 64 -- Assuming nobody names a toon "offspec" or "gvault"
farmbuyer@65 65 -- 16Apr2011: armory finds 20 Gvaults and 77 Offspecs... hulk smash.
farmbuyer@1 66 local disp = e.disposition or e.person
farmbuyer@1 67 if disp == 'offspec' then
farmbuyer@1 68 disp = e.person .. " " .. 'offspec'
farmbuyer@1 69 elseif disp == 'gvault' then
farmbuyer@1 70 --disp = "guild vault (".. e.person .. ")"
farmbuyer@1 71 disp = "guild vault"
farmbuyer@1 72 end
farmbuyer@1 73 if e.extratext_byhand then
farmbuyer@1 74 disp = disp .. " -- " .. e.extratext
farmbuyer@1 75 end
farmbuyer@66 76 if e.variant and not forum_warned_heroic then
farmbuyer@1 77 forum_warned_heroic = true
farmbuyer@1 78 addon:Print(warning_text)
farmbuyer@1 79 end
farmbuyer@1 80 local t = fmt:gsub('%$I', e.id)
farmbuyer@1 81 :gsub('%$N', e.itemname)
farmbuyer@1 82 :gsub('%$X', e.count or "")
farmbuyer@1 83 :gsub('%$T', disp)
farmbuyer@1 84 cache[#cache+1] = t
farmbuyer@1 85
farmbuyer@1 86 elseif e.kind == 'boss' and e.reason == 'kill' then
farmbuyer@65 87 -- The first boss in an instance gets an instance tag, others
farmbuyer@65 88 -- get a blank line
farmbuyer@1 89 if generated.last_instance == e.instance then
farmbuyer@1 90 cache[#cache+1] = ""
farmbuyer@1 91 else
farmbuyer@1 92 cache[#cache+1] = "\n[b]" .. e.instance .. "[/b]"
farmbuyer@1 93 generated.last_instance = e.instance
farmbuyer@1 94 end
farmbuyer@55 95 cache[#cache+1] = "[i]" .. e.bossname .. "[/i]"
farmbuyer@1 96
farmbuyer@1 97 elseif e.kind == 'time' then
farmbuyer@1 98 cache[#cache+1] = "[b]" .. e.startday.text .. "[/b]"
farmbuyer@1 99
farmbuyer@1 100 end
farmbuyer@1 101 end
farmbuyer@61 102 return #cache > 0
farmbuyer@1 103 end
farmbuyer@1 104
farmbuyer@1 105 local function forum_specials (_,_, container, mkbutton)
farmbuyer@1 106 local map,current = {}
farmbuyer@1 107 for label,format in pairs(OuroLootSV_opts.forum) do
farmbuyer@1 108 table.insert(map,label)
farmbuyer@1 109 if label == OuroLootSV_opts.forum_current then
farmbuyer@1 110 current = #map
farmbuyer@1 111 end
farmbuyer@1 112 end
farmbuyer@1 113
farmbuyer@1 114 local dd, editbox
farmbuyer@1 115 dd = mkbutton("Dropdown", nil, "",
farmbuyer@1 116 [[Chose specific formatting of loot items. See Help tab for more. Regenerate to take effect.]])
farmbuyer@1 117 dd:SetFullWidth(true)
farmbuyer@1 118 dd:SetLabel("Item markup")
farmbuyer@1 119 dd:SetList(map)
farmbuyer@1 120 dd:SetValue(current)
farmbuyer@1 121 dd:SetCallback("OnValueChanged", function(_dd,event,choice)
farmbuyer@1 122 OuroLootSV_opts.forum_current = map[choice]
farmbuyer@1 123 forum_warned_heroic = nil
farmbuyer@1 124 editbox:SetDisabled(map[choice] ~= "Custom...")
farmbuyer@1 125 end)
farmbuyer@1 126 container:AddChild(dd)
farmbuyer@1 127
farmbuyer@1 128 editbox = mkbutton("EditBox", nil, OuroLootSV_opts.forum["Custom..."],
farmbuyer@1 129 [[Format described in Help tab (Generated Text -> Forum Markup).]])
farmbuyer@1 130 editbox:SetFullWidth(true)
farmbuyer@1 131 editbox:SetLabel("Custom:")
farmbuyer@1 132 editbox:SetCallback("OnEnterPressed", function(_e,event,value)
farmbuyer@1 133 OuroLootSV_opts.forum["Custom..."] = value
farmbuyer@1 134 _e.editbox:ClearFocus()
farmbuyer@1 135 end)
farmbuyer@1 136 editbox:SetDisabled(OuroLootSV_opts.forum_current ~= "Custom...")
farmbuyer@1 137 container:AddChild(editbox)
farmbuyer@1 138 end
farmbuyer@1 139
farmbuyer@1 140 addon:register_text_generator ("forum", [[Forum Markup]], [[BBcode ready for Ouroboros forums]], forum, forum_specials)
farmbuyer@1 141
farmbuyer@1 142
farmbuyer@56 143 local ingroups, outgroups = {}, {}
farmbuyer@56 144 local function do_attendance (raidertable, max_group_number)
farmbuyer@56 145 local tins, wipe, tsort, tconcat =
farmbuyer@56 146 table.insert, table.wipe, table.sort, table.concat
farmbuyer@56 147
farmbuyer@56 148 -- Assumption: everybody is packed into the first N groups.
farmbuyer@56 149 if raidertable then for name,info in pairs(raidertable) do
farmbuyer@56 150 if info.online ~= 3 then -- 3 == left the raid
farmbuyer@68 151 if (info.subgroup or (NUM_RAID_GROUPS+1)) <= max_group_number then
farmbuyer@56 152 tins (ingroups, name)
farmbuyer@56 153 else
farmbuyer@56 154 tins (outgroups, name)
farmbuyer@56 155 end
farmbuyer@56 156 end
farmbuyer@56 157 end end
farmbuyer@56 158 if #ingroups > 0 then
farmbuyer@56 159 tsort(ingroups)
farmbuyer@56 160 else
farmbuyer@56 161 ingroups[1] = [[Nobody recorded as inside the instance.]]
farmbuyer@56 162 end
farmbuyer@56 163 if #outgroups > 0 then
farmbuyer@56 164 tsort(outgroups)
farmbuyer@56 165 else
farmbuyer@56 166 outgroups[1] = [[Nobody recorded as outside the instance.]]
farmbuyer@56 167 end
farmbuyer@56 168 local i,o = tconcat(ingroups,", "), tconcat(outgroups,", ")
farmbuyer@56 169 wipe(ingroups)
farmbuyer@56 170 wipe(outgroups)
farmbuyer@56 171 return i,o
farmbuyer@56 172 end
farmbuyer@56 173
farmbuyer@1 174 local function att (_, loot, last_printed, _, cache)
farmbuyer@1 175 for i = last_printed+1, #loot do
farmbuyer@1 176 local e = loot[i]
farmbuyer@1 177
farmbuyer@1 178 if e.kind == 'boss' and e.reason == 'kill' then
farmbuyer@69 179 -- Raid size can potentially be different on a per-boss basis
farmbuyer@56 180 -- (e.g., "we're dropping to 10-man for the PvP boss")
farmbuyer@56 181 local i,o = do_attendance (e.raidersnap, e.maxsize / MEMBERS_PER_RAID_GROUP)
farmbuyer@56 182
farmbuyer@65 183 cache[#cache+1] = ("\n%s -- %s\n{+} %s\n{-} %s\n"):
farmbuyer@65 184 format(e.instance, e.bossname, i, o)
farmbuyer@1 185
farmbuyer@1 186 elseif e.kind == 'time' then
farmbuyer@1 187 cache[#cache+1] = e.startday.text
farmbuyer@1 188
farmbuyer@1 189 end
farmbuyer@1 190 end
farmbuyer@61 191 return #cache > 0
farmbuyer@1 192 end
farmbuyer@1 193
farmbuyer@1 194 local function att_specials (_, editbox, container, mkbutton)
farmbuyer@1 195 local w = mkbutton("Take Attendance",
farmbuyer@1 196 [[Take attendance now (will continue to take attendance on each boss kill).]])
farmbuyer@1 197 w:SetFullWidth(true)
farmbuyer@1 198 w:SetCallback("OnClick", function(_w)
farmbuyer@61 199 local ss,max,instance = addon:snapshot_raid (--[[inraid=]]true)
farmbuyer@61 200 local i,o = do_attendance (ss, max / MEMBERS_PER_RAID_GROUP)
farmbuyer@1 201 local h, m = GetGameTime()
farmbuyer@56 202
farmbuyer@61 203 local additional = ("Attendance for %s at %.2d:%.2d:\n{+} %s\n{-} %s"):
farmbuyer@61 204 format(instance, h, m, i, o)
farmbuyer@1 205 editbox:SetText(editbox:GetText() .. '\n' .. additional)
farmbuyer@1 206 end)
farmbuyer@1 207 container:AddChild(w)
farmbuyer@1 208 end
farmbuyer@1 209
farmbuyer@1 210 addon:register_text_generator ("attend", [[Attendance]], [[Attendance list for each kill]], att, att_specials)
farmbuyer@1 211
farmbuyer@1 212 -- vim:noet