init
This commit is contained in:
commit
812448282a
4
.env
Normal file
4
.env
Normal file
@ -0,0 +1,4 @@
|
||||
BOT_TOKEN=7880464408:AAEiLDCgB4r2XVNtEoZHbwKJnFmDUbGSc0Y
|
||||
DATABASE_URL=postgresql+asyncpg://postgres:2780@host.docker.internal/delete_message
|
||||
# DATABASE_URL=postgresql+asyncpg://postgres:2780@localhost/delete_message
|
||||
ADMINS = [6155921710, 6297555082]
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
venv/
|
||||
__pycache__/
|
17
Dockerfile
Normal file
17
Dockerfile
Normal file
@ -0,0 +1,17 @@
|
||||
FROM python:3.11-slim-bullseye
|
||||
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
ENV PYTHONWARNINGS="ignore"
|
||||
ENV SQLALCHEMY_WARN_20=0
|
||||
ENV PYTHONDONTWRITEBYTECODE=1
|
||||
|
||||
WORKDIR /
|
||||
|
||||
COPY requirements.txt .
|
||||
|
||||
RUN pip install --no-cache-dir --upgrade pip \
|
||||
&& pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
COPY . .
|
||||
|
||||
CMD ["python", "bot.py"]
|
46
README.md
Normal file
46
README.md
Normal file
@ -0,0 +1,46 @@
|
||||
# DELETING_MESSAGES
|
||||
|
||||
## Описание
|
||||
Бот добавляет в базу данных тех, кто может писать в чат
|
||||
|
||||
# Запуск через python
|
||||
|
||||
### 1. Создаём виртуальное окружение
|
||||
```cmd
|
||||
python -m venv venv
|
||||
```
|
||||
|
||||
### 2. Активируем виртуальное окружение
|
||||
```cmd
|
||||
venv\Scripts\activate
|
||||
```
|
||||
### 3. Устанавливаем зависимости
|
||||
```cmd
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### 4. Переименовываем .env copy в .env
|
||||
Вставляем свой токен бота
|
||||
|
||||
|
||||
### 5. Запуск
|
||||
```cmd
|
||||
python bot.py
|
||||
```
|
||||
|
||||
# Запуск через Docker
|
||||
|
||||
### 1. Создание докер приложения
|
||||
перейдите в директорию с ботом и пропишите следующую команду (с точкой)
|
||||
```cmd
|
||||
docker build -t название .
|
||||
```
|
||||
|
||||
### 2. Активируем докер приложение
|
||||
```cmd
|
||||
docker run название
|
||||
```
|
||||
|
||||
# Добавление админа
|
||||
|
||||
чтобы добавить админа нужно в файле .env в список ADMINS добавить айди админа
|
18
bot.py
Normal file
18
bot.py
Normal file
@ -0,0 +1,18 @@
|
||||
import asyncio
|
||||
from handlers import router
|
||||
from aiogram import Bot, Dispatcher
|
||||
from config import BOT_TOKEN
|
||||
|
||||
bot = Bot(token=BOT_TOKEN)
|
||||
dp = Dispatcher()
|
||||
|
||||
|
||||
async def main():
|
||||
dp.include_router(router)
|
||||
await dp.start_polling(bot)
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
asyncio.run(main())
|
||||
except KeyboardInterrupt:
|
||||
print('Exit')
|
8
config.py
Normal file
8
config.py
Normal file
@ -0,0 +1,8 @@
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
|
||||
load_dotenv()
|
||||
BOT_TOKEN = os.getenv('BOT_TOKEN')
|
||||
DATABASE_URL = os.getenv('DATABASE_URL')
|
||||
ADMINS = list(map(int, os.getenv("ADMINS", "").strip("[]").split(",")))
|
23
db.py
Normal file
23
db.py
Normal file
@ -0,0 +1,23 @@
|
||||
import logging
|
||||
logging.basicConfig(level=logging.ERROR)
|
||||
logging.getLogger('sqlalchemy.pool').setLevel(logging.ERROR)
|
||||
logging.getLogger('sqlalchemy').setLevel(logging.ERROR)
|
||||
logging.getLogger('sqlalchemy').propagate = False
|
||||
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from sqlalchemy.ext.asyncio import async_sessionmaker
|
||||
from models import Base
|
||||
from config import DATABASE_URL
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore")
|
||||
|
||||
# Создание асинхронного движка для подключения к базе данных
|
||||
engine = create_async_engine(DATABASE_URL, echo=False, pool_pre_ping=True)
|
||||
|
||||
# Создание сессий для работы с базой данных
|
||||
async_session = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession)
|
||||
|
||||
# Функция для инициализации базы данных
|
||||
async def init_db():
|
||||
async with engine.begin() as conn:
|
||||
await conn.run_sync(Base.metadata.create_all) # Создание всех таблиц, определенных в моделях
|
BIN
delete_message_backup.dump
Normal file
BIN
delete_message_backup.dump
Normal file
Binary file not shown.
88
handlers.py
Normal file
88
handlers.py
Normal file
@ -0,0 +1,88 @@
|
||||
from aiogram.filters import CommandStart, Command
|
||||
from aiogram.types import Message, CallbackQuery
|
||||
from aiogram import F, Router
|
||||
from aiogram.fsm.state import StatesGroup, State
|
||||
from aiogram.fsm.context import FSMContext
|
||||
from db import async_session
|
||||
from models import Users
|
||||
from sqlalchemy.future import select
|
||||
from sqlalchemy import and_
|
||||
from states import Admin
|
||||
from config import ADMINS
|
||||
|
||||
router = Router()
|
||||
|
||||
@router.message(CommandStart())
|
||||
async def start(message: Message, state: FSMContext):
|
||||
if message.from_user.id in ADMINS:
|
||||
await state.clear()
|
||||
await message.reply(f"Привет, я бот который следит за сообщениями в группе, и удаляет сообщения тех пользователей кого нет в моём списке.\n/admin_id")
|
||||
else:
|
||||
await message.delete()
|
||||
await message.answer(
|
||||
"Приветствую! Вы недавно в нашем чате? Тогда вам обязательно нужно [ознакомиться с методичкой для новичков](https://telegra.ph/Segodnya-reshila-napisat-metodichku-dlya-novichkov-kto-po-kakim-libo-prichinam-ne-smotrel-video-iz-chata-01-08-3).",
|
||||
parse_mode="Markdown",
|
||||
disable_web_page_preview=True
|
||||
)
|
||||
|
||||
@router.message(Command("admin_id"))
|
||||
async def admin_command(message: Message, state: FSMContext):
|
||||
if message.from_user.id in ADMINS:
|
||||
await state.set_state(Admin.users)
|
||||
await message.reply("Пожалуйста, введите ID пользователей, чьи сообщения не будут удаляться. Каждый ID должен быть на отдельной строке.")
|
||||
else:
|
||||
await message.delete()
|
||||
await message.answer(
|
||||
"Приветствую! Вы недавно в нашем чате? Тогда вам обязательно нужно [ознакомиться с методичкой для новичков](https://telegra.ph/Segodnya-reshila-napisat-metodichku-dlya-novichkov-kto-po-kakim-libo-prichinam-ne-smotrel-video-iz-chata-01-08-3).",
|
||||
parse_mode="Markdown",
|
||||
disable_web_page_preview=True
|
||||
)
|
||||
|
||||
@router.message(Admin.users)
|
||||
async def check_id(message: Message, state: FSMContext):
|
||||
if not message.text.isalpha():
|
||||
ids = message.text.split("\n")
|
||||
valid_ids = []
|
||||
|
||||
async with async_session() as session:
|
||||
for user_id in ids:
|
||||
try:
|
||||
user_id_int = int(user_id.strip())
|
||||
valid_ids.append(user_id_int)
|
||||
|
||||
result = await session.execute(select(Users).where(Users.user_id == user_id_int))
|
||||
existing_user = result.scalars().first()
|
||||
|
||||
if not existing_user:
|
||||
new_user = Users(user_id=user_id_int)
|
||||
session.add(new_user)
|
||||
except ValueError:
|
||||
await message.reply(f"⛔ Ошибка: ID `{user_id}` не является числом.")
|
||||
continue
|
||||
|
||||
await session.commit()
|
||||
|
||||
await message.reply("Список ID пользователей, чьи сообщения не будут удаляться, успешно обновлен! 👍")
|
||||
await state.clear()
|
||||
else:
|
||||
await message.reply("⛔ Ошибка: ID должны состоять только из цифр.")
|
||||
await state.clear()
|
||||
|
||||
@router.message()
|
||||
async def delete_messages(message: Message):
|
||||
user_id = message.from_user.id
|
||||
|
||||
if user_id in ADMINS:
|
||||
return
|
||||
|
||||
async with async_session() as session:
|
||||
result = await session.execute(select(Users).where(Users.user_id == user_id))
|
||||
existing_user = result.scalars().first()
|
||||
|
||||
if not existing_user:
|
||||
await message.delete()
|
||||
await message.answer(
|
||||
"Приветствую! Вы недавно в нашем чате? Тогда вам обязательно нужно [ознакомиться с методичкой для новичков](https://telegra.ph/Segodnya-reshila-napisat-metodichku-dlya-novichkov-kto-po-kakim-libo-prichinam-ne-smotrel-video-iz-chata-01-08-3).",
|
||||
parse_mode="Markdown",
|
||||
disable_web_page_preview=True
|
||||
)
|
11
models.py
Normal file
11
models.py
Normal file
@ -0,0 +1,11 @@
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy import BigInteger, Column, Integer
|
||||
|
||||
# Создание базового класса для моделей
|
||||
Base = declarative_base()
|
||||
|
||||
class Users(Base):
|
||||
__tablename__ = 'users'
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
user_id = Column(BigInteger, unique=True, index = True)
|
BIN
requirements.txt
Normal file
BIN
requirements.txt
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user