import re from core.aochat import server_packets, client_packets from core.conn import Conn from core.decorators import instance from core.logger import Logger from core.lookup.character_service import CharacterService from core.setting_service import SettingService from core.setting_types import BooleanSettingType from core.text import Text from core.igncore import Tyrbot @instance("Darknet") class DarkController: relay_channel_id = None relay_name = None MESSAGE_SOURCE = "darknet" message_regex = re.compile(r"^(){2}\[([a-zA-Z]{2,})] " r"(.+) \[(.+)] \[(.+)]$", re.DOTALL) name_regex = re.compile(r"\1", re.DOTALL) def __init__(self): self.logger = Logger(__name__) def inject(self, registry): self.bot: Tyrbot = registry.get_instance("bot") self.text: Text = registry.get_instance("text") self.setting_service: SettingService = registry.get_instance("setting_service") self.character_service: CharacterService = registry.get_instance("character_service") self.message_hub_service = registry.get_instance("message_hub_service") def pre_start(self): self.bot.register_packet_handler(server_packets.PrivateChannelInvited.id, self.handle_private_channel_invite) self.bot.register_packet_handler(server_packets.PrivateChannelMessage.id, self.handle_private_channel_message) self.message_hub_service.register_message_source(self.MESSAGE_SOURCE) def start(self): self.setting_service.register(self.module_name, "dark_relay", "true", BooleanSettingType(), "Is the Module Enabled?") self.setting_service.register(self.module_name, "dark_wts", "true", BooleanSettingType(), "Is the WTS channel visible?") self.setting_service.register(self.module_name, "dark_wtb", "true", BooleanSettingType(), "Is the WTB channel visible?") self.setting_service.register(self.module_name, "dark_lr", "true", BooleanSettingType(), "Is the Lootrights channel visible?") self.setting_service.register(self.module_name, "dark_gen", "true", BooleanSettingType(), "Is the General channel visible?") self.setting_service.register(self.module_name, "dark_pvp", "true", BooleanSettingType(), "Is the PvP channel visible?") self.setting_service.register(self.module_name, "dark_pvm", "true", BooleanSettingType(), "Is the PVM channel visible?") self.setting_service.register(self.module_name, "dark_event", "true", BooleanSettingType(), "Is the Event channel visible?") def handle_private_channel_invite(self, conn: Conn, packet: server_packets.PrivateChannelInvited): if conn != "main": pass if self.setting_service.get_value("dark_relay") == "0": return if "Darknet" == self.character_service.get_char_name(packet.private_channel_id): channel_name = self.character_service.get_char_name(packet.private_channel_id) self.bot.send_packet(client_packets.PrivateChannelJoin(packet.private_channel_id)) self.logger.info("Joined private channel {channel}".format(channel=channel_name)) self.relay_channel_id = packet.private_channel_id self.relay_name = channel_name def handle_private_channel_message(self, conn, packet: server_packets.PrivateChannelMessage): if conn != "main": pass if self.setting_service.get_value("dark_relay") == "0": return if packet.private_channel_id == self.relay_channel_id: if self.bot.get_char_id() == packet.char_id: return if packet.char_id != self.relay_channel_id: return message = packet.message.strip() self.process_incoming_relay_message(message) def process_incoming_relay_message(self, message): if re.search(self.message_regex, message): cont = re.findall(self.message_regex, message) cont = cont[0] ch = cont[1].lower() msg = cont[2] tell = cont[3] if ch == "wts": if self.setting_service.get_value("dark_wts") == "0": return channel = "WTS" elif ch == "wtb": if self.setting_service.get_value("dark_wtb") == "0": return channel = "WTB" elif ch == "lootrights": if self.setting_service.get_value("dark_lr") == "0": return channel = "LR" elif ch == "general": if self.setting_service.get_value("dark_gen") == "0": return channel = "Gen" elif ch == "pvm": if self.setting_service.get_value("dark_pvm") == "0": return channel = "PvM" elif ch == "event": if self.setting_service.get_value("dark_event") == "0": return channel = "Event" elif ch == "pvp": if self.setting_service.get_value("dark_pvp") == "0": return channel = "PvP" elif ch == "auction": channel = "AUCTION" else: return message = ("[%s] %s [%s]" % (self.text.strip_html_tags(channel), msg, tell)) self.message_hub_service.send_message(self.MESSAGE_SOURCE, None, message, message)