コード例 #1
0
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)
コード例 #2
0
ファイル: quotes.py プロジェクト: jai-x/apollo
    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
コード例 #3
0
ファイル: quotes.py プロジェクト: jai-x/apollo
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
コード例 #4
0
ファイル: quotes.py プロジェクト: jai-x/apollo
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)
コード例 #5
0
ファイル: quotes.py プロジェクト: jai-x/apollo
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)
コード例 #6
0
ファイル: quotes.py プロジェクト: jai-x/apollo
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)
コード例 #7
0
ファイル: quotes.py プロジェクト: jai-x/apollo
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)
コード例 #8
0
ファイル: quotes.py プロジェクト: jai-x/apollo
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)
コード例 #9
0
    ]

    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)',