mirror of
https://github.com/maubot/rss.git
synced 2025-04-20 15:25:48 -04:00
Compare commits
No commits in common. "master" and "v0.3.2" have entirely different histories.
2
.github/workflows/python-lint.yml
vendored
2
.github/workflows/python-lint.yml
vendored
@ -9,7 +9,7 @@ jobs:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-python@v3
|
||||
with:
|
||||
python-version: "3.13"
|
||||
python-version: "3.10"
|
||||
- uses: isort/isort-action@master
|
||||
with:
|
||||
sortPaths: "./rss"
|
||||
|
@ -1,6 +1,6 @@
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v5.0.0
|
||||
rev: v4.1.0
|
||||
hooks:
|
||||
- id: trailing-whitespace
|
||||
exclude_types: [markdown]
|
||||
@ -8,13 +8,13 @@ repos:
|
||||
- id: check-yaml
|
||||
- id: check-added-large-files
|
||||
- repo: https://github.com/psf/black
|
||||
rev: 25.1.0
|
||||
rev: 22.3.0
|
||||
hooks:
|
||||
- id: black
|
||||
language_version: python3
|
||||
files: ^rss/.*\.pyi?$
|
||||
- repo: https://github.com/PyCQA/isort
|
||||
rev: 6.0.0
|
||||
rev: 5.10.1
|
||||
hooks:
|
||||
- id: isort
|
||||
files: ^rss/.*\.pyi?$
|
||||
|
28
README.md
28
README.md
@ -1,30 +1,2 @@
|
||||
# rss
|
||||
A [maubot](https://github.com/maubot/maubot) that posts RSS feed updates to Matrix.
|
||||
|
||||
## Usage
|
||||
Basic commands:
|
||||
|
||||
* `!rss subscribe <url>` - Subscribe the current room to a feed.
|
||||
* `!rss unsubscribe <feed ID>` - Unsubscribe the current room from a feed.
|
||||
* `!rss subscriptions` - List subscriptions (and feed IDs) in the current room.
|
||||
* `!rss notice <feed ID> [true/false]` - Set whether the bot should send new
|
||||
posts as `m.notice` (if false, they're sent as `m.text`).
|
||||
* `!rss template <feed ID> [new template]` - Change the post template for a
|
||||
feed in the current room. If the new template is omitted, the bot replies
|
||||
with the current template.
|
||||
|
||||
### Templates
|
||||
The default template is `New post in $feed_title: [$title]($link)`.
|
||||
|
||||
Templates are interpreted as markdown with some simple variable substitution.
|
||||
The following variables are available:
|
||||
|
||||
* `$feed_url` - The URL that was used to subscribe to the feed.
|
||||
* `$feed_link` - The home page of the feed.
|
||||
* `$feed_title` - The title of the feed.
|
||||
* `$feed_subtitle` - The subtitle of the feed.
|
||||
* `$id` - The unique ID of the entry.
|
||||
* `$date` - The date of the entry.
|
||||
* `$title` - The title of the entry.
|
||||
* `$summary` - The summary/description of the entry.
|
||||
* `$link` - The link of the entry.
|
||||
|
@ -1,6 +1,6 @@
|
||||
maubot: 0.3.0
|
||||
id: xyz.maubot.rss
|
||||
version: 0.4.1
|
||||
version: 0.3.2
|
||||
license: AGPL-3.0-or-later
|
||||
modules:
|
||||
- rss
|
||||
|
@ -8,4 +8,4 @@ line_length = 99
|
||||
|
||||
[tool.black]
|
||||
line-length = 99
|
||||
target-version = ["py310"]
|
||||
target-version = ["py38"]
|
||||
|
25
rss/bot.py
25
rss/bot.py
@ -21,8 +21,6 @@ from string import Template
|
||||
from time import mktime, time
|
||||
import asyncio
|
||||
import hashlib
|
||||
import html
|
||||
import io
|
||||
|
||||
import aiohttp
|
||||
import attr
|
||||
@ -257,9 +255,15 @@ class RSSBot(Plugin):
|
||||
async def _parse_rss(
|
||||
cls, feed: Feed, resp: aiohttp.ClientResponse
|
||||
) -> tuple[Feed, list[Entry]]:
|
||||
content = await resp.read()
|
||||
try:
|
||||
content = await resp.text()
|
||||
except UnicodeDecodeError:
|
||||
try:
|
||||
content = await resp.text(encoding="utf-8", errors="ignore")
|
||||
except UnicodeDecodeError:
|
||||
content = str(await resp.read())[2:-1]
|
||||
headers = {"Content-Location": feed.url, **resp.headers, "Content-Encoding": "identity"}
|
||||
parsed_data = feedparser.parse(io.BytesIO(content), response_headers=headers)
|
||||
parsed_data = feedparser.parse(content, response_headers=headers)
|
||||
if parsed_data.bozo:
|
||||
if not isinstance(parsed_data.bozo_exception, feedparser.ThingsNobodyCaresAboutButMe):
|
||||
raise parsed_data.bozo_exception
|
||||
@ -275,12 +279,12 @@ class RSSBot(Plugin):
|
||||
feed_id=feed_id,
|
||||
id=(
|
||||
getattr(entry, "id", None)
|
||||
or getattr(entry, "link", None)
|
||||
or hashlib.sha1(
|
||||
" ".join(
|
||||
[
|
||||
getattr(entry, "title", ""),
|
||||
getattr(entry, "description", ""),
|
||||
getattr(entry, "link", ""),
|
||||
]
|
||||
).encode("utf-8")
|
||||
).hexdigest()
|
||||
@ -388,7 +392,7 @@ class RSSBot(Plugin):
|
||||
help="Change the notification template for a subscription in this room",
|
||||
)
|
||||
@command.argument("feed_id", "feed ID", parser=int)
|
||||
@command.argument("template", "new template", pass_raw=True, required=False)
|
||||
@command.argument("template", "new template", pass_raw=True)
|
||||
async def command_template(self, evt: MessageEvent, feed_id: int, template: str) -> None:
|
||||
if not await self.can_manage(evt):
|
||||
return
|
||||
@ -396,15 +400,6 @@ class RSSBot(Plugin):
|
||||
if not sub:
|
||||
await evt.reply("This room is not subscribed to that feed")
|
||||
return
|
||||
if not template:
|
||||
await evt.reply(
|
||||
'<p>Current template in this room:</p><pre><code language="markdown">'
|
||||
f"{html.escape(sub.notification_template.template)}"
|
||||
"</code></pre>",
|
||||
allow_html=True,
|
||||
markdown=False,
|
||||
)
|
||||
return
|
||||
await self.dbm.update_template(feed.id, evt.room_id, template)
|
||||
sub = Subscription(
|
||||
feed_id=feed.id,
|
||||
|
Loading…
x
Reference in New Issue
Block a user