ovolkov@7: local dump = DevTools_Dump ovolkov@3: LFGListFrame.SearchPanel.SearchBox:SetMaxLetters(2048) ovolkov@0: ovolkov@3: local filter_expression_functions = setmetatable({}, { ovolkov@3: __mode = "k", ovolkov@3: __index = function(t, key) ovolkov@3: local func, error = loadstring("return " .. key) ovolkov@3: if error then print("Error in LFG filter expression:\n", error) end ovolkov@3: t[key] = func ovolkov@3: return func ovolkov@3: end ovolkov@3: }) ovolkov@3: ovolkov@10: local aliases = { ovolkov@10: hm = "highmaul", ovolkov@10: healers = "healer", ovolkov@10: members = "member", ovolkov@10: tanks = "tank", ovolkov@10: damagers = "damager", ovolkov@10: damage = "damager", ovolkov@10: plates = "plate", ovolkov@10: mails = "mail", ovolkov@10: leathers = "leather", ovolkov@10: cloths = "cloth", ovolkov@10: clothies = "cloth", ovolkov@10: } ovolkov@10: for idx = 1, MAX_CLASSES do ovolkov@10: local class_lc = CLASS_SORT_ORDER[idx]:lower() ovolkov@10: aliases[class_lc .. "s"] = class_lc ovolkov@10: end ovolkov@10: ovolkov@11: local token_to_encounter_id = { ovolkov@11: highmaul = { ovolkov@12: lfg_dungeon_id = 849, ovolkov@12: { "kargath", "bladefist", "kargath_bladefist" }, ovolkov@12: { "butcher", "the_butcher" }, ovolkov@12: { "tectus" }, ovolkov@12: { "brackenspore", "bracken" }, ovolkov@12: { "twin_orgon", "twins" }, ovolkov@12: { "koragh", "breaker" }, ovolkov@12: { "imperator", "margok" }, ovolkov@11: } ovolkov@11: } ovolkov@11: ovolkov@3: function LFGListSearchPanel_DoSearch(self) ovolkov@3: local searchText = self.SearchBox:GetText(); ovolkov@3: local real_search, filter_expression = searchText:match("^([^=]-)=(.+)$") ovolkov@3: if filter_expression then ovolkov@3: filter_expression = filter_expression:lower() ovolkov@3: self.filter_func = filter_expression_functions[filter_expression] ovolkov@3: end ovolkov@3: self.filter_expression = filter_expression ovolkov@3: ovolkov@3: -- print("lfgsearch", real_search, filter_expression) ovolkov@3: C_LFGList.Search(self.categoryID, real_search or searchText, self.filters, self.preferredFilters); ovolkov@3: self.searching = true; ovolkov@3: self.searchFailed = false; ovolkov@3: self.selectedResult = nil; ovolkov@3: LFGListSearchPanel_UpdateResultList(self); ovolkov@3: LFGListSearchPanel_UpdateResults(self); ovolkov@3: end ovolkov@3: ovolkov@12: local localized_encounter_name_to_idx = {} ovolkov@11: ovolkov@11: local function InsertEncounterStateAliases(result_env, raid_token, completed_encounters) ovolkov@11: local encounter_aliases = token_to_encounter_id[raid_token] ovolkov@11: if not encounter_aliases then return end ovolkov@11: ovolkov@12: local lfg_dungeon_id = encounter_aliases.lfg_dungeon_id ovolkov@12: local encounter_names = localized_encounter_name_to_idx[lfg_dungeon_id] ovolkov@11: if not encounter_names then ovolkov@11: encounter_names = {} ovolkov@12: for idx = 1, GetLFGDungeonNumEncounters(lfg_dungeon_id) do ovolkov@12: local bossName, texture, isKilled = GetLFGDungeonEncounterInfo(lfg_dungeon_id, idx) ovolkov@12: encounter_names[bossName] = idx ovolkov@12: end ovolkov@12: localized_encounter_name_to_idx[lfg_dungeon_id] = encounter_names ovolkov@11: end ovolkov@11: ovolkov@11: for idx = 1, #completed_encounters do ovolkov@11: local encounter_id = encounter_names[completed_encounters[idx]] ovolkov@11: if encounter_id then ovolkov@11: local aliases = encounter_aliases[encounter_id] ovolkov@11: if aliases then ovolkov@11: for alias_idx = 1, #aliases do ovolkov@11: result_env[aliases[alias_idx]] = true ovolkov@11: end ovolkov@11: end ovolkov@11: end ovolkov@11: end ovolkov@11: end ovolkov@11: ovolkov@3: local result_env = {} ovolkov@3: -- =highmaul and ((normal and (name:match("imp") or defeated == 6)) or (heroic and defeated == 2)) ovolkov@0: function LFGListUtil_SortSearchResults(results) ovolkov@3: local self = LFGListFrame.SearchPanel ovolkov@3: if self.filter_expression then ovolkov@3: local check = self.filter_func ovolkov@0: local shift_down = 0 ovolkov@0: local original_size = #results ovolkov@0: for idx = 1, original_size do ovolkov@3: local id = results[idx] ovolkov@3: local _, activityID, name, comment, voiceChat, iLvl, age, numBNetFriends, numCharFriends, numGuildMates, isDelisted, leaderName, numMembers = C_LFGList.GetSearchResultInfo(id) ovolkov@3: local completedEncounters = C_LFGList.GetSearchResultEncounterInfo(id) ovolkov@3: local memberCounts = C_LFGList.GetSearchResultMemberCounts(id) ovolkov@3: ovolkov@3: wipe(result_env) ovolkov@3: result_env.name = name:lower() ovolkov@3: result_env.comment = comment:lower() ovolkov@3: result_env.ilvl = iLvl ovolkov@3: -- TODO: should be calculated in meta ovolkov@3: result_env.defeated = completedEncounters and #completedEncounters or 0 ovolkov@6: result_env.member = numMembers ovolkov@6: result_env.tank = memberCounts.TANK ovolkov@6: result_env.healer = memberCounts.HEALER ovolkov@6: result_env.damager = memberCounts.DAMAGER + memberCounts.NOROLE ovolkov@3: result_env.my_server = leaderName and not leaderName:find('-') ovolkov@3: ovolkov@7: for idx = 1, numMembers do ovolkov@7: local role, class, classLocalized = C_LFGList.GetSearchResultMemberInfo(id, idx) ovolkov@7: local class_lc = class:lower() ovolkov@7: local prev_count = result_env[class_lc] ovolkov@7: result_env[class_lc] = prev_count and (prev_count + 1) or 0 ovolkov@7: end ovolkov@7: for idx = 1, MAX_CLASSES do ovolkov@7: local class_lc = CLASS_SORT_ORDER[idx]:lower() ovolkov@7: local count = result_env[class_lc] ovolkov@10: if not count then result_env[class_lc] = 0 end ovolkov@7: end ovolkov@7: ovolkov@11: local raid_token ovolkov@3: if activityID == 37 then ovolkov@11: raid_token = "highmaul" ovolkov@3: result_env.normal = true ovolkov@3: elseif activityID == 38 then ovolkov@11: raid_token = "highmaul" ovolkov@3: result_env.heroic = true ovolkov@11: ovolkov@3: end ovolkov@3: ovolkov@11: result_env[raid_token] = true ovolkov@11: if completedEncounters then InsertEncounterStateAliases(result_env, raid_token, completedEncounters) end ovolkov@11: ovolkov@11: result_env.dead = true ovolkov@11: result_env.defeated = true ovolkov@11: ovolkov@11: -- dump(result_env) ovolkov@10: ovolkov@10: for alias, original in pairs(aliases) do result_env[alias] = result_env[original] end ovolkov@10: ovolkov@10: -- dump(result_env) ovolkov@7: ovolkov@3: local pass ovolkov@3: if check then ovolkov@3: setfenv(check, result_env) ovolkov@3: pass = check() ovolkov@3: end ovolkov@3: ovolkov@3: if pass then ovolkov@0: if shift_down > 0 then ovolkov@3: results[idx - shift_down] = id ovolkov@0: end ovolkov@0: else ovolkov@0: shift_down = shift_down + 1 ovolkov@0: end ovolkov@3: ovolkov@0: end ovolkov@0: for idx = original_size - shift_down + 1, original_size do ovolkov@0: results[idx] = nil ovolkov@0: end ovolkov@0: end ovolkov@3: table.sort(results, LFGListUtil_SortSearchResultsCB); ovolkov@0: end ovolkov@0: ovolkov@0: function LFGListUtil_SortSearchResultsCB(id1, id2) ovolkov@0: local id1, activityID1, name1, comment1, voiceChat1, iLvl1, age1, numBNetFriends1, numCharFriends1, numGuildMates1, isDelisted1 = C_LFGList.GetSearchResultInfo(id1); ovolkov@0: local id2, activityID2, name2, comment2, voiceChat2, iLvl2, age2, numBNetFriends2, numCharFriends2, numGuildMates2, isDelisted2 = C_LFGList.GetSearchResultInfo(id2); ovolkov@0: ovolkov@0: --If one has more friends, do that one first ovolkov@0: if ( numBNetFriends1 ~= numBNetFriends2 ) then ovolkov@0: return numBNetFriends1 > numBNetFriends2; ovolkov@0: end ovolkov@0: ovolkov@0: if ( numCharFriends1 ~= numCharFriends2 ) then ovolkov@0: return numCharFriends1 > numCharFriends2; ovolkov@0: end ovolkov@0: ovolkov@0: if ( numGuildMates1 ~= numGuildMates2 ) then ovolkov@0: return numGuildMates1 > numGuildMates2; ovolkov@0: end ovolkov@0: ovolkov@0: if ( activityID1 ~= activityID2 ) then ovolkov@0: return activityID1 > activityID2; ovolkov@0: end ovolkov@0: ovolkov@0: --If we aren't sorting by anything else, just go by ID ovolkov@0: return id1 < id2; ovolkov@0: end ovolkov@0: ovolkov@0: function LFGPrintRawResults() ovolkov@0: local totalResults, results = C_LFGList.GetSearchResults() ovolkov@0: for idx = 1, totalResults do ovolkov@0: local id1, activityID1, name1, comment1, voiceChat1, iLvl1, age1, numBNetFriends1, numCharFriends1, numGuildMates1, isDelisted1 = C_LFGList.GetSearchResultInfo(results[idx]) ovolkov@0: print(id1, activityID1, C_LFGList.GetActivityInfo(activityID1), '*', name1) ovolkov@0: end ovolkov@13: end