예제 #1
0
파일: bot.py 프로젝트: Padking/tgbot
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)
예제 #2
0
파일: views.py 프로젝트: inma610/webpay
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()
예제 #3
0
파일: bot.py 프로젝트: Padking/tgbot
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)
예제 #4
0
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)
예제 #5
0
파일: bot.py 프로젝트: Padking/tgbot
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)
예제 #6
0
파일: bot.py 프로젝트: Padking/tgbot
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)
예제 #7
0
파일: bot.py 프로젝트: Padking/tgbot
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)
예제 #8
0
파일: views.py 프로젝트: AltisCorp/webpay
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()
예제 #9
0
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Минск, Беларусь")
예제 #10
0
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)