Ejemplo n.º 1
0
def confirm_email(user: User, update: Update, context: CallbackContext):
    available_inputs = [
        user.language.get(Token.YES),
        user.language.get(Token.NO),
        user.language.get(Token.CANCEL)
    ]

    message = update.message.text

    if message not in available_inputs:
        reply_to(user,
                 update,
                 user.language.get(Token.ENTER_VALID_COMMAND),
                 reply_markup=Keyboard.email_verify_keyboard(user.language))
        return

    if message == user.language.get(Token.YES):
        email = context.user_data["email"]
        user.email = email
        update_user(user)
        _clear_context(context)
        reply_html(user, update,
                   user.language.get(Token.EMAIL_SET) % email,
                   Keyboard.main(user))
        mwelog.info(f"{user.username} confirms {email} is correct")
        try:
            context.bot.send_message(
                mwexpress_config.moderator,
                f"{user.username} set their email as: {email}")
        except Exception as ex:
            mwelog.exception(ex)
    else:
        _clear_context(context)
        reply_to(user, update, user.language.get(Token.EMAIL_CANCELLED),
                 Keyboard.main(user))
Ejemplo n.º 2
0
def help_handler(user: User, update: Update, context: CallbackContext) -> None:
    context.bot.send_sticker(update.effective_chat.id, TIPS_FEDORA_STICKER)
    session = database.get_session()
    if not user.viewed_help:
        user.viewed_help = True
        database.commit(session)
    reply_to(user, update, user.language.get(Token.HELP_MESSAGE),
             Keyboard.main(user))
    reply_to(user, update, user.language.get(Token.DISCLAIMER),
             Keyboard.main(user))
Ejemplo n.º 3
0
def _send_submission_to_review(user: User, update: Update,
                               context: CallbackContext):
    if not user.viewed_review_help:
        reply_to(user, update, user.language.get(Token.REVIEW_HELP_MESSAGE_1))
        time.sleep(4)
        reply_to(user, update, user.language.get(Token.REVIEW_HELP_MESSAGE_2))
        time.sleep(4)
        user.viewed_review_help = True
        update_user(user)

    todays_mwe = get_todays_mwe(user.language)
    submissions = get_submissions_to_review(todays_mwe, user)

    if len(submissions) > 0:
        submission: Submission = submissions[0]
        context.user_data["submission"] = submission
        if "review_count" not in context.user_data:
            context.user_data["review_count"] = 0

        parsed = parser.parse(submission.value, submission.mwe)
        review_example = submission.value
        for index in reversed(sorted(submission.mwe_indices)):
            start_index = parsed.token_positions[index][0]
            end_index = parsed.token_positions[index][1]
            review_example = review_example[:
                                            end_index] + "</u></b>" + review_example[
                                                end_index:]
            review_example = review_example[:
                                            start_index] + "<b><u>" + review_example[
                                                start_index:]

        if submission.category == SubmissionCategory.POSITIVE_SEPARATED or \
                submission.category == SubmissionCategory.POSITIVE_TOGETHER:
            review_question = user.language.get(Token.REVIEW_QUESTION_POSITIVE) \
                              % (review_example, _get_word_list_str_from_submission(submission))
            reply_html(user, update, review_question,
                       Keyboard.review_keyboard(user.language))
        else:
            review_question = user.language.get(Token.REVIEW_QUESTION_NEGATIVE) \
                              % (review_example, _get_word_list_str_from_submission(submission))
            reply_html(user, update, review_question,
                       Keyboard.review_keyboard(user.language))
    else:
        if "review_count" in context.user_data:
            reply_to(user, update,
                     user.language.get(Token.NO_SUB_LEFT_TO_REVIEW),
                     Keyboard.main(user))
        else:
            reply_to(user, update, user.language.get(Token.NO_SUBMISSIONS),
                     Keyboard.main(user))
        clear_state(context)
        unmute_user(user.id)
        _safe_delete_context_data(context, "submission")
        _safe_delete_context_data(context, "review_count")
