annotate LFGFilter.lua @ 11:bd476e399376

individual boss information for Highmaul, EJ detection version
author ovolkov
date Tue, 03 Feb 2015 10:26:29 +0300
parents 627bb3803132
children 64c9517efa88
rev   line source
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