diff --git a/src/core/configuration.py b/src/core/configuration.py index 89bb73d..b2467af 100644 --- a/src/core/configuration.py +++ b/src/core/configuration.py @@ -5,7 +5,6 @@ from pydantic import BaseModel, Field class MigrationSettings(BaseModel): batch_size: int = Field(default=100) - rate_limit_delay_seconds: int = Field(default=2) log_level: str = Field(default="DEBUG") class AppConfig(BaseModel): diff --git a/src/fluxer/clone_server.py b/src/fluxer/clone_server.py index e4df087..5182b0b 100644 --- a/src/fluxer/clone_server.py +++ b/src/fluxer/clone_server.py @@ -115,7 +115,6 @@ async def migrate_channels(context: MigrationContext, progress_callback: Callabl current_idx += 1 if progress_callback: await progress_callback(f"Cat: {cat.name}", "Copying", current_idx, total) - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) # Create missing channels for channel in channels_to_create: @@ -161,7 +160,6 @@ async def migrate_channels(context: MigrationContext, progress_callback: Callabl current_idx += 1 if progress_callback: await progress_callback(channel.name, "Copying", current_idx, total) - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) # Move/Sync existing channels for channel, fluxer_id in channels_to_move: @@ -190,6 +188,5 @@ async def migrate_channels(context: MigrationContext, progress_callback: Callabl current_idx += 1 if progress_callback: await progress_callback(channel.name, "Syncing", current_idx, total) - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) return cloned_info diff --git a/src/fluxer/emoji_stickers.py b/src/fluxer/emoji_stickers.py index 261bc9f..8e339d2 100644 --- a/src/fluxer/emoji_stickers.py +++ b/src/fluxer/emoji_stickers.py @@ -113,6 +113,5 @@ async def migrate_emojis(context: MigrationContext, progress_callback: Callable[ logger.error(f"Error downloading/uploading {obj_type.lower()} {obj.name}: {e}") if progress_callback: await progress_callback(obj.name, obj_type, idx + 1, total) - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) return cloned_assets diff --git a/src/fluxer/migrate_message.py b/src/fluxer/migrate_message.py index 4c1529e..cda4360 100644 --- a/src/fluxer/migrate_message.py +++ b/src/fluxer/migrate_message.py @@ -299,7 +299,6 @@ async def migrate_messages( logger.error(traceback.format_exc()) # Delay for rate limit safety - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) except (KeyboardInterrupt, asyncio.CancelledError): context.is_running = False pass diff --git a/src/fluxer/roles_permissions.py b/src/fluxer/roles_permissions.py index 6589e4b..407c7b8 100644 --- a/src/fluxer/roles_permissions.py +++ b/src/fluxer/roles_permissions.py @@ -160,6 +160,5 @@ async def migrate_roles(context: MigrationContext, progress_callback: Callable[[ cloned_role_names.append(role.name) if progress_callback: await progress_callback(role.name, idx + 1, total) - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) return cloned_role_names diff --git a/src/stoat/clone_server.py b/src/stoat/clone_server.py index 22a9c4c..a7fb6cc 100644 --- a/src/stoat/clone_server.py +++ b/src/stoat/clone_server.py @@ -116,7 +116,6 @@ async def migrate_channels(context: MigrationContext, progress_callback: Callabl current_idx += 1 if progress_callback: await progress_callback(f"Cat: {cat.name}", "Copying", current_idx, total) - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) # 2. Create missing channels (unparented for now) for channel in channels_to_create: @@ -158,7 +157,6 @@ async def migrate_channels(context: MigrationContext, progress_callback: Callabl current_idx += 1 if progress_callback: await progress_callback(channel.name, "Copying", current_idx, total) - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) # 3. Move/Sync existing channels for channel, target_id in channels_to_move: @@ -183,7 +181,6 @@ async def migrate_channels(context: MigrationContext, progress_callback: Callabl current_idx += 1 if progress_callback: await progress_callback(channel.name, "Syncing", current_idx, total) - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) # 4. Final step: Parent the channels into categories via mass server.edit() logger.info("Parenting all channels into their respective categories...") diff --git a/src/stoat/emoji_stickers.py b/src/stoat/emoji_stickers.py index ab944a1..bfa1b60 100644 --- a/src/stoat/emoji_stickers.py +++ b/src/stoat/emoji_stickers.py @@ -100,6 +100,5 @@ async def migrate_emojis(context: MigrationContext, progress_callback: Callable[ logger.error(f"Error downloading/uploading {obj_type.lower()} {obj.name}: {e}") if progress_callback: await progress_callback(obj.name, obj_type, idx + 1, total) - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) return cloned_assets diff --git a/src/stoat/migrate_message.py b/src/stoat/migrate_message.py index cad277e..b8755aa 100644 --- a/src/stoat/migrate_message.py +++ b/src/stoat/migrate_message.py @@ -304,9 +304,7 @@ async def migrate_messages( logger.error(f"Failed to process message {msg.id}: {e}") import traceback logger.error(traceback.format_exc()) - - # Delay for rate limit safety - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) + except (KeyboardInterrupt, asyncio.CancelledError): context.is_running = False pass diff --git a/src/stoat/roles_permissions.py b/src/stoat/roles_permissions.py index 9ea23cc..7899aff 100644 --- a/src/stoat/roles_permissions.py +++ b/src/stoat/roles_permissions.py @@ -161,7 +161,6 @@ async def sync_permissions(context: MigrationContext, progress_callback: Callabl current_idx += 1 if progress_callback: await progress_callback(channel.name, current_idx, total) - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) logger.info(f"Stoat permissions sync complete: {len(synced_info['categories_synced'])} categories, {len(synced_info['channels_synced'])} channels.") @@ -208,7 +207,5 @@ async def migrate_roles(context: MigrationContext, progress_callback: Callable[[ cloned_role_names.append(role.name) if progress_callback: await progress_callback(role.name, idx + 1, total) - await asyncio.sleep(context.config.migration.rate_limit_delay_seconds) return cloned_role_names - diff --git a/src/ui/main_app.py b/src/ui/main_app.py index 70572dc..633acd1 100644 --- a/src/ui/main_app.py +++ b/src/ui/main_app.py @@ -436,27 +436,24 @@ class ConfigScreen(Screen): # ── save / start ───────────────────────────────────────────────────── def _collect_and_save(self) -> None: - token = self.query_one("#inp_discord_token", Input).value.strip() - self.config.discord_bot_token = token or None - - server_select = self.query_one("#inp_discord_server", Select) - if server_select.value != Select.BLANK: - self.config.discord_server_id = str(server_select.value) - else: - self.config.discord_server_id = None + # 1. Discord Section + self.config.discord_bot_token = self.query_one("#inp_discord_token", Input).value.strip() or None + d_select = self.query_one("#inp_discord_server", Select) + if d_select.value not in (Select.BLANK, Select.NULL): + self.config.discord_server_id = str(d_select.value) + + # 2. Mode self.config.tool_mode = self._get_selected_mode() + # 3. Target Section if self.config.tool_mode != "backup_only": self.config.target_platform = self._get_selected_platform() - target_token = self.query_one("#inp_target_token", Input).value.strip() - self.config.target_bot_token = target_token or None + self.config.target_bot_token = self.query_one("#inp_target_token", Input).value.strip() or None - target_select = self.query_one("#inp_target_server", Select) - if target_select.value != Select.BLANK: - self.config.target_server_id = str(target_select.value) - else: - self.config.target_server_id = None + t_select = self.query_one("#inp_target_server", Select) + if t_select.value not in (Select.BLANK, Select.NULL): + self.config.target_server_id = str(t_select.value) target_api = self.query_one("#inp_target_api", Input).value.strip() self.config.target_api_url = target_api or None