예제 #1
0
def test_create_karma_user(mock_empty_db_session, mock_slack_api_call):
    karma = Karma("ABC123", "XYZ123", "CHANNEL42")
    assert karma.giver.username == "pybob"
    assert karma.receiver.username == "clamytoe"

    first = db_session.create_session().query(KarmaUser).get("ABC123")
    second = db_session.create_session().query(KarmaUser).get("XYZ123")

    assert first.username == "pybob"
    assert second.username == "clamytoe"
예제 #2
0
def _get_notes_for_user(user: KarmaUser) -> list:
    return (
        db_session.create_session()
        .query(KarmaNote)
        .filter_by(user_id=user.user_id)
        .all()
    )
예제 #3
0
def update_username(**kwargs):
    """Changes the Username"""
    user_id = kwargs.get("user_id").strip("<>@")

    session = create_session()
    karma_user: KarmaUser = session.query(KarmaUser).get(user_id)

    if not karma_user:
        return "User not found"

    old_username = karma_user.username
    user_info = settings.SLACK_CLIENT.api_call("users.info", user=user_id)
    new_username = karmabot.slack.get_available_username(user_info)

    if old_username == new_username:
        return (
            f"Sorry, you have not updated your username: {old_username}. \n"
            "Please update your real-name or display-name in your Slack "
            "profile and retry.")

    karma_user.username = new_username
    session.commit()
    session.close()

    return (f"Sucessfully updated your KarmaUser name "
            f"from '{old_username}' to '{new_username}'!")
예제 #4
0
def test_change_karma(mock_filled_db_session, test_changes, mock_slack_api_call):
    session = db_session.create_session()
    pre_change_karma = session.query(KarmaUser).get(test_changes[1]).karma_points

    karma = Karma(test_changes[0], test_changes[1], test_changes[2])
    karma.change_karma(test_changes[3])

    post_change = session.query(KarmaUser).get(test_changes[1]).karma_points
    assert post_change == (pre_change_karma + test_changes[3])
    session.close()
예제 #5
0
    def __init__(self, giver_id, receiver_id, channel_id):
        self.session = db_session.create_session()
        self.giver = self.session.query(KarmaUser).get(giver_id)
        self.receiver = self.session.query(KarmaUser).get(receiver_id)
        self.channel_id = channel_id
        self.last_score_maxed_out = False

        if not self.giver:
            self.giver = self._create_karma_user(giver_id)
        if not self.receiver:
            self.receiver = self._create_karma_user(receiver_id)
예제 #6
0
def get_user_name(**kwargs):
    """Shows the current Username"""
    user_id = kwargs.get("user_id").strip("<>@")

    session = create_session()
    karma_user: KarmaUser = session.query(KarmaUser).get(user_id)

    if not karma_user:
        return "Sorry, you are not yet known to karmabot. Try to give some Karma! :)"
    username = karma_user.username
    session.close()

    return f"Your current username for karmabot is '{username}'"
예제 #7
0
def top_karma(**kwargs):
    """Get the PyBites members with most karma"""
    output = ["PyBites members with most karma:"]

    session = db_session.create_session()
    top_users = (session.query(KarmaUser).order_by(
        KarmaUser.karma_points.desc()).limit(TOP_NUMBER))

    try:
        for top_user in top_users:
            output.append("{:<20} -> {}".format(top_user.username,
                                                top_user.karma_points))
        ret = "\n".join(output)
        return "```{}```".format(ret)

    finally:
        session.close()
예제 #8
0
def _add_note(text: str, user: KarmaUser) -> str:
    """Adds a new note to the database for the given user."""
    _, note_msg = _parse_note_cmd(text)
    if not note_msg:
        return f"Sorry {user.username}, could not find a note in your message."

    if _note_exists(note_msg, user):
        return f"Sorry {user.username}, you already have an identical note."

    note = KarmaNote(
        user_id=user.user_id, timestamp=datetime.datetime.now(), note=note_msg
    )

    session = db_session.create_session()
    session.add(note)
    session.commit()

    return f"Hey {user.username}, you've just stored a note."
예제 #9
0
def note(user_id: str, channel: str, text: str) -> Union[None, str]:
    """Allows the user to store and retrieve simple notes.

    - Syntax for adding a note: @karmabot note add <">my note<"> (note message can be in quotes)
    - Syntax for listing notes: @karmabot note list
    - Syntax for removing a note: @karmabote note del 1

    Each note is stored for the current user only. A user can only list and delete her own notes.
    """
    user_id = user_id.strip("<>@")

    # retrieve current user
    user = db_session.create_session().query(KarmaUser).get(user_id)
    cmd, _ = _parse_note_cmd(text)

    note_cmd_fnc = NOTE_COMMANDS.get(cmd, _command_not_found)

    return note_cmd_fnc(text, user)
예제 #10
0
def get_karma(**kwargs):
    """Get your current karma score"""
    user_id = kwargs.get("user_id").strip("<>@")

    session = db_session.create_session()
    kama_user = session.query(KarmaUser).get(user_id)

    try:
        if not kama_user:
            return "User not found"

        if kama_user.karma_points == 0:
            return "Sorry, you don't have any karma yet"

        return (
            f"Hey {kama_user.username}, your current karma is {kama_user.karma_points}"
        )

    finally:
        session.close()
예제 #11
0
def _del_note(text: str, user: KarmaUser) -> str:
    """Deletes the note with the given note id."""
    _, note_id = _parse_note_cmd(text)

    if not note_id:
        return f"Sorry {user.username}, it seems you did not provide a valid id."

    session = db_session.create_session()
    query = session.query(KarmaNote).filter_by(id=note_id, user_id=user.user_id)

    row_count = query.delete()
    session.commit()  # otherwise, the deletion is not performed

    if row_count:
        return f"Hey {user.username}, your note was successfully deleted."

    return (
        f"Sorry {user.username}, something went wrong, no record was deleted. "
        f"Please ask an admin..."
    )
예제 #12
0
def test_lookup_username(mock_filled_db_session, test_user_id, expected):
    karma_user = db_session.create_session().query(KarmaUser).get(test_user_id)
    assert karma_user.username == expected
예제 #13
0
def _note_exists(msg: str, user: KarmaUser) -> bool:
    session = db_session.create_session()
    q = session.query(KarmaNote).filter_by(note=msg, user_id=user.user_id)

    return session.query(q.exists()).scalar()  # returns True or False