Add channel deduplication
This commit is contained in:
parent
d645fecae0
commit
63b4be0ac1
4 changed files with 29 additions and 3 deletions
|
|
@ -32,6 +32,7 @@ class Bot:
|
||||||
DELETE_MESSAGES = 1
|
DELETE_MESSAGES = 1
|
||||||
SCAN_BOT_CHANNEL = 2
|
SCAN_BOT_CHANNEL = 2
|
||||||
REFRESH_SUBS = 3
|
REFRESH_SUBS = 3
|
||||||
|
DELETE_DUPLICATE_CHANNELS = 4
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _get_code_version() -> str:
|
def _get_code_version() -> str:
|
||||||
|
|
@ -75,6 +76,7 @@ class Bot:
|
||||||
|
|
||||||
categories, text_channel = self.discord_manager.list_channels(
|
categories, text_channel = self.discord_manager.list_channels(
|
||||||
self.guild_id, request_timeout=self.config.request_timeout)
|
self.guild_id, request_timeout=self.config.request_timeout)
|
||||||
|
|
||||||
self.guild_text_channels: list[TextChannel] = text_channel
|
self.guild_text_channels: list[TextChannel] = text_channel
|
||||||
self.guild_categories: list[ChannelCategory] = categories
|
self.guild_categories: list[ChannelCategory] = categories
|
||||||
self.init_message: Message | None = None
|
self.init_message: Message | None = None
|
||||||
|
|
@ -95,7 +97,9 @@ class Bot:
|
||||||
self.tasks.append((
|
self.tasks.append((
|
||||||
self.Task.SCAN_BOT_CHANNEL, time.time() + self.config.bot_channel_scan_interval, None))
|
self.Task.SCAN_BOT_CHANNEL, time.time() + self.config.bot_channel_scan_interval, None))
|
||||||
self.tasks = list(filter(lambda t: t[0] != Bot.Task.REFRESH_SUBS, self.tasks))
|
self.tasks = list(filter(lambda t: t[0] != Bot.Task.REFRESH_SUBS, self.tasks))
|
||||||
self.tasks.append((Bot.Task.REFRESH_SUBS, time.time() + 1, None))
|
if self.config.delete_duplicate_channels:
|
||||||
|
self.tasks.append((Bot.Task.DELETE_DUPLICATE_CHANNELS, time.time(), None))
|
||||||
|
self.tasks.append((Bot.Task.REFRESH_SUBS, time.time(), None))
|
||||||
self.logger.info('Bot initialized')
|
self.logger.info('Bot initialized')
|
||||||
|
|
||||||
def init_bot_channel(self) -> TextChannel | None:
|
def init_bot_channel(self) -> TextChannel | None:
|
||||||
|
|
@ -122,6 +126,20 @@ class Bot:
|
||||||
deny=Permissions.NONE)]},
|
deny=Permissions.NONE)]},
|
||||||
request_timeout=self.config.request_timeout)
|
request_timeout=self.config.request_timeout)
|
||||||
|
|
||||||
|
def _delete_duplicate_text_channels(self):
|
||||||
|
self.logger.debug('Deleting duplicated text channels')
|
||||||
|
channel_names: list[str] = [c.name for c in self.guild_text_channels if c.name is not None]
|
||||||
|
unique_names: set[str] = set(channel_names)
|
||||||
|
for name in unique_names:
|
||||||
|
occurence = 0
|
||||||
|
for channel in self.guild_text_channels:
|
||||||
|
if channel.name == name:
|
||||||
|
occurence += 1
|
||||||
|
if occurence > 1:
|
||||||
|
self.logger.debug('Deleting duplicate channel: %d -> %s', channel.id, name)
|
||||||
|
self.discord_manager.delete_text_channel(
|
||||||
|
channel.id, request_timeout=self.config.request_timeout)
|
||||||
|
|
||||||
def _get_all_channel_messages(self, channel: TextChannel) -> list[Message]:
|
def _get_all_channel_messages(self, channel: TextChannel) -> list[Message]:
|
||||||
messages_id_delete_task: set[int] = set()
|
messages_id_delete_task: set[int] = set()
|
||||||
for task_type, _, task_params in self.tasks:
|
for task_type, _, task_params in self.tasks:
|
||||||
|
|
@ -554,3 +572,9 @@ class Bot:
|
||||||
self.tasks = list(filter(lambda t: t[0] != Bot.Task.REFRESH_SUBS, self.tasks))
|
self.tasks = list(filter(lambda t: t[0] != Bot.Task.REFRESH_SUBS, self.tasks))
|
||||||
self.tasks.append((
|
self.tasks.append((
|
||||||
self.Task.REFRESH_SUBS, time.time() + self.config.youtube_channel_refresh_interval, None))
|
self.Task.REFRESH_SUBS, time.time() + self.config.youtube_channel_refresh_interval, None))
|
||||||
|
case Bot.Task.DELETE_DUPLICATE_CHANNELS:
|
||||||
|
try:
|
||||||
|
self._delete_duplicate_text_channels()
|
||||||
|
except Exception as error:
|
||||||
|
self.logger.error('Error deleting duplicate channels : %s -> %s',
|
||||||
|
error, traceback.format_exc().replace('\n', ' | '))
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ class Config:
|
||||||
bot_channel_scan_interval: float = 30.
|
bot_channel_scan_interval: float = 30.
|
||||||
bot_channel_init_retries: int = 3
|
bot_channel_init_retries: int = 3
|
||||||
bot_message_duration: float = 150.
|
bot_message_duration: float = 150.
|
||||||
|
delete_duplicate_channels: bool = True
|
||||||
request_timeout: float = 3.
|
request_timeout: float = 3.
|
||||||
unmanaged_categories: str = ''
|
unmanaged_categories: str = ''
|
||||||
youtube_channel_refresh_interval: float = 600
|
youtube_channel_refresh_interval: float = 600
|
||||||
|
|
|
||||||
BIN
tests/data/subscriptions.csv
(Stored with Git LFS)
BIN
tests/data/subscriptions.csv
(Stored with Git LFS)
Binary file not shown.
|
|
|
@ -6,6 +6,7 @@ from breadtube_bot.youtube_subscription import SubscriptionHelper
|
||||||
def test_helper():
|
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['UUkKYLbCdxz3KyNKDzfrL20g'].name == 'abal'
|
||||||
assert subscriptions['UUFrDDP81MX_QfOHrRZOgD4g'].name == 'l214'
|
assert subscriptions['UUFrDDP81MX_QfOHrRZOgD4g'].name == 'l214'
|
||||||
assert subscriptions['UUe2Lt08V5TVudUa86OzRm3w'].name == 'irascible'
|
assert subscriptions['UUe2Lt08V5TVudUa86OzRm3w'].name == 'irascible'
|
||||||
assert subscriptions['UUHXyS9njDTc-HbnfRr1k6uA'].name == 'praxis-par-francois-boulo'
|
assert subscriptions['UUHXyS9njDTc-HbnfRr1k6uA'].name == 'praxis-par-francois-boulo'
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue