Esempio n. 1
0
 def __init__(self, bot, update):
     self.chat_id = update.message.chat_id
     self.message = update.message.text
     self.user = update.message.from_user
     self.user = db.get_user(update.message.from_user.id,
                             user_name=update.message.from_user.first_name,
                             chat_id=update.message.chat_id)
     self._bot = bot
Esempio n. 2
0
def delete_user(cur_user):
    sent_password = request.get_json()['sent_password']
    saved_password = mongodb.get_user(cur_user['email'])['password']
    
    if(bcrypt.check_password_hash(saved_password, sent_password)):
        res = mongodb.delete_user(cur_user['email'])
        return jsonify(res)
    
    return jsonify(False)
Esempio n. 3
0
def on_stat(chat_id):
    user = mongodb.get_user(chat_id)
    res_str = 'Статистика:\nВсего игр - {0}\n' \
              'Всего правильных ответов - {1}\n' \
              'Средний показатель ответов к игре - {2}\n' \
              'Глобальный ранг - {3}'.format(user[mongodb.AvailableFields.TOTAL_GAMES],
                                             user[mongodb.AvailableFields.TOTAL_RIGHT_ANSWERS],
                                             user[mongodb.AvailableFields.AVERAGE],
                                             user[mongodb.AvailableFields.GLOBAL_RANK])
    return res_str
Esempio n. 4
0
def share_archive(cur_user):
    new_email = request.get_json()['email']
    
    if new_email in cur_user['email_list']: return jsonify(False)

    new_user = mongodb.get_user(new_email)
    if not new_user: return jsonify(False)
    
    res = mongodb.share_archive(cur_user, new_user)
    
    return jsonify(res)
Esempio n. 5
0
def change_div(message, chat_id):
    try:
        user_id = message[message.find('change_div ') + 11: len(message)]
        user = backend.get_user(user_id)
        newdiv = user['division'] + 1
        if newdiv == 4:
            newdiv = 1
        backend.update_user(user_id, {'division': newdiv})
        print_admin_user_information(chat_id, user_id)
    except Exception as err:
        print('Не удалось сменить дивизион пользователя', err)
        bot.send_message(chat_id, 'Не удалось сменить дивизион пользователя')
Esempio n. 6
0
def change_participant(message, chat_id):
    try:
        user_id = message[message.find('change_participant ') + 19: len(message)]
        user = backend.get_user(user_id)
        newparticipant = True
        if user['is_participant']:
            newparticipant = False
        backend.update_user(user_id, {'is_participant': newparticipant})
        print_admin_user_information(chat_id, user_id)
    except Exception as err:
        print('Не удалось поменять состояние участника контеста', err)
        bot.send_message(chat_id, 'Не удалось поменять состояние участника контеста')
Esempio n. 7
0
def getarhive():
    user = mongodb.get_user(request.get_json()['email'])
    
    if not user:
        return jsonify(False)
    
    archive_ids = user['archive_ids']
    archives = list(mongodb.get_archives(archive_ids))
    
    if not archives:
        return jsonify(False)

    return jsonify(archives)
Esempio n. 8
0
def new_achievement(message, chat_id, args):
    try:
        backend.erase_session(chat_id)
        user_id = args['user_id']
        user = backend.get_user(user_id)
        custom_achievements = []
        if 'custom_achievements' in user:
            custom_achievements = user['custom_achievements']
        custom_achievements.append(message)
        backend.update_user(user_id, {'custom_achievements': custom_achievements})
        print_admin_user_information(chat_id, user_id)
    except Exception as err:
        print('Не удалось добавить новое достижение участнику', err)
        bot.send_message(chat_id, 'Не удалось добавить новое достижение участнику')
Esempio n. 9
0
def edit_achievement(message, chat_id):
    try:
        number = int(message[message.find('achievement: ') + 13: message.rfind(' ')])
        user_id = str(message[message.rfind(' ') + 1: len(message)])
        user = backend.get_user(user_id)
        custom_achievements = []
        if 'custom_achievements' in user:
            custom_achievements = user['custom_achievements']
        del custom_achievements[number]
        backend.update_user(user_id, {'custom_achievements': custom_achievements})
        print_admin_user_information(chat_id, user_id)
    except Exception as err:
        print('Не удалось изменить достижения участника', err)
        bot.send_message(chat_id, 'Не удалось изменить достижения участника')
