Раздел навигации

AnonBot - Анонимный чат-бот

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

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

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