diff --git a/breadtube_bot/api.py b/breadtube_bot/api.py index c152522..845dd41 100644 --- a/breadtube_bot/api.py +++ b/breadtube_bot/api.py @@ -95,6 +95,10 @@ class Api: default_auto_archive_duration: int default_thread_rate_limit_per_user: int + @staticmethod + def delete_channel(channel_id: int) -> tuple[ApiAction, str]: + return ApiAction.DELETE, f'/channels/{channel_id}' + @staticmethod def list_guilds(guild_id: int) -> tuple[ApiAction, str]: return ApiAction.GET, f'/guilds/{guild_id}/channels' diff --git a/breadtube_bot/bot.py b/breadtube_bot/bot.py index 0f963d5..02b5478 100644 --- a/breadtube_bot/bot.py +++ b/breadtube_bot/bot.py @@ -6,7 +6,6 @@ import http.client import logging import operator from pathlib import Path -import re import sys import time from typing import Any @@ -377,6 +376,10 @@ class Bot: allow=Permissions.VIEW_CHANNEL | Permissions.SEND_MESSAGES, deny=Permissions.NONE)]}, request_timeout=self.config.request_timeout) + if sub_channel != subscription.name: + self.logger.error('Cannot create channel "%s" : mismatch name -> %s', + subscription.name, sub_channel.name) + self.discord_manager.delete_text_channel(sub_channel.id, request_timeout=self.config.request_timeout) return sub_channel def _refresh_subscription(self, connection: http.client.HTTPSConnection, subscription: SubscriptionInfo): diff --git a/breadtube_bot/discord_manager.py b/breadtube_bot/discord_manager.py index 5f01988..0e34a45 100644 --- a/breadtube_bot/discord_manager.py +++ b/breadtube_bot/discord_manager.py @@ -152,6 +152,11 @@ class DiscordManager: raise RuntimeError(f'Error creating channel with params (no info): {params}') return TextChannel.from_dict(channel_info) + def delete_text_channel(self, channel_id: int, request_timeout: float): + _, _ = self._send_request( + *Api.Guild.delete_channel(channel_id=channel_id), request_timeout=request_timeout, + expected_code=204) + def create_message(self, channel: TextChannel, params: Api.Message.CreateParams, request_timeout: float, upload_files: list[tuple[str, FileMime, bytes]] | None = None) -> Message: if 'content' in params and len(params['content']) >= self.MAX_MESSAGE_LENGTH: diff --git a/breadtube_bot/youtube_subscription.py b/breadtube_bot/youtube_subscription.py index c83ecae..d9a9a50 100644 --- a/breadtube_bot/youtube_subscription.py +++ b/breadtube_bot/youtube_subscription.py @@ -2,6 +2,7 @@ from __future__ import annotations from dataclasses import dataclass, field from datetime import datetime +import re from typing import NewType from breadtube_bot.unidecode import unidecode @@ -68,7 +69,10 @@ class SubscriptionInfo: @staticmethod def discord_compatible_name(text: str) -> SubscriptionName: assert text, 'Channel name cannot be empty' - return SubscriptionName(unidecode(text[:100].replace(' ', '-'))) + name = unidecode(text[:100].replace(' ', '-')) + name = re.sub(r'-+', '-', name) + name = re.sub(r'-+$', '', name) + return SubscriptionName(name) @staticmethod def from_dict(info: dict) -> SubscriptionInfo: diff --git a/pyproject.toml b/pyproject.toml index e489f74..929db9b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,7 @@ max-nested-blocks=8 max-public-methods=16 max-returns=8 max-statements=96 +max-statements-in-try=64 [tool.ruff.lint.mccabe] max-complexity = 34 diff --git a/tests/data/subscriptions.csv b/tests/data/subscriptions.csv index 3e9a12b..d29f353 100644 --- a/tests/data/subscriptions.csv +++ b/tests/data/subscriptions.csv @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:43048fa740f1583dcd33c27ffa38b15a03aa53177aa6c1ce23b2adebb04546af -size 91 +oid sha256:cc1286c164a1bb48c7fcd500c010ecc39311525002afd567f2b0dfe6e21bc22e +size 182 diff --git a/tests/test_youtube_subscription.py b/tests/test_youtube_subscription.py index 9d3f23c..56a423f 100644 --- a/tests/test_youtube_subscription.py +++ b/tests/test_youtube_subscription.py @@ -7,3 +7,5 @@ def test_helper(): subscriptions = SubscriptionHelper.read_text(Path('tests/data/subscriptions.csv').read_bytes()) assert subscriptions['UUlDye0T4xTEq46sA5evq9fA'].name == 'a-gauche' assert subscriptions['UUFrDDP81MX_QfOHrRZOgD4g'].name == 'l214' + assert subscriptions['UUe2Lt08V5TVudUa86OzRm3w'].name == 'irascible' + assert subscriptions['UUHXyS9njDTc-HbnfRr1k6uA'].name == 'praxis-par-francois-boulo'