def get_scoreboard(language: Language) -> List[UserScore]: session = database.get_session() board = [] if language == Language.TURKISH: users_sorted_by_score: List[User] = session \ .query(User) \ .filter(User.score_today_tr > 0) \ .order_by(User.score_today_tr.desc()) \ .all() for user in users_sorted_by_score: board.append( UserScore(user.id, user.username, user.score_today_tr)) elif language == Language.ENGLISH: users_sorted_by_score: List[User] = session \ .query(User) \ .filter(User.score_today_en > 0) \ .order_by(User.score_today_en.desc()) \ .all() for user in users_sorted_by_score: board.append( UserScore(user.id, user.username, user.score_today_en)) elif language == Language.ITALIAN: users_sorted_by_score: List[User] = session \ .query(User) \ .filter(User.score_today_it > 0) \ .order_by(User.score_today_it.desc()) \ .all() for user in users_sorted_by_score: board.append( UserScore(user.id, user.username, user.score_today_it)) return board
def unmute_everyone(): mwelog.info("Unmuting everyone") all_users = get_all_users() for user in all_users: user.muted = False session = database.get_session() database.commit(session)
def iterate(self, context: Optional[CallbackContext] = None): session = database.get_session() for language in Language.ENGLISH, Language.TURKISH, Language.ITALIAN: todays_mwe = get_todays_mwe(language) positive_together_count = session.query(Submission)\ .filter(Submission.category == SubmissionCategory.POSITIVE_TOGETHER)\ .filter(Submission.mwe == todays_mwe)\ .count() negative_together_count = session.query(Submission)\ .filter(Submission.category == SubmissionCategory.NEGATIVE_TOGETHER)\ .filter(Submission.mwe == todays_mwe)\ .count() diff = abs(positive_together_count - negative_together_count) if self.buffed_category[language] is None: if diff >= 15: if positive_together_count < negative_together_count: self.buffed_category[ language] = SubmissionCategory.POSITIVE_TOGETHER notification_manager.send_idioms_worth_more(context) else: self.buffed_category[ language] = SubmissionCategory.NEGATIVE_TOGETHER notification_manager.send_non_idioms_worth_more( context) else: if diff < 10: self.buffed_category[language] = None
def add_review(user: User, submission: Submission, category: ReviewCategory) -> Review: if user == submission.user: raise Exception("Review and submission user cannot be the same") review = Review( user=user, submission=submission, review_type=category, mwe=submission.mwe, created=datetime.now() ) if category == ReviewCategory.LIKE: if submission.language == Language.ENGLISH: submission.user.score_today_en += submission.points elif submission.language == Language.TURKISH: submission.user.score_today_tr += submission.points elif submission.language == Language.ITALIAN: submission.user.score_today_it += submission.points submission.user.score += submission.points submission.score += submission.points user.score += submission_scores.get_review_score() if submission.language == Language.ENGLISH: user.score_today_en += submission_scores.get_review_score() elif submission.language == Language.TURKISH: user.score_today_tr += submission_scores.get_review_score() elif submission.language == Language.ITALIAN: user.score_today_it += submission_scores.get_review_score() session = database.get_session() session.add(review) database.commit(session) return review
def put_config(key: str, value: str): session = get_session() _c = session.query(config).filter_by(key=key).first() _c.value = value session.commit() session.close() return value
def achievements_handler(user: User, update: Update, context: CallbackContext): session = database.get_session() level, next_threshold = get_level(user.score) update.message.reply_html( user.language.get(Token.LEVEL_MESSAGE) % (user.score, level, next_threshold)) today = datetime.now().date() user_submission_count_today = session.query(Submission)\ .filter(and_(Submission.user == user, func.Date(Submission.created) == today))\ .count() user_review_count_today = session.query(Review) \ .filter(and_(Review.user == user, func.Date(Review.created) == today)) \ .count() update.message.reply_html( user.language.get(Token.USER_DAILY_PLAY_DETAILS_MESSAGE) % (user_submission_count_today, user_review_count_today)) user_achievements = get_user_achievements(user) update.message.reply_html( user.language.get(Token.UNLOCKED_ACHIEVEMENTS) + "\n" + print_unlocked_achievements(user, user_achievements)) update.message.reply_html( user.language.get(Token.LOCKED_ACHIEVEMENTS) + "\n" + print_locked_achievements(user, user_achievements)) if user.became_champion and user.email is None: update.message.reply_text(user.language.get(Token.CHAMP_BUT_NO_EMAIL))
def _process_review_achievements(user: User, update: Update): session = database.get_session() todays_mwe = get_todays_mwe(user.language) user_review_count_today = session.query(Review)\ .filter(and_(Review.mwe == todays_mwe, Review.user == user)).count() if user_review_count_today == 10: award_achievement(user, AchievementType.REVIEW_LVL_1) update.message.reply_sticker(ACHIEVEMENT_STICKER) update.message.reply_html( user.language.get(Token.REVIEW_LVL_1_ACH_CONGRATS_MSG)) if user_review_count_today == 20: award_achievement(user, AchievementType.REVIEW_LVL_2) update.message.reply_sticker(ACHIEVEMENT_STICKER) update.message.reply_html( user.language.get(Token.REVIEW_LVL_2_ACH_CONGRATS_MSG)) if user_review_count_today == 40: award_achievement(user, AchievementType.REVIEW_LVL_3) update.message.reply_sticker(ACHIEVEMENT_STICKER) update.message.reply_html( user.language.get(Token.REVIEW_LVL_3_ACH_CONGRATS_MSG)) if user_review_count_today == 80: award_achievement(user, AchievementType.REVIEW_LVL_4) update.message.reply_sticker(ACHIEVEMENT_STICKER) update.message.reply_html( user.language.get(Token.REVIEW_LVL_4_ACH_CONGRATS_MSG)) if user_review_count_today == 160: award_achievement(user, AchievementType.REVIEW_LVL_5) update.message.reply_sticker(ACHIEVEMENT_STICKER) update.message.reply_html( user.language.get(Token.REVIEW_LVL_5_ACH_CONGRATS_MSG))
def get_log_all(log_type='bds'): session = get_session() if log_type is None: _c = session.query(bds_log).all() else: _c = session.query(bds_log).filter_by(log_type=log_type).all() session.close() return _c
def change_user_language(user: User, language: Language) -> None: session = database.get_session() user.language = language database.commit(session) mwelog.info("User {user_name} changed language to: {language}", user_name=user.username, user_id=user.id, language=str(user.language))
def flag_submission(user: User, submission_id: int, context: CallbackContext): if user.id == 1065263859: session = database.get_session() submission = session.query(Submission).filter( Submission.id == submission_id).first() submission.flagged = True database.commit(session) context.bot.send_message(user.id, f"Submission {submission_id} is flagged.")
def clear_scores_for_today(): mwelog.info("Clearing scores for today") all_users = get_all_users() for user in all_users: user.score_today_en = 0 user.score_today_tr = 0 user.score_today_it = 0 session = database.get_session() database.commit(session) scoreboard.clear()
def put_log(log_type: str, value: str, ignore=False): session = get_session() if ignore: value = '(ignore) ' + value else: _c = bds_log(time=datetime.now(), log=value, log_type=log_type) session.add(_c) session.commit() session.close() print(f'{log_type} > {value}')
def ban_user(user: User, user_id: int, context: CallbackContext): if user.id == 1065263859: session = database.get_session() banned_user = get_user(user_id) banned_user.banned = True for submission in session.query(Submission).filter( Submission.user == banned_user).all(): submission.flagged = True database.commit() context.bot.send_message(user.id, f"User {user_id} is banned.")
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 leave_team(userID: int): try: session = get_session() player = session.query(Player).filter(Player.id == userID).one() team_id = player.team_id player.team_id = None session.commit() session.close() return {'result': True, 'team_id': team_id} except NoResultFound: return {'result': False, 'team_id': team_id}
def init(): session = get_session() for key in default: # noinspection PyBroadException try: _config = config(key=key, value=default[key]) session.add(_config) session.commit() except: pass session.close()
def api_get_all_config(): session = get_session() _configs = session.query(config).all() session.close() configs = {} for v in _configs: configs[v.key] = v.value return self.get_body(body_code=200, body_type='config_all', body_content=configs, body_msg='OK')
def add_mwe(name: str, meaning: str, language: Language, date: date, lemmas: List[str], category: MweCategory) -> None: session = database.get_session() mwe = Mwe(name=name, meaning=meaning, language=language, date=date, lemmas=lemmas, category=category) session.add(mwe) database.commit(session)
def create_team(leaderID: int): try: session = get_session() new_team = Team(leader_id=leaderID) session.add(new_team) session.commit() player = session.query(Player).filter(Player.id == leaderID).one() player.team_id = new_team.id session.commit() session.close() return {'result': True, 'team_id': new_team.id} except NoResultFound: return {'result': False, 'team_id': None}
def scoreboard_handler(user: User, update: Update, context: CallbackContext): scoreboard.send_to_user(user, update) todays_mwe = get_todays_mwe(user.language) session = database.get_session() submission_count_now = session.query(Submission).filter( Submission.mwe == todays_mwe).count() if submission_count_now < 100: update.message.reply_text( user.language.get(Token.TODAYS_TARGET) % (100 - submission_count_now)) if user.became_champion and user.email is None: update.message.reply_text(user.language.get(Token.CHAMP_BUT_NO_EMAIL)) update.message.reply_text(user.language.get(Token.SURVEY_MESSAGE))
def get_config(key: str): session = get_session() _c = session.query(config).filter_by(key=key).first() if (_c is None) and (key in default.keys()): _c = config(key=key, value=default[key]) session.add(_c) session.commit() return get_config(key) session.close() if _c is None: return None else: return _c.value
def create_feedback_data_for_user(user: User) -> FeedbackData: data = FeedbackData() data.user = user data.review_count = len(user.reviews) data.submission_count = len(user.submissions) data.created = datetime.now() session = database.get_session() try: session.add(data) session.commit() return data except: session.rollback() raise
def join_team(userID: int, teamID: int = None, leaderID: int = None): try: session = get_session() if teamID is not None: team = session.query(Team).filter(Team.id == teamID).one() elif leaderID is not None: team = session.query(Team).filter(Team.leader_id == leaderID).one() player = session.query(Player).filter(Player.id == userID).one() player.team_id = team.id session.commit() session.close() return {'result': True, 'team_id': team.id} except NoResultFound: return {'result': False, 'team_id': None}
def send_i_need_x_examples(self, context: CallbackContext): self._clear_old_notifications() language = mwexpress_config.language todays_mwe = get_todays_mwe(language) session = database.get_session() submission_count_now = session.query(Submission).filter( Submission.mwe == todays_mwe).count() if submission_count_now < 100: for user in get_all_users(): self._send_notification( context, user.id, user.language.get(Token.TODAYS_TARGET) % (100 - submission_count_now), NotificationType.I_NEED_X_EXAMPLES, SAD_RAIN_STICKER) time.sleep(0.3)
def get_submissions_to_review(mwe: Mwe, user: User) -> List[Submission]: session = database.get_session() submissions = session.query(Submission) \ .filter(Submission.user != user) \ .filter(Submission.mwe == mwe) \ .filter(Submission.flagged == False) \ .all() reviews_made_by_user = session.query(Review) \ .filter(Review.user == user) \ .filter(Review.mwe == mwe) \ .all() reviews_made_by_user_sub_ids = [ x.submission_id for x in reviews_made_by_user ] submissions = sorted(submissions, key=lambda x: x.review_count) return [x for x in submissions if x.id not in reviews_made_by_user_sub_ids]
def get_user_from_update(update: Update) -> User: session = database.get_session() user = get_user(update.effective_user.id) if user is None: username = update.effective_user.username if username is None: username = update.effective_user.id return add_user_with_id(update.effective_user.id, username, mwexpress_config.language) else: if (user.username == str(user.id) or user.username is None) and update.effective_user.username is not None: user.username = update.effective_user.username database.commit(session) return user
def XBoxInput(update: Update, context: CallbackContext): context.bot.send_message(chat_id=update.effective_chat.id, text="请稍等,我们正在绑定") if get_player_by_xbox_id(update.message.text) is None: session = get_session() session.add( Player(id=update.effective_user.id, xbox_id=update.message.text, tp_number=RANDOM_TP)) session.commit() session.close() context.bot.send_message(chat_id=update.effective_chat.id, text="绑定成功") return ConversationHandler.END else: context.bot.send_message(chat_id=update.effective_chat.id, text="此账号已经被别人绑定了哦!如果这是你的账号,请联系管理") return ConversationHandler.END
def join_team_callback(update: Update, context: CallbackContext): query = update.callback_query team_id = int(re.search(r'[0-9]*', query.data).group()) session = get_session() player = get_player_by_player_id(query.from_user.id) team = session.query(Team).filter(Team.id == team_id).one_or_none() if player is None: context.bot.send_message(chat_id=update.effective_chat.id, text='加入失败!您未绑定玩家信息。', reply_to_message_id=update.message.message_id) return if team is None: context.bot.send_message(chat_id=update.effective_chat.id, text='不存在的队伍!', reply_to_message_id=update.message.message_id) return team_members = team.members if len(team_members) == TEAM_MEMBER_MAX: context.bot.send_message(chat_id=update.effective_chat.id, text='队伍已满!无法加入。', reply_to_message_id=update.message.message_id) return player.team_id = team_id session.commit() team_members = team.members text = '' leader = get_player_by_player_id(team.leader_id) keyboard = [ InlineKeyboardButton('Join!!!', callback_data=('join'.join(str(team.id)))) ] for i in team_members: text.join(i.xbox_id + '\n') if len(team_members) == TEAM_MEMBER_MAX: context.bot.edit_message_text(chat_id=query.message.chat_id, message_id=query.message.message_id, text=('%s的队伍已满!现有成员:\n%s' % leader.xbox_id, text)) else: context.bot.edit_message_text( chat_id=query.message.chat_id, message_id=query.message.message_id, text=('%s的队伍正在招募(%s/%s),现有成员:\n %s' % leader.xbox_id, str(len(team_members)), str(TEAM_MEMBER_MAX), text), reply_markup=InlineKeyboardMarkup(keyboard))
def add_user(name: str, language: Language) -> User: user = User( username=name, language=language, viewed_help=False, viewed_todays_mwe_help=False, viewed_submission_help=False, viewed_review_help=False, score=0.0, score_today_en=0.0, score_today_tr=0.0, muted=False, created=datetime.now() ) session = database.get_session() session.add(user) database.commit(session) return user
def rtp(update: Update, context: CallbackContext): user = update.message.from_user session = get_session() player = get_player_by_player_id(user.id) if player is None: context.bot.send_message(chat_id=update.effective_chat.id, text="您没有绑定哦~请使用/bind [XboxID]进行绑定", reply_to_message_id=update.message.message_id) if player.TpNumber < RANDOM_TP: res = sendCommand('testfor \"%s\"' % player.XBoxID, '1') if not res['status']: context.bot.send_message( chat_id=update.effective_chat.id, text='服务器去火星了,等会儿再试试吧! 错误信息:' % res.msg, reply_to_message_id=update.message.message_id) elif res['content'][0]['log'] != 'No targets matched selector': player.TpNumber += 1 session.commit() session.close() x = random.randint(30000, 70000) * -1 # 随机X轴 z = random.randint(30000, 70000) * -1 # 随机Z轴 sendCommand('effect \"%s\" resistance 15 5 true' % player.XBoxID, '1') time.sleep(0.2) sendCommand('tp \"%s\" %s 120 %s' % (player.XBoxID, x, z), '0') context.bot.send_message( chat_id=update.effective_chat.id, text= f'您已被传送至{x},120,{z}\n使用次数:{player.TpNumber}/{RANDOM_TP}\n传送本不易,且行且珍惜', reply_to_message_id=update.message.message_id) else: context.bot.send_message( chat_id=update.effective_chat.id, text='您当前不在线上!', reply_to_message_id=update.message.message_id) else: context.bot.send_message(chat_id=update.effective_chat.id, text='今日随机传送次数已用完,且行且珍惜', reply_to_message_id=update.message.message_id)