Ejemplo n.º 4
0
def _review_answer_handler(user: User, update: Update,
                           context: CallbackContext):
    mute_user(user.id)
    available_inputs = [
        user.language.get(Token.AGREE_NICE_EXAMPLE),
        user.language.get(Token.DO_NOT_LIKE_EXAMPLE),
        user.language.get(Token.REPORT_SUBMISSION),
        user.language.get(Token.QUIT_REVIEWING)
    ]

    if update.message.text not in available_inputs:
        reply_to(user, update,
                 user.language.get(Token.PLEASE_ENTER_VALID_REVIEW),
                 Keyboard.review_keyboard(user.language))
        return

    submission = context.user_data["submission"]
    context.user_data["review_count"] += 1

    if update.message.text == user.language.get(Token.AGREE_NICE_EXAMPLE):
        add_review(user, submission, ReviewCategory.LIKE)
        reply_to(
            user, update,
            user.language.get(Token.THANKS_FOR_REVIEW) %
            (get_random_congrats_message(
                user.language), submission_scores.get_review_score()))
        _process_review_achievements(user, update)
        notification_manager.send_someone_liked_your_example(
            submission.user, context)
        scoreboard.iterate(update, context)
    elif update.message.text == user.language.get(Token.DO_NOT_LIKE_EXAMPLE):
        add_review(user, submission, ReviewCategory.DISLIKE)
        reply_to(
            user, update,
            user.language.get(Token.THANKS_FOR_REVIEW) %
            (get_random_congrats_message(
                user.language), submission_scores.get_review_score()))
        _process_review_achievements(user, update)
        scoreboard.iterate(update, context)
    elif update.message.text == user.language.get(Token.REPORT_SUBMISSION):
        add_review(user, submission, ReviewCategory.SKIP)
        reply_to(user, update,
                 user.language.get(Token.REPORT_SUBMISSION_REPLY))
        context.bot.send_message(
            mwexpress_config.moderator,
            f"Someone reported this submission: {submission.value}\n"
            f"Flag submission: /flag{submission.id}, "
            f"ban user: /ban{submission.user.id}")
        _process_review_achievements(user, update)
        scoreboard.iterate(update, context)
    else:
        unmute_user(user.id)
        reply_to(user, update, user.language.get(Token.REVIEW_CANCELLED),
                 Keyboard.main(user))
        _safe_delete_context_data(context, "submission")
        clear_state(context)
        return

    _send_submission_to_review(user, update, context)
Ejemplo n.º 5
0
    def send_to_user(self, user: User, update: Update):
        board = self.scoreboards[user.language]
        if len(board) > 0:
            scoreboard_message = user.language.get(Token.TOP_FIVE_USERS)
            user_appeared_in_first_five = False
            for i in range(0, 5):
                if i >= len(board):
                    break
                rankings = ["🥇", "🥈", "🥉", "4\.", "5\."]
                username = board[i].username
                if user.id == board[i].user_id:
                    username = "******" % (username,
                                                user.language.get(Token.YOU))
                    user_appeared_in_first_five = True
                ranking = rankings[i]
                if user.id == board[i].user_id:
                    ranking = "*%s*" % ranking
                point = board[i].score
                change = ""
                old_ranking = self.get_old_ranking(board[i].user_id,
                                                   user.language)
                if old_ranking > i:
                    change = "🔼 "
                elif old_ranking < i:
                    change = "🔻 "
                scoreboard_message += "%s %s%s \- %d" % (
                    ranking, change, username, point) + "\n"

            if not user_appeared_in_first_five:
                for i in range(len(board)):
                    if board[i].user_id == user.id:
                        scoreboard_message += "\.\.\.\n"
                        scoreboard_message += "%d\. %s \- %d" % (
                            i + 1, user.username, board[i].score) + "\n"

            update.message.reply_text(
                scoreboard_message,
                parse_mode=telegram.ParseMode.MARKDOWN_V2,
                reply_markup=Keyboard.main(user))
        else:
            update.message.reply_text(user.language.get(
                Token.SCOREBOARD_EMPTY),
                                      parse_mode=telegram.ParseMode.MARKDOWN,
                                      reply_markup=Keyboard.main(user))
