ovolkov@7
|
1 local dump = DevTools_Dump
|
ovolkov@3
|
2 LFGListFrame.SearchPanel.SearchBox:SetMaxLetters(2048)
|
ovolkov@0
|
3
|
ovolkov@3
|
4 local filter_expression_functions = setmetatable({}, {
|
ovolkov@3
|
5 __mode = "k",
|
ovolkov@3
|
6 __index = function(t, key)
|
ovolkov@3
|
7 local func, error = loadstring("return " .. key)
|
ovolkov@3
|
8 if error then print("Error in LFG filter expression:\n", error) end
|
ovolkov@3
|
9 t[key] = func
|
ovolkov@3
|
10 return func
|
ovolkov@3
|
11 end
|
ovolkov@3
|
12 })
|
ovolkov@3
|
13
|
ovolkov@10
|
14 local aliases = {
|
ovolkov@10
|
15 hm = "highmaul",
|
ovolkov@10
|
16 healers = "healer",
|
ovolkov@10
|
17 members = "member",
|
ovolkov@10
|
18 tanks = "tank",
|
ovolkov@10
|
19 damagers = "damager",
|
ovolkov@10
|
20 damage = "damager",
|
ovolkov@10
|
21 plates = "plate",
|
ovolkov@10
|
22 mails = "mail",
|
ovolkov@10
|
23 leathers = "leather",
|
ovolkov@10
|
24 cloths = "cloth",
|
ovolkov@10
|
25 clothies = "cloth",
|
ovolkov@10
|
26 }
|
ovolkov@10
|
27 for idx = 1, MAX_CLASSES do
|
ovolkov@10
|
28 local class_lc = CLASS_SORT_ORDER[idx]:lower()
|
ovolkov@10
|
29 aliases[class_lc .. "s"] = class_lc
|
ovolkov@10
|
30 end
|
ovolkov@10
|
31
|
ovolkov@11
|
32 -- EJ_GetCurrentInstance()
|
ovolkov@11
|
33 -- EJ_SelectInstance(477)
|
ovolkov@11
|
34 -- EJ_GetEncounterInfoByIndex(4)
|
ovolkov@11
|
35
|
ovolkov@11
|
36 local token_to_encounter_id = {
|
ovolkov@11
|
37 highmaul = {
|
ovolkov@11
|
38 ej_instance = 477,
|
ovolkov@11
|
39 [1128] = { "kargath", "bladefist", "kargath_bladefist" },
|
ovolkov@11
|
40 [971] = { "butcher", "the_butcher" },
|
ovolkov@11
|
41 [1195] = { "tectus" },
|
ovolkov@11
|
42 [1196] = { "brackenspore", "bracken" },
|
ovolkov@11
|
43 [1148] = { "twin_orgon", "twins" },
|
ovolkov@11
|
44 [1153] = { "koragh", "breaker" },
|
ovolkov@11
|
45 [1197] = { "imperator", "margok" },
|
ovolkov@11
|
46 }
|
ovolkov@11
|
47 }
|
ovolkov@11
|
48
|
ovolkov@3
|
49 function LFGListSearchPanel_DoSearch(self)
|
ovolkov@3
|
50 local searchText = self.SearchBox:GetText();
|
ovolkov@3
|
51 local real_search, filter_expression = searchText:match("^([^=]-)=(.+)$")
|
ovolkov@3
|
52 if filter_expression then
|
ovolkov@3
|
53 filter_expression = filter_expression:lower()
|
ovolkov@3
|
54 self.filter_func = filter_expression_functions[filter_expression]
|
ovolkov@3
|
55 end
|
ovolkov@3
|
56 self.filter_expression = filter_expression
|
ovolkov@3
|
57
|
ovolkov@3
|
58 -- print("lfgsearch", real_search, filter_expression)
|
ovolkov@3
|
59 C_LFGList.Search(self.categoryID, real_search or searchText, self.filters, self.preferredFilters);
|
ovolkov@3
|
60 self.searching = true;
|
ovolkov@3
|
61 self.searchFailed = false;
|
ovolkov@3
|
62 self.selectedResult = nil;
|
ovolkov@3
|
63 LFGListSearchPanel_UpdateResultList(self);
|
ovolkov@3
|
64 LFGListSearchPanel_UpdateResults(self);
|
ovolkov@3
|
65 end
|
ovolkov@3
|
66
|
ovolkov@11
|
67 local localized_encounter_name_to_id = {}
|
ovolkov@11
|
68
|
ovolkov@11
|
69 local function InsertEncounterStateAliases(result_env, raid_token, completed_encounters)
|
ovolkov@11
|
70 local encounter_aliases = token_to_encounter_id[raid_token]
|
ovolkov@11
|
71 if not encounter_aliases then return end
|
ovolkov@11
|
72
|
ovolkov@11
|
73 local ej_instance = encounter_aliases.ej_instance
|
ovolkov@11
|
74 local encounter_names = localized_encounter_name_to_id[ej_instance]
|
ovolkov@11
|
75 if not encounter_names then
|
ovolkov@11
|
76 encounter_names = {}
|
ovolkov@11
|
77 EJ_SelectInstance(ej_instance)
|
ovolkov@11
|
78 local encounter_idx = 1
|
ovolkov@11
|
79 local encounter_name, encounter_id, root_section_id, _
|
ovolkov@11
|
80 repeat
|
ovolkov@11
|
81 encounter_name, _, encounter_id, root_section_id = EJ_GetEncounterInfoByIndex(encounter_idx)
|
ovolkov@11
|
82 if encounter_name then
|
ovolkov@11
|
83 encounter_names[encounter_name] = encounter_id
|
ovolkov@11
|
84 local next_section_id = root_section_id
|
ovolkov@11
|
85 repeat
|
ovolkov@11
|
86 local title, description, headerType, abilityIcon, displayInfo, siblingID, _, fileredByDifficulty, link, startsOpen, flag1, flag2, flag3, flag4 = EJ_GetSectionInfo(next_section_id)
|
ovolkov@11
|
87 if displayInfo ~= 0 then
|
ovolkov@11
|
88 if not encounter_names[title] then encounter_names[title] = encounter_id end
|
ovolkov@11
|
89 end
|
ovolkov@11
|
90 next_section_id = siblingID
|
ovolkov@11
|
91 until not next_section_id
|
ovolkov@11
|
92 encounter_idx = encounter_idx + 1
|
ovolkov@11
|
93 end
|
ovolkov@11
|
94 until not encounter_name
|
ovolkov@11
|
95 localized_encounter_name_to_id[ej_instance] = encounter_names
|
ovolkov@11
|
96 end
|
ovolkov@11
|
97
|
ovolkov@11
|
98 for idx = 1, #completed_encounters do
|
ovolkov@11
|
99 local encounter_id = encounter_names[completed_encounters[idx]]
|
ovolkov@11
|
100 if encounter_id then
|
ovolkov@11
|
101 local aliases = encounter_aliases[encounter_id]
|
ovolkov@11
|
102 if aliases then
|
ovolkov@11
|
103 for alias_idx = 1, #aliases do
|
ovolkov@11
|
104 result_env[aliases[alias_idx]] = true
|
ovolkov@11
|
105 end
|
ovolkov@11
|
106 end
|
ovolkov@11
|
107 end
|
ovolkov@11
|
108 end
|
ovolkov@11
|
109 end
|
ovolkov@11
|
110
|
ovolkov@3
|
111 local result_env = {}
|
ovolkov@3
|
112 -- =highmaul and ((normal and (name:match("imp") or defeated == 6)) or (heroic and defeated == 2))
|
ovolkov@0
|
113 function LFGListUtil_SortSearchResults(results)
|
ovolkov@3
|
114 local self = LFGListFrame.SearchPanel
|
ovolkov@3
|
115 if self.filter_expression then
|
ovolkov@3
|
116 local check = self.filter_func
|
ovolkov@0
|
117 local shift_down = 0
|
ovolkov@0
|
118 local original_size = #results
|
ovolkov@0
|
119 for idx = 1, original_size do
|
ovolkov@3
|
120 local id = results[idx]
|
ovolkov@3
|
121 local _, activityID, name, comment, voiceChat, iLvl, age, numBNetFriends, numCharFriends, numGuildMates, isDelisted, leaderName, numMembers = C_LFGList.GetSearchResultInfo(id)
|
ovolkov@3
|
122 local completedEncounters = C_LFGList.GetSearchResultEncounterInfo(id)
|
ovolkov@3
|
123 local memberCounts = C_LFGList.GetSearchResultMemberCounts(id)
|
ovolkov@3
|
124
|
ovolkov@3
|
125 wipe(result_env)
|
ovolkov@3
|
126 result_env.name = name:lower()
|
ovolkov@3
|
127 result_env.comment = comment:lower()
|
ovolkov@3
|
128 result_env.ilvl = iLvl
|
ovolkov@3
|
129 -- TODO: should be calculated in meta
|
ovolkov@3
|
130 result_env.defeated = completedEncounters and #completedEncounters or 0
|
ovolkov@6
|
131 result_env.member = numMembers
|
ovolkov@6
|
132 result_env.tank = memberCounts.TANK
|
ovolkov@6
|
133 result_env.healer = memberCounts.HEALER
|
ovolkov@6
|
134 result_env.damager = memberCounts.DAMAGER + memberCounts.NOROLE
|
ovolkov@3
|
135 result_env.my_server = leaderName and not leaderName:find('-')
|
ovolkov@3
|
136
|
ovolkov@7
|
137 for idx = 1, numMembers do
|
ovolkov@7
|
138 local role, class, classLocalized = C_LFGList.GetSearchResultMemberInfo(id, idx)
|
ovolkov@7
|
139 local class_lc = class:lower()
|
ovolkov@7
|
140 local prev_count = result_env[class_lc]
|
ovolkov@7
|
141 result_env[class_lc] = prev_count and (prev_count + 1) or 0
|
ovolkov@7
|
142 end
|
ovolkov@7
|
143 for idx = 1, MAX_CLASSES do
|
ovolkov@7
|
144 local class_lc = CLASS_SORT_ORDER[idx]:lower()
|
ovolkov@7
|
145 local count = result_env[class_lc]
|
ovolkov@10
|
146 if not count then result_env[class_lc] = 0 end
|
ovolkov@7
|
147 end
|
ovolkov@7
|
148
|
ovolkov@11
|
149 local raid_token
|
ovolkov@3
|
150 if activityID == 37 then
|
ovolkov@11
|
151 raid_token = "highmaul"
|
ovolkov@3
|
152 result_env.normal = true
|
ovolkov@3
|
153 elseif activityID == 38 then
|
ovolkov@11
|
154 raid_token = "highmaul"
|
ovolkov@3
|
155 result_env.heroic = true
|
ovolkov@11
|
156
|
ovolkov@3
|
157 end
|
ovolkov@3
|
158
|
ovolkov@11
|
159 result_env[raid_token] = true
|
ovolkov@11
|
160 if completedEncounters then InsertEncounterStateAliases(result_env, raid_token, completedEncounters) end
|
ovolkov@11
|
161
|
ovolkov@11
|
162 result_env.dead = true
|
ovolkov@11
|
163 result_env.defeated = true
|
ovolkov@11
|
164
|
ovolkov@11
|
165 -- dump(result_env)
|
ovolkov@10
|
166
|
ovolkov@10
|
167 for alias, original in pairs(aliases) do result_env[alias] = result_env[original] end
|
ovolkov@10
|
168
|
ovolkov@10
|
169 -- dump(result_env)
|
ovolkov@7
|
170
|
ovolkov@3
|
171 local pass
|
ovolkov@3
|
172 if check then
|
ovolkov@3
|
173 setfenv(check, result_env)
|
ovolkov@3
|
174 pass = check()
|
ovolkov@3
|
175 end
|
ovolkov@3
|
176
|
ovolkov@3
|
177 if pass then
|
ovolkov@0
|
178 if shift_down > 0 then
|
ovolkov@3
|
179 results[idx - shift_down] = id
|
ovolkov@0
|
180 end
|
ovolkov@0
|
181 else
|
ovolkov@0
|
182 shift_down = shift_down + 1
|
ovolkov@0
|
183 end
|
ovolkov@3
|
184
|
ovolkov@0
|
185 end
|
ovolkov@0
|
186 for idx = original_size - shift_down + 1, original_size do
|
ovolkov@0
|
187 results[idx] = nil
|
ovolkov@0
|
188 end
|
ovolkov@0
|
189 end
|
ovolkov@3
|
190 table.sort(results, LFGListUtil_SortSearchResultsCB);
|
ovolkov@0
|
191 end
|
ovolkov@0
|
192
|
ovolkov@0
|
193 function LFGListUtil_SortSearchResultsCB(id1, id2)
|
ovolkov@0
|
194 local id1, activityID1, name1, comment1, voiceChat1, iLvl1, age1, numBNetFriends1, numCharFriends1, numGuildMates1, isDelisted1 = C_LFGList.GetSearchResultInfo(id1);
|
ovolkov@0
|
195 local id2, activityID2, name2, comment2, voiceChat2, iLvl2, age2, numBNetFriends2, numCharFriends2, numGuildMates2, isDelisted2 = C_LFGList.GetSearchResultInfo(id2);
|
ovolkov@0
|
196
|
ovolkov@0
|
197 --If one has more friends, do that one first
|
ovolkov@0
|
198 if ( numBNetFriends1 ~= numBNetFriends2 ) then
|
ovolkov@0
|
199 return numBNetFriends1 > numBNetFriends2;
|
ovolkov@0
|
200 end
|
ovolkov@0
|
201
|
ovolkov@0
|
202 if ( numCharFriends1 ~= numCharFriends2 ) then
|
ovolkov@0
|
203 return numCharFriends1 > numCharFriends2;
|
ovolkov@0
|
204 end
|
ovolkov@0
|
205
|
ovolkov@0
|
206 if ( numGuildMates1 ~= numGuildMates2 ) then
|
ovolkov@0
|
207 return numGuildMates1 > numGuildMates2;
|
ovolkov@0
|
208 end
|
ovolkov@0
|
209
|
ovolkov@0
|
210 if ( activityID1 ~= activityID2 ) then
|
ovolkov@0
|
211 return activityID1 > activityID2;
|
ovolkov@0
|
212 end
|
ovolkov@0
|
213
|
ovolkov@0
|
214 --If we aren't sorting by anything else, just go by ID
|
ovolkov@0
|
215 return id1 < id2;
|
ovolkov@0
|
216 end
|
ovolkov@0
|
217
|
ovolkov@0
|
218 function LFGPrintRawResults()
|
ovolkov@0
|
219 local totalResults, results = C_LFGList.GetSearchResults()
|
ovolkov@0
|
220 for idx = 1, totalResults do
|
ovolkov@0
|
221 local id1, activityID1, name1, comment1, voiceChat1, iLvl1, age1, numBNetFriends1, numCharFriends1, numGuildMates1, isDelisted1 = C_LFGList.GetSearchResultInfo(results[idx])
|
ovolkov@0
|
222 print(id1, activityID1, C_LFGList.GetActivityInfo(activityID1), '*', name1)
|
ovolkov@0
|
223 end
|
ovolkov@11
|
224 end
|
ovolkov@11
|
225
|
ovolkov@11
|
226 function LFGPrintInstanceScan(ej_instance)
|
ovolkov@11
|
227 EJ_SelectInstance(ej_instance)
|
ovolkov@11
|
228 local encounter_idx = 1
|
ovolkov@11
|
229 local encounter_name, encounter_id, root_section_id, _
|
ovolkov@11
|
230 repeat
|
ovolkov@11
|
231 encounter_name, _, encounter_id, root_section_id = EJ_GetEncounterInfoByIndex(encounter_idx)
|
ovolkov@11
|
232 if encounter_name then
|
ovolkov@11
|
233 print(encounter_id, encounter_name)
|
ovolkov@11
|
234 local next_section_id = root_section_id
|
ovolkov@11
|
235 repeat
|
ovolkov@11
|
236 local title, description, headerType, abilityIcon, displayInfo, siblingID, _, fileredByDifficulty, link, startsOpen, flag1, flag2, flag3, flag4 = EJ_GetSectionInfo(next_section_id)
|
ovolkov@11
|
237 if displayInfo ~= 0 then
|
ovolkov@11
|
238 print(encounter_id, title)
|
ovolkov@11
|
239 end
|
ovolkov@11
|
240 next_section_id = siblingID
|
ovolkov@11
|
241 until not next_section_id
|
ovolkov@11
|
242 encounter_idx = encounter_idx + 1
|
ovolkov@11
|
243 end
|
ovolkov@11
|
244 until not encounter_name
|
ovolkov@11
|
245 localized_encounter_name_to_id[ej_instance] = encounter_names
|
ovolkov@11
|
246 end
|