Mercurial > wow > lfg-premade-filter
diff LFGFilter.lua @ 3:041bc456db50 v2
v2 - complete rework to use filtering expressions in search string
author | ovolkov |
---|---|
date | Wed, 21 Jan 2015 19:19:02 +0300 |
parents | df29f8179b76 |
children | 5a89e06534ac |
line wrap: on
line diff
--- a/LFGFilter.lua Wed Nov 12 16:21:54 2014 +0300 +++ b/LFGFilter.lua Wed Jan 21 19:19:02 2015 +0300 @@ -1,28 +1,87 @@ -local aName, aEnv = ... -aEnv.LFGFilter_Allow_Activity = {} -aEnv.LFGFilter_Allow_Activity.count = 0 -local LFGFilter_Allow_Activity = aEnv.LFGFilter_Allow_Activity +LFGListFrame.SearchPanel.SearchBox:SetMaxLetters(2048) +local filter_expression_functions = setmetatable({}, { + __mode = "k", + __index = function(t, key) + local func, error = loadstring("return " .. key) + if error then print("Error in LFG filter expression:\n", error) end + t[key] = func + return func + end +}) + +function LFGListSearchPanel_DoSearch(self) + local searchText = self.SearchBox:GetText(); + local real_search, filter_expression = searchText:match("^([^=]-)=(.+)$") + if filter_expression then + filter_expression = filter_expression:lower() + self.filter_func = filter_expression_functions[filter_expression] + end + self.filter_expression = filter_expression + + -- print("lfgsearch", real_search, filter_expression) + C_LFGList.Search(self.categoryID, real_search or searchText, self.filters, self.preferredFilters); + self.searching = true; + self.searchFailed = false; + self.selectedResult = nil; + LFGListSearchPanel_UpdateResultList(self); + LFGListSearchPanel_UpdateResults(self); +end + +local result_env = {} +-- =highmaul and ((normal and (name:match("imp") or defeated == 6)) or (heroic and defeated == 2)) function LFGListUtil_SortSearchResults(results) - if LFGFilter_Allow_Activity.count > 0 then + local self = LFGListFrame.SearchPanel + if self.filter_expression then + local check = self.filter_func local shift_down = 0 local original_size = #results for idx = 1, original_size do - local result = results[idx] - local _, activityID = C_LFGList.GetSearchResultInfo(result) - if LFGFilter_Allow_Activity[activityID] then + local id = results[idx] + local _, activityID, name, comment, voiceChat, iLvl, age, numBNetFriends, numCharFriends, numGuildMates, isDelisted, leaderName, numMembers = C_LFGList.GetSearchResultInfo(id) + local completedEncounters = C_LFGList.GetSearchResultEncounterInfo(id) + local memberCounts = C_LFGList.GetSearchResultMemberCounts(id) + + wipe(result_env) + result_env.name = name:lower() + result_env.comment = comment:lower() + result_env.ilvl = iLvl + -- TODO: should be calculated in meta + result_env.defeated = completedEncounters and #completedEncounters or 0 + result_env.members = numMembers + result_env.tanks = memberCounts.TANK + result_env.healers = memberCounts.HEALER + result_env.damagers = memberCounts.DAMAGER + memberCounts.NOROLE + result_env.my_server = leaderName and not leaderName:find('-') + + if activityID == 37 then + result_env.highmaul = true + result_env.normal = true + elseif activityID == 38 then + result_env.highmaul = true + result_env.heroic = true + end + + local pass + if check then + setfenv(check, result_env) + pass = check() + end + + if pass then if shift_down > 0 then - results[idx - shift_down] = result + results[idx - shift_down] = id end else shift_down = shift_down + 1 end + end for idx = original_size - shift_down + 1, original_size do results[idx] = nil end end - table.sort(results, LFGListUtil_SortSearchResultsCB); + table.sort(results, LFGListUtil_SortSearchResultsCB); end function LFGListUtil_SortSearchResultsCB(id1, id2) @@ -56,9 +115,4 @@ local id1, activityID1, name1, comment1, voiceChat1, iLvl1, age1, numBNetFriends1, numCharFriends1, numGuildMates1, isDelisted1 = C_LFGList.GetSearchResultInfo(results[idx]) print(id1, activityID1, C_LFGList.GetActivityInfo(activityID1), '*', name1) end -end - --- SoO (Normal): 4 --- SoO (Heroic): 41 --- SoO (Mythic): 42 --- /run LFGFilter_Allow_Activity = { [42] = true } \ No newline at end of file +end \ No newline at end of file