예제 #1
0
파일: main.py 프로젝트: mohd-akram/item.tf
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
예제 #2
0
파일: main.py 프로젝트: mohd-akram/item.tf
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
예제 #3
0
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
예제 #4
0
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