annotate LFGFilter.lua @ 22:924948188536

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