annotate LFGFilter.lua @ 10:627bb3803132

aliases support; convert plural support to aliases
author ovolkov
date Tue, 03 Feb 2015 07:41:39 +0300
parents 1c43d75054e7
children bd476e399376
rev   line source
ovolkov@7 1 local dump = DevTools_Dump
ovolkov@7 2
ovolkov@3 3 LFGListFrame.SearchPanel.SearchBox:SetMaxLetters(2048)
ovolkov@0 4
ovolkov@3 5 local filter_expression_functions = setmetatable({}, {
ovolkov@3 6 __mode = "k",
ovolkov@3 7 __index = function(t, key)
ovolkov@3 8 local func, error = loadstring("return " .. key)
ovolkov@3 9 if error then print("Error in LFG filter expression:\n", error) end
ovolkov@3 10 t[key] = func
ovolkov@3 11 return func
ovolkov@3 12 end
ovolkov@3 13 })
ovolkov@3 14
ovolkov@10 15 local aliases = {
ovolkov@10 16 hm = "highmaul",
ovolkov@10 17 healers = "healer",
ovolkov@10 18 members = "member",
ovolkov@10 19 tanks = "tank",
ovolkov@10 20 damagers = "damager",
ovolkov@10 21 damage = "damager",
ovolkov@10 22 plates = "plate",
ovolkov@10 23 mails = "mail",
ovolkov@10 24 leathers = "leather",
ovolkov@10 25 cloths = "cloth",
ovolkov@10 26 clothies = "cloth",
ovolkov@10 27 }
ovolkov@10 28 for idx = 1, MAX_CLASSES do
ovolkov@10 29 local class_lc = CLASS_SORT_ORDER[idx]:lower()
ovolkov@10 30 aliases[class_lc .. "s"] = class_lc
ovolkov@10 31 end
ovolkov@10 32
ovolkov@3 33 function LFGListSearchPanel_DoSearch(self)
ovolkov@3 34 local searchText = self.SearchBox:GetText();
ovolkov@3 35 local real_search, filter_expression = searchText:match("^([^=]-)=(.+)$")
ovolkov@3 36 if filter_expression then
ovolkov@3 37 filter_expression = filter_expression:lower()
ovolkov@3 38 self.filter_func = filter_expression_functions[filter_expression]
ovolkov@3 39 end
ovolkov@3 40 self.filter_expression = filter_expression
ovolkov@3 41
ovolkov@3 42 -- print("lfgsearch", real_search, filter_expression)
ovolkov@3 43 C_LFGList.Search(self.categoryID, real_search or searchText, self.filters, self.preferredFilters);
ovolkov@3 44 self.searching = true;
ovolkov@3 45 self.searchFailed = false;
ovolkov@3 46 self.selectedResult = nil;
ovolkov@3 47 LFGListSearchPanel_UpdateResultList(self);
ovolkov@3 48 LFGListSearchPanel_UpdateResults(self);
ovolkov@3 49 end
ovolkov@3 50
ovolkov@3 51 local result_env = {}
ovolkov@3 52 -- =highmaul and ((normal and (name:match("imp") or defeated == 6)) or (heroic and defeated == 2))
ovolkov@0 53 function LFGListUtil_SortSearchResults(results)
ovolkov@3 54 local self = LFGListFrame.SearchPanel
ovolkov@3 55 if self.filter_expression then
ovolkov@3 56 local check = self.filter_func
ovolkov@0 57 local shift_down = 0
ovolkov@0 58 local original_size = #results
ovolkov@0 59 for idx = 1, original_size do
ovolkov@3 60 local id = results[idx]
ovolkov@3 61 local _, activityID, name, comment, voiceChat, iLvl, age, numBNetFriends, numCharFriends, numGuildMates, isDelisted, leaderName, numMembers = C_LFGList.GetSearchResultInfo(id)
ovolkov@3 62 local completedEncounters = C_LFGList.GetSearchResultEncounterInfo(id)
ovolkov@3 63 local memberCounts = C_LFGList.GetSearchResultMemberCounts(id)
ovolkov@3 64
ovolkov@3 65 wipe(result_env)
ovolkov@3 66 result_env.name = name:lower()
ovolkov@3 67 result_env.comment = comment:lower()
ovolkov@3 68 result_env.ilvl = iLvl
ovolkov@3 69 -- TODO: should be calculated in meta
ovolkov@3 70 result_env.defeated = completedEncounters and #completedEncounters or 0
ovolkov@6 71 result_env.member = numMembers
ovolkov@6 72 result_env.tank = memberCounts.TANK
ovolkov@6 73 result_env.healer = memberCounts.HEALER
ovolkov@6 74 result_env.damager = memberCounts.DAMAGER + memberCounts.NOROLE
ovolkov@3 75 result_env.my_server = leaderName and not leaderName:find('-')
ovolkov@3 76
ovolkov@7 77 for idx = 1, numMembers do
ovolkov@7 78 local role, class, classLocalized = C_LFGList.GetSearchResultMemberInfo(id, idx)
ovolkov@7 79 local class_lc = class:lower()
ovolkov@7 80 local prev_count = result_env[class_lc]
ovolkov@7 81 result_env[class_lc] = prev_count and (prev_count + 1) or 0
ovolkov@7 82 end
ovolkov@7 83 for idx = 1, MAX_CLASSES do
ovolkov@7 84 local class_lc = CLASS_SORT_ORDER[idx]:lower()
ovolkov@7 85 local count = result_env[class_lc]
ovolkov@10 86 if not count then result_env[class_lc] = 0 end
ovolkov@7 87 end
ovolkov@7 88
ovolkov@3 89 if activityID == 37 then
ovolkov@3 90 result_env.highmaul = true
ovolkov@3 91 result_env.normal = true
ovolkov@3 92 elseif activityID == 38 then
ovolkov@3 93 result_env.highmaul = true
ovolkov@3 94 result_env.heroic = true
ovolkov@3 95 end
ovolkov@3 96
ovolkov@10 97 -- dump(result_env)
ovolkov@10 98
ovolkov@10 99 for alias, original in pairs(aliases) do result_env[alias] = result_env[original] end
ovolkov@10 100
ovolkov@10 101 -- dump(result_env)
ovolkov@7 102
ovolkov@3 103 local pass
ovolkov@3 104 if check then
ovolkov@3 105 setfenv(check, result_env)
ovolkov@3 106 pass = check()
ovolkov@3 107 end
ovolkov@3 108
ovolkov@3 109 if pass then
ovolkov@0 110 if shift_down > 0 then
ovolkov@3 111 results[idx - shift_down] = id
ovolkov@0 112 end
ovolkov@0 113 else
ovolkov@0 114 shift_down = shift_down + 1
ovolkov@0 115 end
ovolkov@3 116
ovolkov@0 117 end
ovolkov@0 118 for idx = original_size - shift_down + 1, original_size do
ovolkov@0 119 results[idx] = nil
ovolkov@0 120 end
ovolkov@0 121 end
ovolkov@3 122 table.sort(results, LFGListUtil_SortSearchResultsCB);
ovolkov@0 123 end
ovolkov@0 124
ovolkov@0 125 function LFGListUtil_SortSearchResultsCB(id1, id2)
ovolkov@0 126 local id1, activityID1, name1, comment1, voiceChat1, iLvl1, age1, numBNetFriends1, numCharFriends1, numGuildMates1, isDelisted1 = C_LFGList.GetSearchResultInfo(id1);
ovolkov@0 127 local id2, activityID2, name2, comment2, voiceChat2, iLvl2, age2, numBNetFriends2, numCharFriends2, numGuildMates2, isDelisted2 = C_LFGList.GetSearchResultInfo(id2);
ovolkov@0 128
ovolkov@0 129 --If one has more friends, do that one first
ovolkov@0 130 if ( numBNetFriends1 ~= numBNetFriends2 ) then
ovolkov@0 131 return numBNetFriends1 > numBNetFriends2;
ovolkov@0 132 end
ovolkov@0 133
ovolkov@0 134 if ( numCharFriends1 ~= numCharFriends2 ) then
ovolkov@0 135 return numCharFriends1 > numCharFriends2;
ovolkov@0 136 end
ovolkov@0 137
ovolkov@0 138 if ( numGuildMates1 ~= numGuildMates2 ) then
ovolkov@0 139 return numGuildMates1 > numGuildMates2;
ovolkov@0 140 end
ovolkov@0 141
ovolkov@0 142 if ( activityID1 ~= activityID2 ) then
ovolkov@0 143 return activityID1 > activityID2;
ovolkov@0 144 end
ovolkov@0 145
ovolkov@0 146 --If we aren't sorting by anything else, just go by ID
ovolkov@0 147 return id1 < id2;
ovolkov@0 148 end
ovolkov@0 149
ovolkov@0 150 function LFGPrintRawResults()
ovolkov@0 151 local totalResults, results = C_LFGList.GetSearchResults()
ovolkov@0 152 for idx = 1, totalResults do
ovolkov@0 153 local id1, activityID1, name1, comment1, voiceChat1, iLvl1, age1, numBNetFriends1, numCharFriends1, numGuildMates1, isDelisted1 = C_LFGList.GetSearchResultInfo(results[idx])
ovolkov@0 154 print(id1, activityID1, C_LFGList.GetActivityInfo(activityID1), '*', name1)
ovolkov@0 155 end
ovolkov@3 156 end