Ejemplo n.º 6
0
def todays_mwe_handler(user: User, update: Update):
    now = datetime.now().time()
    if mwexpress_config.start_time <= now <= mwexpress_config.end_time:
        todays_mwe = get_todays_mwe(user.language)
        update.message.reply_text(
            text=user.language.get(Token.TODAYS_MWE_REPLY_TEXT) %
            (todays_mwe.name, todays_mwe.meaning),
            parse_mode=ParseMode.HTML,
            reply_markup=Keyboard.main(user))
        if submission_scores.buffed_category[user.language] is not None:
            notification_messages = {
                SubmissionCategory.POSITIVE_TOGETHER: Token.POS_TOG_WORTH_MORE,
                SubmissionCategory.POSITIVE_SEPARATED:
                Token.POS_SEP_WORTH_MORE,
                SubmissionCategory.NEGATIVE_TOGETHER: Token.NEG_TOG_WORTH_MORE
            }
            update.message.reply_html(
                user.language.get(notification_messages[
                    submission_scores.buffed_category[user.language]]))
        if not user.viewed_todays_mwe_help:
            time.sleep(3)
            update.message.reply_text(text=user.language.get(
                Token.TODAYS_MWE_HELP_MESSAGE_1),
                                      parse_mode=ParseMode.MARKDOWN,
                                      reply_markup=Keyboard.main(user))
            time.sleep(5)
            update.message.reply_text(text=user.language.get(
                Token.TODAYS_MWE_HELP_MESSAGE_2),
                                      parse_mode=ParseMode.HTML,
                                      reply_markup=Keyboard.main(user))
            user.viewed_todays_mwe_help = True
            update_user(user)
    else:
        reply_to(user,
                 update,
                 user.language.get(Token.GAME_HOURS_FINISHED) %
                 mwexpress_config.start_time.hour,
                 reply_markup=Keyboard.main(user))
Ejemplo n.º 7
0
def language_update_handler(user: User, update: Update,
                            context: CallbackContext) -> None:
    if update.message.text == user.language.get(Token.LANGUAGE_ENGLISH):
        change_user_language(user, Language.ENGLISH)
        clear_state(context)
        reply_to(user, update,
                 user.language.get(Token.LANGUAGE_CHANGE_SUCCESSFUL),
                 Keyboard.main(user))
    elif update.message.text == user.language.get(Token.LANGUAGE_TURKISH):
        change_user_language(user, Language.TURKISH)
        clear_state(context)
        reply_to(user, update,
                 user.language.get(Token.LANGUAGE_CHANGE_SUCCESSFUL),
                 Keyboard.main(user))
    else:
        mwelog.info(
            "User {user_name} entered wrong value ({message}) for language change.",
            user_name=user.username,
            user_id=user.id,
            message=update.message.text)
        reply_to(user, update,
                 user.language.get(Token.PLEASE_SELECT_VALID_LANGUAGE),
                 Keyboard.language_selection(user.language))
Ejemplo n.º 8
0
def main_review_handler(user: User, update: Update, context: CallbackContext):
    now = datetime.now().time()
    if mwexpress_config.start_time <= now < mwexpress_config.end_time:
        set_state(context, State.REVIEWING)

        if "submission" in context.user_data:
            _review_answer_handler(user, update, context)
            return

        _send_submission_to_review(user, update, context)
    else:
        clear_state(context)
        unmute_user(user.id)
        _safe_delete_context_data(context, "submission")
        _safe_delete_context_data(context, "review_count")
        reply_to(user,
                 update,
                 user.language.get(Token.GAME_HOURS_FINISHED) %
                 mwexpress_config.start_time.hour,
                 reply_markup=Keyboard.main(user))
