diff --git a/.github/workflows/python-lint.yml b/.github/workflows/python-lint.yml index 18be560..fc28bdb 100644 --- a/.github/workflows/python-lint.yml +++ b/.github/workflows/python-lint.yml @@ -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" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index caefdcb..7f1b3e5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -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?$ diff --git a/README.md b/README.md index aab772a..ee06f0c 100644 --- a/README.md +++ b/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 ` - Subscribe the current room to a feed. -* `!rss unsubscribe ` - Unsubscribe the current room from a feed. -* `!rss subscriptions` - List subscriptions (and feed IDs) in the current room. -* `!rss notice [true/false]` - Set whether the bot should send new - posts as `m.notice` (if false, they're sent as `m.text`). -* `!rss template [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. diff --git a/maubot.yaml b/maubot.yaml index b8c0836..4cefc3d 100644 --- a/maubot.yaml +++ b/maubot.yaml @@ -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 diff --git a/pyproject.toml b/pyproject.toml index f143797..3e608c9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,4 +8,4 @@ line_length = 99 [tool.black] line-length = 99 -target-version = ["py310"] +target-version = ["py38"] diff --git a/rss/bot.py b/rss/bot.py index 74c1681..0352f4c 100644 --- a/rss/bot.py +++ b/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( - '

Current template in this room:

'
-                f"{html.escape(sub.notification_template.template)}"
-                "
", - allow_html=True, - markdown=False, - ) - return await self.dbm.update_template(feed.id, evt.room_id, template) sub = Subscription( feed_id=feed.id,