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