Ejemplo n.º 9
0
def send_game_starting_message_to_all() -> None:
    mwelog.info("Sending game started message to all users")
    unmute_everyone()
    all_users = get_all_users()
    for user in all_users:
        try:
            mwexpress_bot.bot.send_sticker(user.id, GOOD_MORNING_STICKER)
            send_message_to_user(mwexpress_bot.bot, user,
                                 user.language.get(Token.GAME_STARTED))
            todays_mwe = get_todays_mwe(user.language)
            send_message_to_user(
                mwexpress_bot.bot,
                user,
                user.language.get(Token.TODAYS_MWE_REPLY_TEXT) %
                (todays_mwe.name, todays_mwe.meaning),
                reply_markup=Keyboard.main(user),
                parse_mode=ParseMode.HTML)
            time.sleep(0.3)
        except Exception as ex:
            mwelog.exception(str(ex))
    mwelog.info("Sent game started message to all users")
Ejemplo n.º 10
0
def start(update: Update, context: CallbackContext):
    user = get_user_from_update(update)

    mwelog.info("User {user_name} started using Mwexpress",
                user_name=user.username,
                user_id=user.id)

    clear_state(context)

    context.bot.send_sticker(update.effective_chat.id, TIPS_FEDORA_STICKER)
    reply_to(user, update, user.language.get(Token.WELCOME_MESSAGE_1),
             Keyboard.remove())
    time.sleep(2)
    reply_to(user, update, user.language.get(Token.WELCOME_MESSAGE_2),
             Keyboard.remove())
    time.sleep(5)
    reply_to(user, update, user.language.get(Token.WELCOME_MESSAGE_3),
             Keyboard.remove())
    time.sleep(3)
    reply_to(user, update, user.language.get(Token.WELCOME_MESSAGE_4),
             Keyboard.remove())
    time.sleep(2)
    reply_to(user, update, user.language.get(Token.WELCOME_MESSAGE_5),
             Keyboard.remove())
    time.sleep(5)
    reply_to(user, update, user.language.get(Token.WELCOME_MESSAGE_6),
             Keyboard.remove())
    time.sleep(10)
    update.message.reply_text(text=user.language.get(Token.WELCOME_MESSAGE_7),
                              parse_mode=ParseMode.HTML,
                              reply_markup=Keyboard.remove())
    time.sleep(5)
    context.bot.send_photo(user.id, open("assets/keyboard_button.png", "rb"))
    time.sleep(0.5)
    reply_to(user, update, user.language.get(Token.WELCOME_MESSAGE_8))
    time.sleep(5)
    reply_to(user, update, user.language.get(Token.DISCLAIMER),
             Keyboard.main(user))
Ejemplo n.º 11
0
def main_submit_handler(user: User, update: Update, context: CallbackContext):
    set_state(context, State.SUBMISSION)
    sub_state = context.user_data["sub_state"] \
        if "sub_state" in context.user_data \
        else None

    now = datetime.now().time()
    if mwexpress_config.start_time <= now < mwexpress_config.end_time:
        mute_user(user.id)
        if sub_state is None:
            start_submit_handler(user, update, context)
        elif sub_state == "typing_example":
            submit_message_handler(user, update, context)
        elif sub_state == "choosing_category":
            submit_category_handler(user, update, context)
    else:
        unmute_user(user.id)
        _clear_context(context)
        reply_to(user,
                 update,
                 user.language.get(Token.GAME_HOURS_FINISHED) %
                 mwexpress_config.start_time.hour,
                 reply_markup=Keyboard.main(user))
