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_auto_archive_duration: int
default_thread_rate_limit_per_user: 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 @staticmethod
def list_guilds(guild_id: int) -> tuple[ApiAction, str]: def list_guilds(guild_id: int) -> tuple[ApiAction, str]:
return ApiAction.GET, f'/guilds/{guild_id}/channels' return ApiAction.GET, f'/guilds/{guild_id}/channels'

View file

@ -6,7 +6,6 @@ import http.client
import logging import logging
import operator import operator
from pathlib import Path from pathlib import Path
import re
import sys import sys
import time import time
from typing import Any from typing import Any
@ -377,6 +376,10 @@ class Bot:
allow=Permissions.VIEW_CHANNEL | Permissions.SEND_MESSAGES, allow=Permissions.VIEW_CHANNEL | Permissions.SEND_MESSAGES,
deny=Permissions.NONE)]}, deny=Permissions.NONE)]},
request_timeout=self.config.request_timeout) 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 return sub_channel
def _refresh_subscription(self, connection: http.client.HTTPSConnection, subscription: SubscriptionInfo): 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}') raise RuntimeError(f'Error creating channel with params (no info): {params}')
return TextChannel.from_dict(channel_info) 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, def create_message(self, channel: TextChannel, params: Api.Message.CreateParams, request_timeout: float,
upload_files: list[tuple[str, FileMime, bytes]] | None = None) -> Message: upload_files: list[tuple[str, FileMime, bytes]] | None = None) -> Message:
if 'content' in params and len(params['content']) >= self.MAX_MESSAGE_LENGTH: 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 dataclasses import dataclass, field
from datetime import datetime from datetime import datetime
import re
from typing import NewType from typing import NewType
from breadtube_bot.unidecode import unidecode from breadtube_bot.unidecode import unidecode
@ -68,7 +69,10 @@ class SubscriptionInfo:
@staticmethod @staticmethod
def discord_compatible_name(text: str) -> SubscriptionName: def discord_compatible_name(text: str) -> SubscriptionName:
assert text, 'Channel name cannot be empty' 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 @staticmethod
def from_dict(info: dict) -> SubscriptionInfo: def from_dict(info: dict) -> SubscriptionInfo:

View file

@ -54,6 +54,7 @@ max-nested-blocks=8
max-public-methods=16 max-public-methods=16
max-returns=8 max-returns=8
max-statements=96 max-statements=96
max-statements-in-try=64
[tool.ruff.lint.mccabe] [tool.ruff.lint.mccabe]
max-complexity = 34 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()) subscriptions = SubscriptionHelper.read_text(Path('tests/data/subscriptions.csv').read_bytes())
assert subscriptions['UUlDye0T4xTEq46sA5evq9fA'].name == 'a-gauche' assert subscriptions['UUlDye0T4xTEq46sA5evq9fA'].name == 'a-gauche'
assert subscriptions['UUFrDDP81MX_QfOHrRZOgD4g'].name == 'l214' assert subscriptions['UUFrDDP81MX_QfOHrRZOgD4g'].name == 'l214'
assert subscriptions['UUe2Lt08V5TVudUa86OzRm3w'].name == 'irascible'
assert subscriptions['UUHXyS9njDTc-HbnfRr1k6uA'].name == 'praxis-par-francois-boulo'