jabnews
Jabber-бот для трансляции RSS-новостей в конференции (MUC).
Бот подписывается на RSS-ленты и автоматически публикует новые записи в указанные jabber-комнаты.
Возможности
- Управление через личные сообщения и команды в конференции
- Подписка на несколько RSS-лент с индивидуальным интервалом опроса
- Дедупликация: каждый RSS-источник опрашивается один раз, даже если подписан в нескольких комнатах
- Персональные командные символы для каждой комнаты
- Разграничение прав: владелец бота, администратор комнаты, участник
Команды
Личные сообщения
| Команда | Описание |
|---|---|
join <room@conference.example.org> |
Добавить бота в конференцию |
exit <room@conference.example.org> |
Вывести бота из конференции |
list |
Список моих комнат |
list-all |
Все комнаты бота — только для владельца |
help |
Справка |
Команды в конференции
По умолчанию командные символы — !. Их можно изменить командой cmd.
| Команда | Описание |
|---|---|
! subscribe <url> [интервал] |
Подписаться на RSS (интервал в минутах, default 15, min 5) |
! unsubscribe <url> |
Отписаться от RSS |
! list |
Список подписок комнаты |
! cmd <символы> |
Сменить командные символы |
! help |
Справка по командам комнаты |
Обращение к боту по нику (jabnews, help) эквивалентно команде ! help.
Архитектура
Проект реализован по паттерну Ports and Adapters (Hexagonal Architecture).
src/
domain/
subscriptions/ — shared kernel: Subscription, SubscriptionRepository
news/ — NewsItem, NewsFetcher, NewsPublisher, FetchAndPublishNews
admin/ — Room, Admin, все usecases управления
adapters/
jabber/ — XMPP-соединение, публикация новостей, обработка команд
sources/rss/ — получение новостей через feedparser
db/ — SQLite реализации репозиториев
scheduled/ — таймер проверки новостей (каждые 5 мин)
main.py — composition root
Направления зависимостей
domain/admin → domain/subscriptions
domain/news → domain/subscriptions
adapters/* → domain/*
main.py → adapters/* + domain/*
domain/admin ↛ domain/news
domain/news ↛ domain/admin
Доменный слой не зависит ни от slixmpp, ни от feedparser, ни от aiosqlite.
Запуск
Требования
- Docker + Docker Compose
Настройка
cp env.example .env
Заполните .env:
BOT_JID=bot@your-jabber-server.com
BOT_PASSWORD=secret
JID_OWNER=owner@your-jabber-server.com
BOT_NICK=jabnews
DB_PATH=/data/jabnews.db
LOG_LEVEL=INFO
Запуск через Docker Compose
docker compose up -d
База данных хранится в ./data/jabnews.db на хосте.
Запуск локально (для разработки)
uv sync
cp env.example .env
# заполнить .env
uv run python src/main.py
Стек
- Python 3.12+
- slixmpp — XMPP-клиент
- feedparser — парсинг RSS
- aiosqlite — асинхронная работа с SQLite
- uv — сборка и управление зависимостями
Description
Languages
Python
99.4%
Dockerfile
0.4%
Shell
0.2%