diff --git a/src/mudlib/commands/helpadmin.py b/src/mudlib/commands/helpadmin.py index 8174727..8b123e2 100644 --- a/src/mudlib/commands/helpadmin.py +++ b/src/mudlib/commands/helpadmin.py @@ -159,8 +159,34 @@ async def _on_edit_admin( async def _cmd_remove(player: Player, args: str) -> None: - """Placeholder for topic removal.""" - await player.send("Not yet implemented.\r\n") + """Remove a help topic.""" + name = args.strip() + if not name: + await player.send("Usage: @help remove \r\n") + return + + if name not in _help_topics: + await player.send(f"Topic '{name}' not found.\r\n") + return + + await player.send(f"Remove topic '{name}'? [y/N]: ") + player.pending_input = lambda p, line: _on_remove_confirm(p, line, name) + + +async def _on_remove_confirm(player: Player, line: str, name: str) -> None: + if line.strip().lower() not in ("y", "yes"): + await player.send("Cancelled.\r\n") + return + + # Remove from memory + _help_topics.pop(name, None) + + # Remove file + path = Path(__file__).resolve().parents[2] / "content" / "help" / f"{name}.toml" + if path.exists(): + path.unlink() + + await player.send(f"Topic '{name}' removed.\r\n") register( diff --git a/tests/test_help_topics.py b/tests/test_help_topics.py index 97009cc..f6611b2 100644 --- a/tests/test_help_topics.py +++ b/tests/test_help_topics.py @@ -227,3 +227,27 @@ async def test_at_help_edit_prompts_title(admin_player): output = "".join(c[0][0] for c in admin_player.writer.write.call_args_list) # Should show current title as default assert "combat primer" in output + + +@pytest.mark.asyncio +async def test_at_help_remove_unknown_topic(admin_player): + await commands.dispatch(admin_player, "@help remove bogus") + output = "".join(c[0][0] for c in admin_player.writer.write.call_args_list) + assert "not found" in output.lower() + + +@pytest.mark.asyncio +async def test_at_help_remove_no_args(admin_player): + await commands.dispatch(admin_player, "@help remove") + output = "".join(c[0][0] for c in admin_player.writer.write.call_args_list) + assert "usage" in output.lower() + + +@pytest.mark.asyncio +async def test_at_help_remove_prompts_confirmation(admin_player): + _help_topics["combat"] = HelpTopic( + name="combat", body="fight", title="combat primer" + ) + await commands.dispatch(admin_player, "@help remove combat") + output = "".join(c[0][0] for c in admin_player.writer.write.call_args_list) + assert "y/n" in output.lower() or "confirm" in output.lower()