-> !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 -2
View File
@@ -74,8 +74,8 @@ class CloakController:
time_until_change = row.created_at + one_hour - t
if row.action == "off" and time_until_change <= 0:
time_str = self.util.time_to_readable(t - row.created_at)
msg = "The cloaking device is <orange>disabled</orange> but can be enabled. " \
"<highlight>%s</highlight> disabled it %s ago." % (row.name, time_str)
msg = f"The cloaking device is <orange>disabled</orange> but can be enabled. " \
f"<highlight>{row.name}</highlight> disabled it {time_str} ago."
self.message_hub_service.send_message(self.MESSAGE_SOURCE, None, None, msg)
@event(event_type=CLOAK_EVENT, description="Set a timer for when cloak can be raised and lowered")
+36
View File
@@ -15,6 +15,42 @@ class OrgOnlineController(OnlineController):
if self.bot.is_ready():
self.awaiting_data.put([event_data, 'org', False])
@command(command="logon", params=[Const("clear")], access_level="member",
description="Clears your logon message")
def logon_clear_cmd(self, request, message):
self.account_service.set_logon(request.sender.char_id)
return "Your logon message has been cleared."
@command(command="logoff", params=[Const("clear")], access_level="member",
description="Clears your logoff message")
def logoff_clear_cmd(self, request, message):
self.account_service.set_logoff(request.sender.char_id)
return "Your logoff message has been cleared."
@command(command="logon", params=[Any("message", is_optional=True)], access_level="member",
description="Sets or shows your logon message")
def logon_cmd(self, request, message):
if message:
self.account_service.set_logon(request.sender.char_id, message)
return f"Your new logon message has been set: <grey>{message}</grey>"
else:
entry = self.account_service.get_entry(request.sender.char_id)
if entry.logon:
return f"Your current logon message is: <grey>{entry.logon}</grey>"
return f"You do not have a logon message set."
@command(command="logoff", params=[Any("message", is_optional=True)], access_level="member",
description="Sets or shows your logoff message ")
def logoff_cmd(self, request, message):
if message:
self.account_service.set_logoff(request.sender.char_id, message)
return f"Your new logoff message has been set: <grey>{message}</grey>"
else:
entry = self.account_service.get_entry(request.sender.char_id)
if entry.logon:
return f"Your current logoff message is: <grey>{entry.logon}</grey>"
return f"You do not have a logoff message set."
@command(command="online", params=[Const('all', is_optional=True),
Int("min_level", is_optional=True),
Any("profession", is_optional=True)],
+16 -7
View File
@@ -1,13 +1,13 @@
from core.chat_blob import ChatBlob
from core.db import DB
from core.decorators import instance, event
from core.decorators import instance, event, setting
from core.dict_object import DictObject
from core.igncore import IgnCore
from core.logger import Logger
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 core.igncore import IgnCore
from core.util import Util
from modules.core.accounting.services.account_service import AccountService
from modules.orgbot.org.org_roster_controller import OrgRosterController
@@ -44,11 +44,16 @@ class OrgChannelController:
["private_channel", "websocket_relay", "cloak_reminder", "wave_counter", "shutdown_notice"],
[self.MESSAGE_SOURCE])
self.setting_service.register(self.module_name, "prefix_org_priv", True, BooleanSettingType(),
"Should the prefix [org] be displayed in relayed messages")
def handle_incoming_relay_message(self, ctx):
self.bot.send_org_message(ctx.formatted_message, fire_outgoing_event=False)
# {'source': 'org_channel', 'sender': {'char_id': 384018, 'name': 'Risianna'}, 'message': 'Sooo', 'formatted_message': "[<cyan>Org</cyan>] <a href='user://Risianna'>Risianna</a>: Sooo"}
if not self.display_main().get_value() == "1" and ctx.source == "private_channel" and ctx.sender:
name = f"{OrgChannelController.ORG_CHANNEL_PREFIX} <yellow>{ctx.sender.name}</yellow>"
if account := self.account_service.get_account(ctx.sender.char_id):
if account.main != ctx.sender.char_id:
name += f" (<yellow>{account.name}</yellow>)"
self.bot.send_org_message(name + ": " + ctx.message, fire_outgoing_event=False)
else:
self.bot.send_org_message(ctx.formatted_message, fire_outgoing_event=False)
@event(event_type=PublicChannelService.ORG_CHANNEL_MESSAGE_EVENT,
description="Relay messages from the org channel to the relay hub",
@@ -101,7 +106,7 @@ class OrgChannelController:
if not self.bot.is_ready():
return
char_name = self.character_service.resolve_char_to_name(event_data.packet.char_id)
logoff = f" :: <grey>{event_data.account.logon}<grey>" if event_data.account.logon else ""
logoff = f" :: <grey>{event_data.account.logoff}<grey>" if event_data.account.logoff else ""
msg = f"{char_name} logged <red>off</red>.{logoff}"
self.bot.send_org_message(msg, fire_outgoing_event=False)
self.message_hub_service.send_message(self.MESSAGE_SOURCE, None, None, "[<cyan>Org</cyan>] " + msg)
@@ -132,3 +137,7 @@ class OrgChannelController:
None,
event_data.message,
message)
@setting(name="display_main", value="false", description="Should the main be displayed in relayed messages")
def display_main(self) -> BooleanSettingType:
return BooleanSettingType()
+15 -4
View File
@@ -3,6 +3,7 @@ import time
import requests
from core.aochat import server_packets
from core.buddy_service import BuddyService
from core.cache_service import CacheService
from core.chat_blob import ChatBlob
@@ -11,12 +12,12 @@ from core.db import DB
from core.decorators import instance, command, event, timerevent
from core.dict_object import DictObject
from core.event_service import EventService
from core.igncore import IgnCore
from core.logger import Logger
from core.lookup.character_service import CharacterService
from core.lookup.org_pork_service import OrgPorkService
from core.lookup.pork_service import PorkService
from core.public_channel_service import PublicChannelService
from core.igncore import IgnCore
from core.util import Util
from modules.core.accounting.services.account_service import AccountService
@@ -43,6 +44,7 @@ class OrgRosterController:
JOINED_ORG = [508, 5146599]
def __init__(self):
self.readd_cache = []
self.logger = Logger(__name__)
def inject(self, registry):
@@ -63,12 +65,13 @@ class OrgRosterController:
def pre_start(self):
self.db.exec("CREATE TABLE IF NOT EXISTS org_activity ("
"id int primary key AUTO_INCREMENT, "
"message varchar(32) NOT NULL, "
"message varchar(255) NOT NULL, "
"time int not null)")
self.event_service.register_event_type(self.ORG_MEMBER_LOGON_EVENT)
self.event_service.register_event_type(self.ORG_MEMBER_LOGOFF_EVENT)
self.access_service.register_access_level(self.ORG_ACCESS_LEVEL, 60, self.check_org_member)
self.bot.register_packet_handler(server_packets.BuddyRemoved.id, self.handle_remove)
def check_org_member(self, char_id):
return (self.account_service.get_account(char_id) or {}).get("member", 0) == self.public_channel_service.org_id
@@ -128,7 +131,7 @@ class OrgRosterController:
self.bot.send_org_message("Updating roster...")
cache = self.cache.retrieve('org_roster', f"{self.public_channel_service.org_id}.5.json")
if cache:
if cache.last_modified > time.time() - 16 * 60 * 60:
if cache.last_modified < time.time() - 16 * 60 * 60:
result = requests.get(self.org_pork_service.get_pork_url(5, self.public_channel_service.org_id)).json()
if result:
self.cache.store('org_roster', f"{self.public_channel_service.org_id}.5.json", json.dumps(result))
@@ -250,7 +253,15 @@ class OrgRosterController:
def update_buddylist(self, char_id, mode):
if mode in [self.MODE_ADD_MANUAL, self.MODE_ADD_AUTO]:
if not self.buddy_service.get_buddy(char_id):
self.buddy_service.add_buddy(char_id, self.ORG_BUDDY_TYPE)
return
self.readd_cache.append(char_id)
self.buddy_service.remove_buddy(char_id, "member")
self.buddy_service.add_buddy(char_id, self.ORG_BUDDY_TYPE)
else:
self.buddy_service.remove_buddy(char_id, self.ORG_BUDDY_TYPE)
def handle_remove(self, conn, packet):
if packet.char_id in self.readd_cache:
self.readd_cache.remove(packet.char_id)
self.buddy_service.add_buddy(packet.char_id, self.ORG_BUDDY_TYPE)
@@ -42,8 +42,7 @@ class WaveCounterController:
self.send_message("General incoming. <red>DO NOT enter the city!</red>")
self.scheduled_job_id = None
else:
self.send_message("Wave <highlight>%d</highlight> incoming. "
"<red>DO NOT enter the city!</red>" % wave_number)
self.send_message(f"Wave <highlight>{wave_number}</highlight> incoming. <red>DO NOT enter the city!</red>")
self.scheduled_job_id = self.job_scheduler.scheduled_job(self.timer_alert,
t + self.ALERT_TIMES[wave_number],
wave_number)