async def cardviewer_announce(session): if not flask.request.is_json: return flask.jsonify(message="Request not JSON"), 400 req = flask.request.get_json() cards = server.db.metadata.tables['cards'] card_multiverse = server.db.metadata.tables['card_multiverse'] query = sqlalchemy.select([cards.c.id, cards.c.name, cards.c.text]) if 'multiverseid' in req: query = query.select_from(cards.join(card_multiverse)).where( card_multiverse.c.id == req['multiverseid']) elif 'name' in req: name = cardname.to_query(req['name']) exact = cardname.clean_text(req['name']) hidden = False if 'variant' in req: name += escape_like("_" + req['variant']) exact += "_" + req['variant'] hidden = True exact_query = sqlalchemy.exists().where(cards.c.filteredname == exact) if not hidden: exact_query = exact_query.where(~cards.c.hidden) query = query.where((exact_query & (cards.c.filteredname == exact)) | (~exact_query & cards.c.filteredname.ilike(name))) if not hidden: query = query.where(~cards.c.hidden) elif 'host' in req or 'augment' in req: name = "" if 'augment' in req: name += cardname.to_query(req['augment']) + escape_like("_aug") if 'host' in req: name += ("_" if name != "" else "") + cardname.to_query( req['host']) + escape_like("_host") query = query.where(cards.c.filteredname.ilike(name)) else: return flask.jsonify(message=""), 400 with server.db.engine.begin() as conn: cards = conn.execute(query).fetchall() if len(cards) == 0: return flask.jsonify(message="No such card"), 400 elif len(cards) > 1: return flask.jsonify(message="Matched multiple cards"), 400 card_id, name, text = cards[0] await common.rpc.bot.cardviewer.announce(card_id) return flask.jsonify( name=name, text=text, )
async def cardviewer_announce(session): if not flask.request.is_json: return flask.jsonify(message="Request not JSON"), 400 req = flask.request.get_json() log.debug("Received cardviewer: %r", req) cards = server.db.metadata.tables['cards'] card_multiverse = server.db.metadata.tables['card_multiverse'] query = sqlalchemy.select([cards.c.id, cards.c.name, cards.c.text]) if 'multiverseid' in req: query = query.select_from(cards.join(card_multiverse)).where(card_multiverse.c.id == req['multiverseid']) elif 'name' in req: name = cardname.to_query(req['name']) exact = cardname.clean_text(req['name']) hidden = False if 'variant' in req: name += escape_like("_" + req['variant']) exact += "_" + req['variant'] hidden = True exact_query = sqlalchemy.exists().where(cards.c.filteredname == exact) if not hidden: exact_query = exact_query.where(~cards.c.hidden) query = query.where( (exact_query & (cards.c.filteredname == exact)) | (~exact_query & cards.c.filteredname.ilike(name))) if not hidden: query = query.where(~cards.c.hidden) elif 'host' in req or 'augment' in req: name = "" if 'augment' in req: name += cardname.to_query(req['augment']) + escape_like("_aug") if 'host' in req: name += ("_" if name != "" else "") + cardname.to_query(req['host']) + escape_like("_host") query = query.where(cards.c.filteredname.ilike(name)) else: return flask.jsonify(message=""), 400 with server.db.engine.begin() as conn: cards = conn.execute(query).fetchall() if len(cards) == 0: return flask.jsonify(message="No such card"), 400 elif len(cards) > 1: return flask.jsonify(message="Matched multiple cards"), 400 card_id, name, text = cards[0] await common.rpc.bot.cardviewer.announce(card_id) return flask.jsonify( name=name, text=text, )
def to_query(text): return "%" + "%".join( escape_like(clean_text(word)) for word in text.split()) + "%"
def to_query(text): return "%" + "%".join(escape_like(clean_text(word)) for word in text.split()) + "%"