Ejemplo n.º 12
0
def submit_category_handler(user: User, update: Update,
                            context: CallbackContext) -> None:
    available_inputs = [
        user.language.get(Token.FORMS_SPECIAL_MEANING),
        user.language.get(Token.DOES_NOT_FORM_SPECIAL_MEANING),
        user.language.get(Token.CANCEL)
    ]
    if update.message.text not in available_inputs:
        reply_to(user, update,
                 user.language.get(Token.ENTER_VALID_MWE_CATEGORY),
                 Keyboard.submission_category(user.language))
        return

    if update.message.text == user.language.get(Token.CANCEL):
        _clear_context(context)
        unmute_user(user.id)
        reply_to(user, update, user.language.get(Token.SUBMISSION_CANCELLED),
                 Keyboard.main(user))
        return

    parsed = context.user_data["parsed"]
    todays_mwe = get_todays_mwe(user.language)
    positive = update.message.text == user.language.get(
        Token.FORMS_SPECIAL_MEANING)
    submission = add_submission(user, parsed, todays_mwe, positive)

    unmute_user(user.id)
    _clear_context(context)

    reply_to(
        user, update,
        user.language.get(Token.THANKS_FOR_SUBMISSION) %
        (get_random_congrats_message(user.language), submission.points),
        Keyboard.main(user))

    if random.random() < 0.75:
        time.sleep(1)
        send_hint_message(user, update, context)

    session = database.get_session()
    submission_count_now = session.query(Submission).filter(
        Submission.mwe == todays_mwe).count()
    if submission_count_now == 1:
        # award first submission
        award_achievement(user, AchievementType.FIRST_SUBMISSION)
        update.message.reply_sticker(ACHIEVEMENT_STICKER)
        update.message.reply_html(
            user.language.get(Token.FIRST_SUB_ACH_CONGRATS_MSG))

    # if submission_count_now < 100:
    #     update.message.reply_text(user.language.get(Token.TODAYS_TARGET) % (100 - submission_count_now))

    now = datetime.now()
    start_datetime = datetime.combine(now, mwexpress_config.start_time)
    start_diff = now - start_datetime
    if start_diff.total_seconds() < 1800:
        # award early bird
        if not user_has_achievement(user, AchievementType.EARLY_BIRD):
            award_achievement(user, AchievementType.EARLY_BIRD)
            update.message.reply_sticker(ACHIEVEMENT_STICKER)
            update.message.reply_html(
                user.language.get(Token.EARLY_BIRD_ACH_CONGRATS_MSG))

    today_sub_count_by_user = session.query(Submission)\
        .filter(and_(Submission.mwe == todays_mwe, Submission.user == user)).count()
    if today_sub_count_by_user == 5:
        award_achievement(user, AchievementType.SUB_LVL_1)
        update.message.reply_sticker(ACHIEVEMENT_STICKER)
        update.message.reply_html(
            user.language.get(Token.SUB_LVL_1_ACH_CONGRATS_MSG))
    if today_sub_count_by_user == 10:
        award_achievement(user, AchievementType.SUB_LVL_2)
        update.message.reply_sticker(ACHIEVEMENT_STICKER)
        update.message.reply_html(
            user.language.get(Token.SUB_LVL_2_ACH_CONGRATS_MSG))
    if today_sub_count_by_user == 20:
        award_achievement(user, AchievementType.SUB_LVL_3)
        update.message.reply_sticker(ACHIEVEMENT_STICKER)
        update.message.reply_html(
            user.language.get(Token.SUB_LVL_3_ACH_CONGRATS_MSG))
    if today_sub_count_by_user == 40:
        award_achievement(user, AchievementType.SUB_LVL_4)
        update.message.reply_sticker(ACHIEVEMENT_STICKER)
        update.message.reply_html(
            user.language.get(Token.SUB_LVL_4_ACH_CONGRATS_MSG))
    if today_sub_count_by_user == 70:
        award_achievement(user, AchievementType.SUB_LVL_5)
        update.message.reply_sticker(ACHIEVEMENT_STICKER)
        update.message.reply_html(
            user.language.get(Token.SUB_LVL_5_ACH_CONGRATS_MSG))

    submission_scores.iterate(context)