Esempio n. 10
0
def print_contest_information(chatId, contestId):
    try:
        contest = backend.get_contest_information(contestId)
        contestTop = contest['contestTop']
        rating = contest['allRating']
        top = ""
        if len(contestTop) >= 1:
            top += "Топ:\n" + "🥇 " + backend.get_user(contestTop[0][0])['name'] + " - " + str(contestTop[0][1]) \
                   + " " + struct.declension(contestTop[0][1], "задача", "задачи", "задач") + "\n"
        if len(contestTop) >= 2:
            top += "🥈 " + backend.get_user(contestTop[1][0])['name'] + " - " + str(contestTop[1][1]) \
                   + " " + struct.declension(contestTop[1][1], "задача", "задачи", "задач") + "\n"
        if len(contestTop) >= 3:
            top += "🥉 " + backend.get_user(contestTop[2][0])['name'] + " - " + str(contestTop[2][1]) \
                   + " " + struct.declension(contestTop[2][1], "задача", "задачи", "задач") + "\n"
        if len(contestTop) >= 1:
            top += "\n"

        first_submit = ""
        if 'firstSubmission' in contest:
            first_submit = "Первая успешная посылка:\n" + backend.get_user(contest['firstSubmission']['name'])['name'] + "\n"\
                           + "Время посылки: " + str(contest['firstSubmission']['time']) + " " + \
                           struct.declension(contest['firstSubmission']['time'], "минута", "минуты", "минут") + "\n\n"
        key = InlineKeyboardMarkup()
        but_1 = InlineKeyboardButton(text="Посмотреть активность",
                                     callback_data="not_admin_contest_id" +
                                     str(contestId))
        key.add(but_1)
        bot.send_message(chatId,
                         "<b>" + contest['name'] + ":</b>\n\n" + first_submit +
                         top + "Рейтинг за тренировку:\n\n<pre>" + rating +
                         "</pre>",
                         parse_mode="html",
                         reply_markup=key)
    except Exception as err:
        bot.send_message(chatId,
                         "Произошла ошибка при выводе таблицы контеста", err)
Esempio n. 11
0
def login():
    email = request.get_json()['email']
    password = request.get_json()['password']

    user = mongodb.get_user(email)

    if (user and user['password']) and (bcrypt.check_password_hash(
            user['password'], password)):
        del user['password']
        del user['_id']

        user['exp'] = datetime.datetime.now() + datetime.timedelta(days=7)
        user['token'] = jwt.encode(user,
                                   os.getenv("JWT_SECRET"),
                                   algorithm='HS256').decode("utf-8")

    return jsonify(user)
Esempio n. 12
0
def print_settings(chatId):
    try:
        key = InlineKeyboardMarkup()
        button = InlineKeyboardButton(text='Вкл/Выкл уведомления',
                                      callback_data='notifications')
        key.add(button)
        user = backend.get_user(chatId)
        notifications = user['notifications']
        status = 'Уведомления: '
        if notifications:
            status += '🟢'
        else:
            status += '🔴'
        bot.send_message(chatId, status, reply_markup=key)
    except Exception as err:
        bot.send_message(chatId, "Произошла ошибка")
        print('Произошла ошибка при выводе настроек пользователя', err)
Esempio n. 13
0
def show_achievements(message, chat_id):
    try:
        user_id = message[message.find('show_achievements ') + 18: len(message)]
        user = backend.get_user(user_id)
        custom_achievements = []
        if 'custom_achievements' in user:
            custom_achievements = user['custom_achievements']

        key = InlineKeyboardMarkup()
        for (index, achievement) in enumerate(custom_achievements):
            button = InlineKeyboardButton(text=achievement,
                                          callback_data='achievement: ' + str(index) + ' ' + str(user_id))
            key.add(button)
        button = InlineKeyboardButton(text='Добавить достижение', callback_data='+achievement ' + str(user_id))
        key.add(button)
        bot.send_message(chat_id,
                         'Нажмите на достижение, чтобы удалить его, или нажмите на кнопку ДОБАВИТЬ, чтобы добавить новое',
                         reply_markup=key)
    except Exception as err:
        print('Не удалось поменять достижения участника', err)
        bot.send_message(chat_id, 'Не удалось поменять достижения участника')
