annotate text_tabs.lua @ 66:43913e02a1ef

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