def update_competitor_db_record(table_row, competitor: Competitor): competitor.level = to_int(table_row[3], None) competitor.matches = to_int(table_row[4]) competitor.wins = to_int(table_row[5]) competitor.losses = to_int(table_row[6]) competitor.performance = to_int(table_row[7]) competitor.save()
def confirm_results(self, message: Message, user: User, bot: TeleBot, competitor: Competitor): res = user.check_result() if not res: pass # TODO opponent, opponent_user = get_opponent_and_opponent_user(competitor) if not opponent or not opponent_user: res.delete() return teardown_challenge( competitor, message, user, bot, 'challenge_confirm_cannot_find_opponent_msg' if not opponent else 'challenge_confirm_cannot_fin_opponents_user_msg') if not user.dismiss_confirmed: bot.send_message( message.chat.id, get_translation_for('result_confirmation_confirm_msg')) user.dismiss_confirmed = True user.save() return RET.OK, None, None, None else: user.dismiss_confirmed = False user.save() pa = res.player_a.fetch() pb = res.player_b.fetch() winner: Competitor loser: Competitor if res.result == RESULT.A_WINS: winner = pa loser = pb elif res.result == RESULT.B_WINS: winner = pb loser = pa else: logger.error('INCONSISTENT RESULT OF A RESULT') return RET.GO_TO_STATE, 'MenuState', None, None res.confirmed = True res.date = datetime.now(timezone('Europe/Kiev')) res.player_a_s = pa.name res.player_b_s = pb.name winner.wins = winner.wins + 1 if winner.wins is not None else 1 winner.matches = winner.matches + 1 if winner.matches is not None else 1 winner.change_status(COMPETITOR_STATUS.ACTIVE) winner.previous_status = None winner.previous_challenge_status = None winner.challenge_started_at = None winner.in_challenge_with = None winner.save() UsersSheet.update_competitor_table_record(winner) loser.losses = loser.losses + 1 if loser.losses is not None else 1 loser.matches = loser.matches + 1 if loser.matches is not None else 1 loser.change_status(loser.previous_status) loser.previous_status = None loser.previous_challenge_status = None loser.challenge_started_at = None loser.in_challenge_with = None loser.save() UsersSheet.update_competitor_table_record(loser) prev_level, new_level = None, None if winner.level > loser.level: prev_level = winner.level new_level = loser.level res.level_change = f'{prev_level}->{new_level}' res.save() opponent.reload() competitor.reload() if prev_level: if opponent == winner: sw = smwae_check( opponent_user.user_id, get_translation_for( 'result_confirmation_confirmed_opponent_msg') + '\n' + get_translation_for('your_level_changed_str').format( prev_level, new_level), opponent_user, reply_markup=get_menu_keyboard(status=opponent.status)) bot.send_message( message.chat.id, get_translation_for('result_confirmation_confirmed_msg') + '\n' + get_translation_for('your_level_changed_str').format( new_level, prev_level), ) opponent.reload() opponent.level = new_level opponent.save() UsersSheet.update_competitor_table_record(opponent) competitor.reload() competitor.level = prev_level competitor.save() UsersSheet.update_competitor_table_record(competitor) else: sw = smwae_check( opponent_user.user_id, get_translation_for( 'result_confirmation_confirmed_opponent_msg') + '\n' + get_translation_for('your_level_changed_str').format( new_level, new_level), opponent_user, reply_markup=get_menu_keyboard(status=opponent.status)) bot.send_message( message.chat.id, get_translation_for('result_confirmation_confirmed_msg') + '\n' + get_translation_for('your_level_changed_str').format( prev_level, new_level), ) competitor.reload() competitor.level = new_level competitor.save() UsersSheet.update_competitor_table_record(competitor) opponent.reload() opponent.level = prev_level opponent.save() UsersSheet.update_competitor_table_record(opponent) else: sw = smwae_check( opponent_user.user_id, get_translation_for( 'result_confirmation_confirmed_opponent_msg'), opponent_user, reply_markup=get_menu_keyboard(status=opponent.status)) opponent_user.reload() opponent_user.current_result = None opponent_user.states.append('MenuState') if len(opponent_user.states) > STATES_HISTORY_LEN: del opponent_user.states[0] opponent_user.save() user.reload() user.current_result = None user.save() res.reload() ResultsSheet.upload_result(res) if not res.level_change: LogsSheet.glog( get_translation_for('gsheet_log_game_finished').format( competitor.name, opponent.name, winner.name, res.repr_score())) else: LogsSheet.glog( get_translation_for('gsheet_log_game_finished').format( competitor.name, opponent.name, winner.name, res.repr_score()) + '. ' + get_translation_for('group_chat_players_level_changed').format( res.level_change)) config = get_config() if config.group_chat_id: score = res.repr_score() gmsg = get_translation_for('group_chat_match_result_msg').format( winner.name, loser.name, score) if res.level_change: gmsg += '.\n' gmsg += get_translation_for( 'group_chat_players_level_changed').format( res.level_change) try: bot.send_message(config.group_chat_id, gmsg, parse_mode='html') except: logger.exception( 'Exception occurred while sending message to group chat') return RET.GO_TO_STATE, 'MenuState', message, user
def dismiss_button(self, message: Message, user: User, bot: TeleBot, competitor: Competitor): defeat = False if not user.dismiss_confirmed: if competitor.previous_status == COMPETITOR_STATUS.PASSIVE: bot.send_message( message.chat.id, get_translation_for('challenge_confirm_technical_defeat') ) else: bot.send_message( message.chat.id, get_translation_for('challenge_received_dismiss_confirm_msg') ) user.dismiss_confirmed = True user.save() return RET.OK, None, None, None else: user.dismiss_confirmed = False user.save() if competitor.previous_status == COMPETITOR_STATUS.PASSIVE and competitor.challenges_dismissed_in_a_row >= 1: defeat = True opponent, opponent_user = get_opponent_and_opponent_user(competitor) if not opponent or not opponent_user: return teardown_challenge( competitor, message, user, bot, 'challenge_confirm_cannot_find_opponent_msg' if not opponent else 'challenge_confirm_cannot_fin_opponents_user_msg' ) opponent.in_challenge_with = None opponent.change_status(opponent.previous_status) opponent.previous_status = None opponent.save() if defeat: opponent.wins = opponent.wins + 1 if opponent.wins is not None else 1 opponent.matches = opponent.matches + 1 if opponent.matches is not None else 1 level_change = None if opponent.level > competitor.level: level_change = f'{opponent.level}->{competitor.level}' c = opponent.level opponent.level = competitor.level competitor.level = c ResultsSheet.upload_canceled_result(opponent, competitor, level_change, was_dismissed=True) UsersSheet.update_competitor_table_record(opponent) res = Result( player_a=opponent, player_a_s=opponent.name, player_b=competitor, player_b_s=competitor.name, result=RESULT.DISMISSED, canceled=True, date=datetime.now(tz=timezone('Europe/Kiev')), level_change=level_change ) res.save() config = get_config() if config.group_chat_id: gmsg = get_translation_for('group_chat_technical_win_report_msg').format(opponent.name, competitor.name) if level_change: gmsg += '.\n' gmsg += get_translation_for('group_chat_players_level_changed').format(level_change) try: bot.send_message( config.group_chat_id, gmsg, parse_mode='html' ) except: logger.exception('Exception occurred while sending message to group chat') result = Result( player_a=opponent, player_b=competitor, result=RESULT.A_WINS ) result.save() opponent.save() competitor.in_challenge_with = None if defeat: competitor.change_status(COMPETITOR_STATUS.ACTIVE) competitor.challenges_dismissed_in_a_row = 0 competitor.losses += competitor.losses + 1 if competitor.losses is not None else 1 competitor.matches += competitor.matches + 1 if competitor.matches is not None else 1 UsersSheet.update_competitor_table_record(competitor) else: competitor.change_status(COMPETITOR_STATUS.PASSIVE) competitor.challenges_dismissed_in_a_row = 1 competitor.challenges_dismissed_total = competitor.challenges_dismissed_total + 1 if competitor.challenges_dismissed_total is not None else 1 competitor.latest_challenge_received_at = None competitor.save() opponent_user.states.append('MenuState') if len(opponent_user.states) > STATES_HISTORY_LEN: del opponent_user.states[0] opponent_user.save() if defeat: smwae_check( opponent_user.user_id, get_translation_for('challenge_confirm_opponent_wins') + ' ' + str(opponent.level), opponent_user, reply_markup=get_menu_keyboard(status=opponent.status) ) bot.send_message( user.user_id, get_translation_for('challenge_confirm_competitor_losses') + ' ' + str(competitor.level), ) else: smwae_check( opponent_user.user_id, get_translation_for('challenge_confirmation_dismissed_opponent_msg'), opponent_user, reply_markup=get_menu_keyboard(status=opponent.status) ) bot.send_message( user.user_id, get_translation_for('challenge_confirmation_dismissed_competitor_msg'), ) LogsSheet.glog( get_translation_for('gsheet_log_player_dismissed_challenge_from_player').format(competitor.name, opponent.name) ) return RET.GO_TO_STATE, 'MenuState', message, user