-> !wants
-> !orgs info
-> special cmd's
-> !assist
-> "afk" for players without active account
-> !loot add <item_ref> <count> => nolonger breaks !account
Changes:
-> grouped !tara, !gaunt, .. into !wb
-> Display the most recent news entry on logon (default: enabled)
-> improved grouping of !items
-> Added the option to authentificate WS connections (Datanet module). This is used in special cases, where the Websocket Server requires the clien tto authentificate itself. (Server sends "#auth", client responds with the auth string)
-> Add main name to relaying (priv <-> org) [default: disabled]
-> Added logon/logoff messages back
-> restricted default access to "dangerous" commands to moderator
-> Added optional logging (Private Channel, Org Channel, Tells, ... disabled by default)

Rewrite of the Tower Module.
-> More verbosity, if enabled in config. by default, GAS and Hot timer only.
-> !hot displays currently hot (and in penalty) sites, and these which go hot in < 60 minutes
-> !attacks filterable by PF and Site
-> display current contract QL's grouped by org: !contracts (requires managed cache)
This commit is contained in:
2021-11-25 14:09:43 +01:00
parent 2d7ecf4883
commit 17c776faec
44 changed files with 1669 additions and 1249 deletions
+2
View File
@@ -257,6 +257,8 @@ class Character(Any):
if char_id is None:
return SenderObj(char_id, val.capitalize(), None)
else:
if int(char_id) >= 4294967290:
return SenderObj(None, val.capitalize(), None)
return SenderObj(char_id, val.capitalize(), access_service.get_access_level(char_id))
+30 -7
View File
@@ -17,6 +17,7 @@ from core.logger import Logger
from core.lookup.character_service import CharacterService
from core.public_channel_service import PublicChannelService
from core.setting_service import SettingService
from core.setting_types import BooleanSettingType
from core.text import Text
from modules.core.accounting.services.access_service import AccessService
@@ -41,8 +42,8 @@ class IgnCore:
self.dimension = None
self.last_timer_event = 0
self.start_time = int(time.time())
self.major_version = "IGNCore v2.7"
self.minor_version = "2"
self.major_version = "IGNCore v2.8"
self.minor_version = "0"
self.incoming_queue = FifoQueue()
self.mass_message_queue = None
self.conns = DictObject()
@@ -151,6 +152,15 @@ class IgnCore:
def start(self):
self.register_packet_handler(server_packets.PrivateMessage.id, self.handle_private_message, priority=40)
self.setting_service.register("core.logging", "log_tells", "false",
BooleanSettingType(),
"Should tells get logged to file")
self.setting_service.register("core.logging", "log_priv", "false",
BooleanSettingType(),
"Should the private channel get logged to file")
self.setting_service.register("core.logging", "log_org", "false",
BooleanSettingType(),
"Should the org channel get logged to file")
def connect(self, config):
conn = self.create_conn("main")
@@ -352,6 +362,13 @@ class IgnCore:
else:
color = self.setting_service.get("private_message_color").get_font_color() if add_color else ""
pages = self.get_text_pages(msg, self.setting_service.get("private_message_max_page_length").get_value())
if self.setting_service.get_value("log_tells") == "1":
if type(msg) == ChatBlob:
self.logger.log_tell('spam', '->', self.character_service.get_char_name(char_id),
f"[link]{msg.title}[/link]")
else:
self.logger.log_tell('spam', '->', self.character_service.get_char_name(char_id), msg)
for page in pages:
# self.logger.log_tell(conn_id, "To", self.character_service.get_char_name(char_id), page)
packet = client_packets.PrivateMessage(char_id, color + page, "\0")
@@ -376,18 +393,23 @@ class IgnCore:
DictObject({"private_channel_id": private_channel_id, "message": msg}))
def send_mass_message(self, char_id, msg, add_color=True, log_message=False):
# self.logger.log_tell('spam', 'To', self.character_service.get_char_name(char_id), msg)
if not char_id:
self.logger.warning("Could not send message to empty char_id")
if len(self.conns.items()) == 1:
self.send_private_message(char_id, msg, add_color, log_message)
else:
if self.setting_service.get_value("log_tells") == "1":
if type(msg) == ChatBlob:
self.logger.log_tell('spam', '->', self.character_service.get_char_name(char_id),
f"[link]{msg.title}[/link]")
else:
self.logger.log_tell('spam', '->', self.character_service.get_char_name(char_id), msg)
color = self.setting_service.get("private_message_color").get_font_color() if add_color else ""
pages = self.get_text_pages(msg, self.setting_service.get("private_message_max_page_length").get_value())
for page in pages:
if log_message:
self.logger.log_tell("spam", "To", self.character_service.get_char_name(char_id), page)
# if self.log_mass_tell().get_value():
# self.logger.log_tell("spam", "->", self.character_service.get_char_name(char_id), page)
if self.mass_message_queue:
packet = client_packets.PrivateMessage(char_id, color + page, "\0")
self.mass_message_queue.put(packet)
@@ -396,7 +418,8 @@ class IgnCore:
self.conns["main"].send_packet(packet)
def handle_private_message(self, conn: Conn, packet: server_packets.PrivateMessage):
# self.logger.log_tell(conn.id, "From", self.character_service.get_char_name(packet.char_id), packet.message)
if self.setting_service.get_value("log_tells") == "1":
self.logger.log_tell(conn.id, "<-", self.character_service.get_char_name(packet.char_id), packet.message)
self.event_service.fire_event(self.PRIVATE_MSG_EVENT, packet)
def get_text_pages(self, msg, max_page_length):
+11 -2
View File
@@ -2,6 +2,7 @@ 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.setting_service import SettingService
@instance()
@@ -19,6 +20,7 @@ class PrivateChannelService:
self.event_service = registry.get_instance("event_service")
self.character_service = registry.get_instance("character_service")
self.access_service = registry.get_instance("access_service")
self.setting_service: SettingService = registry.get_instance("setting_service")
def pre_start(self):
self.event_service.register_event_type(self.JOINED_PRIVATE_CHANNEL_EVENT)
@@ -38,15 +40,19 @@ class PrivateChannelService:
def handle_private_channel_message(self, conn: Conn, packet: server_packets.PrivateChannelMessage):
if conn.id != "main":
return
if self.setting_service.get_value("log_priv") == "1":
char_name = self.character_service.get_char_name(packet.char_id)
self.logger.log_chat(conn, "Private Channel", char_name, packet.message)
if packet.private_channel_id == self.bot.get_char_id():
self.event_service.fire_event(self.PRIVATE_CHANNEL_MESSAGE_EVENT, packet)
def handle_private_channel_client_joined(self, conn: Conn, packet: server_packets.PrivateChannelClientJoined):
if conn.id != "main":
return
if packet.private_channel_id == self.bot.get_char_id():
if self.setting_service.get_value("log_priv") == "1":
char_name = self.character_service.get_char_name(packet.char_id)
self.logger.log_chat(conn, "Private Channel", None, f"{char_name} joined the channel.")
self.private_channel_chars[packet.char_id] = packet
self.event_service.fire_event(self.JOINED_PRIVATE_CHANNEL_EVENT, packet)
@@ -55,6 +61,9 @@ class PrivateChannelService:
return
if packet.private_channel_id == self.bot.get_char_id():
if self.setting_service.get_value("log_priv") == "1":
char_name = self.character_service.get_char_name(packet.char_id)
self.logger.log_chat(conn, "Private Channel", None, f"{char_name} left the channel.")
del self.private_channel_chars[packet.char_id]
self.event_service.fire_event(self.LEFT_PRIVATE_CHANNEL_EVENT, packet)
+14 -12
View File
@@ -87,20 +87,22 @@ class PublicChannelService(BaseModule):
return
if self.is_org_channel_id(packet.channel_id):
# char_name = self.character_service.get_char_name(packet.char_id)
# if packet.extended_message:
# message = packet.extended_message.get_message()
# else:
# message = packet.message
# # self.logger.log_chat(conn.id, "Org Channel", char_name, message)
if self.setting_service.get_value("log_org") == "1" and packet.char_id == self.bot.get_char_id():
char_name = self.character_service.get_char_name(packet.char_id)
if packet.extended_message:
message = packet.extended_message.get_message()
else:
message = packet.message
self.logger.log_chat(conn.id, "Org Channel", char_name, message)
self.event_service.fire_event(self.ORG_CHANNEL_MESSAGE_EVENT, packet)
elif packet.channel_id == self.ORG_MSG_CHANNEL_ID:
# char_name = self.character_service.get_char_name(packet.char_id)
# if packet.extended_message:
# message = packet.extended_message.get_message()
# else:
# message = packet.message
# self.logger.log_chat(conn.id, "Org Msg", char_name, message)
if self.setting_service.get_value("log_org") == "1" and packet.char_id == self.bot.get_char_id():
char_name = self.character_service.get_char_name(packet.char_id)
if packet.extended_message:
message = packet.extended_message.get_message()
else:
message = packet.message
self.logger.log_chat(conn.id, "Org Msg", char_name, message)
self.event_service.fire_event(self.ORG_MSG_EVENT, packet)
def is_org_channel_id(self, channel_id):
+1 -1
View File
@@ -128,7 +128,7 @@ class Text:
if count == 0:
return no_data_msg
else:
blob = "<font color=CCInfoText>"
blob = ""
blob += "" + pages + "\n"
blob += headline
index = offset