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 + LOOT.TTYPE is a non-nil string containing all text in the text box (and
|
farmbuyer@1
|
24 if the user has edited the text box, this string will be updated). Do not
|
farmbuyer@1
|
25 change this, but like GENERATED.TTYPE it is available for examination.
|
farmbuyer@1
|
26
|
farmbuyer@1
|
27 Return true if text was created, false if nothing was done.
|
farmbuyer@1
|
28 ]]
|
farmbuyer@1
|
29
|
farmbuyer@1
|
30 --[[ Optional special widgets:
|
farmbuyer@1
|
31 FUNC (ttype, editbox, container, mkbutton)
|
farmbuyer@1
|
32 TTYPE: see above
|
farmbuyer@1
|
33 EDITBOX: the MultiLineEditBox widget
|
farmbuyer@1
|
34 CONTAINER: widget container (already has 'Regenerate' button in it)
|
farmbuyer@1
|
35 MKBUTTON: function to create more AceGUI widgets, as follows:
|
farmbuyer@1
|
36
|
farmbuyer@65
|
37 mkbutton ("WidgetType", 'display key', "Text On Widget", "mouseover text")
|
farmbuyer@65
|
38 mkbutton ( [Button] 'display key', "Text On Widget", "mouseover text")
|
farmbuyer@65
|
39 mkbutton ( [Button] [text] "Text On Widget", "mouseover text")
|
farmbuyer@1
|
40
|
farmbuyer@65
|
41 The 'display key' parameter will almost certainly be specified as nil for
|
farmbuyer@65
|
42 these functions.
|
farmbuyer@1
|
43 ]]
|
farmbuyer@1
|
44
|
farmbuyer@1
|
45 local forum_warned_heroic
|
farmbuyer@1
|
46 local warning_text
|
farmbuyer@1
|
47 do
|
farmbuyer@1
|
48 local red = '|cffff0505'
|
farmbuyer@11
|
49 local green = ITEM_QUALITY_COLORS[ITEM_QUALITY_UNCOMMON].hex
|
farmbuyer@66
|
50 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
|
51 end
|
farmbuyer@1
|
52
|
farmbuyer@1
|
53 local function forum (_, loot, last_printed, generated, cache)
|
farmbuyer@97
|
54 local fmt = addon.db.profile.forum[addon.db.profile.forum_current] or ""
|
farmbuyer@1
|
55 -- if it's capable of handling heroic items, consider them warned already
|
farmbuyer@1
|
56 forum_warned_heroic = forum_warned_heroic or fmt:find'%$I'
|
farmbuyer@1
|
57
|
farmbuyer@1
|
58 for i = last_printed+1, #loot do
|
farmbuyer@1
|
59 local e = loot[i]
|
farmbuyer@1
|
60
|
farmbuyer@1
|
61 if e.kind == 'loot' then
|
farmbuyer@109
|
62 local destination = e.person
|
farmbuyer@109
|
63 if e.disposition then
|
farmbuyer@109
|
64 local disp = e.disposition
|
farmbuyer@109
|
65 local disptext = addon:_test_disposition(disp,'text')
|
farmbuyer@109
|
66 if disp == 'offspec' then
|
farmbuyer@109
|
67 destination = e.person .. " " .. disptext
|
farmbuyer@109
|
68 elseif disp == 'gvault' then
|
farmbuyer@109
|
69 --destination = ("%s (%s)"):format(disptext,e.person)
|
farmbuyer@109
|
70 destination = disptext
|
farmbuyer@109
|
71 else
|
farmbuyer@109
|
72 destination = disptext
|
farmbuyer@109
|
73 end
|
farmbuyer@1
|
74 end
|
farmbuyer@1
|
75 if e.extratext_byhand then
|
farmbuyer@109
|
76 destination = destination .. " -- " .. e.extratext
|
farmbuyer@1
|
77 end
|
farmbuyer@66
|
78 if e.variant and not forum_warned_heroic then
|
farmbuyer@1
|
79 forum_warned_heroic = true
|
farmbuyer@1
|
80 addon:Print(warning_text)
|
farmbuyer@1
|
81 end
|
farmbuyer@1
|
82 local t = fmt:gsub('%$I', e.id)
|
farmbuyer@1
|
83 :gsub('%$N', e.itemname)
|
farmbuyer@1
|
84 :gsub('%$X', e.count or "")
|
farmbuyer@109
|
85 :gsub('%$T', destination)
|
farmbuyer@1
|
86 cache[#cache+1] = t
|
farmbuyer@1
|
87
|
farmbuyer@1
|
88 elseif e.kind == 'boss' and e.reason == 'kill' then
|
farmbuyer@65
|
89 -- The first boss in an instance gets an instance tag, others
|
farmbuyer@65
|
90 -- get a blank line
|
farmbuyer@1
|
91 if generated.last_instance == e.instance then
|
farmbuyer@1
|
92 cache[#cache+1] = ""
|
farmbuyer@1
|
93 else
|
farmbuyer@1
|
94 cache[#cache+1] = "\n[b]" .. e.instance .. "[/b]"
|
farmbuyer@1
|
95 generated.last_instance = e.instance
|
farmbuyer@1
|
96 end
|
farmbuyer@55
|
97 cache[#cache+1] = "[i]" .. e.bossname .. "[/i]"
|
farmbuyer@1
|
98
|
farmbuyer@1
|
99 elseif e.kind == 'time' then
|
farmbuyer@1
|
100 cache[#cache+1] = "[b]" .. e.startday.text .. "[/b]"
|
farmbuyer@1
|
101
|
farmbuyer@1
|
102 end
|
farmbuyer@1
|
103 end
|
farmbuyer@61
|
104 return #cache > 0
|
farmbuyer@1
|
105 end
|
farmbuyer@1
|
106
|
farmbuyer@1
|
107 local function forum_specials (_,_, container, mkbutton)
|
farmbuyer@97
|
108 local opts = addon.db.profile
|
farmbuyer@1
|
109 local map,current = {}
|
farmbuyer@97
|
110 for label,format in pairs(opts.forum) do
|
farmbuyer@1
|
111 table.insert(map,label)
|
farmbuyer@97
|
112 if label == opts.forum_current then
|
farmbuyer@1
|
113 current = #map
|
farmbuyer@1
|
114 end
|
farmbuyer@1
|
115 end
|
farmbuyer@1
|
116
|
farmbuyer@1
|
117 local dd, editbox
|
farmbuyer@1
|
118 dd = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
119 [[Chose specific formatting of loot items. See Help tab for more. Regenerate to take effect.]])
|
farmbuyer@1
|
120 dd:SetFullWidth(true)
|
farmbuyer@1
|
121 dd:SetLabel("Item markup")
|
farmbuyer@1
|
122 dd:SetList(map)
|
farmbuyer@1
|
123 dd:SetValue(current)
|
farmbuyer@1
|
124 dd:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@97
|
125 opts.forum_current = map[choice]
|
farmbuyer@1
|
126 forum_warned_heroic = nil
|
farmbuyer@1
|
127 editbox:SetDisabled(map[choice] ~= "Custom...")
|
farmbuyer@1
|
128 end)
|
farmbuyer@1
|
129 container:AddChild(dd)
|
farmbuyer@1
|
130
|
farmbuyer@97
|
131 editbox = mkbutton("EditBox", nil, opts.forum["Custom..."],
|
farmbuyer@1
|
132 [[Format described in Help tab (Generated Text -> Forum Markup).]])
|
farmbuyer@1
|
133 editbox:SetFullWidth(true)
|
farmbuyer@1
|
134 editbox:SetLabel("Custom:")
|
farmbuyer@1
|
135 editbox:SetCallback("OnEnterPressed", function(_e,event,value)
|
farmbuyer@97
|
136 opts.forum["Custom..."] = value
|
farmbuyer@1
|
137 _e.editbox:ClearFocus()
|
farmbuyer@1
|
138 end)
|
farmbuyer@97
|
139 editbox:SetDisabled(opts.forum_current ~= "Custom...")
|
farmbuyer@1
|
140 container:AddChild(editbox)
|
farmbuyer@1
|
141 end
|
farmbuyer@1
|
142
|
farmbuyer@1
|
143 addon:register_text_generator ("forum", [[Forum Markup]], [[BBcode ready for Ouroboros forums]], forum, forum_specials)
|
farmbuyer@1
|
144
|
farmbuyer@1
|
145
|
farmbuyer@56
|
146 local ingroups, outgroups = {}, {}
|
farmbuyer@56
|
147 local function do_attendance (raidertable, max_group_number)
|
farmbuyer@56
|
148 local tins, wipe, tsort, tconcat =
|
farmbuyer@56
|
149 table.insert, table.wipe, table.sort, table.concat
|
farmbuyer@56
|
150
|
farmbuyer@56
|
151 -- Assumption: everybody is packed into the first N groups.
|
farmbuyer@56
|
152 if raidertable then for name,info in pairs(raidertable) do
|
farmbuyer@102
|
153 if info.online ~= 'no_longer' then -- 'no_longer' == left the raid
|
farmbuyer@68
|
154 if (info.subgroup or (NUM_RAID_GROUPS+1)) <= max_group_number then
|
farmbuyer@114
|
155 tins (ingroups, info.fname)
|
farmbuyer@56
|
156 else
|
farmbuyer@114
|
157 tins (outgroups, info.fname)
|
farmbuyer@56
|
158 end
|
farmbuyer@56
|
159 end
|
farmbuyer@56
|
160 end end
|
farmbuyer@56
|
161 if #ingroups > 0 then
|
farmbuyer@56
|
162 tsort(ingroups)
|
farmbuyer@56
|
163 else
|
farmbuyer@56
|
164 ingroups[1] = [[Nobody recorded as inside the instance.]]
|
farmbuyer@56
|
165 end
|
farmbuyer@56
|
166 if #outgroups > 0 then
|
farmbuyer@56
|
167 tsort(outgroups)
|
farmbuyer@56
|
168 else
|
farmbuyer@56
|
169 outgroups[1] = [[Nobody recorded as outside the instance.]]
|
farmbuyer@56
|
170 end
|
farmbuyer@56
|
171 local i,o = tconcat(ingroups,", "), tconcat(outgroups,", ")
|
farmbuyer@56
|
172 wipe(ingroups)
|
farmbuyer@56
|
173 wipe(outgroups)
|
farmbuyer@56
|
174 return i,o
|
farmbuyer@56
|
175 end
|
farmbuyer@56
|
176
|
farmbuyer@1
|
177 local function att (_, loot, last_printed, _, cache)
|
farmbuyer@1
|
178 for i = last_printed+1, #loot do
|
farmbuyer@1
|
179 local e = loot[i]
|
farmbuyer@1
|
180
|
farmbuyer@1
|
181 if e.kind == 'boss' and e.reason == 'kill' then
|
farmbuyer@69
|
182 -- Raid size can potentially be different on a per-boss basis
|
farmbuyer@56
|
183 -- (e.g., "we're dropping to 10-man for the PvP boss")
|
farmbuyer@56
|
184 local i,o = do_attendance (e.raidersnap, e.maxsize / MEMBERS_PER_RAID_GROUP)
|
farmbuyer@56
|
185
|
farmbuyer@65
|
186 cache[#cache+1] = ("\n%s -- %s\n{+} %s\n{-} %s\n"):
|
farmbuyer@65
|
187 format(e.instance, e.bossname, i, o)
|
farmbuyer@1
|
188
|
farmbuyer@1
|
189 elseif e.kind == 'time' then
|
farmbuyer@1
|
190 cache[#cache+1] = e.startday.text
|
farmbuyer@1
|
191
|
farmbuyer@1
|
192 end
|
farmbuyer@1
|
193 end
|
farmbuyer@61
|
194 return #cache > 0
|
farmbuyer@1
|
195 end
|
farmbuyer@1
|
196
|
farmbuyer@1
|
197 local function att_specials (_, editbox, container, mkbutton)
|
farmbuyer@1
|
198 local w = mkbutton("Take Attendance",
|
farmbuyer@1
|
199 [[Take attendance now (will continue to take attendance on each boss kill).]])
|
farmbuyer@1
|
200 w:SetFullWidth(true)
|
farmbuyer@1
|
201 w:SetCallback("OnClick", function(_w)
|
farmbuyer@61
|
202 local ss,max,instance = addon:snapshot_raid (--[[inraid=]]true)
|
farmbuyer@61
|
203 local i,o = do_attendance (ss, max / MEMBERS_PER_RAID_GROUP)
|
farmbuyer@1
|
204 local h, m = GetGameTime()
|
farmbuyer@56
|
205
|
farmbuyer@61
|
206 local additional = ("Attendance for %s at %.2d:%.2d:\n{+} %s\n{-} %s"):
|
farmbuyer@61
|
207 format(instance, h, m, i, o)
|
farmbuyer@1
|
208 editbox:SetText(editbox:GetText() .. '\n' .. additional)
|
farmbuyer@1
|
209 end)
|
farmbuyer@1
|
210 container:AddChild(w)
|
farmbuyer@1
|
211 end
|
farmbuyer@1
|
212
|
farmbuyer@1
|
213 addon:register_text_generator ("attend", [[Attendance]], [[Attendance list for each kill]], att, att_specials)
|
farmbuyer@1
|
214
|
farmbuyer@109
|
215 addon.FILES_LOADED = addon.FILES_LOADED + 1
|
farmbuyer@1
|
216 -- vim:noet
|