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@1
|
51 warning_text = ([[%sWARNING:|r Heroic 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 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@1
|
75 if e.is_heroic 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
|