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
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)
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
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)
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, 'Не удалось сменить дивизион пользователя')
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, 'Не удалось поменять состояние участника контеста')
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)
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, 'Не удалось добавить новое достижение участнику')
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, 'Не удалось изменить достижения участника')
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)
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)
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)
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')
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)
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)
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)
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)
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)