MathBot - бот для генерации примеров

Добро пожаловать!

Зарегистрировавшись у нас, вы сможете обсуждать, делиться и отправлять личные сообщения другим участникам нашего сообщества.

Зарегистрироваться!
  • Если Вы желаете помогать развитию проекта, готовы заполнять раздел(-ы) и подсказывать другим пользователям на портале, есть возможность попасть в команду редакторов. Для этого следует обратиться в техническую поддержку
lua / python developer
Редактор
Регистрация
13 Июн 2022
Сообщения
61
Для работы вам понадобятся библиотеки: Aiogram( >=3.0 ) , asyncio, json, os.
А также, создайте файл "db.json" в папке с данным файлом

Не забудьте заполнить переменную token в коде.

Бот работает только в группах!

Логика игры:
1. Игрок вводит /start в группе
2. Бот генерирует пример и начинает игру
3. Кто первый введёт правильное число - победил. Бот также отсчитывает время, за сколько секунд был дан ответ.

1703932459124.png


Python:
import asyncio
import json
import random
import time

from aiogram import Bot, Dispatcher, F
from aiogram.filters import Command
from aiogram.types import Message, CallbackQuery
from aiogram.types import (ReplyKeyboardMarkup, KeyboardButton,
                           InlineKeyboardMarkup, InlineKeyboardButton)


token = "" # Сюда токен

bot = Bot(token)
dp = Dispatcher()


class js: # Класс для работы с JSON
    def write(tab):
        tab = json.dumps(tab)
        tab = json.loads(str(tab))
        with open("db.json", 'w', encoding='utf-8') as file:
          json.dump(tab, file, indent=4, ensure_ascii=False)

    def read():
        with open("db.json", 'r', encoding='utf-8') as file:
          return json.load(file)

data = js.read()

def is_digit(n): # Функция для проверки на число
    try:
        int(n)
        return True
    except ValueError:
        return  False

def generateExample(lens): # Функция для генерации примера
    oper = ""
    z = ["+", "-", "*"] # Массив с + - *
    for i in range(lens):
        if i != (lens - 1):
            oper += "" + str(random.randint(1, 10)) + "" + z[random.randint(0, 2)] # Генерируем пример( вид 2*2 )
        else:
            oper += "" + str(random.randint(1, 20))


    return oper

def calc(oper):
    return eval(oper)

class db: # Класс для быстрой работы с жс-бд
    def get_group_cursor(group_id): # Функция для получения курсора на таблицу
        if group_id not in data:
            data[group_id] = {
                "status": 0,
                "operation": "",
                "result": 0,
                "start_time": 0
            }
            js.write(data)
        return data[group_id]

    def start_game(group_id, ex, res): # Функция для старта игры
        data[group_id] = {
            "status": 1,
            "operation": ex,
            "result": int(res),
            "start_time": time.time()
        }
        js.write(data)

    def stop_game(group_id): # Функция для окончания игры
        data[group_id] = {
            "status": 0,
            "operation": "",
            "result": 0,
            "start_time": 0
        }
        js.write(data)


class keyboard: # Класс работы с клавиатурой
    def main():
        kb = InlineKeyboardMarkup(
            inline_keyboard=[
                [
                    InlineKeyboardButton(text="Начать новую игру", callback_data = "new_game")
                ]
            ],
            resize_keyboard = True
        )
        return kb   
 
@dp.message(Command("start")) # Обработчик команды /start
async def start_message(message: Message):
    if message.chat.type == "private": # Если мы используем бота в лс
        await message.answer(
            "➗ Добро пожаловать в MathBot!\n"
            "Для использования бота добавьте его в группу."
        )
    elif message.chat.type == "group": # Если в группе
        group_id = str(message.chat.id)

        cur = db.get_group_cursor(group_id) # Получаем курсор на группу
        if cur["status"] == 0: # Если там не идёт игра
            example = generateExample(random.randint(2, 4)) # Генерируем пример
            db.start_game(group_id, example, calc(example)) # Начинаем игру
            await message.answer(
                f"Игра успешно начата!\nПример: {example}"
            )

@dp.message() # Обработчик всех сообщений
async def handler_message(message: Message):
    if message.chat.type == "group" and message.text:
        if is_digit(message.text): # Проверяем текст на число
            num = int(message.text)
            group_id = str(message.chat.id)
            cur = db.get_group_cursor(group_id)

            if cur["status"] == 1: # Если идёт игра
                if cur["result"] == num: # Если число равно результату примера
                    db.stop_game(group_id) # Останавливаем игру
                    await message.answer(
                        f"@{message.from_user.username} первый решил пример!\nОтвет: {num}"
                        f"\n\nПример был решен за {int(time.time() - cur["start_time"])} сек.",
                        reply_markup = keyboard.main()
                    )

@dp.callback_query() # Обработчик inline кнопок
async def callbackquery(call: CallbackQuery):
    if call.data == "new_game":
        group_id = str(call.message.chat.id)
        cur = db.get_group_cursor(group_id)

        if cur["status"] == 0: # Если нет игры
            example = generateExample(random.randint(2, 4))
            db.start_game(group_id, example, calc(example))
            await bot.send_message(group_id,
                f"Игра успешно начата!\nПример: {example}"
            )





async def main():
    await dp.start_polling(bot)


if __name__ == "__main__":
    asyncio.run(main())
 
Сверху