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@97
|
56 local fmt = addon.db.profile.forum[addon.db.profile.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@109
|
64 local destination = e.person
|
farmbuyer@109
|
65 if e.disposition then
|
farmbuyer@109
|
66 local disp = e.disposition
|
farmbuyer@109
|
67 local disptext = addon:_test_disposition(disp,'text')
|
farmbuyer@109
|
68 if disp == 'offspec' then
|
farmbuyer@109
|
69 destination = e.person .. " " .. disptext
|
farmbuyer@109
|
70 elseif disp == 'gvault' then
|
farmbuyer@109
|
71 --destination = ("%s (%s)"):format(disptext,e.person)
|
farmbuyer@109
|
72 destination = disptext
|
farmbuyer@109
|
73 else
|
farmbuyer@109
|
74 destination = disptext
|
farmbuyer@109
|
75 end
|
farmbuyer@1
|
76 end
|
farmbuyer@1
|
77 if e.extratext_byhand then
|
farmbuyer@109
|
78 destination = destination .. " -- " .. e.extratext
|
farmbuyer@1
|
79 end
|
farmbuyer@66
|
80 if e.variant and not forum_warned_heroic then
|
farmbuyer@1
|
81 forum_warned_heroic = true
|
farmbuyer@1
|
82 addon:Print(warning_text)
|
farmbuyer@1
|
83 end
|
farmbuyer@1
|
84 local t = fmt:gsub('%$I', e.id)
|
farmbuyer@1
|
85 :gsub('%$N', e.itemname)
|
farmbuyer@1
|
86 :gsub('%$X', e.count or "")
|
farmbuyer@109
|
87 :gsub('%$T', destination)
|
farmbuyer@1
|
88 cache[#cache+1] = t
|
farmbuyer@1
|
89
|
farmbuyer@1
|
90 elseif e.kind == 'boss' and e.reason == 'kill' then
|
farmbuyer@65
|
91 -- The first boss in an instance gets an instance tag, others
|
farmbuyer@65
|
92 -- get a blank line
|
farmbuyer@1
|
93 if generated.last_instance == e.instance then
|
farmbuyer@1
|
94 cache[#cache+1] = ""
|
farmbuyer@1
|
95 else
|
farmbuyer@1
|
96 cache[#cache+1] = "\n[b]" .. e.instance .. "[/b]"
|
farmbuyer@1
|
97 generated.last_instance = e.instance
|
farmbuyer@1
|
98 end
|
farmbuyer@55
|
99 cache[#cache+1] = "[i]" .. e.bossname .. "[/i]"
|
farmbuyer@1
|
100
|
farmbuyer@1
|
101 elseif e.kind == 'time' then
|
farmbuyer@1
|
102 cache[#cache+1] = "[b]" .. e.startday.text .. "[/b]"
|
farmbuyer@1
|
103
|
farmbuyer@1
|
104 end
|
farmbuyer@1
|
105 end
|
farmbuyer@61
|
106 return #cache > 0
|
farmbuyer@1
|
107 end
|
farmbuyer@1
|
108
|
farmbuyer@1
|
109 local function forum_specials (_,_, container, mkbutton)
|
farmbuyer@97
|
110 local opts = addon.db.profile
|
farmbuyer@1
|
111 local map,current = {}
|
farmbuyer@97
|
112 for label,format in pairs(opts.forum) do
|
farmbuyer@1
|
113 table.insert(map,label)
|
farmbuyer@97
|
114 if label == opts.forum_current then
|
farmbuyer@1
|
115 current = #map
|
farmbuyer@1
|
116 end
|
farmbuyer@1
|
117 end
|
farmbuyer@1
|
118
|
farmbuyer@1
|
119 local dd, editbox
|
farmbuyer@1
|
120 dd = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
121 [[Chose specific formatting of loot items. See Help tab for more. Regenerate to take effect.]])
|
farmbuyer@1
|
122 dd:SetFullWidth(true)
|
farmbuyer@1
|
123 dd:SetLabel("Item markup")
|
farmbuyer@1
|
124 dd:SetList(map)
|
farmbuyer@1
|
125 dd:SetValue(current)
|
farmbuyer@1
|
126 dd:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@97
|
127 opts.forum_current = map[choice]
|
farmbuyer@1
|
128 forum_warned_heroic = nil
|
farmbuyer@1
|
129 editbox:SetDisabled(map[choice] ~= "Custom...")
|
farmbuyer@1
|
130 end)
|
farmbuyer@1
|
131 container:AddChild(dd)
|
farmbuyer@1
|
132
|
farmbuyer@97
|
133 editbox = mkbutton("EditBox", nil, opts.forum["Custom..."],
|
farmbuyer@1
|
134 [[Format described in Help tab (Generated Text -> Forum Markup).]])
|
farmbuyer@1
|
135 editbox:SetFullWidth(true)
|
farmbuyer@1
|
136 editbox:SetLabel("Custom:")
|
farmbuyer@1
|
137 editbox:SetCallback("OnEnterPressed", function(_e,event,value)
|
farmbuyer@97
|
138 opts.forum["Custom..."] = value
|
farmbuyer@1
|
139 _e.editbox:ClearFocus()
|
farmbuyer@1
|
140 end)
|
farmbuyer@97
|
141 editbox:SetDisabled(opts.forum_current ~= "Custom...")
|
farmbuyer@1
|
142 container:AddChild(editbox)
|
farmbuyer@1
|
143 end
|
farmbuyer@1
|
144
|
farmbuyer@1
|
145 addon:register_text_generator ("forum", [[Forum Markup]], [[BBcode ready for Ouroboros forums]], forum, forum_specials)
|
farmbuyer@1
|
146
|
farmbuyer@1
|
147
|
farmbuyer@56
|
148 local ingroups, outgroups = {}, {}
|
farmbuyer@56
|
149 local function do_attendance (raidertable, max_group_number)
|
farmbuyer@56
|
150 local tins, wipe, tsort, tconcat =
|
farmbuyer@56
|
151 table.insert, table.wipe, table.sort, table.concat
|
farmbuyer@56
|
152
|
farmbuyer@56
|
153 -- Assumption: everybody is packed into the first N groups.
|
farmbuyer@56
|
154 if raidertable then for name,info in pairs(raidertable) do
|
farmbuyer@102
|
155 if info.online ~= 'no_longer' then -- 'no_longer' == left the raid
|
farmbuyer@68
|
156 if (info.subgroup or (NUM_RAID_GROUPS+1)) <= max_group_number then
|
farmbuyer@56
|
157 tins (ingroups, name)
|
farmbuyer@56
|
158 else
|
farmbuyer@56
|
159 tins (outgroups, name)
|
farmbuyer@56
|
160 end
|
farmbuyer@56
|
161 end
|
farmbuyer@56
|
162 end end
|
farmbuyer@56
|
163 if #ingroups > 0 then
|
farmbuyer@56
|
164 tsort(ingroups)
|
farmbuyer@56
|
165 else
|
farmbuyer@56
|
166 ingroups[1] = [[Nobody recorded as inside the instance.]]
|
farmbuyer@56
|
167 end
|
farmbuyer@56
|
168 if #outgroups > 0 then
|
farmbuyer@56
|
169 tsort(outgroups)
|
farmbuyer@56
|
170 else
|
farmbuyer@56
|
171 outgroups[1] = [[Nobody recorded as outside the instance.]]
|
farmbuyer@56
|
172 end
|
farmbuyer@56
|
173 local i,o = tconcat(ingroups,", "), tconcat(outgroups,", ")
|
farmbuyer@56
|
174 wipe(ingroups)
|
farmbuyer@56
|
175 wipe(outgroups)
|
farmbuyer@56
|
176 return i,o
|
farmbuyer@56
|
177 end
|
farmbuyer@56
|
178
|
farmbuyer@1
|
179 local function att (_, loot, last_printed, _, cache)
|
farmbuyer@1
|
180 for i = last_printed+1, #loot do
|
farmbuyer@1
|
181 local e = loot[i]
|
farmbuyer@1
|
182
|
farmbuyer@1
|
183 if e.kind == 'boss' and e.reason == 'kill' then
|
farmbuyer@69
|
184 -- Raid size can potentially be different on a per-boss basis
|
farmbuyer@56
|
185 -- (e.g., "we're dropping to 10-man for the PvP boss")
|
farmbuyer@56
|
186 local i,o = do_attendance (e.raidersnap, e.maxsize / MEMBERS_PER_RAID_GROUP)
|
farmbuyer@56
|
187
|
farmbuyer@65
|
188 cache[#cache+1] = ("\n%s -- %s\n{+} %s\n{-} %s\n"):
|
farmbuyer@65
|
189 format(e.instance, e.bossname, i, o)
|
farmbuyer@1
|
190
|
farmbuyer@1
|
191 elseif e.kind == 'time' then
|
farmbuyer@1
|
192 cache[#cache+1] = e.startday.text
|
farmbuyer@1
|
193
|
farmbuyer@1
|
194 end
|
farmbuyer@1
|
195 end
|
farmbuyer@61
|
196 return #cache > 0
|
farmbuyer@1
|
197 end
|
farmbuyer@1
|
198
|
farmbuyer@1
|
199 local function att_specials (_, editbox, container, mkbutton)
|
farmbuyer@1
|
200 local w = mkbutton("Take Attendance",
|
farmbuyer@1
|
201 [[Take attendance now (will continue to take attendance on each boss kill).]])
|
farmbuyer@1
|
202 w:SetFullWidth(true)
|
farmbuyer@1
|
203 w:SetCallback("OnClick", function(_w)
|
farmbuyer@61
|
204 local ss,max,instance = addon:snapshot_raid (--[[inraid=]]true)
|
farmbuyer@61
|
205 local i,o = do_attendance (ss, max / MEMBERS_PER_RAID_GROUP)
|
farmbuyer@1
|
206 local h, m = GetGameTime()
|
farmbuyer@56
|
207
|
farmbuyer@61
|
208 local additional = ("Attendance for %s at %.2d:%.2d:\n{+} %s\n{-} %s"):
|
farmbuyer@61
|
209 format(instance, h, m, i, o)
|
farmbuyer@1
|
210 editbox:SetText(editbox:GetText() .. '\n' .. additional)
|
farmbuyer@1
|
211 end)
|
farmbuyer@1
|
212 container:AddChild(w)
|
farmbuyer@1
|
213 end
|
farmbuyer@1
|
214
|
farmbuyer@1
|
215 addon:register_text_generator ("attend", [[Attendance]], [[Attendance list for each kill]], att, att_specials)
|
farmbuyer@1
|
216
|
farmbuyer@109
|
217 addon.FILES_LOADED = addon.FILES_LOADED + 1
|
farmbuyer@1
|
218 -- vim:noet
|