Fix discord channel name and add verification

This commit is contained in:
BreadTube 2026-05-26 23:59:13 +09:00
commit d645fecae0
7 changed files with 23 additions and 4 deletions

View file

@ -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'

View file

@ -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):

View file

@ -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:

View file

@ -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:

View file

@ -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

BIN
tests/data/subscriptions.csv (Stored with Git LFS)

Binary file not shown.
1 version https://git-lfs.github.com/spec/v1
3 size 182

View file

@ -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'