def opt_out_of_quotes(is_exec, requester: Mention, target: Mention = None, session=db_session) -> str: # if no target, target ourselves if target is None: target = requester # check if requester has permission permission = True if requester.is_id_type(): # discord user check (with exec override) if requester.id != target.id and not is_exec: permission = False else: if requester.string != target.string and not is_exec: permission = False if not permission: raise QuoteException(QuoteError.NOT_PERMITTED) # check if user has opted out if target.is_id_type(): f = QuoteOptouts.user_id == target.id else: f = QuoteOptouts.user_string == target.string q = session.query(QuoteOptouts).filter(f).one_or_none() if q is not None: raise QuoteException(QuoteError.OPTED_OUT) # opt out user optout = QuoteOptouts(user_type=target.type, user_id=target.id, user_string=target.string) try: session.add(optout) session.commit() # purge old quotes deleted = purge_quotes(is_exec, requester, target, session) session.commit() return deleted except (ScalarListException, SQLAlchemyError) as e: session.rollback() logging.exception(e) raise QuoteException(QuoteError.DB_ERROR)
async def convert(self, ctx, argument) -> Union[Mention, QuoteID, str]: if is_id(argument): return int(argument[1:]) if argument[0] == "@": return Mention.string_mention(argument[1:]) argument = await MC.convert(ctx, argument) return argument
def user_opted_out(user: Mention, session=db_session) -> bool: """check if mentioned user has opted out""" if user.is_id_type(): f = QuoteOptouts.user_id == user.id else: f = QuoteOptouts.user_string == user.string q = session.query(QuoteOptouts).filter(f).one_or_none() return q is not None
def add_quote(author: Mention, quote, time, session=db_session) -> str: """Add a quote by the specified author""" if quote is None: raise QuoteException(QuoteError.BAD_FORMAT) if user_opted_out(author, session): raise QuoteException(QuoteError.OPTED_OUT) if author.is_id_type(): new_quote = Quote.id_quote(author.id, quote, time) else: new_quote = Quote.string_quote(author.string, quote, time) try: session.add(new_quote) session.commit() return str(new_quote.quote_id) except (ScalarListException, SQLAlchemyError) as e: session.rollback() logging.exception(e) raise QuoteException(QuoteError.DB_ERROR)
def opt_in_to_quotes(requester: Mention, session=db_session) -> str: # check to see if target is opted out already if requester.is_id_type(): q = session.query(QuoteOptouts).filter(QuoteOptouts.user_id == requester.id) else: q = session.query(QuoteOptouts).filter( QuoteOptouts.user_string == requester.string ) if q.one_or_none() is None: raise QuoteException(QuoteError.NO_OP) # opt in try: q.delete() session.commit() return "OK" except (ScalarListException, SQLAlchemyError) as e: session.rollback() logging.exception(e) raise QuoteException(QuoteError.DB_ERROR)
def purge_quotes( is_exec, requester: Mention, target: Mention, session=db_session ) -> str: if not is_exec and requester != target: raise QuoteException(QuoteError.NOT_PERMITTED) # get quotes if target.is_id_type(): f = session.query(Quote).filter(Quote.author_id == target.id) else: f = session.query(Quote).filter(Quote.author_string == target.string) to_delete = f.count() try: f.delete() session.commit() return str(to_delete) except (ScalarListException, SQLAlchemyError) as e: session.rollback() logging.exception(e) raise QuoteException(QuoteError.DB_ERROR)
def ctx_to_mention(ctx): """Convert requester name to Mention""" if user_is_irc_bot(ctx): return Mention.string_mention(get_name_string(ctx)) else: return Mention.id_mention(get_database_user(ctx.author).id)
def _(query: Mention, session=db_session): """query by Mention""" if query.is_id_type(): return session.query(Quote).filter(Quote.author_id == query.id) else: return session.query(Quote).filter(Quote.author_string == query.string)
] db_session.add_all(users) db_session.add_all(TEST_QUOTES) # Add some opt-outs db_session.add(QuoteOptouts(user_type=MentionType.ID, user_id=3, user_string=None)) db_session.commit() return db_session QUERY_QUOTES = { "By ID": (1, [TEST_QUOTES[0]]), "By Author (Discord)": (Mention.id_mention(1), [TEST_QUOTES[0], TEST_QUOTES[4]]), "By Author (IRC/String)": ( Mention.string_mention("ircguy"), [TEST_QUOTES[1], TEST_QUOTES[3]], ), "By Topic": ("irc", [TEST_QUOTES[1], TEST_QUOTES[3], TEST_QUOTES[4]]), "No valid quotes": ("blargleargle", []), } ADD_QUOTES = { "Discord user quote": ( Mention.id_mention(1), "Foo said this", datetime(1998, 12, 24), 7, '**#7:** "Foo said this" - <@1000> (24/12/1998)',