Ejemplo n.º 13
0
def feedback_handler(user: User, update: Update,
                     context: CallbackContext) -> None:
    reply_to(user, update, user.language.get(Token.FEEDBACK_MESSAGE),
             Keyboard.main(user))
    reply_to(user, update, user.language.get(Token.FEEDBACK_URL),
             Keyboard.main(user))
Ejemplo n.º 14
0
def message(update: Update, context: CallbackContext):
    user = get_user_from_update(update)
    try:
        mwelog.info("New message from {user_name}: {message}",
                    user_name=user.username,
                    message=update.message.text)

        if user.banned:
            update.message.reply_text(
                user.language.get(Token.USER_IS_BANNED_MESSAGE))
            return

        if update.message.text.startswith("/flag"):
            flag_submission(user, int(update.message.text.replace("/flag",
                                                                  "")),
                            context)
            return
        if update.message.text.startswith("/ban"):
            ban_user(user, int(update.message.text.replace("/ban", "")),
                     context)
            return

        if mwexpress_config.game_stopped:
            update.message.reply_sticker(COFFEE_STICKER)
            update.message.reply_text(
                user.language.get(Token.GAME_TEMPORARILY_STOPPED))
            update.message.reply_text(user.language.get(Token.SURVEY_MESSAGE))
            return

        if get_state(context) != State.NONE:
            state = get_state(context)
            mwelog.info("Current state for {user_name}: {state}",
                        user_name=user.username,
                        state=str(state))
            if state == State.SUBMISSION:
                main_submit_handler(user, update, context)
            elif state == State.CHANGING_LANGUAGE:
                language_update_handler(user, update, context)
            elif state == State.REVIEWING:
                main_review_handler(user, update, context)
            elif state == State.ADDING_EMAIL:
                main_email_handler(user, update, context)
        else:
            if update.message.text == user.language.get(Token.TODAYS_MWE):
                todays_mwe_handler(user, update)
            elif update.message.text == user.language.get(Token.SUBMIT):
                main_submit_handler(user, update, context)
            elif update.message.text == user.language.get(
                    Token.CHANGE_LANGUAGE):
                language_change_handler(user, update, context)
            elif update.message.text == user.language.get(Token.HELP):
                help_handler(user, update, context)
            elif update.message.text == user.language.get(Token.REVIEW):
                main_review_handler(user, update, context)
            elif update.message.text == user.language.get(Token.FEEDBACK):
                feedback_handler(user, update, context)
            elif update.message.text == user.language.get(
                    Token.SHOW_SCOREBOARD):
                scoreboard_handler(user, update, context)
            elif update.message.text == user.language.get(Token.ACHIEVEMENTS):
                achievements_handler(user, update, context)
            elif update.message.text == user.language.get(Token.ADD_EMAIL):
                main_email_handler(user, update, context)
            elif submission_contains_todays_mwe(user, update.message.text):
                context.user_data["sub_state"] = "typing_example"
                main_submit_handler(user, update, context)
            else:
                update.message.reply_text(user.language.get(
                    Token.ENTER_VALID_COMMAND),
                                          parse_mode=ParseMode.MARKDOWN,
                                          reply_markup=Keyboard.main(user))
                context.bot.send_photo(
                    user.id, open("assets/keyboard_button.png", "rb"))
                update.message.reply_text(user.language.get(
                    Token.WELCOME_MESSAGE_8),
                                          parse_mode=ParseMode.MARKDOWN,
                                          reply_markup=Keyboard.main(user))

    except Exception as ex:
        clear_state(context)
        unmute_user(user.id)
        _safe_delete_context_data(context, "sub_state")
        _safe_delete_context_data(context, "parsed")
        _safe_delete_context_data(context, "submission")
        mwelog.error(
            f"erroneous message: {user.username}: {update.message.text}")
        mwelog.exception(str(ex))
        update.message.reply_text(user.language.get(Token.ERROR_OCCURRED),
                                  reply_markup=Keyboard.main(user))