116 lines
4.9 KiB
Python
116 lines
4.9 KiB
Python
import hjson
|
|
|
|
from core.chat_blob import ChatBlob
|
|
from core.command_param_types import Any, Const, Options, Character
|
|
from core.decorators import instance, command, timerevent
|
|
from core.logger import Logger
|
|
from core.translation_service import TranslationService
|
|
|
|
|
|
@instance()
|
|
class BuddyController:
|
|
def __init__(self):
|
|
self.logger = Logger(__name__)
|
|
|
|
def inject(self, registry):
|
|
self.bot = registry.get_instance("bot")
|
|
self.character_service = registry.get_instance("character_service")
|
|
self.buddy_service = registry.get_instance("buddy_service")
|
|
self.ts: TranslationService = registry.get_instance("translation_service")
|
|
self.getresp = self.ts.get_response
|
|
|
|
def start(self):
|
|
self.ts.register_translation("module/buddy", self.load_buddy_msg)
|
|
|
|
def load_buddy_msg(self):
|
|
with open("modules/core/buddy/buddy.msg", mode="r", encoding="UTF-8") as f:
|
|
return hjson.load(f)
|
|
|
|
@command(command="buddylist", params=[], access_level="admin",
|
|
description="Show characters on the buddy list")
|
|
def buddylist_cmd(self, _):
|
|
buddy_list = []
|
|
for char_id, buddy in self.buddy_service.get_all_buddies().items():
|
|
char_name = self.character_service.resolve_char_to_name(char_id, "Unknown(%d)" % char_id)
|
|
buddy_list.append([char_name, buddy])
|
|
|
|
blob = self.format_buddies(buddy_list)
|
|
|
|
return ChatBlob(self.getresp("module/buddy", "blob_title", {"amount": len(buddy_list)}), blob)
|
|
|
|
@command(command="buddylist",
|
|
params=[Const("add"), Character("character"), Any("type")],
|
|
access_level="admin",
|
|
description="Add a character to the buddy list")
|
|
def buddylist_add_cmd(self, _, _1, char, buddy_type):
|
|
buddy_type = buddy_type.lower()
|
|
|
|
if char.char_id:
|
|
self.buddy_service.add_buddy(char.char_id, buddy_type)
|
|
return self.getresp("module/buddy", "add_success", {"char": char.name, "type": buddy_type})
|
|
else:
|
|
return self.getresp("global", "char_not_found", {"char": char.name})
|
|
|
|
@command(command="buddylist", params=[Options(["rem", "remove"]), Const("all")], access_level="admin",
|
|
description="Remove all characters from the buddy list")
|
|
def buddylist_remove_all_cmd(self, _, _1, _2):
|
|
count = 0
|
|
for char_id, buddy in self.buddy_service.get_all_buddies().items():
|
|
self.buddy_service.remove_buddy(char_id, None, True)
|
|
count += 1
|
|
|
|
return self.getresp("module/buddy", "rem_all", {"count": count})
|
|
|
|
@command(command="buddylist",
|
|
params=[Options(["rem", "remove"]), Character("character"), Any("type")],
|
|
access_level="admin",
|
|
description="Remove a character from the buddy list")
|
|
def buddylist_remove_cmd(self, _, _1, char, buddy_type):
|
|
buddy_type = buddy_type.lower()
|
|
|
|
if char.char_id:
|
|
self.buddy_service.remove_buddy(char.char_id, buddy_type)
|
|
return self.getresp("module/buddy", "rem_single", {"char": char.name, "type": buddy_type})
|
|
else:
|
|
return self.getresp("global", "char_not_found", {"char": char.name})
|
|
|
|
@command(command="buddylist", params=[Const("clean")], access_level="admin",
|
|
description="Remove all orphaned buddies from the buddy list")
|
|
def buddylist_clean_cmd(self, _, _1):
|
|
return self.getresp("module/buddy", "rem_orphaned", {"count": self.remove_orphaned_buddies()})
|
|
|
|
@command(command="buddylist", params=[Const("search"), Any("character")], access_level="admin",
|
|
description="Search for characters on the buddy list")
|
|
def buddylist_search_cmd(self, _, _1, search):
|
|
search = search.lower()
|
|
|
|
buddy_list = []
|
|
for char_id, buddy in self.buddy_service.get_all_buddies().items():
|
|
char_name = self.character_service.resolve_char_to_name(char_id, "Unknown(%d)" % char_id)
|
|
if search in char_name.lower():
|
|
buddy_list.append([char_name, buddy])
|
|
|
|
blob = self.format_buddies(buddy_list)
|
|
return ChatBlob(self.getresp("module/buddy", "search_title", {"amount": len(buddy_list)}), blob)
|
|
|
|
@timerevent(budatime="24h", description="Remove orphaned buddies", is_hidden=True)
|
|
def remove_orphaned_buddies_event(self, _, _1):
|
|
self.logger.debug("removing %d orphaned buddies" % self.remove_orphaned_buddies())
|
|
|
|
def remove_orphaned_buddies(self):
|
|
count = 0
|
|
for char_id, buddy in self.buddy_service.get_all_buddies().items():
|
|
if len(buddy["types"]) == 0:
|
|
self.buddy_service.remove_buddy(char_id, None, True)
|
|
count += 1
|
|
return count
|
|
|
|
def format_buddies(self, buddy_list):
|
|
buddy_list = sorted(buddy_list, key=lambda x: x[0])
|
|
|
|
blob = ""
|
|
for name, buddy in buddy_list:
|
|
blob += "%s(%s) - %s\n" % (name, buddy["conn_id"], ",".join(buddy["types"]))
|
|
|
|
return blob
|