feat: add project infrastructure
- Add src/ structure with config and logger modules - Add .env.example with required environment variables - Add python-dotenv dependency - Add TASK.md with implementation roadmap
This commit is contained in:
6
.env.example
Normal file
6
.env.example
Normal file
@@ -0,0 +1,6 @@
|
||||
# Telegram Bot
|
||||
BOT_TOKEN=your_bot_token_here
|
||||
ADMIN_LOGIN=your_telegram_username
|
||||
|
||||
# Logging (DEBUG, INFO, WARNING, ERROR)
|
||||
LOG_LEVEL=INFO
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -8,3 +8,5 @@ wheels/
|
||||
|
||||
# Virtual environments
|
||||
.venv
|
||||
|
||||
TASK.md
|
||||
@@ -24,8 +24,6 @@
|
||||
|
||||
В `data` попадают только полностью озвученные дорожки. Под дорожкой подразумевается набор всех реплик одного диктора в рамках сценария. Дорожки, озвученные частично, хранятся в `data_partial/<scenario_id>/<replica_number>_<dataset_speaker_id>.wav`. Они автоматически переносятся в `data` после завершения озвучивания.
|
||||
|
||||
Тихие участки в начале и конце аудиофайла автоматически удаляются.
|
||||
|
||||
### База данных
|
||||
|
||||
Служебные данные, такие как состояния пользовательских сессий, соответствие `dataset_speaker_id` и `telegram_user_id` и т. п., сохраняются в базе данных SQLite. После перезагрузки бота его состояние полностью восстанавливается из базы данных.
|
||||
|
||||
18
main.py
18
main.py
@@ -1,5 +1,19 @@
|
||||
def main():
|
||||
print("Hello from dataset-tg-bot!")
|
||||
from telegram.ext import ApplicationBuilder
|
||||
|
||||
from src.config import BOT_TOKEN
|
||||
from src.logger import logger
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""Точка входа приложения."""
|
||||
logger.info("Запуск бота...")
|
||||
|
||||
app = ApplicationBuilder().token(BOT_TOKEN).build()
|
||||
|
||||
# TODO: добавить обработчики
|
||||
|
||||
logger.info("Бот запущен")
|
||||
app.run_polling()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -5,5 +5,6 @@ description = "Add your description here"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.12"
|
||||
dependencies = [
|
||||
"python-dotenv>=1.2.1",
|
||||
"python-telegram-bot>=22.6",
|
||||
]
|
||||
|
||||
0
src/__init__.py
Normal file
0
src/__init__.py
Normal file
25
src/config.py
Normal file
25
src/config.py
Normal file
@@ -0,0 +1,25 @@
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
|
||||
def _get_env(key: str) -> str:
|
||||
"""Получает переменную окружения или выбрасывает ошибку."""
|
||||
value = os.getenv(key)
|
||||
if value is None:
|
||||
raise RuntimeError(f"Переменная окружения {key} не задана")
|
||||
return value
|
||||
|
||||
|
||||
BOT_TOKEN: str = _get_env("BOT_TOKEN")
|
||||
ADMIN_LOGIN: str = _get_env("ADMIN_LOGIN")
|
||||
LOG_LEVEL: str = os.getenv("LOG_LEVEL", "INFO")
|
||||
|
||||
BASE_DIR: Path = Path(__file__).parent.parent
|
||||
DATA_DIR: Path = BASE_DIR / "data"
|
||||
DATA_PARTIAL_DIR: Path = BASE_DIR / "data_partial"
|
||||
SCENARIOS_DIR: Path = BASE_DIR / "scenarios"
|
||||
DB_PATH: Path = BASE_DIR / "bot.db"
|
||||
25
src/logger.py
Normal file
25
src/logger.py
Normal file
@@ -0,0 +1,25 @@
|
||||
import logging
|
||||
import sys
|
||||
|
||||
from src.config import LOG_LEVEL
|
||||
|
||||
|
||||
def setup_logger() -> logging.Logger:
|
||||
"""Настраивает и возвращает логгер приложения."""
|
||||
logger = logging.getLogger("bot")
|
||||
logger.setLevel(LOG_LEVEL)
|
||||
|
||||
if not logger.handlers:
|
||||
handler = logging.StreamHandler(sys.stdout)
|
||||
handler.setLevel(LOG_LEVEL)
|
||||
formatter = logging.Formatter(
|
||||
"%(asctime)s | %(levelname)-8s | %(message)s",
|
||||
datefmt="%Y-%m-%d %H:%M:%S",
|
||||
)
|
||||
handler.setFormatter(formatter)
|
||||
logger.addHandler(handler)
|
||||
|
||||
return logger
|
||||
|
||||
|
||||
logger = setup_logger()
|
||||
15
uv.lock
generated
15
uv.lock
generated
@@ -33,11 +33,15 @@ name = "dataset-tg-bot"
|
||||
version = "0.1.0"
|
||||
source = { virtual = "." }
|
||||
dependencies = [
|
||||
{ name = "python-dotenv" },
|
||||
{ name = "python-telegram-bot" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
requires-dist = [{ name = "python-telegram-bot", specifier = ">=22.6" }]
|
||||
requires-dist = [
|
||||
{ name = "python-dotenv", specifier = ">=1.2.1" },
|
||||
{ name = "python-telegram-bot", specifier = ">=22.6" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "h11"
|
||||
@@ -85,6 +89,15 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "python-dotenv"
|
||||
version = "1.2.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "python-telegram-bot"
|
||||
version = "22.6"
|
||||
|
||||
Reference in New Issue
Block a user