def login():
    """
    :return: returns login page and handles authentication scenarios
    """
    if current_user.is_authenticated:
        return redirect(url_for('chat_room'))
    message = ''
    if request.method=='POST':
        username = request.form.get('username')
        password = request.form.get('password')
        user = get_user(username)
        if username and password:
            if user and user.check_password(password):
                login_user(user)
                session[NAME_KEY] = username
                flash(f'You were successfully logged in as {username}.')
                return redirect(url_for('chat_room'))
            elif not user:
                message= f'{username} is not registered, please signup'
                session[message]=message
                return render_template('login.html', message=message)
            elif not user.check_password(password):
                message = f'Wrong password, please enter the correct password to login'
                return render_template('login.html', message=message)
        elif username and not password:
            message = 'please enter password before submitting'
            return render_template('login.html', message=message)

        else:
            message = 'please enter username and password before submitting'
            return render_template('login.html', message=message)
    else:
        try:
            message=request.args['message']
            return render_template('login.html',message=message)
        except BadRequestKeyError:
            return render_template('login.html')
Esempio n. 15
0
def get_user_infomation():
    try:
        user_information = {}
        contest = {}
        for contest_inf in backend.get_contests():
            contestId = contest_inf['contest_id']
            contest[contestId] = {}
            contest[contestId] = backend.get_contest_information(contestId)

        for user in backend.get_users({'is_participant': True}):
            user_id = user['user_id']
            user_information[user_id] = {}
            user_information[user_id]['name'] = backend.get_user(user_id)['name']
            user_information[user_id]['achievements'] = ''
            user_information[user_id]['activity'] = 0
            user_information[user_id]['last_activities'] = []
            unsolvedCount = 0
            solvedCount = 0
            solvedCountLast = 0
            allCount = 0
            for (index, contest_inf) in enumerate(backend.get_contests()):
                contestId = contest_inf['contest_id']
                if user_id in contest[contestId]['users']:
                    unsolvedCount += contest[contestId]['problemCount'] - \
                                     (contest[contestId]['users'][user_id]['solvedCount'] +
                                      contest[contestId]['users'][user_id]['upsolvedCount'])
                    solvedCount += contest[contestId]['users'][user_id]['solvedCount'] + \
                                   contest[contestId]['users'][user_id][
                                       'upsolvedCount']
                    rank = contest[contestId]['users'][user_id]['rank']
                    if rank == 1:
                        user_information[user_id]['achievements'] += "🥇"
                    elif rank == 2:
                        user_information[user_id]['achievements'] += "🥈"
                    elif rank == 3:
                        user_information[user_id]['achievements'] += "🥉"
                    if len(contest) - index <= 5:
                        solvedCountLast += contest[contestId]['users'][user_id]['solvedCount'] + \
                                           contest[contestId]['users'][user_id]['upsolvedCount']
                        allCount += contest[contestId]['problemCount']
                        user_information[user_id]['last_activities'].append(
                            contest[contestId]['users'][user_id]['user_activity'])
                        user_information[user_id]['activity'] += contest[contestId]['users'][user_id]['user_activity']

            user_information[user_id]['activity'] = round(
                user_information[user_id]['activity'] / min(5, max(1, len(contest))))
            user_inf = backend.get_user(user_id)
            if user_information[user_id]['achievements'] == '' and (
                    'custom_achievements' in user_inf and len(user_inf['custom_achievements']) == 0 or not (
                    'custom_achievements' in user_inf)):
                user_information[user_id]['achievements'] = 'Пока тут ничего нет :('
            user_information[user_id]['solved'] = solvedCount
            user_information[user_id]['unsolved'] = unsolvedCount
            user_information[user_id]['solvedLast'] = solvedCountLast
            user_information[user_id]['allLast'] = allCount
            user_information[user_id]['active_name'] = user_information[user_id]['name'] + ' ' + \
                                                       const.activity[user_information[user_id]['activity']][0]
            updates = user_information[user_id]
            backend.update_user(user_id, updates)
    except Exception as err:
        print('Не удалось взять личную информацию пользователей', err)
