ovolkov@29
|
1 -- [AUTOLOCAL START]
|
ovolkov@29
|
2 local CLASS_SORT_ORDER = CLASS_SORT_ORDER
|
ovolkov@29
|
3 local C_LFGList = C_LFGList
|
ovolkov@29
|
4 local GetLFGDungeonEncounterInfo = GetLFGDungeonEncounterInfo
|
ovolkov@29
|
5 local GetLFGDungeonNumEncounters = GetLFGDungeonNumEncounters
|
ovolkov@29
|
6 local MAX_CLASSES = MAX_CLASSES
|
ovolkov@7
|
7 local dump = DevTools_Dump
|
ovolkov@29
|
8 local match = string.match
|
ovolkov@29
|
9 local pairs = pairs
|
ovolkov@29
|
10 local setfenv = setfenv
|
ovolkov@29
|
11 local wipe = wipe
|
ovolkov@29
|
12 -- [AUTOLOCAL END]
|
ovolkov@29
|
13
|
ovolkov@3
|
14 LFGListFrame.SearchPanel.SearchBox:SetMaxLetters(2048)
|
ovolkov@0
|
15
|
ovolkov@3
|
16 local filter_expression_functions = setmetatable({}, {
|
ovolkov@3
|
17 __mode = "k",
|
ovolkov@3
|
18 __index = function(t, key)
|
ovolkov@3
|
19 local func, error = loadstring("return " .. key)
|
ovolkov@3
|
20 if error then print("Error in LFG filter expression:\n", error) end
|
ovolkov@3
|
21 t[key] = func
|
ovolkov@3
|
22 return func
|
ovolkov@3
|
23 end
|
ovolkov@3
|
24 })
|
ovolkov@3
|
25
|
ovolkov@10
|
26 local aliases = {
|
ovolkov@31
|
27 voice_chat = "voice",
|
ovolkov@18
|
28 hm = "highmaul",
|
ovolkov@18
|
29 brf = "blackrock_foundry",
|
ovolkov@18
|
30 blackrockfoundry = "blackrock_foundry",
|
ovolkov@36
|
31 hellfirecitadel = "hellfire_citadel",
|
ovolkov@36
|
32 hellfire = "hellfire_citadel",
|
ovolkov@36
|
33 hfc = "hellfire_citadel",
|
rowaasr13@42
|
34 en = "emerald_nightmare",
|
rowaasr13@42
|
35 tov = "trial_of_valor",
|
ovolkov@18
|
36 healers = "healer",
|
ovolkov@18
|
37 members = "member",
|
ovolkov@18
|
38 tanks = "tank",
|
ovolkov@18
|
39 damagers = "damager",
|
ovolkov@18
|
40 damage = "damager",
|
ovolkov@18
|
41 plates = "plate",
|
ovolkov@18
|
42 mails = "mail",
|
ovolkov@18
|
43 leathers = "leather",
|
ovolkov@18
|
44 cloths = "cloth",
|
ovolkov@18
|
45 clothies = "cloth",
|
ovolkov@10
|
46 }
|
ovolkov@10
|
47 for idx = 1, MAX_CLASSES do
|
ovolkov@10
|
48 local class_lc = CLASS_SORT_ORDER[idx]:lower()
|
ovolkov@10
|
49 aliases[class_lc .. "s"] = class_lc
|
ovolkov@10
|
50 end
|
ovolkov@10
|
51
|
ovolkov@11
|
52 local token_to_encounter_id = {
|
ovolkov@11
|
53 highmaul = {
|
ovolkov@12
|
54 lfg_dungeon_id = 849,
|
ovolkov@12
|
55 { "kargath", "bladefist", "kargath_bladefist" },
|
ovolkov@12
|
56 { "butcher", "the_butcher" },
|
ovolkov@12
|
57 { "tectus" },
|
ovolkov@12
|
58 { "brackenspore", "bracken" },
|
ovolkov@12
|
59 { "twin_orgon", "twins" },
|
ovolkov@12
|
60 { "koragh", "breaker" },
|
ovolkov@12
|
61 { "imperator", "margok" },
|
ovolkov@23
|
62 },
|
ovolkov@23
|
63 blackrock_foundry = {
|
ovolkov@30
|
64 lfg_dungeon_id = 847,
|
ovolkov@30
|
65 { "oregorger", "oreg" },
|
ovolkov@30
|
66 { "gruul" },
|
ovolkov@30
|
67 { "hansgar", "franzok", "hans", "franz", "hans_and_franz", "twins" },
|
ovolkov@30
|
68 { "beastlord", "darmac" },
|
ovolkov@30
|
69 { "flamebender", "kagraz" },
|
ovolkov@30
|
70 { "operator", "thogar" },
|
ovolkov@30
|
71 { "blast_furnace", "bf", "furnace", "blast" },
|
ovolkov@30
|
72 { "kromog" },
|
ovolkov@30
|
73 { "iron_maidens", "im", "maidens" },
|
ovolkov@30
|
74 { "blackhand" },
|
ovolkov@11
|
75 }
|
ovolkov@11
|
76 }
|
ovolkov@11
|
77
|
rowaasr13@45
|
78 local prev_LFGListSearchPanel_DoSearch = LFGListSearchPanel_DoSearch
|
rowaasr13@45
|
79 function LFGListSearchPanel_DoSearch(self, ...)
|
ovolkov@3
|
80 local searchText = self.SearchBox:GetText();
|
ovolkov@3
|
81 local real_search, filter_expression = searchText:match("^([^=]-)=(.+)$")
|
ovolkov@3
|
82 if filter_expression then
|
ovolkov@3
|
83 filter_expression = filter_expression:lower()
|
ovolkov@3
|
84 self.filter_func = filter_expression_functions[filter_expression]
|
ovolkov@3
|
85 end
|
ovolkov@3
|
86 self.filter_expression = filter_expression
|
ovolkov@35
|
87
|
rowaasr13@45
|
88 local need_unwrapping = real_search and real_search ~= searchText
|
rowaasr13@45
|
89 if need_unwrapping then
|
rowaasr13@45
|
90 self.SearchBox:SetText(real_search)
|
rowaasr13@45
|
91 end
|
rowaasr13@45
|
92
|
rowaasr13@45
|
93 prev_LFGListSearchPanel_DoSearch(self, ...)
|
rowaasr13@45
|
94
|
rowaasr13@45
|
95 if need_unwrapping then
|
rowaasr13@45
|
96 self.SearchBox:SetText(searchText)
|
rowaasr13@45
|
97 end
|
ovolkov@3
|
98 end
|
ovolkov@3
|
99
|
ovolkov@12
|
100 local localized_encounter_name_to_idx = {}
|
ovolkov@11
|
101
|
ovolkov@22
|
102 local dead = true
|
ovolkov@22
|
103
|
ovolkov@11
|
104 local function InsertEncounterStateAliases(result_env, raid_token, completed_encounters)
|
ovolkov@11
|
105 local encounter_aliases = token_to_encounter_id[raid_token]
|
ovolkov@11
|
106 if not encounter_aliases then return end
|
ovolkov@11
|
107
|
ovolkov@12
|
108 local lfg_dungeon_id = encounter_aliases.lfg_dungeon_id
|
ovolkov@12
|
109 local encounter_names = localized_encounter_name_to_idx[lfg_dungeon_id]
|
ovolkov@11
|
110 if not encounter_names then
|
ovolkov@11
|
111 encounter_names = {}
|
ovolkov@12
|
112 for idx = 1, GetLFGDungeonNumEncounters(lfg_dungeon_id) do
|
ovolkov@12
|
113 local bossName, texture, isKilled = GetLFGDungeonEncounterInfo(lfg_dungeon_id, idx)
|
ovolkov@12
|
114 encounter_names[bossName] = idx
|
ovolkov@12
|
115 end
|
ovolkov@12
|
116 localized_encounter_name_to_idx[lfg_dungeon_id] = encounter_names
|
ovolkov@11
|
117 end
|
ovolkov@11
|
118
|
ovolkov@11
|
119 for idx = 1, #completed_encounters do
|
ovolkov@11
|
120 local encounter_id = encounter_names[completed_encounters[idx]]
|
ovolkov@11
|
121 if encounter_id then
|
ovolkov@11
|
122 local aliases = encounter_aliases[encounter_id]
|
ovolkov@22
|
123 result_env["boss" .. encounter_id] = dead
|
ovolkov@11
|
124 if aliases then
|
ovolkov@11
|
125 for alias_idx = 1, #aliases do
|
ovolkov@22
|
126 result_env[aliases[alias_idx]] = dead
|
ovolkov@11
|
127 end
|
ovolkov@11
|
128 end
|
ovolkov@11
|
129 end
|
ovolkov@11
|
130 end
|
ovolkov@11
|
131 end
|
ovolkov@11
|
132
|
ovolkov@3
|
133 local result_env = {}
|
ovolkov@3
|
134 -- =highmaul and ((normal and (name:match("imp") or defeated == 6)) or (heroic and defeated == 2))
|
ovolkov@0
|
135 function LFGListUtil_SortSearchResults(results)
|
ovolkov@3
|
136 local self = LFGListFrame.SearchPanel
|
ovolkov@3
|
137 if self.filter_expression then
|
ovolkov@3
|
138 local check = self.filter_func
|
ovolkov@0
|
139 local shift_down = 0
|
ovolkov@0
|
140 local original_size = #results
|
ovolkov@0
|
141 for idx = 1, original_size do
|
ovolkov@3
|
142 local id = results[idx]
|
rowaasr13@41
|
143 local _, activityID, name, comment, voiceChat, iLvl, honorLevel, age, numBNetFriends, numCharFriends, numGuildMates, isDelisted, leaderName, numMembers = C_LFGList.GetSearchResultInfo(id)
|
ovolkov@3
|
144 local completedEncounters = C_LFGList.GetSearchResultEncounterInfo(id)
|
ovolkov@3
|
145 local memberCounts = C_LFGList.GetSearchResultMemberCounts(id)
|
ovolkov@3
|
146
|
ovolkov@3
|
147 wipe(result_env)
|
ovolkov@3
|
148 result_env.name = name:lower()
|
ovolkov@3
|
149 result_env.comment = comment:lower()
|
ovolkov@3
|
150 result_env.ilvl = iLvl
|
ovolkov@3
|
151 -- TODO: should be calculated in meta
|
ovolkov@3
|
152 result_env.defeated = completedEncounters and #completedEncounters or 0
|
ovolkov@6
|
153 result_env.member = numMembers
|
ovolkov@6
|
154 result_env.tank = memberCounts.TANK
|
ovolkov@6
|
155 result_env.healer = memberCounts.HEALER
|
ovolkov@6
|
156 result_env.damager = memberCounts.DAMAGER + memberCounts.NOROLE
|
ovolkov@3
|
157 result_env.my_server = leaderName and not leaderName:find('-')
|
ovolkov@31
|
158 if voiceChat and voiceChat ~= "" then
|
ovolkov@31
|
159 result_env.voice = voiceChat
|
ovolkov@31
|
160 end
|
ovolkov@3
|
161
|
ovolkov@7
|
162 for idx = 1, numMembers do
|
ovolkov@7
|
163 local role, class, classLocalized = C_LFGList.GetSearchResultMemberInfo(id, idx)
|
ovolkov@7
|
164 local class_lc = class:lower()
|
ovolkov@7
|
165 local prev_count = result_env[class_lc]
|
ovolkov@7
|
166 result_env[class_lc] = prev_count and (prev_count + 1) or 0
|
ovolkov@7
|
167 end
|
ovolkov@7
|
168 for idx = 1, MAX_CLASSES do
|
ovolkov@7
|
169 local class_lc = CLASS_SORT_ORDER[idx]:lower()
|
ovolkov@7
|
170 local count = result_env[class_lc]
|
ovolkov@10
|
171 if not count then result_env[class_lc] = 0 end
|
ovolkov@7
|
172 end
|
ovolkov@7
|
173
|
ovolkov@11
|
174 local raid_token
|
ovolkov@3
|
175 if activityID == 37 then
|
ovolkov@11
|
176 raid_token = "highmaul"
|
ovolkov@3
|
177 result_env.normal = true
|
ovolkov@3
|
178 elseif activityID == 38 then
|
ovolkov@11
|
179 raid_token = "highmaul"
|
ovolkov@3
|
180 result_env.heroic = true
|
ovolkov@18
|
181 elseif activityID == 39 then
|
ovolkov@18
|
182 raid_token = "blackrock_foundry"
|
ovolkov@18
|
183 result_env.normal = true
|
ovolkov@18
|
184 elseif activityID == 40 then
|
ovolkov@18
|
185 raid_token = "blackrock_foundry"
|
ovolkov@18
|
186 result_env.heroic = true
|
ovolkov@36
|
187 elseif activityID == 409 then
|
ovolkov@36
|
188 raid_token = "hellfire_citadel"
|
ovolkov@36
|
189 result_env.normal = true
|
ovolkov@36
|
190 elseif activityID == 410 then
|
ovolkov@36
|
191 raid_token = "hellfire_citadel"
|
ovolkov@36
|
192 result_env.heroic = true
|
rowaasr13@42
|
193 elseif activityID == 413 then
|
rowaasr13@42
|
194 raid_token = "emerald_nightmare"
|
rowaasr13@42
|
195 result_env.normal = true
|
rowaasr13@42
|
196 elseif activityID == 414 then
|
rowaasr13@42
|
197 raid_token = "emerald_nightmare"
|
rowaasr13@42
|
198 result_env.heroic = true
|
rowaasr13@42
|
199 elseif activityID == 456 then
|
rowaasr13@42
|
200 raid_token = "trial_of_valor"
|
rowaasr13@42
|
201 result_env.normal = true
|
rowaasr13@42
|
202 elseif activityID == 457 then
|
rowaasr13@42
|
203 raid_token = "trial_of_valor"
|
rowaasr13@42
|
204 result_env.heroic = true
|
ovolkov@3
|
205 end
|
ovolkov@3
|
206
|
ovolkov@17
|
207 if raid_token then
|
ovolkov@17
|
208 result_env[raid_token] = true
|
ovolkov@17
|
209 if completedEncounters then InsertEncounterStateAliases(result_env, raid_token, completedEncounters) end
|
ovolkov@17
|
210 end
|
ovolkov@11
|
211
|
ovolkov@22
|
212 result_env.dead = dead
|
ovolkov@11
|
213
|
ovolkov@11
|
214 -- dump(result_env)
|
ovolkov@10
|
215
|
ovolkov@10
|
216 for alias, original in pairs(aliases) do result_env[alias] = result_env[original] end
|
ovolkov@10
|
217
|
ovolkov@37
|
218 -- dump(result_env)
|
ovolkov@7
|
219
|
ovolkov@3
|
220 local pass
|
ovolkov@3
|
221 if check then
|
ovolkov@3
|
222 setfenv(check, result_env)
|
ovolkov@3
|
223 pass = check()
|
ovolkov@3
|
224 end
|
ovolkov@3
|
225
|
ovolkov@3
|
226 if pass then
|
ovolkov@0
|
227 if shift_down > 0 then
|
ovolkov@3
|
228 results[idx - shift_down] = id
|
ovolkov@0
|
229 end
|
ovolkov@0
|
230 else
|
ovolkov@0
|
231 shift_down = shift_down + 1
|
ovolkov@0
|
232 end
|
ovolkov@3
|
233
|
ovolkov@0
|
234 end
|
ovolkov@0
|
235 for idx = original_size - shift_down + 1, original_size do
|
ovolkov@0
|
236 results[idx] = nil
|
ovolkov@0
|
237 end
|
ovolkov@0
|
238 end
|
ovolkov@3
|
239 table.sort(results, LFGListUtil_SortSearchResultsCB);
|
ovolkov@0
|
240 end
|
ovolkov@0
|
241
|
ovolkov@0
|
242 function LFGListUtil_SortSearchResultsCB(id1, id2)
|
ovolkov@0
|
243 local id1, activityID1, name1, comment1, voiceChat1, iLvl1, age1, numBNetFriends1, numCharFriends1, numGuildMates1, isDelisted1 = C_LFGList.GetSearchResultInfo(id1);
|
ovolkov@0
|
244 local id2, activityID2, name2, comment2, voiceChat2, iLvl2, age2, numBNetFriends2, numCharFriends2, numGuildMates2, isDelisted2 = C_LFGList.GetSearchResultInfo(id2);
|
ovolkov@0
|
245
|
ovolkov@0
|
246 --If one has more friends, do that one first
|
ovolkov@0
|
247 if ( numBNetFriends1 ~= numBNetFriends2 ) then
|
ovolkov@0
|
248 return numBNetFriends1 > numBNetFriends2;
|
ovolkov@0
|
249 end
|
ovolkov@0
|
250
|
ovolkov@0
|
251 if ( numCharFriends1 ~= numCharFriends2 ) then
|
ovolkov@0
|
252 return numCharFriends1 > numCharFriends2;
|
ovolkov@0
|
253 end
|
ovolkov@0
|
254
|
ovolkov@0
|
255 if ( numGuildMates1 ~= numGuildMates2 ) then
|
ovolkov@0
|
256 return numGuildMates1 > numGuildMates2;
|
ovolkov@0
|
257 end
|
ovolkov@0
|
258
|
ovolkov@0
|
259 if ( activityID1 ~= activityID2 ) then
|
ovolkov@0
|
260 return activityID1 > activityID2;
|
ovolkov@0
|
261 end
|
ovolkov@0
|
262
|
ovolkov@0
|
263 --If we aren't sorting by anything else, just go by ID
|
ovolkov@0
|
264 return id1 < id2;
|
ovolkov@0
|
265 end
|
ovolkov@0
|
266
|
ovolkov@0
|
267 function LFGPrintRawResults()
|
ovolkov@0
|
268 local totalResults, results = C_LFGList.GetSearchResults()
|
ovolkov@0
|
269 for idx = 1, totalResults do
|
ovolkov@0
|
270 local id1, activityID1, name1, comment1, voiceChat1, iLvl1, age1, numBNetFriends1, numCharFriends1, numGuildMates1, isDelisted1 = C_LFGList.GetSearchResultInfo(results[idx])
|
ovolkov@0
|
271 print(id1, activityID1, C_LFGList.GetActivityInfo(activityID1), '*', name1)
|
ovolkov@0
|
272 end
|
ovolkov@21
|
273 end
|
ovolkov@21
|
274
|
ovolkov@21
|
275 function LFGPrintFindDungeon(upper_limit, pattern)
|
ovolkov@21
|
276 local lower_limit = 1
|
ovolkov@21
|
277 if not pattern then
|
ovolkov@37
|
278 lower_limit = upper_limit
|
ovolkov@21
|
279 pattern = GetLFGDungeonInfo(upper_limit)
|
ovolkov@21
|
280 end
|
ovolkov@21
|
281 for idx = lower_limit, upper_limit do
|
ovolkov@21
|
282 local name = GetLFGDungeonInfo(idx)
|
ovolkov@21
|
283 if name and name:find(pattern) then
|
ovolkov@21
|
284 print(idx, name)
|
ovolkov@21
|
285 for enc_idx = 1, GetLFGDungeonNumEncounters(idx) do
|
ovolkov@21
|
286 local bossName, texture, isKilled = GetLFGDungeonEncounterInfo(idx, enc_idx)
|
ovolkov@21
|
287 print("*", enc_idx, bossName)
|
ovolkov@21
|
288 end
|
ovolkov@21
|
289 end
|
ovolkov@21
|
290 end
|
ovolkov@13
|
291 end |