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@1
|
38 mkbutton ("WidgetType", 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
39 mkbutton ( [Button] 'display key', "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
40 mkbutton ( [Button] [text] "Text On Widget", "the mouseover display text")
|
farmbuyer@1
|
41
|
farmbuyer@1
|
42 The 'display key' parameter will almost certainly be specified as nil for 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@1
|
50 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
|
51 end
|
farmbuyer@1
|
52
|
farmbuyer@1
|
53 local function forum (_, loot, last_printed, generated, cache)
|
farmbuyer@1
|
54 local fmt = OuroLootSV_opts.forum[OuroLootSV_opts.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@1
|
62 -- Assuming nobody names a toon "offspec" or "gvault"
|
farmbuyer@1
|
63 -- 16Apr2011: armory finds 20 Gvaults and 77 Offspecs... hulk smash.
|
farmbuyer@1
|
64 local disp = e.disposition or e.person
|
farmbuyer@1
|
65 if disp == 'offspec' then
|
farmbuyer@1
|
66 disp = e.person .. " " .. 'offspec'
|
farmbuyer@1
|
67 elseif disp == 'gvault' then
|
farmbuyer@1
|
68 --disp = "guild vault (".. e.person .. ")"
|
farmbuyer@1
|
69 disp = "guild vault"
|
farmbuyer@1
|
70 end
|
farmbuyer@1
|
71 if e.extratext_byhand then
|
farmbuyer@1
|
72 disp = disp .. " -- " .. e.extratext
|
farmbuyer@1
|
73 end
|
farmbuyer@1
|
74 if e.is_heroic and not forum_warned_heroic then
|
farmbuyer@1
|
75 forum_warned_heroic = true
|
farmbuyer@1
|
76 addon:Print(warning_text)
|
farmbuyer@1
|
77 end
|
farmbuyer@1
|
78 local t = fmt:gsub('%$I', e.id)
|
farmbuyer@1
|
79 :gsub('%$N', e.itemname)
|
farmbuyer@1
|
80 :gsub('%$X', e.count or "")
|
farmbuyer@1
|
81 :gsub('%$T', disp)
|
farmbuyer@1
|
82 cache[#cache+1] = t
|
farmbuyer@1
|
83
|
farmbuyer@1
|
84 elseif e.kind == 'boss' and e.reason == 'kill' then
|
farmbuyer@1
|
85 -- first boss in an instance gets an instance tag, others get a blank line
|
farmbuyer@1
|
86 if generated.last_instance == e.instance then
|
farmbuyer@1
|
87 cache[#cache+1] = ""
|
farmbuyer@1
|
88 else
|
farmbuyer@1
|
89 cache[#cache+1] = "\n[b]" .. e.instance .. "[/b]"
|
farmbuyer@1
|
90 generated.last_instance = e.instance
|
farmbuyer@1
|
91 end
|
farmbuyer@55
|
92 cache[#cache+1] = "[i]" .. e.bossname .. "[/i]"
|
farmbuyer@1
|
93
|
farmbuyer@1
|
94 elseif e.kind == 'time' then
|
farmbuyer@1
|
95 cache[#cache+1] = "[b]" .. e.startday.text .. "[/b]"
|
farmbuyer@1
|
96
|
farmbuyer@1
|
97 end
|
farmbuyer@1
|
98 end
|
farmbuyer@1
|
99 return true
|
farmbuyer@1
|
100 end
|
farmbuyer@1
|
101
|
farmbuyer@1
|
102 local function forum_specials (_,_, container, mkbutton)
|
farmbuyer@1
|
103 local map,current = {}
|
farmbuyer@1
|
104 for label,format in pairs(OuroLootSV_opts.forum) do
|
farmbuyer@1
|
105 table.insert(map,label)
|
farmbuyer@1
|
106 if label == OuroLootSV_opts.forum_current then
|
farmbuyer@1
|
107 current = #map
|
farmbuyer@1
|
108 end
|
farmbuyer@1
|
109 end
|
farmbuyer@1
|
110
|
farmbuyer@1
|
111 local dd, editbox
|
farmbuyer@1
|
112 dd = mkbutton("Dropdown", nil, "",
|
farmbuyer@1
|
113 [[Chose specific formatting of loot items. See Help tab for more. Regenerate to take effect.]])
|
farmbuyer@1
|
114 dd:SetFullWidth(true)
|
farmbuyer@1
|
115 dd:SetLabel("Item markup")
|
farmbuyer@1
|
116 dd:SetList(map)
|
farmbuyer@1
|
117 dd:SetValue(current)
|
farmbuyer@1
|
118 dd:SetCallback("OnValueChanged", function(_dd,event,choice)
|
farmbuyer@1
|
119 OuroLootSV_opts.forum_current = map[choice]
|
farmbuyer@1
|
120 forum_warned_heroic = nil
|
farmbuyer@1
|
121 editbox:SetDisabled(map[choice] ~= "Custom...")
|
farmbuyer@1
|
122 end)
|
farmbuyer@1
|
123 container:AddChild(dd)
|
farmbuyer@1
|
124
|
farmbuyer@1
|
125 editbox = mkbutton("EditBox", nil, OuroLootSV_opts.forum["Custom..."],
|
farmbuyer@1
|
126 [[Format described in Help tab (Generated Text -> Forum Markup).]])
|
farmbuyer@1
|
127 editbox:SetFullWidth(true)
|
farmbuyer@1
|
128 editbox:SetLabel("Custom:")
|
farmbuyer@1
|
129 editbox:SetCallback("OnEnterPressed", function(_e,event,value)
|
farmbuyer@1
|
130 OuroLootSV_opts.forum["Custom..."] = value
|
farmbuyer@1
|
131 _e.editbox:ClearFocus()
|
farmbuyer@1
|
132 end)
|
farmbuyer@1
|
133 editbox:SetDisabled(OuroLootSV_opts.forum_current ~= "Custom...")
|
farmbuyer@1
|
134 container:AddChild(editbox)
|
farmbuyer@1
|
135 end
|
farmbuyer@1
|
136
|
farmbuyer@1
|
137 addon:register_text_generator ("forum", [[Forum Markup]], [[BBcode ready for Ouroboros forums]], forum, forum_specials)
|
farmbuyer@1
|
138
|
farmbuyer@1
|
139
|
farmbuyer@56
|
140 local ingroups, outgroups = {}, {}
|
farmbuyer@56
|
141 local function do_attendance (raidertable, max_group_number)
|
farmbuyer@56
|
142 local tins, wipe, tsort, tconcat =
|
farmbuyer@56
|
143 table.insert, table.wipe, table.sort, table.concat
|
farmbuyer@56
|
144
|
farmbuyer@56
|
145 -- Assumption: everybody is packed into the first N groups.
|
farmbuyer@56
|
146 if raidertable then for name,info in pairs(raidertable) do
|
farmbuyer@56
|
147 if info.online ~= 3 then -- 3 == left the raid
|
farmbuyer@56
|
148 if info.subgroup <= max_group_number then
|
farmbuyer@56
|
149 tins (ingroups, name)
|
farmbuyer@56
|
150 else
|
farmbuyer@56
|
151 tins (outgroups, name)
|
farmbuyer@56
|
152 end
|
farmbuyer@56
|
153 end
|
farmbuyer@56
|
154 end end
|
farmbuyer@56
|
155 if #ingroups > 0 then
|
farmbuyer@56
|
156 tsort(ingroups)
|
farmbuyer@56
|
157 else
|
farmbuyer@56
|
158 ingroups[1] = [[Nobody recorded as inside the instance.]]
|
farmbuyer@56
|
159 end
|
farmbuyer@56
|
160 if #outgroups > 0 then
|
farmbuyer@56
|
161 tsort(outgroups)
|
farmbuyer@56
|
162 else
|
farmbuyer@56
|
163 outgroups[1] = [[Nobody recorded as outside the instance.]]
|
farmbuyer@56
|
164 end
|
farmbuyer@56
|
165 local i,o = tconcat(ingroups,", "), tconcat(outgroups,", ")
|
farmbuyer@56
|
166 wipe(ingroups)
|
farmbuyer@56
|
167 wipe(outgroups)
|
farmbuyer@56
|
168 return i,o
|
farmbuyer@56
|
169 end
|
farmbuyer@56
|
170
|
farmbuyer@56
|
171 local saved_g_loot_pointer
|
farmbuyer@1
|
172 local function att (_, loot, last_printed, _, cache)
|
farmbuyer@56
|
173 saved_g_loot_pointer = loot
|
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@56
|
182 cache[#cache+1] = ("\n%s -- %s\n[+] %s\n[-] %s\n"):format(e.instance,
|
farmbuyer@56
|
183 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@1
|
190 return true
|
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@56
|
198 local instance, maxsize = addon.instance_tag()
|
farmbuyer@56
|
199 local i,o = do_attendance (saved_g_loot_pointer.raiders, maxsize / MEMBERS_PER_RAID_GROUP)
|
farmbuyer@1
|
200 local h, m = GetGameTime()
|
farmbuyer@56
|
201
|
farmbuyer@56
|
202 local additional = ("Attendance for %s at %.2d:%.2d:\n[+] %s\n[-] %s"):format(instance, h, m, i, o)
|
farmbuyer@1
|
203 editbox:SetText(editbox:GetText() .. '\n' .. additional)
|
farmbuyer@1
|
204 end)
|
farmbuyer@1
|
205 container:AddChild(w)
|
farmbuyer@1
|
206 end
|
farmbuyer@1
|
207
|
farmbuyer@1
|
208 addon:register_text_generator ("attend", [[Attendance]], [[Attendance list for each kill]], att, att_specials)
|
farmbuyer@1
|
209
|
farmbuyer@1
|
210 -- vim:noet
|