Esempio n. 16
0
def get_sortedRating(contestId):
    try:
        contest_information = backend.get_contest_information(contestId)
        sortedRating = []
        for user in contest_information['users']:
            sortedRating.append(
                [contest_information['users'][user]['solvedCount'], contest_information['users'][user]['upsolvedCount'],
                 user]
            )

        def compare(x, y):
            if x[0] + x[1] > y[0] + y[1] or x[0] + x[1] == y[0] + y[1] and x[0] > y[0]:
                return -1
            elif x[0] + x[1] < y[0] + y[1] or x[0] + x[1] == y[0] + y[1] and x[0] < y[0]:
                return 1
            else:
                return 0

        sortedRating = sorted(sortedRating, key=cmp_to_key(compare))
        backend.update_contest(contestId, {'sortedRating': sortedRating})
        rating = table.Texttable()
        rating.set_deco(table.Texttable.HEADER)
        rating.set_cols_align(["l", "c", "r"])
        rating.set_cols_valign(["t", "t", "t"])
        rating.set_cols_dtype(['t', 't', 't'])
        rating.add_row(["Фамилия\n", "🏆\n", "Задачи"])
        space = '  '
        for index, item in enumerate(sortedRating):
            userName = backend.get_user(item[2])['name']
            name = userName[userName.find(' ') + 1:]
            if index == 9:
                space = ' '
            rating.add_row([str(index + 1) + space +
                            str(name),
                            str(contest_information['users'][item[2]]['solvedCount'] +
                                contest_information['users'][item[2]]['upsolvedCount']),
                            str(contest_information['users'][item[2]]['solvedCount']) + "/" + str(
                                contest_information['users'][item[2]]['upsolvedCount'])
                            ])
        backend.update_contest(contestId, {'allRating': rating.draw()})
        activity = table.Texttable()
        activity.set_deco(table.Texttable.HEADER)
        activity.set_cols_align(["l", "c", "c"])
        activity.set_cols_valign(["t", "t", "t"])
        activity.set_cols_dtype(['t', 't', 't'])
        activity.add_row(["Фамилия\n", "Div.\n", "Активность\n"])
        space = '  '
        for index, user in enumerate(sortedRating):
            user_inf = backend.get_user(user[2])
            user_div = int(user_inf['division'])
            userName = user_inf['name']
            name = userName[userName.find(' ') + 1:]
            user_activity = -1
            for kol in contest_information['activity'][user_div - 1]:
                if kol <= contest_information['users'][user[2]]['solvedCount'] + \
                        contest_information['users'][user[2]]['upsolvedCount']:
                    user_activity += 1
            backend.update_contest(contestId, {'users.' + user[2] + '.user_activity': user_activity})
            if index == 9:
                space = ' '
            activity.add_row([str(index + 1) + space + str(name),
                              str(user_div),
                              const.activity[user_activity][0]])
        backend.update_contest(contestId, {'allActivity': activity.draw()})
    except Exception as err:
        print('Ошибка при получении отсортированного рейтинга за контест', err)
