Ejemplo n.º 1
0
 def insert_competitor_in_table(data: Competitor, check_for_existence=False, at_row=None, all_data=None):
     cfg = get_config()
     if check_for_existence:
         pass
     data.reload()
     if not data.legacy_number:
         data.legacy_number = str(Competitor.objects.count() + 100)
         data.save()
     if at_row is None:
         if not all_data:
             already_inserted_data = UsersSheet.get_all_users()
         else:
             already_inserted_data = all_data
         at_row = len(already_inserted_data) + 2
     update_data(
         cfg.spreadsheet_id,
         f'{cfg.spreadsheet_users_sheet}!A{at_row}:G',
         values=[
             [
                 data.legacy_number,
                 data.name,
                 Competitor.status_code_to_str_dict[data.status],
                 data.level or '',
                 data.matches or 0,
                 data.wins or 0,
                 data.losses or 0
             ],
         ]
     )
Ejemplo n.º 2
0
 def update_model(cleanse=True):
     data = UsersSheet.get_all_users()
     if not data:
         pass
     else:
         stored_in_sheet_records = set()
         row_num = 1
         for row in data:
             existing_data = Competitor.objects(
                 name=row[1],
                 legacy_number=row[0]
             ).first()
             if existing_data is None:
                 cfg = get_config()
                 new_data = Competitor(
                     legacy_number=row[0],
                     name=row[1],
                     status=COMPETITOR_STATUS.UNAUTHORIZED,
                     level=to_int(row[3], None),
                     matches=to_int(row[4]),
                     wins=to_int(row[5]),
                     losses=to_int(row[6]),
                     performance=to_int(row[7]),
                     used_vacation_time=0
                 )
                 new_data.save()
                 new_data.reload()
                 stored_in_sheet_records.add(new_data.id)
             else:
                 stored_in_sheet_records.add(existing_data.id)
                 UsersSheet.update_competitor_db_record(row, existing_data)
             row_num += 1
         for new_record in Competitor.objects(id__not__in=stored_in_sheet_records):
             if not cleanse:
                 row_num += 1
                 UsersSheet.insert_competitor_in_table(new_record, at_row=row_num)
             else:
                 new_record.delete()
         hr_logger.info('Оновлено список гравців з гугл-таблиці')
Ejemplo n.º 3
0
    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