diff --git a/api/discord_bot.py b/api/discord_bot.py index 0cd3f96..80cafd8 100644 --- a/api/discord_bot.py +++ b/api/discord_bot.py @@ -146,6 +146,37 @@ async def on_ready(): ) +@bot.event +async def on_guild_channel_update(before, after): + """채널 이름 변경 감지 -> 워크스페이스 자동 이름 변경.""" + if before.name == after.name: + return + + if not ws_manager.is_workspace_channel(after.id): + return + + ws = ws_manager.get_workspace(after.id) + old_name = ws.name + new_name = after.name + + success, new_path = ws_manager.rename_workspace(after.id, new_name) + + if success: + embed = discord.Embed( + title="📝 워크스페이스 자동 업데이트", + description=( + f"채널 이름 변경 감지: `{old_name}` -> `{new_name}`\n\n" + f"워크스페이스 이름: **{new_name}**\n" + f"경로: `{new_path}`" + ), + color=0x3498DB, + ) + await after.send(embed=embed) + else: + logger.warning(f"채널 이름 변경 시 워크스페이스 업데이트 실패: {new_path}") + + + @bot.event async def on_message(message: discord.Message): """메시지 수신 — 워크스페이스 채널이면 자동 응답.""" diff --git a/core/workspace.py b/core/workspace.py index d75fe5d..a628f15 100644 --- a/core/workspace.py +++ b/core/workspace.py @@ -251,6 +251,39 @@ class WorkspaceManager: return True return False + def rename_workspace(self, channel_id: int, new_name: str) -> tuple[bool, str]: + """워크스페이스 이름 + 폴더 변경. + + Returns: (성공 여부, 새 경로 또는 에러 메시지) + """ + ws = self.workspaces.get(channel_id) + if not ws: + return False, "워크스페이스 없음" + + old_name = ws.name + old_path = Path(ws.path) + + # 이름만 변경 (폴더는 기본경로일 때만 이동) + ws.name = new_name + + # 기본경로(VW_Proj 아래)인 경우 폴더도 이동 + base_dir = Path(config.WORKSPACE_BASE_DIR) + if old_path.parent == base_dir and old_path.exists(): + new_path = base_dir / new_name + if not new_path.exists(): + try: + old_path.rename(new_path) + ws.path = str(new_path) + logger.info(f"폴더 이동: {old_path} -> {new_path}") + except OSError as e: + logger.warning(f"폴더 이동 실패: {e}") + ws.path = str(old_path) # 폴더는 유지 + + self._save() + logger.info(f"워크스페이스 이름 변경: {old_name} -> {new_name}") + return True, ws.path + def list_all(self) -> list[Workspace]: """전체 워크스페이스 목록.""" return list(self.workspaces.values()) +