Esempio n. 17
0
def callback_text(text):
    backend.erase_session(
        text.from_user.id)  # удаление сессии при нажатии на кнопку
    try:
        message = text.data
        print(
            str(text.message.chat.id) + ' ' + str(text.from_user.username) +
            ' ' + str(text.from_user.first_name) + ' ' +
            str(text.from_user.last_name) + ': ' + str(message))  # логи
        if message == "getcontest":
            print_contests(text.message.chat.id, '')
        elif message == "getuser":
            print_users(text.message.chat.id, 'info', False)
        elif message.find('infologin: '******'infologin: '******'admin_info_login: '******'admin_info_login: '******'Не удалось вывести пользователя админу', err)
                bot.send_message(text.message.chat.id,
                                 'Не удалось вывести пользователя')
        elif message.find('change_div ') != -1:
            admin.change_div(message, text.from_user.id)
        elif message.find('change_participant ') != -1:
            admin.change_participant(message, text.from_user.id)
        elif message.find('change_name ') != -1:
            admin.change_name(message, text.from_user.id)
        elif message.find('change_handle ') != -1:
            admin.change_handle(message, text.from_user.id)
        elif message.find('show_achievements ') != -1:
            admin.show_achievements(message, text.from_user.id)
        elif message.find('achievement: ') != -1:
            admin.edit_achievement(message, text.from_user.id)
        elif message.find('+achievement') != -1:
            admin.add_achievement(message, text.from_user.id)
        elif message.find('not_admin_contest_id') != -1:
            id = message[message.find('not_admin_contest_id') +
                         20:len(message)]
            admin.show_contest(id, text.message.chat.id, False)
        elif message.find('admin_contest_id') != -1:
            id = message[message.find('admin_contest_id') + 16:len(message)]
            admin.show_contest(id, text.message.chat.id, True)
        elif message.find('id') != -1:
            print_contest_information(
                text.message.chat.id,
                message[message.find('id') + 2:len(message)])
        elif message.find('notifications') != -1:
            user = backend.get_user(text.message.chat.id)
            new_notifications = not user['notifications']
            backend.update_user(text.message.chat.id,
                                {'notifications': new_notifications})
            print_settings(text.message.chat.id)
        elif message.find('admin_users') != -1:
            print_users(text.message.chat.id, 'admin_info_',
                        True)  # вывод пользователей для админа
        elif message.find('admin_contests') != -1:
            print_contests(text.message.chat.id, 'admin_contest_')
        elif message.find('choose_div') != -1:
            contestId = message[message.find(' ') + 1:message.rfind(' ')]
            chatId = message[message.rfind(' ') + 1:len(message)]
            admin.choose_div(contestId, chatId)
        elif message.find('div_') != -1:
            contestId = message[message.find(' ') + 1:message.rfind(' ')]
            chatId = message[message.rfind(' ') + 1:len(message)]
            div = message[message.find('_') + 1:message.find(' ')]
            admin.edit_activity(contestId, chatId, div)
    except Exception as err:
        print("Проблемы с callback", err)
Esempio n. 18
0
def get_all_rating():
    global print_rating
    try:
        hq_rating = {}
        solved = {}
        upsolved = {}
        for user in backend.get_users({'is_participant': True}):
            handle = user['user_id']
            hq_rating[handle] = 0
            solved[handle] = 0
            upsolved[handle] = 0

        for contest in backend.get_contests():
            for user in contest['users']:
                is_participant = backend.get_user(user)['is_participant']
                if is_participant:
                    hq_rating[user] += contest['users'][user]['solvedCount'] + contest['users'][user]['upsolvedCount']
                    solved[user] += contest['users'][user]['solvedCount']
                    upsolved[user] += contest['users'][user]['upsolvedCount']

        rating = []

        def compare(x, y):
            if x[1] > y[1] or x[1] == y[1] and solved[x[0]] > solved[y[0]]:
                return -1
            elif x[1] < y[1] or x[1] == y[1] and solved[x[0]] < solved[y[0]]:
                return 1
            else:
                return 0

        for item in hq_rating.items():
            rating.append([item[0], item[1]])

        rating = sorted(rating, key=cmp_to_key(compare))
        hq_rating_information = {}

        for item in rating:
            user = item[0]
            hq_rating_information[user] = {}
            hq_rating_information[user]['solved'] = solved[user]
            hq_rating_information[user]['upsolved'] = upsolved[user]
            hq_rating_information[user]['rating'] = item[1]
        try:
            print_rating = table.Texttable()
            print_rating.set_deco(table.Texttable.HEADER)
            print_rating.set_cols_align(["l", "c", "c"])
            print_rating.set_cols_valign(["t", "t", "m"])
            print_rating.set_cols_dtype(['t', 'i', 'i'])
            print_rating.add_row(["Фамилия\n", "🏆\n", "Задачи\n"])
        except:
            print('Ошибка при выводе топа рейтинга')
        try:
            space = '  '
            for index, user in enumerate(hq_rating_information):
                userName = backend.get_user(user)['name']
                name = userName[userName.find(' ') + 1:]
                if index == 9:
                    space = ' '
                print_rating.add_row([str(index + 1) + space +
                                      name,
                                      str(hq_rating_information[user]['rating']),
                                      str(hq_rating_information[user]['solved']) + "/" +
                                      str(hq_rating_information[user]['upsolved'])
                                      ])
            backend.update_rating({'rating': print_rating.draw()})
        except Exception as err:
            print("Не удалось получить таблицу рейтинга", err)
    except Exception as err:
        print('Не удалось получить общий рейтинг', err)
