2026-03-23 12:45:37 +03:00
2026-03-23 12:45:37 +03:00
2026-03-23 12:45:37 +03:00
2026-03-23 01:08:14 +03:00
2026-03-22 18:07:16 +03:00
2026-03-22 19:19:11 +03:00
2026-03-22 18:07:16 +03:00
2026-03-22 19:12:27 +03:00
2026-03-22 19:19:11 +03:00
2026-03-22 18:07:16 +03:00
2026-03-22 19:12:27 +03:00

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
No description provided
Readme 119 KiB
Languages
Python 99.4%
Dockerfile 0.4%
Shell 0.2%