diff --git a/bot/app/bot.py b/bot/app/bot.py index 07e766a..b0c3973 100644 --- a/bot/app/bot.py +++ b/bot/app/bot.py @@ -25,9 +25,7 @@ import keyboards # DB from db.base import Session, engine, Base -from db.models import User -# from db.engine import Database -# from sqlalchemy import select +from db.models import User, Queue, QueueUser bot = AsyncTeleBot(token, state_storage=StatePickleStorage()) @@ -47,12 +45,44 @@ async def start(msg: Message): 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) +@bot.message_handler(commands=["new_queue"]) +async def nq(msg: Message): + user = session.query(User).filter_by(id=msg.from_user.id).first() + queue = Queue(owner_id=user.id) + session.add(queue) + session.commit() + await bot.send_message(chat_id=msg.chat.id, text=f"Создана новая очередь: {queue.id}") + +@bot.message_handler(commands=["take_part"]) +async def tp(msg: Message): + try: + command, queue_id = msg.text.split() + except: + await bot.send_message(chat_id=msg.chat.id, text="Вы забыли указать очередь") + return + qu = QueueUser(user_id=msg.from_user.id, queue_id=queue_id) + session.add(qu) + session.commit() + await bot.send_message(chat_id=msg.chat.id, text="Вы приняли участие в очереди!") + +@bot.message_handler(commands=["queue"]) +async def q(msg: Message): + try: + command, queue_id = msg.text.split() + except: + await bot.send_message(chat_id=msg.chat.id, text="Вы забыли указать очередь") + return + queue = session.query(Queue).filter_by(id=queue_id).first() + if queue: + users = [q.user.name for q in queue.users] + await bot.send_message(chat_id=msg.chat.id, text=f"Пользователи этой очереди: {', '.join(users)}") + else: + await bot.send_message(chat_id=msg.chat.id, text="Очередь не найдена!") async def main(): a = asyncio.create_task(bot.polling(non_stop=True)) @@ -61,7 +91,6 @@ async def main(): if __name__ == "__main__": print("Bot started", flush=True) - # db = Database() Base.metadata.create_all(engine) session = Session() bot.add_custom_filter(StateFilter(bot)) diff --git a/bot/app/db/base.py b/bot/app/db/base.py index f53c1cd..817e2d3 100644 --- a/bot/app/db/base.py +++ b/bot/app/db/base.py @@ -1,9 +1,11 @@ from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.exc import OperationalError from sqlalchemy.orm import sessionmaker from db.settings import Settings engine = create_engine(Settings().uri) + Session = sessionmaker(bind=engine) Base = declarative_base() diff --git a/bot/app/db/models.py b/bot/app/db/models.py index 914726b..8c7cf58 100644 --- a/bot/app/db/models.py +++ b/bot/app/db/models.py @@ -1,5 +1,6 @@ from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy import Column, Integer, String, BigInteger, Uuid +from sqlalchemy import Column, Integer, String, BigInteger, ForeignKey +from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship import uuid @@ -13,16 +14,22 @@ class User(Base): name = Column(String) username = Column(String) -# -# class Queue(Base): -# __tablename__ = "queue" -# -# id = Column(Uuid, primary_key=True, default=uuid.uuid4()) -# owner = relationship(User) -# -# -# class QueueUser(Base): -# __tablename__ = "queueuser" -# -# id = Column(Uuid, primary_key=True, default=uuid.uuid4()) -# user_id = + owns_queues = relationship("Queue", backref="owner") + takes_part_in_queues = relationship("QueueUser", backref="user") + + +class Queue(Base): + __tablename__ = "queue" + + id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + owner_id = Column(BigInteger, ForeignKey("user.id")) + + users = relationship("QueueUser", backref="queue") + + +class QueueUser(Base): + __tablename__ = "queueuser" + + id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + user_id = Column(BigInteger, ForeignKey("user.id")) + queue_id = Column(UUID(as_uuid=True), ForeignKey("queue.id")) diff --git a/bot/app/textbook.py b/bot/app/textbook.py index 5178237..82e28a0 100644 --- a/bot/app/textbook.py +++ b/bot/app/textbook.py @@ -1,3 +1,3 @@ start = "Привет! Я помогу тебе вести очередность людей! Это бывает очень полезно для сдачи работ, к примеру, когда люди договариваются в разных чатах, а ближе к сдаче получается путаница. Ты можешь создавать очереди, отправлять ссылки на вступление, менять очередноcть, создавать очереди в групповых чатах и т.д.!" -start_group = "Привет, я QUEUEBOT 2.0, помогаю создавать очереди в твоих групповых чатах без регистрации и смс!\n\nЧтобы пользоваться мной в этом чате, пользователь с правами админа должен настроить меня, комманда /settings, также не забудь выдать мне права администратора, чтобы я мог видеть список участников этой группы!" +start_group = "Привет, я QUEUEBOT 2.0, помогаю создавать очереди в твоих групповых чатах!\n\nЧтобы пользоваться мной в этом чате, пользователь с правами админа должен настроить меня, комманда /settings, также не забудь выдать мне права администратора, чтобы я мог видеть список участников этой группы!" menu = "Главное меню" diff --git a/docker-compose.yml b/docker-compose.yml index 82e5019..cc7ccfe 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,18 @@ services: + postgres: + image: postgres:15.1 + restart: always + volumes: + - ./postgres_data:/var/lib/postgresql/data/:rw + environment: + POSTGRES_USER: user + POSTGRES_PASSWORD: password + POSTGRES_DB: db + healthcheck: + test: ["CMD-SHELL", "pg_isready -d db --user user"] + interval: 2s + timeout: 2s + retries: 5 bot: build: context: bot @@ -11,12 +25,6 @@ services: HOST: postgres PORT: 5432 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 + depends_on: + postgres: + condition: service_healthy