def load_user(username):
    return get_user(username)
Esempio n. 20
0
def get_contest_information(contestId):
    try:
        contestId = str(contestId)
        contest = backend.get_contest_information(contestId)
        standings = req.get_codeforces_contest_stadings(contestId, contest['apis'][0], contest['apis'][1], True)
        contestInformation = {}
        contestInformation['name'] = req.get_contestName(contestId, contest['apis'][0], contest['apis'][1])

        users = {}
        maxSolved = 1
        problemCount = len(standings['result']['problems'])
        contestInformation['problemCount'] = problemCount

        for user in standings['result']['rows']:
            userName = user['party']['members'][0]['handle']
            userName = get_username(userName)
            if not is_participant(userName):
                continue
            user_id = backend.get_users({'handle': userName})[0]['user_id']
            user_inf = backend.get_user(user_id)
            if not (user_inf['is_participant']):
                continue
            if not (user_id in users):
                users[user_id] = {}
                users[user_id]['rank'] = user['rank']
                users[user_id]['solved'] = [False for i in range(problemCount)]
                users[user_id]['upsolved'] = [False for i in range(problemCount)]

        for user in standings['result']['rows']:
            userName = user['party']['members'][0]['handle']
            if userName.find('=') == -1:
                continue
            userName = get_username(userName)
            if not is_participant(userName):
                continue
            user_id = backend.get_users({'handle': userName})[0]['user_id']
            user_inf = backend.get_user(user_id)
            if not (user_inf['is_participant']):
                continue

            if user['rank'] != 0:
                users[user_id]['rank'] = user['rank']

            for index, problem in enumerate(user['problemResults']):
                if user['rank'] != 0:
                    if problem['points'] == 1:
                        users[user_id]['solved'][index] = True
                else:
                    if problem['points'] == 1:
                        users[user_id]['upsolved'][index] = True

        official = 0
        used = [0] * 200
        for user in users:
            user_inf = users[user]
            if user_inf['rank'] != 0:
                official += 1
                used[int(user_inf['rank'])] = user
            users[user]['solvedCount'], users[user]['upsolvedCount'] = get_solved_count(users[user]['solved'],
                                                                                        users[user]['upsolved'])
            maxSolved = max(maxSolved, users[user]['solvedCount'])

        top = 1
        for i in range(0, len(users)):
            if used[i] != 0:
                users[used[i]]['rank'] = top
                top += 1

        for user in backend.get_users({'is_participant': True}):
            user_id = user['user_id']
            if not (user_id in users):
                users[user_id] = {}
                users[user_id]['rank'] = 0
                users[user_id]['solvedCount'] = 0
                users[user_id]['upsolvedCount'] = 0
                users[user_id]['solved'] = [False for i in range(problemCount)]
                users[user_id]['upsolved'] = [False for i in range(problemCount)]

        for user in users:
            contest_activity = contest['activity']
            user_inf = backend.get_user(int(user))
            user_div = int(user_inf['division'])
            user_activity = -1
            for kol in contest_activity[user_div - 1]:
                if kol <= users[user]['solvedCount'] + users[user]['upsolvedCount']:
                    user_activity += 1
                users[user]['user_activity'] = user_activity

        contestInformation['users'] = users

        status = req.get_codeforces_contest_status(contestId, contest['apis'][0], contest['apis'][1])
        try:
            for submission in range(len(status['result']) - 1, -1, -1):
                name = get_username(status['result'][submission]['author']['members'][0]['handle'])
                if not is_participant(name):
                    continue
                user_id = backend.get_users({'handle': name})[0]['user_id']
                user_inf = backend.get_user(user_id)
                if not (user_inf['is_participant']):
                    continue
                if status['result'][submission]['verdict'] == 'OK':
                    contestInformation['firstSubmission'] = {}
                    contestInformation['firstSubmission']['name'] = backend.get_users({'handle': name})[0]['user_id']
                    contestInformation['firstSubmission']['time'] = status['result'][submission][
                                                                        'relativeTimeSeconds'] // 60
                    break
        except Exception as err:
            print("Trouble with status", err)
        backend.update_contest(contestId, contestInformation)
    except Exception as err:
        print("Failed Contest Information", err)