import os import pathlib from core.chat_blob import ChatBlob from core.command_param_types import Any from core.decorators import instance, command @instance() class InfoController: FILE_EXT = ".txt" CUSTOM_DATA_DIRECTORY = "./data/info" def __init__(self): self.paths = [] self.paths.append(os.path.dirname(os.path.realpath(__file__)) + os.sep + "info") self.paths.append(self.CUSTOM_DATA_DIRECTORY) def inject(self, registry): self.text = registry.get_instance("text") self.command_alias_service = registry.get_instance("command_alias_service") def start(self): self.command_alias_service.add_alias("guides", "info") self.command_alias_service.add_alias("breed", "info breed") self.command_alias_service.add_alias("healdelta", "info healdelta") self.command_alias_service.add_alias("nanodelta", "info nanodelta") self.command_alias_service.add_alias("lag", "info lag") self.command_alias_service.add_alias("stats", "info stats") self.command_alias_service.add_alias("light", "info light") self.command_alias_service.add_alias("doja", "info doja") pathlib.Path(self.CUSTOM_DATA_DIRECTORY).mkdir(parents=True, exist_ok=True) @command(command="info", params=[], access_level="member", description="Show the list of info topics") def info_list_cmd(self, _): topics = self.get_all_topics() blob = "" for topic in topics: blob += self.text.make_tellcmd(topic, "info " + topic) + "\n" return ChatBlob("Info Topics (%d)" % len(topics), blob) @command(command="info", params=[Any("topic")], access_level="member", description="Show the info topic details") def info_show_cmd(self, _, topic_name): topic = self.get_topic_info(topic_name) if topic: return ChatBlob(topic_name.capitalize(), topic) else: return "Could not find info topic %s." % topic_name def register_path(self, path): self.paths.append(path) def get_topic_info(self, name): name = name.lower() for base in reversed(self.paths): file_path = base + os.sep + name + self.FILE_EXT try: with open(file_path, mode="r", encoding="UTF-8") as f: return f.read() except FileNotFoundError: pass return None def get_all_topics(self): topics = [] for base in reversed(self.paths): topics += [f[:-len(self.FILE_EXT)] for f in os.listdir(base) if f.endswith(self.FILE_EXT)] return sorted(set(topics))