def choose_category(message): # Добавляем исполнителя, о котором написал пользователь SQLighter(config.database_name).update_for_user(message.chat.id, message.text, column_name="performer") bot.send_message(message.chat.id, f"{utils.choice_random_message('1.4')} {message.text}") time.sleep(1) bot.send_message(message.chat.id, f"{utils.choice_random_message('1.5')}") # Получаем имена категорий categories = SQLighter(config.database_name).select_from_single_column(category_num=4) # Создаём клаву с категориями keyboard_c = utils.generate_inline_markup(categories, categories, category=True) # Сохраняем клаву с категориями на время игры utils.set_user(message.chat.id, cat_kb=keyboard_c) # Формируем "табло игры" - соответствие 4-х нот конкретной категории for category in categories: # попробовать уйти от цикла # Получаем 4 ноты с ценами note_and_price = SQLighter(config.database_name).select_from_multiple_column("category_name", *category) # Подготовка содержимого параметра callback_data объекта InlineKeyboardButton note_price_ind = utils.encode_notes(*note_and_price) # Запоминаем содержимое параметров text & callback_data label_text = [('Нота 1', ), ('Нота 2', ), ('Нота 3', ), ('Нота 4', )] utils.set_user_text(message.chat.id, *category, label_text, sign=True) utils.set_user_callback(message.chat.id, *category, note_price_ind, sign=True) # Создаём клаву с нотами keyboard_n = utils.generate_inline_markup(label_text, note_price_ind) # Сохраняем клаву с нотами и количеством попыток в пределах категории utils.set_user_cats_and_notes(message.chat.id, *category, attincat=0, note_kb=keyboard_n) bot.send_message(message.chat.id, f"{utils.choice_random_message('1.6')}", reply_markup=keyboard_c) dbworker.set_state(message.chat.id, config.States.S_ENTER_CATEGORY.value)
def verify(request): form = BrowserIDForm(data=request.POST) if form.is_valid(): log.info('verifying assertion') result = verify_assertion(form.cleaned_data['assertion'], get_audience(request)) if result: log.info('assertion ok: %s' % result) set_user(request, result['email']) return {'has_pin': request.session['uuid_has_pin'], 'pin_create': reverse('pin.create')} request.session.clear() return http.HttpResponseBadRequest()
def play_attempt(call: CallbackQuery): status = utils.get_user_one_note_choise(call.message.chat.id) if call.data and status: # Получаем информацию о ноте note_info = call.data category_name = utils.get_user(call.message.chat.id, chosen_category=True) # Проверка выбора разыгранной/неразыгранной ноты: note_info = note_info.split(',') encoded_note_name = note_info[0] # если строка начинается с "Нота", значит нота разыграна if note_info[0].startswith("Нота"): bot.send_message(call.message.chat.id, f"{utils.choice_random_message('1.7.1')}") dbworker.set_state(call.message.chat.id, config.States.S_ENTER_NOTE.value) elif len(encoded_note_name) == 4 and len(note_info) == 3: # снижаем вероятность, если вдруг введён подменный текст в callback # Устанавливаем запрет на выбор ещё одной ноты пока пользователь ожидает цену выбранной utils.set_user_one_note_choise(call.message.chat.id, sign=False) # Получаем маркировку и колбэк-текст для всех нот в пределах категории text = utils.get_user_text(call.message.chat.id, category_name) c_data = utils.get_user_callback(call.message.chat.id, category_name) # Преобразуем маркировку и коллбэк-текст для выбранной ноты new_text_and_c_data = utils.modify_params(note_info, text, c_data) # Генерируем клаву с нотами keyboard_n_edited = utils.generate_inline_markup(new_text_and_c_data[0], new_text_and_c_data[1]) # Сохраняем обновлённый текст для формирования клавы utils.set_user_text(call.message.chat.id, category_name, new_text_and_c_data[0], sign=False) utils.set_user_callback(call.message.chat.id, category_name, new_text_and_c_data[1], sign=False) # Здесь сохраняем в хранилище новый вид клавы utils.set_user_cats_and_notes(call.message.chat.id, category_name, attincat=None, note_kb=keyboard_n_edited) # Сообщаем цену разыгрываемой ноты пользователю bot.edit_message_text("<b>А цена ноты составит..</b>", chat_id=call.message.chat.id, message_id=call.message.message_id, parse_mode='HTML', reply_markup=keyboard_n_edited) # Получаем file_id и note_name из БД price = int(note_info[1]) # Запоминаем цену выбранной ноты utils.set_user(call.message.chat.id, price=price) file_id, note_name = SQLighter(config.database_name).select_file_id_and_full_note_name(encoded_note_name) # Получаем 3 НЕправильных ответа wrong_answers = SQLighter(config.database_name).select_from_single_column(column_name="note_name", note_name=encoded_note_name, note_num=3) # Формируем разметку: wrong_answers = [n+',' for note in wrong_answers for n in note] wrong_answers = "{}{}{}".format(*wrong_answers).strip(',') markup = utils.generate_markup(note_name, wrong_answers) # Удаляем клаву с нотами после задержки (чтобы пользователь смог увидеть цену) time.sleep(1.5) bot.delete_message(call.message.chat.id, call.message.message_id) # Отправляем аудиофайл с вариантами ответа bot.send_voice(call.message.chat.id, file_id, reply_markup=markup) # Включаем "игровой режим" - записываем ожидаемый правильный ответ от пользователя utils.set_user(call.message.chat.id, estimated_answer=note_name) dbworker.set_state(call.message.chat.id, config.States.S_ENTER_ANSWER.value)
def set_user_id(bot, update): steam_user = update.message.text u = User(steam_user, api_key) try: username = u.check_account() set_user(update.message.chat_id, steam_user) bot.send_message(chat_id=update.message.chat_id, text=u"Weclome, {}".format(username), reply_to_message_id=update.message.message_id) except UserDoesNotExistError: bot.send_message(chat_id=update.message.chat_id, text=u"無法獲取用戶信息,請檢查用戶ID", reply_to_message_id=update.message.message_id) except: bot.send_message(chat_id=update.message.chat_id, text=u"網路連接錯誤,請稍後重試", reply_to_message_id=update.message.message_id)
def choose_note(call: CallbackQuery): if call.data: category_name = call.data # всегда ожидаем имя категории как в БД. Как может быть скомпрометировано? # Запоминаем имя категории utils.set_user(call.message.chat.id, chosen_category=category_name) # Предоставляем право выбора ноты только один раз utils.set_user_one_note_choise(call.message.chat.id, sign=True) # Восстанавливаем клаву с нотами и количеством игровых попыток в пределах категории note_and_attincat = utils.get_user_cats_and_notes(call.message.chat.id, category_name) # Проверяем кол-во сыгранных нот в пределах категории if note_and_attincat[1] == 4: # Если категория разыграна, то пользователь выбирает из присланной ранее клавы bot.send_message(call.message.chat.id, f"{utils.choice_random_message('1.6.1')}") dbworker.set_state(call.message.chat.id, config.States.S_ENTER_CATEGORY.value) else: # Удаляем клаву с категориями МОМЕНТАЛЬНО после выбора категории bot.delete_message(call.message.chat.id, call.message.message_id) # Отправляем клаву с нотами keyboard_n = note_and_attincat[0] bot.send_message(call.message.chat.id, f"{utils.choice_random_message('1.7')}", reply_markup=keyboard_n) dbworker.set_state(call.message.chat.id, config.States.S_ENTER_NOTE.value)
def check_answer(message): # Удаляем выбранный вариант ответа bot.delete_message(message.chat.id, message.message_id) answer = utils.get_user(message.chat.id, estimated_answer=True) # Убираем клавиатуру с вариантами ответа keyboard_hider = types.ReplyKeyboardRemove() # Если ответ правильный/неправильный if message.text == answer: bot.send_message(message.chat.id, f"{utils.choice_random_message('1.8.1')}", reply_markup=keyboard_hider) price = utils.get_user(message.chat.id, price=True) SQLighter(config.database_name).update_for_game_stat(message.chat.id, price=price) else: bot.send_message(message.chat.id, f"{utils.choice_random_message('1.8.2')}", reply_markup=keyboard_hider) SQLighter(config.database_name).update_for_game_stat(message.chat.id, answer_right=False) # Фиксируем количество сыгранных нот в пределах категории category_name = utils.get_user(message.chat.id, chosen_category=True) # перед finish_user!! utils.set_user_cats_and_notes(message.chat.id, category_name, attincat=True) # Завершаем попытку utils.finish_user(message.chat.id, tour=False) # Фиксируем количество попыток в игре utils.set_user(message.chat.id, attempt_num=1) # Если количество попыток: # не превышено - продолжаем игру и num_of_atts = random.choice(range(5, 8)) # можно первый раз выбрать число случайно, потом вытаскивать его из БД, иначе, значение переменной всегда меняется!! if utils.get_user(message.chat.id, attempt_num=True) < num_of_atts: # получаем клаву с категориями keyboard_c = utils.get_user(message.chat.id, cat_kb=True) bot.send_message(message.chat.id, f"{utils.choice_random_message('1.10.1')}", reply_markup=keyboard_c) dbworker.set_state(message.chat.id, config.States.S_ENTER_CATEGORY.value) else: # превышено - завершаем игру и отправляем # сообщение с результатами игры в виде: очки - % угаданных score, success_att, num_of_attempts = SQLighter(config.database_name).select_for_game_result(message.chat.id) percent = f"{round(int(success_att)/int(num_of_attempts)*100)}" bot.send_message(message.chat.id, "Набранное количество очков: <b>{}</b> \n Успешных попыток <i>{} %</i>".format(score, percent), parse_mode='HTML') bot.send_message(message.chat.id, f"{utils.choice_random_message('1.10.2')}") utils.finish_user(message.chat.id, tour=True) # Подготавливаем БД к следующей игре SQLighter(config.database_name).update_for_games(message.chat.id) dbworker.set_state(message.chat.id, config.States.S_BEFORE_START.value)
def cmd_start(message: Message): state = dbworker.get_current_state(message.chat.id) if state == config.States.S_ENTER_NAME.value: bot.send_message(message.chat.id, "Кажется, кто-то обещал отправить своё имя, но так и не сделал этого :( Жду...") elif state == config.States.S_ENTER_PERFORMER.value: bot.send_message(message.chat.id, "Кажется, кто-то обещал отправить своего исполнителя, но так и не сделал этого :( Жду...") else: # к самому началу действий с ботом (при этом порядковый номер состояния != 0) if bool(SQLighter(config.database_name).is_there_user_id(message.chat.id)) is False: bot.send_message(message.chat.id, "Добро пожаловать в игру 'Угадай мелодию'!") dbworker.set_state(message.chat.id, config.States.S_START.value) # Отправляем страницу с помощью cmd_help(message) # Даём время на прочтение страницы с помощью time.sleep(1) # Добавляем информацию о пользователе SQLighter(config.database_name).insert_row_about_user(message) bot.send_message(message.chat.id, "Какой замечательный человек заглянул) Как Вас зовут?") dbworker.set_state(message.chat.id, config.States.S_ENTER_NAME.value) else: # очередная игра пользователя после оконченной или недоигранной предыдущей bot.send_message(message.chat.id, "Рад, что Вы снова в игре! Начинаем") # Удаление всех ключей из хранилища utils.delete_for_reset(message.chat.id) # Здесь обнуление success, attempts, score SQLighter(config.database_name).update_for_incomplete_game(message.chat.id) categories = SQLighter(config.database_name).select_from_single_column(category_num=4) keyboard_c = utils.generate_inline_markup(categories, categories, category=True) utils.set_user(message.chat.id, cat_kb=keyboard_c) for category in categories: note_and_price = SQLighter(config.database_name).select_from_multiple_column("category_name", *category) note_price_ind = utils.encode_notes(*note_and_price) label_text = [('Нота 1', ), ('Нота 2', ), ('Нота 3', ), ('Нота 4', )] utils.set_user_text(message.chat.id, *category, label_text, sign=True) utils.set_user_callback(message.chat.id, *category, note_price_ind, sign=True) keyboard_n = utils.generate_inline_markup(label_text, note_price_ind) utils.set_user_cats_and_notes(message.chat.id, *category, attincat=0, note_kb=keyboard_n) bot.send_message(message.chat.id, f"{utils.choice_random_message('1.6')}", reply_markup=keyboard_c) dbworker.set_state(message.chat.id, config.States.S_ENTER_CATEGORY.value)
def verify(request): form = BrowserIDForm(data=request.POST) if form.is_valid(): url = settings.BROWSERID_VERIFICATION_URL audience = get_audience(request) extra_params = {'forceIssuer': settings.BROWSERID_UNVERIFIED_ISSUER, 'allowUnverified': 'true'} assertion = form.cleaned_data['assertion'] log.info('verifying Persona assertion. url: %s, audience: %s, ' 'extra_params: %s, assertion: %s' % (url, audience, extra_params, assertion)) result = verify_assertion(assertion, audience, extra_params) if result: log.info('Persona assertion ok: %s' % result) email = result.get('unverified-email', result.get('email')) set_user(request, email) return {'has_pin': request.session.get('uuid_has_pin'), 'pin_create': reverse('pin.create')} log.error('Persona assertion failed.') request.session.clear() return http.HttpResponseBadRequest()
def message_handler(message): user_id: str = str(message.from_user.id) def send_message(message, reply_markup=None): bot.send_message(user_id, message, reply_markup=reply_markup) if message.text == "Регистрация": if not utils.id_exists(user_id): send_message("Ваш id - " + user_id + ". " + "Для того, чтобы установить пароль, введите:" + "\n\nnew - *ваш новый пароль*") else: send_message("Пользователь с id " + user_id + " уже существует. ", reply_markup=keyboards.login_or_register()) elif "new" in message.text: utils.set_user(user_id, message.text) send_message("Регистрация завершена успешно.") elif message.text == "Вход": if utils.id_exists(user_id): send_message("Ваш id: " + user_id + ". " + "\n\nВведите пароль (pass - *ваш пароль*):") else: send_message("Вы ещё не зарегестрированы.", reply_markup=keyboards.login_or_register()) elif "pass" in message.text: password = re.search(r'\S+$', message.text).group(0) if password == utils.get_password(user_id): send_message("Вы вошли в систему.", reply_markup=keyboards.main_menu()) else: send_message("Неверный пароль. Повторите попытку.") elif message.text == "Новая операция": bot.send_message(user_id, "Выберите операцию.", reply_markup=keyboards.operations()) ############### FOR CASH ############### elif message.text == "Пополнить 💵": cash, card = utils.get_money(user_id) send_message("Текущий баланс: " + "\nНаличные - " + str(cash) + "\nКарта - " + str(card) + "\n\nВведите сумму:" "\n\n+$ *ваша сумма*") elif "+$" in message.text: sum = float(re.search(r'\S+$', message.text).group(0)) result = utils.add_cash(user_id, sum) cash, card = utils.get_money(user_id) send_message(result + "\n\nТекущий баланс: " + "\nНаличные - " + str(cash) + "\nКарта - " + str(card)) elif message.text == "Списать 💵": cash, card = utils.get_money(user_id) send_message("\n\nТекущий баланс: " + "\nНаличные - " + str(cash) + "\nКарта - " + str(card) + "\n\nВведите сумму:" "\n\n-$ *ваша сумма*") elif "-$" in message.text: sum = float(re.search(r'\S+$', message.text).group(0)) result = utils.subtract_cash(user_id, sum) cash, card = utils.get_money(user_id) send_message(result + "\n\nТекущий баланс: " + "\nНаличные - " + str(cash) + "\nКарта - " + str(card)) elif message.text == "Изменить 💵": pass ######################################## ############### FOR CARD ############### elif message.text == "Пополнить 💳": send_message("Введите сумму:" "\n\n++ *ваша сумма*") elif "++" in message.text: sum = float(re.search(r'\S+$', message.text).group(0)) result = utils.add_card(user_id, sum) cash, card = utils.get_money(user_id) send_message(result + "\n\nТекущий баланс: " + "\nНаличные - " + str(cash) + "\nКарта - " + str(card)) elif message.text == "Списать 💳": send_message("Введите сумму:" "\n\n-- *ваша сумма*") elif "--" in message.text: sum = float(re.search(r'\S+$', message.text).group(0)) result = utils.subtract_card(user_id, sum) cash, card = utils.get_money(user_id) send_message(result + "\n\nТекущий баланс: " + "\nНаличные - " + str(cash) + "\nКарта - " + str(card)) elif message.text == "Изменить 💳": pass ######################################## elif message.text == "Баланс 💰": cash, card = utils.get_money(user_id) send_message("Наличные: " + str(cash) + "." + "\nКарта: " + str(card) + ".") elif message.text == "О боте 🤖": send_message("Раздел находится на стадии разработки.") # TODO info, how to use bot elif message.text == "Разработчик 👼": send_message("Лев Красовский" + "\n@lkrasovsky" + "\n\nМинск, Беларусь")
from config import shelve_name import shelve from utils import set_user i = 0 with shelve.open(shelve_name) as storage: for id in storage.keys(): set_user(id) print(id, end=" ") i+=1 print(i)