From e25080d05452fc9cedd0c613fa38e2f42d247149 Mon Sep 17 00:00:00 2001 From: Artem Reznichenko Date: Mon, 5 Jun 2023 16:31:04 +0300 Subject: [PATCH] first one --- .gitignore | 4 +++ bot/Dockerfile | 7 +++++ bot/app/bot.py | 69 ++++++++++++++++++++++++++++++++++++++++++ bot/app/db/base.py | 8 +++++ bot/app/db/engine.py | 17 +++++++++++ bot/app/db/models.py | 21 +++++++++++++ bot/app/db/settings.py | 15 +++++++++ bot/app/keyboards.py | 0 bot/app/textbook.py | 3 ++ bot/requirements.txt | 7 +++++ docker-compose.yml | 14 +++++++++ 11 files changed, 165 insertions(+) create mode 100644 .gitignore create mode 100644 bot/Dockerfile create mode 100644 bot/app/bot.py create mode 100644 bot/app/db/base.py create mode 100644 bot/app/db/engine.py create mode 100644 bot/app/db/models.py create mode 100644 bot/app/db/settings.py create mode 100644 bot/app/keyboards.py create mode 100644 bot/app/textbook.py create mode 100644 bot/requirements.txt create mode 100644 docker-compose.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2a16037 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +**/postgres_data +config.py +*.pyc +**/__pycache__ diff --git a/bot/Dockerfile b/bot/Dockerfile new file mode 100644 index 0000000..049045e --- /dev/null +++ b/bot/Dockerfile @@ -0,0 +1,7 @@ +FROM python:3.11.3 +WORKDIR /app +COPY requirements.txt . +RUN pip install -r requirements.txt +ADD app/ . +ENTRYPOINT ["python"] +CMD ["/app/bot.py"] diff --git a/bot/app/bot.py b/bot/app/bot.py new file mode 100644 index 0000000..07e766a --- /dev/null +++ b/bot/app/bot.py @@ -0,0 +1,69 @@ +# Telebot imports +from telebot.async_telebot import AsyncTeleBot +from telebot.asyncio_storage import StateMemoryStorage, StatePickleStorage +from telebot.asyncio_handler_backends import State, StatesGroup +from telebot.asyncio_filters import StateFilter +from telebot import types +from telebot.callback_data import CallbackData, CallbackDataFilter +from telebot.types import Message + +# Async things imports +import asyncio + +# Other modules imports +import sqlite3 +import json +from datetime import datetime +import math +import socket +import os + +# Local imports +from config import token, admins +import textbook +import keyboards + +# DB +from db.base import Session, engine, Base +from db.models import User +# from db.engine import Database +# from sqlalchemy import select + + +bot = AsyncTeleBot(token, state_storage=StatePickleStorage()) + +class States(StatesGroup): + default = State() + + +@bot.message_handler(commands=["start"]) +async def start(msg: Message): + user = session.query(User).filter_by(id=msg.from_user.id).first() + if user: + await bot.send_message(chat_id=msg.chat.id, text="Вы зарегистрированы!") + else: + await bot.send_message(chat_id=msg.chat.id, text="Привет, новый пользователь, регистрирую тебя..") + new_user = User(id=msg.from_user.id, name=msg.from_user.first_name, username=msg.from_user.username) + session.add(new_user) + session.commit() + await bot.send_message(chat_id=msg.chat.id, text="Регистрация прошла успешно, добро пожаловать!") + print(session.query(User).all(), flush=True) + # if msg.chat.type in ("group", "supergroup"): + # await bot.send_message(chat_id=msg.chat.id, text=textbook.start_group) + # else: + # await bot.send_message(chat_id=msg.chat.id, text=textbook.start) + + +async def main(): + a = asyncio.create_task(bot.polling(non_stop=True)) + await a + + +if __name__ == "__main__": + print("Bot started", flush=True) + # db = Database() + Base.metadata.create_all(engine) + session = Session() + bot.add_custom_filter(StateFilter(bot)) + bot.enable_saving_states(filename="./.state-save/states.pkl") + asyncio.run(main()) diff --git a/bot/app/db/base.py b/bot/app/db/base.py new file mode 100644 index 0000000..596673d --- /dev/null +++ b/bot/app/db/base.py @@ -0,0 +1,8 @@ +from sqlalchemy import create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + +engine = create_engine("postgresql+psycopg2://user:password@postgres:5432/db") +Session = sessionmaker(bind=engine) + +Base = declarative_base() diff --git a/bot/app/db/engine.py b/bot/app/db/engine.py new file mode 100644 index 0000000..c152cfd --- /dev/null +++ b/bot/app/db/engine.py @@ -0,0 +1,17 @@ +from sqlalchemy import create_engine, MetaData +from db.settings import Settings +from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.declarative import declarative_base + + +class Database: + def __init__(self): + self.engine = create_engine("postgresql+psycopg2://user:password@postgres:5432/db") + self.meta = MetaData() + self.engine.connect() + self.meta.create_all(bind=self.engine) + self._Session = sessionmaker(bind=self.engine) + self.base = declarative_base() + + def session(self): + return self._Session diff --git a/bot/app/db/models.py b/bot/app/db/models.py new file mode 100644 index 0000000..9d54cec --- /dev/null +++ b/bot/app/db/models.py @@ -0,0 +1,21 @@ +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import Column, Integer, String, BigInteger, Uuid +from sqlalchemy.orm import relationship + +import uuid + +from db.base import Base + +class User(Base): + __tablename__ = "user" + + id = Column(BigInteger, primary_key=True) + name = Column(String) + username = Column(String) +# +# +# class Queue(Base): +# __tablename__ = "queue" +# +# id = Column(Uuid, primary_key=True, default=uuid.uuid4()) +# owner = relationship(User) diff --git a/bot/app/db/settings.py b/bot/app/db/settings.py new file mode 100644 index 0000000..cb7b668 --- /dev/null +++ b/bot/app/db/settings.py @@ -0,0 +1,15 @@ +from dataclasses import dataclass + +@dataclass +class Settings: + dialect: str = "postgresql" + driver: str = "psycopg2" + user: str = "user" + password: str = "password" + db_name: str = "db" + host: str = "postgres" + port: int = 5432 + + @property + def uri(self): + return f"{self.dialect}+{self.driver}://{self.user}:{self.password}@{self.host}:{self.port}/{self.db_name}" diff --git a/bot/app/keyboards.py b/bot/app/keyboards.py new file mode 100644 index 0000000..e69de29 diff --git a/bot/app/textbook.py b/bot/app/textbook.py new file mode 100644 index 0000000..5178237 --- /dev/null +++ b/bot/app/textbook.py @@ -0,0 +1,3 @@ +start = "Привет! Я помогу тебе вести очередность людей! Это бывает очень полезно для сдачи работ, к примеру, когда люди договариваются в разных чатах, а ближе к сдаче получается путаница. Ты можешь создавать очереди, отправлять ссылки на вступление, менять очередноcть, создавать очереди в групповых чатах и т.д.!" +start_group = "Привет, я QUEUEBOT 2.0, помогаю создавать очереди в твоих групповых чатах без регистрации и смс!\n\nЧтобы пользоваться мной в этом чате, пользователь с правами админа должен настроить меня, комманда /settings, также не забудь выдать мне права администратора, чтобы я мог видеть список участников этой группы!" +menu = "Главное меню" diff --git a/bot/requirements.txt b/bot/requirements.txt new file mode 100644 index 0000000..7c75ce6 --- /dev/null +++ b/bot/requirements.txt @@ -0,0 +1,7 @@ +pytelegrambotapi +asyncio +aiohttp +psycopg-binary +pydantic +sqlalchemy +psycopg2-binary diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..8f7f6ed --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,14 @@ +services: + bot: + build: + context: bot + restart: always + postgres: + image: postgres:15.1 + restart: always + volumes: + - ./postgres_data:/var/lib/postgresql/data/:Z + environment: + POSTGRES_USER: user + POSTGRES_PASSWORD: password + POSTGRES_DB: db