init
This commit is contained in:
53
game_server/game/chat/command_handler.py
Normal file
53
game_server/game/chat/command_handler.py
Normal file
@@ -0,0 +1,53 @@
|
||||
from utils.logger import Info
|
||||
from game_server.game.chat.decorators import command_registry
|
||||
from game_server.net.session import PlayerSession
|
||||
import game_server.game.chat.command # noqa: F401
|
||||
|
||||
|
||||
class CommandHandler:
|
||||
def load_commands(self):
|
||||
registered_commands = ", ".join(
|
||||
item.prefix for item in command_registry.values() if not item.is_alias
|
||||
)
|
||||
|
||||
Info(
|
||||
f"[BOOT] [CommandHandler] Registered {len(command_registry)} game commands => {registered_commands}"
|
||||
)
|
||||
|
||||
def parse_command(self, content: str):
|
||||
content = content.lstrip("/")
|
||||
parts = content.split(maxsplit=1)
|
||||
if len(parts) < 2:
|
||||
return parts[0], ""
|
||||
|
||||
return parts[0], parts[1]
|
||||
|
||||
def print_help(self):
|
||||
result = "Available commands:\n"
|
||||
for index, (_, func) in enumerate(command_registry.items()):
|
||||
result += f"{index+1}) {func.usage}\n\n"
|
||||
return result
|
||||
|
||||
async def handle_command(self, session: PlayerSession, content: str):
|
||||
if content == "/help":
|
||||
return self.print_help()
|
||||
|
||||
command_label, args = self.parse_command(content)
|
||||
command_func = command_registry.get(command_label)
|
||||
|
||||
if command_func is not None:
|
||||
func_args_cnt = command_func.__code__.co_argcount - 1
|
||||
args_list = args.split()[:func_args_cnt]
|
||||
|
||||
if args_list and args_list[0] == "help":
|
||||
return f"Usage: {command_func.usage}"
|
||||
|
||||
try:
|
||||
return await command_func(session, *args_list)
|
||||
except TypeError:
|
||||
return f"Usage: {command_func.usage}"
|
||||
|
||||
return None
|
||||
|
||||
|
||||
handler = CommandHandler()
|
||||
Reference in New Issue
Block a user