annotate LFGFilter.lua @ 29:349253bf8332

autolocal
author ovolkov
date Sun, 22 Feb 2015 07:11:13 +0300
parents c257f5127e68
children 1ff8e590959d
rev   line source
ovolkov@29 1 -- [AUTOLOCAL START]
ovolkov@29 2 local CLASS_SORT_ORDER = CLASS_SORT_ORDER
ovolkov@29 3 local C_LFGList = C_LFGList
ovolkov@29 4 local GetLFGDungeonEncounterInfo = GetLFGDungeonEncounterInfo
ovolkov@29 5 local GetLFGDungeonNumEncounters = GetLFGDungeonNumEncounters
ovolkov@29 6 local MAX_CLASSES = MAX_CLASSES
ovolkov@7 7 local dump = DevTools_Dump
ovolkov@29 8 local match = string.match
ovolkov@29 9 local pairs = pairs
ovolkov@29 10 local setfenv = setfenv
ovolkov@29 11 local wipe = wipe
ovolkov@29 12 -- [AUTOLOCAL END]
ovolkov@29 13
ovolkov@3 14 LFGListFrame.SearchPanel.SearchBox:SetMaxLetters(2048)
ovolkov@0 15
ovolkov@3 16 local filter_expression_functions = setmetatable({}, {
ovolkov@3 17 __mode = "k",
ovolkov@3 18 __index = function(t, key)
ovolkov@3 19 local func, error = loadstring("return " .. key)
ovolkov@3 20 if error then print("Error in LFG filter expression:\n", error) end
ovolkov@3 21 t[key] = func
ovolkov@3 22 return func
ovolkov@3 23 end
ovolkov@3 24 })
ovolkov@3 25
ovolkov@10 26 local aliases = {
ovolkov@18 27 hm = "highmaul",
ovolkov@18 28 brf = "blackrock_foundry",
ovolkov@18 29 blackrockfoundry = "blackrock_foundry",
ovolkov@18 30 healers = "healer",
ovolkov@18 31 members = "member",
ovolkov@18 32 tanks = "tank",
ovolkov@18 33 damagers = "damager",
ovolkov@18 34 damage = "damager",
ovolkov@18 35 plates = "plate",
ovolkov@18 36 mails = "mail",
ovolkov@18 37 leathers = "leather",
ovolkov@18 38 cloths = "cloth",
ovolkov@18 39 clothies = "cloth",
ovolkov@10 40 }
ovolkov@10 41 for idx = 1, MAX_CLASSES do
ovolkov@10 42 local class_lc = CLASS_SORT_ORDER[idx]:lower()
ovolkov@10 43 aliases[class_lc .. "s"] = class_lc
ovolkov@10 44 end
ovolkov@10 45
ovolkov@11 46 local token_to_encounter_id = {
ovolkov@11 47 highmaul = {
ovolkov@12 48 lfg_dungeon_id = 849,
ovolkov@12 49 { "kargath", "bladefist", "kargath_bladefist" },
ovolkov@12 50 { "butcher", "the_butcher" },
ovolkov@12 51 { "tectus" },
ovolkov@12 52 { "brackenspore", "bracken" },
ovolkov@12 53 { "twin_orgon", "twins" },
ovolkov@12 54 { "koragh", "breaker" },
ovolkov@12 55 { "imperator", "margok" },
ovolkov@23 56 },
ovolkov@23 57 blackrock_foundry = {
ovolkov@23 58 lfg_dungeon_id = 847,
ovolkov@11 59 }
ovolkov@11 60 }
ovolkov@11 61
ovolkov@3 62 function LFGListSearchPanel_DoSearch(self)
ovolkov@3 63 local searchText = self.SearchBox:GetText();
ovolkov@3 64 local real_search, filter_expression = searchText:match("^([^=]-)=(.+)$")
ovolkov@3 65 if filter_expression then
ovolkov@3 66 filter_expression = filter_expression:lower()
ovolkov@3 67 self.filter_func = filter_expression_functions[filter_expression]
ovolkov@3 68 end
ovolkov@3 69 self.filter_expression = filter_expression
ovolkov@3 70
ovolkov@3 71 -- print("lfgsearch", real_search, filter_expression)
ovolkov@3 72 C_LFGList.Search(self.categoryID, real_search or searchText, self.filters, self.preferredFilters);
ovolkov@3 73 self.searching = true;
ovolkov@3 74 self.searchFailed = false;
ovolkov@3 75 self.selectedResult = nil;
ovolkov@3 76 LFGListSearchPanel_UpdateResultList(self);
ovolkov@3 77 LFGListSearchPanel_UpdateResults(self);
ovolkov@3 78 end
ovolkov@3 79
ovolkov@12 80 local localized_encounter_name_to_idx = {}
ovolkov@11 81
ovolkov@22 82 local dead = true
ovolkov@22 83
ovolkov@11 84 local function InsertEncounterStateAliases(result_env, raid_token, completed_encounters)
ovolkov@11 85 local encounter_aliases = token_to_encounter_id[raid_token]
ovolkov@11 86 if not encounter_aliases then return end
ovolkov@11 87
ovolkov@12 88 local lfg_dungeon_id = encounter_aliases.lfg_dungeon_id
ovolkov@12 89 local encounter_names = localized_encounter_name_to_idx[lfg_dungeon_id]
ovolkov@11 90 if not encounter_names then
ovolkov@11 91 encounter_names = {}
ovolkov@12 92 for idx = 1, GetLFGDungeonNumEncounters(lfg_dungeon_id) do
ovolkov@12 93 local bossName, texture, isKilled = GetLFGDungeonEncounterInfo(lfg_dungeon_id, idx)
ovolkov@12 94 encounter_names[bossName] = idx
ovolkov@12 95 end
ovolkov@12 96 localized_encounter_name_to_idx[lfg_dungeon_id] = encounter_names
ovolkov@11 97 end
ovolkov@11 98
ovolkov@11 99 for idx = 1, #completed_encounters do
ovolkov@11 100 local encounter_id = encounter_names[completed_encounters[idx]]
ovolkov@11 101 if encounter_id then
ovolkov@11 102 local aliases = encounter_aliases[encounter_id]
ovolkov@22 103 result_env["boss" .. encounter_id] = dead
ovolkov@11 104 if aliases then
ovolkov@11 105 for alias_idx = 1, #aliases do
ovolkov@22 106 result_env[aliases[alias_idx]] = dead
ovolkov@11 107 end
ovolkov@11 108 end
ovolkov@11 109 end
ovolkov@11 110 end
ovolkov@11 111 end
ovolkov@11 112
ovolkov@3 113 local result_env = {}
ovolkov@3 114 -- =highmaul and ((normal and (name:match("imp") or defeated == 6)) or (heroic and defeated == 2))
ovolkov@0 115 function LFGListUtil_SortSearchResults(results)
ovolkov@3 116 local self = LFGListFrame.SearchPanel
ovolkov@3 117 if self.filter_expression then
ovolkov@3 118 local check = self.filter_func
ovolkov@0 119 local shift_down = 0
ovolkov@0 120 local original_size = #results
ovolkov@0 121 for idx = 1, original_size do
ovolkov@3 122 local id = results[idx]
ovolkov@3 123 local _, activityID, name, comment, voiceChat, iLvl, age, numBNetFriends, numCharFriends, numGuildMates, isDelisted, leaderName, numMembers = C_LFGList.GetSearchResultInfo(id)
ovolkov@3 124 local completedEncounters = C_LFGList.GetSearchResultEncounterInfo(id)
ovolkov@3 125 local memberCounts = C_LFGList.GetSearchResultMemberCounts(id)
ovolkov@3 126
ovolkov@3 127 wipe(result_env)
ovolkov@3 128 result_env.name = name:lower()
ovolkov@3 129 result_env.comment = comment:lower()
ovolkov@3 130 result_env.ilvl = iLvl
ovolkov@3 131 -- TODO: should be calculated in meta
ovolkov@3 132 result_env.defeated = completedEncounters and #completedEncounters or 0
ovolkov@6 133 result_env.member = numMembers
ovolkov@6 134 result_env.tank = memberCounts.TANK
ovolkov@6 135 result_env.healer = memberCounts.HEALER
ovolkov@6 136 result_env.damager = memberCounts.DAMAGER + memberCounts.NOROLE
ovolkov@3 137 result_env.my_server = leaderName and not leaderName:find('-')
ovolkov@3 138
ovolkov@7 139 for idx = 1, numMembers do
ovolkov@7 140 local role, class, classLocalized = C_LFGList.GetSearchResultMemberInfo(id, idx)
ovolkov@7 141 local class_lc = class:lower()
ovolkov@7 142 local prev_count = result_env[class_lc]
ovolkov@7 143 result_env[class_lc] = prev_count and (prev_count + 1) or 0
ovolkov@7 144 end
ovolkov@7 145 for idx = 1, MAX_CLASSES do
ovolkov@7 146 local class_lc = CLASS_SORT_ORDER[idx]:lower()
ovolkov@7 147 local count = result_env[class_lc]
ovolkov@10 148 if not count then result_env[class_lc] = 0 end
ovolkov@7 149 end
ovolkov@7 150
ovolkov@11 151 local raid_token
ovolkov@3 152 if activityID == 37 then
ovolkov@11 153 raid_token = "highmaul"
ovolkov@3 154 result_env.normal = true
ovolkov@3 155 elseif activityID == 38 then
ovolkov@11 156 raid_token = "highmaul"
ovolkov@3 157 result_env.heroic = true
ovolkov@18 158 elseif activityID == 39 then
ovolkov@18 159 raid_token = "blackrock_foundry"
ovolkov@18 160 result_env.normal = true
ovolkov@18 161 elseif activityID == 40 then
ovolkov@18 162 raid_token = "blackrock_foundry"
ovolkov@18 163 result_env.heroic = true
ovolkov@3 164 end
ovolkov@3 165
ovolkov@17 166 if raid_token then
ovolkov@17 167 result_env[raid_token] = true
ovolkov@17 168 if completedEncounters then InsertEncounterStateAliases(result_env, raid_token, completedEncounters) end
ovolkov@17 169 end
ovolkov@11 170
ovolkov@22 171 result_env.dead = dead
ovolkov@11 172
ovolkov@11 173 -- dump(result_env)
ovolkov@10 174
ovolkov@10 175 for alias, original in pairs(aliases) do result_env[alias] = result_env[original] end
ovolkov@10 176
ovolkov@10 177 -- dump(result_env)
ovolkov@7 178
ovolkov@3 179 local pass
ovolkov@3 180 if check then
ovolkov@3 181 setfenv(check, result_env)
ovolkov@3 182 pass = check()
ovolkov@3 183 end
ovolkov@3 184
ovolkov@3 185 if pass then
ovolkov@0 186 if shift_down > 0 then
ovolkov@3 187 results[idx - shift_down] = id
ovolkov@0 188 end
ovolkov@0 189 else
ovolkov@0 190 shift_down = shift_down + 1
ovolkov@0 191 end
ovolkov@3 192
ovolkov@0 193 end
ovolkov@0 194 for idx = original_size - shift_down + 1, original_size do
ovolkov@0 195 results[idx] = nil
ovolkov@0 196 end
ovolkov@0 197 end
ovolkov@3 198 table.sort(results, LFGListUtil_SortSearchResultsCB);
ovolkov@0 199 end
ovolkov@0 200
ovolkov@0 201 function LFGListUtil_SortSearchResultsCB(id1, id2)
ovolkov@0 202 local id1, activityID1, name1, comment1, voiceChat1, iLvl1, age1, numBNetFriends1, numCharFriends1, numGuildMates1, isDelisted1 = C_LFGList.GetSearchResultInfo(id1);
ovolkov@0 203 local id2, activityID2, name2, comment2, voiceChat2, iLvl2, age2, numBNetFriends2, numCharFriends2, numGuildMates2, isDelisted2 = C_LFGList.GetSearchResultInfo(id2);
ovolkov@0 204
ovolkov@0 205 --If one has more friends, do that one first
ovolkov@0 206 if ( numBNetFriends1 ~= numBNetFriends2 ) then
ovolkov@0 207 return numBNetFriends1 > numBNetFriends2;
ovolkov@0 208 end
ovolkov@0 209
ovolkov@0 210 if ( numCharFriends1 ~= numCharFriends2 ) then
ovolkov@0 211 return numCharFriends1 > numCharFriends2;
ovolkov@0 212 end
ovolkov@0 213
ovolkov@0 214 if ( numGuildMates1 ~= numGuildMates2 ) then
ovolkov@0 215 return numGuildMates1 > numGuildMates2;
ovolkov@0 216 end
ovolkov@0 217
ovolkov@0 218 if ( activityID1 ~= activityID2 ) then
ovolkov@0 219 return activityID1 > activityID2;
ovolkov@0 220 end
ovolkov@0 221
ovolkov@0 222 --If we aren't sorting by anything else, just go by ID
ovolkov@0 223 return id1 < id2;
ovolkov@0 224 end
ovolkov@0 225
ovolkov@0 226 function LFGPrintRawResults()
ovolkov@0 227 local totalResults, results = C_LFGList.GetSearchResults()
ovolkov@0 228 for idx = 1, totalResults do
ovolkov@0 229 local id1, activityID1, name1, comment1, voiceChat1, iLvl1, age1, numBNetFriends1, numCharFriends1, numGuildMates1, isDelisted1 = C_LFGList.GetSearchResultInfo(results[idx])
ovolkov@0 230 print(id1, activityID1, C_LFGList.GetActivityInfo(activityID1), '*', name1)
ovolkov@0 231 end
ovolkov@21 232 end
ovolkov@21 233
ovolkov@21 234 function LFGPrintFindDungeon(upper_limit, pattern)
ovolkov@21 235 local lower_limit = 1
ovolkov@21 236 if not pattern then
ovolkov@21 237 lower_limit = upper_limit
ovolkov@21 238 pattern = GetLFGDungeonInfo(upper_limit)
ovolkov@21 239 end
ovolkov@21 240 for idx = lower_limit, upper_limit do
ovolkov@21 241 local name = GetLFGDungeonInfo(idx)
ovolkov@21 242 if name and name:find(pattern) then
ovolkov@21 243 print(idx, name)
ovolkov@21 244 for enc_idx = 1, GetLFGDungeonNumEncounters(idx) do
ovolkov@21 245 local bossName, texture, isKilled = GetLFGDungeonEncounterInfo(idx, enc_idx)
ovolkov@21 246 print("*", enc_idx, bossName)
ovolkov@21 247 end
ovolkov@21 248 end
ovolkov@21 249 end
ovolkov@13 250 end