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