first one
This commit is contained in:
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
**/postgres_data
|
||||||
|
config.py
|
||||||
|
*.pyc
|
||||||
|
**/__pycache__
|
||||||
7
bot/Dockerfile
Normal file
7
bot/Dockerfile
Normal file
@ -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"]
|
||||||
69
bot/app/bot.py
Normal file
69
bot/app/bot.py
Normal file
@ -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())
|
||||||
8
bot/app/db/base.py
Normal file
8
bot/app/db/base.py
Normal file
@ -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()
|
||||||
17
bot/app/db/engine.py
Normal file
17
bot/app/db/engine.py
Normal file
@ -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
|
||||||
21
bot/app/db/models.py
Normal file
21
bot/app/db/models.py
Normal file
@ -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)
|
||||||
15
bot/app/db/settings.py
Normal file
15
bot/app/db/settings.py
Normal file
@ -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}"
|
||||||
0
bot/app/keyboards.py
Normal file
0
bot/app/keyboards.py
Normal file
3
bot/app/textbook.py
Normal file
3
bot/app/textbook.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
start = "Привет! Я помогу тебе вести очередность людей! Это бывает очень полезно для сдачи работ, к примеру, когда люди договариваются в разных чатах, а ближе к сдаче получается путаница. Ты можешь создавать очереди, отправлять ссылки на вступление, менять очередноcть, создавать очереди в групповых чатах и т.д.!"
|
||||||
|
start_group = "Привет, я QUEUEBOT 2.0, помогаю создавать очереди в твоих групповых чатах без регистрации и смс!\n\nЧтобы пользоваться мной в этом чате, пользователь с правами админа должен настроить меня, комманда /settings, также не забудь выдать мне права администратора, чтобы я мог видеть список участников этой группы!"
|
||||||
|
menu = "Главное меню"
|
||||||
7
bot/requirements.txt
Normal file
7
bot/requirements.txt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
pytelegrambotapi
|
||||||
|
asyncio
|
||||||
|
aiohttp
|
||||||
|
psycopg-binary
|
||||||
|
pydantic
|
||||||
|
sqlalchemy
|
||||||
|
psycopg2-binary
|
||||||
14
docker-compose.yml
Normal file
14
docker-compose.yml
Normal file
@ -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
|
||||||
Reference in New Issue
Block a user