- Регистрация
- 13 Июн 2022
- Сообщения
- 71
- Автор темы
- #1
Для работы вам понадобятся библиотеки: Aiogram( >=3.0 ) , asyncio, json, os.
А также, создайте файл "db.json" в папке с данным файлом
Не забудьте заполнить переменную
А также, создайте файл "db.json" в папке с данным файлом
Не забудьте заполнить переменную
token
в коде.
Python:
import asyncio
import json
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)
db = Dispatcher()
class cfg: # Класс для работы с 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 = cfg.read()
class database:
def get_user_cursor(chat_id): # Функция для получения указателя на юзера
result = False
if chat_id not in data:
data[chat_id] = {
"status": 0,
"chat": {
"rid": ""
}
}
cfg.write(data)
result = True
return data[chat_id], result
def get_users_in_search(): # Получение количества игроков в поиске
num = 0
for user_id, user_data in list(data.items()):
if user_data["status"] == 1:
num += 1
return num
def search(chat_id): # Поиск игрока для чата
for user_id, user_data in list(data.items()):
if user_id != chat_id:
if user_data["status"] == 1:
return {
"id": user_id,
"data": user_data
}
def set_chat(chat_id, rival_id):
data[chat_id]["chat"]["rid"] = rival_id
cfg.write(data)
def set_status(chat_id, status):
data[chat_id]["status"] = status
cfg.write(data)
class keyboard: # Класс для работы с клавиатурой
def main():
kb = ReplyKeyboardMarkup(
keyboard = [
[
KeyboardButton(text="🔎 Найти чат")
]
],
resize_keyboard = True
)
return kb
def finish():
kb = ReplyKeyboardMarkup(
keyboard = [
[
KeyboardButton(text="🛑 Завершить")
]
],
resize_keyboard = True
)
return kb
@db.message(Command("start")) # Обработчик команды /start
async def start_message(message: Message):
user, is_register = database.get_user_cursor(str(message.from_user.id))
if is_register:
await message.answer(
"💎 Для начала поиска собеседника нажмите на кнопку ниже."
f"👥 Людей в поиске: {database.get_users_in_search()}",
reply_markup = keyboard.main()
)
@db.message(F.text == '🔎 Найти чат') # Обработчик кнопки Найти чат
async def chat_search(message: Message):
user, is_register = database.get_user_cursor(str(message.from_user.id)) # Получаем указатель на игрока
if user["status"] == 0: # Не находится в поиске
rival = database.search(str(message.from_user.id)) # Ищем игрока
database.set_status(str(message.from_user.id), 1) # Меняем наш статус на "В поиске"
if rival is None: # Никого не нашёл
await message.reply(
"🔎 Вы начали поиск человека...\n"
f"👥 Людей в поиске: {database.get_users_in_search()}",
reply_markup = keyboard.finish()
)
else: # Если игрок найден
database.set_status(str(message.from_user.id), 2) # Меняем наш статус на "В игре"
database.set_status(rival["id"], 2) # Меняем статус собеседника на "В игре"
database.set_chat(str(message.from_user.id), rival["id"]) # Меняем параметр "rid" для указателя на нашего собеседника
database.set_chat(rival["id"], str(message.from_user.id)) # Меняем параметр "rid" для указателя на нас
await bot.send_message(rival["id"], "Человек найден!\n\nВ данный момент вы находитесь в чате, и все ваши отправленные сообщения отправляются ему.\n\nДля завершения, нажмите \"🛑 Завершить\"")
await message.answer(
"Человек найден!\n\n",
"В данный момент вы находитесь в чате, и все ваши отправленные сообщения отправляются ему.\n\n"
"Для завершения, нажмите \"🛑 Завершить\""
)
elif user["status"] == 1: # В поиске
await message.reply("Вы уже находитесь в поиске!")
elif user["status"] == 2: # В чате
await message.reply("Вы находитесь в чате!")
@db.message(F.text == "🛑 Завершить")
async def stop(message: Message):
user, is_register = database.get_user_cursor(str(message.from_user.id)) # Получаем указатель на нас
if user["status"] == 1: # В поиске
database.set_status(str(message.from_user.id), 0) # Меняем статус на "Не в игре и не в поиске"
await message.answer(
"Вы успешно покинули поиск чата",
reply_markup = keyboard.main()
)
elif user["status"] == 2: # В игре
rival = {
"id": user["chat"]["rid"],
"data": data[user["chat"]["rid"]]
}
database.set_status(str(message.from_user.id), 0)# Меняем наш статус на "Не в игре и не в поиске"
database.set_status(rival["id"], 0) # Меняем статус соперника на "Не в игре и не в поиске"
await bot.send_message(rival["id"], "Игрок покинул чат! Начните поиск заново.", reply_markup=keyboard.main())
database.set_chat(rival["id"], "")
await message.answer("Вы покинули чат! Начните поиск заново.", reply_markup=keyboard.main())
database.set_chat(str(message.from_user.id), "")
elif user["status"] == 0: # не в поиске и не в игре
await message.answer(
"Возвращаю кнопку поиска игры",
reply_markup=keyboard.main()
)
@db.message() # Обработчик всех текстовых сообщений
async def handler_message(message: Message):
user, is_register = database.get_user_cursor(str(message.from_user.id)) # Получаем указатель на игрока
if not is_register:
if user["status"] == 2: # Если игрок находится в чате
if message.text is None:
print("err")
else:
await bot.send_message(int(user["chat"]["rid"]), message.text) # Отправляем собеседнику сообщение
async def main():
await db.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())