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))
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))
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")
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)
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))
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))
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))
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))
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")
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))
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))
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)
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))
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))