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@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@97
|
106 local opts = addon.db.profile
|
farmbuyer@1
|
107 local map,current = {}
|
farmbuyer@97
|
108 for label,format in pairs(opts.forum) do
|
farmbuyer@1
|
109 table.insert(map,label)
|
farmbuyer@97
|
110 if label == opts.forum_current then
|
farmbuyer@1
|
111 current = #map
|
farmbuyer@1
|
112 end
|
farmbuyer@1
|
113 end
|
farmbuyer@1
|
114
|
farmbuyer@1
|
115 local dd, editbox
|
farmbuyer@1
|
116 dd = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
117 [[Chose specific formatting of loot items. See Help tab for more. Regenerate to take effect.]])
|
farmbuyer@1
|
118 dd:SetFullWidth(true)
|
farmbuyer@1
|
119 dd:SetLabel("Item markup")
|
farmbuyer@1
|
120 dd:SetList(map)
|
farmbuyer@1
|
121 dd:SetValue(current)
|
farmbuyer@1
|
122 dd:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@97
|
123 opts.forum_current = map[choice]
|
farmbuyer@1
|
124 forum_warned_heroic = nil
|
farmbuyer@1
|
125 editbox:SetDisabled(map[choice] ~= "Custom...")
|
farmbuyer@1
|
126 end)
|
farmbuyer@1
|
127 container:AddChild(dd)
|
farmbuyer@1
|
128
|
farmbuyer@97
|
129 editbox = mkbutton("EditBox", nil, opts.forum["Custom..."],
|
farmbuyer@1
|
130 [[Format described in Help tab (Generated Text -> Forum Markup).]])
|
farmbuyer@1
|
131 editbox:SetFullWidth(true)
|
farmbuyer@1
|
132 editbox:SetLabel("Custom:")
|
farmbuyer@1
|
133 editbox:SetCallback("OnEnterPressed", function(_e,event,value)
|
farmbuyer@97
|
134 opts.forum["Custom..."] = value
|
farmbuyer@1
|
135 _e.editbox:ClearFocus()
|
farmbuyer@1
|
136 end)
|
farmbuyer@97
|
137 editbox:SetDisabled(opts.forum_current ~= "Custom...")
|
farmbuyer@1
|
138 container:AddChild(editbox)
|
farmbuyer@1
|
139 end
|
farmbuyer@1
|
140
|
farmbuyer@1
|
141 addon:register_text_generator ("forum", [[Forum Markup]], [[BBcode ready for Ouroboros forums]], forum, forum_specials)
|
farmbuyer@1
|
142
|
farmbuyer@1
|
143
|
farmbuyer@56
|
144 local ingroups, outgroups = {}, {}
|
farmbuyer@56
|
145 local function do_attendance (raidertable, max_group_number)
|
farmbuyer@56
|
146 local tins, wipe, tsort, tconcat =
|
farmbuyer@56
|
147 table.insert, table.wipe, table.sort, table.concat
|
farmbuyer@56
|
148
|
farmbuyer@56
|
149 -- Assumption: everybody is packed into the first N groups.
|
farmbuyer@56
|
150 if raidertable then for name,info in pairs(raidertable) do
|
farmbuyer@56
|
151 if info.online ~= 3 then -- 3 == left the raid
|
farmbuyer@68
|
152 if (info.subgroup or (NUM_RAID_GROUPS+1)) <= max_group_number then
|
farmbuyer@56
|
153 tins (ingroups, name)
|
farmbuyer@56
|
154 else
|
farmbuyer@56
|
155 tins (outgroups, name)
|
farmbuyer@56
|
156 end
|
farmbuyer@56
|
157 end
|
farmbuyer@56
|
158 end end
|
farmbuyer@56
|
159 if #ingroups > 0 then
|
farmbuyer@56
|
160 tsort(ingroups)
|
farmbuyer@56
|
161 else
|
farmbuyer@56
|
162 ingroups[1] = [[Nobody recorded as inside the instance.]]
|
farmbuyer@56
|
163 end
|
farmbuyer@56
|
164 if #outgroups > 0 then
|
farmbuyer@56
|
165 tsort(outgroups)
|
farmbuyer@56
|
166 else
|
farmbuyer@56
|
167 outgroups[1] = [[Nobody recorded as outside the instance.]]
|
farmbuyer@56
|
168 end
|
farmbuyer@56
|
169 local i,o = tconcat(ingroups,", "), tconcat(outgroups,", ")
|
farmbuyer@56
|
170 wipe(ingroups)
|
farmbuyer@56
|
171 wipe(outgroups)
|
farmbuyer@56
|
172 return i,o
|
farmbuyer@56
|
173 end
|
farmbuyer@56
|
174
|
farmbuyer@1
|
175 local function att (_, loot, last_printed, _, cache)
|
farmbuyer@1
|
176 for i = last_printed+1, #loot do
|
farmbuyer@1
|
177 local e = loot[i]
|
farmbuyer@1
|
178
|
farmbuyer@1
|
179 if e.kind == 'boss' and e.reason == 'kill' then
|
farmbuyer@69
|
180 -- Raid size can potentially be different on a per-boss basis
|
farmbuyer@56
|
181 -- (e.g., "we're dropping to 10-man for the PvP boss")
|
farmbuyer@56
|
182 local i,o = do_attendance (e.raidersnap, e.maxsize / MEMBERS_PER_RAID_GROUP)
|
farmbuyer@56
|
183
|
farmbuyer@65
|
184 cache[#cache+1] = ("\n%s -- %s\n{+} %s\n{-} %s\n"):
|
farmbuyer@65
|
185 format(e.instance, e.bossname, i, o)
|
farmbuyer@1
|
186
|
farmbuyer@1
|
187 elseif e.kind == 'time' then
|
farmbuyer@1
|
188 cache[#cache+1] = e.startday.text
|
farmbuyer@1
|
189
|
farmbuyer@1
|
190 end
|
farmbuyer@1
|
191 end
|
farmbuyer@61
|
192 return #cache > 0
|
farmbuyer@1
|
193 end
|
farmbuyer@1
|
194
|
farmbuyer@1
|
195 local function att_specials (_, editbox, container, mkbutton)
|
farmbuyer@1
|
196 local w = mkbutton("Take Attendance",
|
farmbuyer@1
|
197 [[Take attendance now (will continue to take attendance on each boss kill).]])
|
farmbuyer@1
|
198 w:SetFullWidth(true)
|
farmbuyer@1
|
199 w:SetCallback("OnClick", function(_w)
|
farmbuyer@61
|
200 local ss,max,instance = addon:snapshot_raid (--[[inraid=]]true)
|
farmbuyer@61
|
201 local i,o = do_attendance (ss, max / MEMBERS_PER_RAID_GROUP)
|
farmbuyer@1
|
202 local h, m = GetGameTime()
|
farmbuyer@56
|
203
|
farmbuyer@61
|
204 local additional = ("Attendance for %s at %.2d:%.2d:\n{+} %s\n{-} %s"):
|
farmbuyer@61
|
205 format(instance, h, m, i, o)
|
farmbuyer@1
|
206 editbox:SetText(editbox:GetText() .. '\n' .. additional)
|
farmbuyer@1
|
207 end)
|
farmbuyer@1
|
208 container:AddChild(w)
|
farmbuyer@1
|
209 end
|
farmbuyer@1
|
210
|
farmbuyer@1
|
211 addon:register_text_generator ("attend", [[Attendance]], [[Attendance list for each kill]], att, att_specials)
|
farmbuyer@1
|
212
|
farmbuyer@1
|
213 -- vim:noet
|