async def getresults(classes, tags): key = getsearchkey(classes, tags) multikey = getsearchkey(classes, tags, 'Multi') allkey = getsearchkey(classes, tags, 'All') title = tf2search.getclasstagtitle(classes, tags) keys = (key, multikey, allkey) titles = (title, 'Multi-Class Items', 'All-Class Items') if not await store.exists(key) and not await store.exists(allkey): classeskey = 'temp:classes' tagskey = 'temp:tags' remove = [] pipe = store.multi_exec() classkeys = [getclasskey(class_) for class_ in classes] or ['items'] pipe.sunionstore(classeskey, *classkeys) # Get only the specified weapon types if 'weapon' in tags and not tags.isdisjoint(tf2api.getweapontags()): tags.remove('weapon') remove.append(gettagkey('token')) tagkeys = [gettagkey(tag) for tag in tags] or ['items'] pipe.sunionstore(tagskey, *tagkeys) # Hide medals if not explicitly searching for them if 'tournament' not in tags: remove.append(gettagkey('tournament')) if remove: pipe.sdiffstore(tagskey, *([tagskey] + remove)) pipe.sinterstore(key, classeskey, tagskey) pipe.sinterstore(multikey, key, getclasskey(multi=True)) pipe.sinterstore(allkey, tagskey, getclasskey()) pipe.sdiffstore(key, key, multikey, allkey) pipe.delete(classeskey) pipe.delete(tagskey) for k in keys: pipe.sort(k, store=k) pipe.expire(k, 3600) await pipe.execute() async def getkeys(key): return [getitemkey(k) for k in await store.lrange(key, 0, -1)] results = [] for title, key in zip(titles, keys): itemkeys = await getkeys(key) if itemkeys: results.append(tf2search.getsearchresult( title=title, items=store.Hashes(itemkeys))) return results
def getresults(classes, tags): key = getsearchkey(classes, tags) multikey = getsearchkey(classes, tags, "Multi") allkey = getsearchkey(classes, tags, "All") keys = (key, multikey, allkey) titles = ("", "Multi-Class Items", "All-Class Items") if not store.exists(key) and not store.exists(allkey): classeskey = "temp:classes" tagskey = "temp:tags" remove = [] pipe = store.pipeline() classkeys = [getclasskey(class_) for class_ in classes] or "items" pipe.sunionstore(classeskey, classkeys) # Get only the specified weapon types if "weapon" in tags and not tags.isdisjoint(tf2api.getweapontags()): tags.remove("weapon") remove.append(gettagkey("token")) tagkeys = [gettagkey(tag) for tag in tags] or "items" pipe.sunionstore(tagskey, tagkeys) # Hide medals if not explicitly searching for them if "tournament" not in tags: remove.append(gettagkey("tournament")) if remove: pipe.sdiffstore(tagskey, [tagskey] + remove) pipe.sinterstore(key, [classeskey, tagskey]) pipe.sinterstore(multikey, [key, getclasskey(multi=True)]) pipe.sinterstore(allkey, [tagskey, getclasskey()]) pipe.sdiffstore(key, [key, multikey, allkey]) pipe.delete(classeskey) pipe.delete(tagskey) for k in keys: pipe.sort(k, store=k) pipe.expire(k, 3600) pipe.execute() getkeys = lambda key: [getitemkey(k) for k in store.lrange(key, 0, -1)] results = [] for title, key in zip(titles, keys): itemkeys = getkeys(key) if itemkeys: results.append(tf2search.getsearchresult(title=title, items=store.Hashes(itemkeys))) return results
def _classtagsearch(classes, tags, itemsdict): """Search for items that match classes and tags""" results = defaultdict(list) names = set() title = getclasstagtitle(classes, tags) titles = [title, 'Multi-Class Items', 'All-Class Items'] # Check if the user is searching for tournament medals hidemedals = 'tournament' not in tags # Check if the weapon tag is specified (eg. primary, melee) hasweapontag = not tags.isdisjoint(tf2api.getweapontags()) for itemdict in itemsdict.values(): itemclasses = itemdict['classes'] itemtags = itemdict['tags'] # Gives a match if there's an intersection between the item's # classes and the parsed classes in the query. Also gives a match # if the item doesn't have any classes specified (all-class item) isclassmatch = (not classes.isdisjoint(itemclasses) or not itemclasses) if hasweapontag: # This avoids showing slot tokens when searching for # 'primary weapon', 'melee weapon', etc. istagmatch = tags.issubset(itemtags) else: istagmatch = not tags.isdisjoint(itemtags) if (isclassmatch or not classes) and (istagmatch or not tags): name = itemdict['name'] # Don't show tournament medals unless explicitly searched if isvalidresult(itemdict, hidemedals) and name not in names: if len(itemclasses) == 1: results[titles[0]].append(itemdict) elif len(itemclasses) > 1: results[titles[1]].append(itemdict) else: results[titles[2]].append(itemdict) names.add(name) results = [getsearchresult(title, items=items) for title, items in results.items()] results.sort(key=lambda k: titles.index(k['title'])) return results
async def getresults(classes, tags): key = getsearchkey(classes, tags) multikey = getsearchkey(classes, tags, 'Multi') allkey = getsearchkey(classes, tags, 'All') title = tf2search.getclasstagtitle(classes, tags) keys = (key, multikey, allkey) titles = (title, 'Multi-Class Items', 'All-Class Items') if not await store.exists(key) and not await store.exists(allkey): classeskey = 'temp:classes' tagskey = 'temp:tags' remove = [] pipe = store.multi_exec() classkeys = [getclasskey(class_) for class_ in classes] or ['items'] pipe.sunionstore(classeskey, *classkeys) # Get only the specified weapon types if 'weapon' in tags and not tags.isdisjoint(tf2api.getweapontags()): tags.remove('weapon') remove.append(gettagkey('token')) tagkeys = [gettagkey(tag) for tag in tags] or ['items'] pipe.sunionstore(tagskey, *tagkeys) # Hide medals if not explicitly searching for them if 'tournament' not in tags: remove.append(gettagkey('tournament')) if remove: pipe.sdiffstore(tagskey, *([tagskey] + remove)) pipe.sinterstore(key, classeskey, tagskey) pipe.sinterstore(multikey, key, getclasskey(multi=True)) pipe.sinterstore(allkey, tagskey, getclasskey()) pipe.sdiffstore(key, key, multikey, allkey) pipe.delete(classeskey) pipe.delete(tagskey) for k in keys: pipe.sort(k, store=k) pipe.expire(k, 3600) await pipe.execute() async def getkeys(key): return [getitemkey(k) for k in await store.lrange(key, 0, -1)] results = [] for title, key in zip(titles, keys): itemkeys = await getkeys(key) if itemkeys: results.append( tf2search.getsearchresult(title=title, items=store.Hashes(itemkeys))) return results