mirror of
https://github.com/civsocit/olgram.git
synced 2023-07-22 01:29:12 +03:00
initial
This commit is contained in:
commit
3a022ec588
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
venv
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
.idea
|
||||||
|
__pycache__
|
||||||
|
*.pyc
|
11
README.md
Normal file
11
README.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# OLGram
|
||||||
|
|
||||||
|
Open-source self-hosted Livegram alternative
|
||||||
|
|
||||||
|
|
||||||
|
#####
|
||||||
|
|
||||||
|
таблицы
|
||||||
|
|
||||||
|
Боты: токен, имя, владелец
|
||||||
|
Пользователи: идентификатор
|
29
bot.py
Normal file
29
bot.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import asyncio
|
||||||
|
from aiogram import Bot, Dispatcher, executor
|
||||||
|
from aiogram.contrib.fsm_storage.memory import MemoryStorage
|
||||||
|
|
||||||
|
from settings import BotSettings
|
||||||
|
|
||||||
|
from olgram.bot.bots import router as bots_router
|
||||||
|
from olgram.bot.start import router as start_router
|
||||||
|
|
||||||
|
from olgram.utils.database import init_database
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
Classic polling
|
||||||
|
"""
|
||||||
|
asyncio.get_event_loop().run_until_complete(init_database())
|
||||||
|
|
||||||
|
bot = Bot(BotSettings.token())
|
||||||
|
dp = Dispatcher(bot, storage=MemoryStorage())
|
||||||
|
|
||||||
|
start_router.setup(dp)
|
||||||
|
bots_router.setup(dp)
|
||||||
|
|
||||||
|
executor.start_polling(dp, skip_updates=True)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
15
docker-compose.yaml
Normal file
15
docker-compose.yaml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: kartoza/postgis
|
||||||
|
environment:
|
||||||
|
- POSTGRES_USER=test_user
|
||||||
|
- POSTGRES_PASSWORD=test_passwd
|
||||||
|
- POSTGRES_DB=olgram
|
||||||
|
ports:
|
||||||
|
- '5431:5432'
|
||||||
|
volumes:
|
||||||
|
- database:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
database:
|
0
olgram/bot/__init__.py
Normal file
0
olgram/bot/__init__.py
Normal file
16
olgram/bot/bots.py
Normal file
16
olgram/bot/bots.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
from aiogram import Bot, Dispatcher, executor, types
|
||||||
|
from aiogram.dispatcher import FSMContext
|
||||||
|
|
||||||
|
from ..utils.router import Router
|
||||||
|
|
||||||
|
router = Router()
|
||||||
|
|
||||||
|
|
||||||
|
@router.message_handler(commands=["my_bots"])
|
||||||
|
async def my_bots(message: types.Message, state: FSMContext):
|
||||||
|
await message.answer("У тебя много ботов )")
|
||||||
|
|
||||||
|
|
||||||
|
@router.message_handler(commands=["add_bot"])
|
||||||
|
async def add_bot(message: types.Message, state: FSMContext):
|
||||||
|
await message.answer("Добавь тогда ок")
|
17
olgram/bot/start.py
Normal file
17
olgram/bot/start.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
from aiogram import Bot, Dispatcher, executor, types
|
||||||
|
from aiogram.dispatcher import FSMContext
|
||||||
|
|
||||||
|
from ..utils.router import Router
|
||||||
|
|
||||||
|
router = Router()
|
||||||
|
|
||||||
|
|
||||||
|
@router.message_handler(commands=["start"])
|
||||||
|
async def start(message: types.Message, state: FSMContext):
|
||||||
|
"""
|
||||||
|
Start command handler
|
||||||
|
"""
|
||||||
|
|
||||||
|
await message.answer(
|
||||||
|
"Привет. Я бот Olgram"
|
||||||
|
)
|
11
olgram/models/bot.py
Normal file
11
olgram/models/bot.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from tortoise.models import Model
|
||||||
|
from tortoise import fields
|
||||||
|
|
||||||
|
|
||||||
|
class Bot(Model):
|
||||||
|
id = fields.IntField(pk=True)
|
||||||
|
token = fields.CharField(max_length=50, unique=True)
|
||||||
|
owner = fields.ForeignKeyField("models.User", related_name="bots")
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
table = 'bot'
|
9
olgram/models/user.py
Normal file
9
olgram/models/user.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
from tortoise import Model, fields
|
||||||
|
|
||||||
|
|
||||||
|
class User(Model):
|
||||||
|
id = fields.IntField(pk=True)
|
||||||
|
telegram_id = fields.IntField(index=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
table = 'user'
|
0
olgram/utils/__init__.py
Normal file
0
olgram/utils/__init__.py
Normal file
15
olgram/utils/database.py
Normal file
15
olgram/utils/database.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
from tortoise import Tortoise
|
||||||
|
from settings import DatabaseSettings
|
||||||
|
|
||||||
|
|
||||||
|
async def init_database():
|
||||||
|
# Here we create a SQLite DB using file "db.sqlite3"
|
||||||
|
# also specify the app name of "models"
|
||||||
|
# which contain models from "app.models"
|
||||||
|
await Tortoise.init(
|
||||||
|
db_url=f'postgres://{DatabaseSettings.user()}:{DatabaseSettings.password()}'
|
||||||
|
f'@localhost:5431/{DatabaseSettings.database_name()}',
|
||||||
|
modules={'models': ['olgram.models.bot', 'olgram.models.user']}
|
||||||
|
)
|
||||||
|
# Generate the schema
|
||||||
|
await Tortoise.generate_schemas()
|
79
olgram/utils/router.py
Normal file
79
olgram/utils/router.py
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
from dataclasses import dataclass
|
||||||
|
from typing import Any, Dict, List, Tuple
|
||||||
|
|
||||||
|
from aiogram.dispatcher import Dispatcher
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass()
|
||||||
|
class Handler:
|
||||||
|
callback: Any
|
||||||
|
custom_filters: Tuple[Any]
|
||||||
|
kwargs: Dict[Any, Any]
|
||||||
|
commands: Any = None
|
||||||
|
regexp: Any = None
|
||||||
|
content_types: Any = None
|
||||||
|
state: Any = None
|
||||||
|
run_task: Any = None
|
||||||
|
|
||||||
|
|
||||||
|
class Router:
|
||||||
|
def __init__(self):
|
||||||
|
self._message_handlers: List[Handler] = []
|
||||||
|
self._inline_handlers: List[Handler] = []
|
||||||
|
self._callback_handlers: List[Handler] = []
|
||||||
|
|
||||||
|
def message_handler(
|
||||||
|
self, *custom_filters, commands=None, regexp=None, content_types=None, state=None, run_task=None, **kwargs
|
||||||
|
):
|
||||||
|
def decorator(callback):
|
||||||
|
self._message_handlers.append(
|
||||||
|
Handler(callback, custom_filters, kwargs, commands, regexp, content_types, state, run_task)
|
||||||
|
)
|
||||||
|
return callback
|
||||||
|
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
def inline_handler(self, *custom_filters, state=None, run_task=None, **kwargs):
|
||||||
|
def decorator(callback):
|
||||||
|
self._inline_handlers.append(Handler(callback, custom_filters, kwargs, state=state, run_task=run_task))
|
||||||
|
return callback
|
||||||
|
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
def callback_query_handler(self, *custom_filters, state=None, run_task=None, **kwargs):
|
||||||
|
def decorator(callback):
|
||||||
|
self._callback_handlers.append(Handler(callback, custom_filters, kwargs, state=state, run_task=run_task))
|
||||||
|
return callback
|
||||||
|
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
def setup(self, dp: Dispatcher):
|
||||||
|
for handler in self._message_handlers:
|
||||||
|
dp.register_message_handler(
|
||||||
|
handler.callback,
|
||||||
|
*handler.custom_filters,
|
||||||
|
commands=handler.commands,
|
||||||
|
regexp=handler.regexp,
|
||||||
|
content_types=handler.content_types,
|
||||||
|
state=handler.state,
|
||||||
|
run_task=handler.run_task,
|
||||||
|
**handler.kwargs
|
||||||
|
)
|
||||||
|
|
||||||
|
for handler in self._inline_handlers:
|
||||||
|
dp.register_inline_handler(
|
||||||
|
handler.callback,
|
||||||
|
*handler.custom_filters,
|
||||||
|
state=handler.state,
|
||||||
|
run_task=handler.run_task,
|
||||||
|
**handler.kwargs
|
||||||
|
)
|
||||||
|
|
||||||
|
for handler in self._callback_handlers:
|
||||||
|
dp.register_callback_query_handler(
|
||||||
|
handler.callback,
|
||||||
|
*handler.custom_filters,
|
||||||
|
state=handler.state,
|
||||||
|
run_task=handler.run_task,
|
||||||
|
**handler.kwargs
|
||||||
|
)
|
4
requirements.txt
Normal file
4
requirements.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
aiogram
|
||||||
|
tortoise-orm[asyncpg]
|
||||||
|
aerich
|
||||||
|
python-dotenv
|
35
settings.py
Normal file
35
settings.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
from abc import ABC
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
|
||||||
|
class _Settings(ABC):
|
||||||
|
@classmethod
|
||||||
|
def _get_env(cls, parameter: str) -> str:
|
||||||
|
parameter = os.getenv(parameter, None)
|
||||||
|
if not parameter:
|
||||||
|
raise ValueError(f"{parameter} not defined in ENV")
|
||||||
|
return parameter
|
||||||
|
|
||||||
|
|
||||||
|
class BotSettings(_Settings):
|
||||||
|
@classmethod
|
||||||
|
def token(cls) -> str:
|
||||||
|
return cls._get_env("BOT_TOKEN")
|
||||||
|
|
||||||
|
|
||||||
|
class DatabaseSettings(_Settings):
|
||||||
|
@classmethod
|
||||||
|
def user(cls) -> str:
|
||||||
|
return cls._get_env("POSTGRES_USER")
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def password(cls) -> str:
|
||||||
|
return cls._get_env("POSTGRES_PASSWORD")
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def database_name(cls) -> str:
|
||||||
|
return cls._get_env("POSTGRES_DB")
|
Loading…
Reference in New Issue
Block a user