Fixed:
-> !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:
@@ -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")
|
||||
|
||||
@@ -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)],
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
import re
|
||||
|
||||
from core.aochat.client_packets import PrivateMessage
|
||||
from core.command_param_types import Const
|
||||
from core.decorators import instance, setting, command, timerevent, event
|
||||
from core.logger import Logger
|
||||
from core.lookup.character_service import CharacterService
|
||||
from core.message_hub_service import MessageHubService
|
||||
from core.public_channel_service import PublicChannelService
|
||||
from core.setting_service import SettingService
|
||||
from core.setting_types import TextSettingType
|
||||
from core.text import Text
|
||||
from core.igncore import IgnCore
|
||||
from core.util import Util
|
||||
|
||||
|
||||
@instance()
|
||||
class RaidSpyController:
|
||||
planned = ""
|
||||
|
||||
def __init__(self):
|
||||
self.logger = Logger(__name__)
|
||||
|
||||
def inject(self, registry):
|
||||
self.bot: IgnCore = registry.get_instance("bot")
|
||||
self.setting_service: SettingService = registry.get_instance("setting_service")
|
||||
self.character_service: CharacterService = registry.get_instance("character_service")
|
||||
self.public_channel_service: PublicChannelService = registry.get_instance("public_channel_service")
|
||||
self.util: Util = registry.get_instance("util")
|
||||
self.text: Text = registry.get_instance("text")
|
||||
self.relay_hub_service: MessageHubService = registry.get_instance("message_hub_service")
|
||||
|
||||
@setting(name="raidbot-name", value="", description="The Raidbot")
|
||||
def raidbot(self):
|
||||
return TextSettingType(allow_empty=True)
|
||||
|
||||
@event(event_type=IgnCore.PRIVATE_MSG_EVENT, description="update raidlist", is_enabled=False)
|
||||
def handle_raidbot_msg(self, _, textblob: PrivateMessage):
|
||||
if self.character_service.get_char_name(textblob.char_id) != self.setting_service.get_value("raidbot-name"):
|
||||
return
|
||||
tag = re.search(
|
||||
r"<font color=#.{6}><font color=#.{6}>Planned Raids last updated \w+ \d+\w+, \d+ \d+:\d+:: "
|
||||
r"<a href=\"text://(.+)\">.+</a></font></font>",
|
||||
textblob.message,
|
||||
re.DOTALL)
|
||||
if tag:
|
||||
textblob.message = tag[1]
|
||||
with open("data/latest_raids.txt", "w") as f:
|
||||
f.write(textblob.message)
|
||||
self.planned = textblob.message
|
||||
self.bot.send_org_message("Die Raids wurden geupdatet: " +
|
||||
self.text.format_page("Die Raids der Woche", self.planned), fire_outgoing_event=False)
|
||||
self.bot.send_private_channel_message("Die Raids wurden geupdatet: " +
|
||||
self.text.format_page("Die Raids der Woche", self.planned),
|
||||
fire_outgoing_event=False)
|
||||
|
||||
@event(event_type="connect", description="update raidlist", is_enabled=False)
|
||||
def handle_log_raidlog(self, _, _1):
|
||||
try:
|
||||
with open("data/latest_raids.txt", "r") as f:
|
||||
self.planned = f.read()
|
||||
except FileNotFoundError:
|
||||
self.planned = "<center><font color=#DDDD44>:::: Planned Raids ::::" \
|
||||
"</font></center><br><font color=#66AA66> Es sind mir leider keine Raids bekannt.</font>"
|
||||
|
||||
# @command(command="raids", params=[],
|
||||
# description="Shows planned raids", access_level="org_member")
|
||||
# def raids_list(self, request):
|
||||
# return self.text.format_page("Die Raids der Woche", self.planned)
|
||||
|
||||
@command(command="raids", params=[Const("update")],
|
||||
description="Shows planned raids", access_level="moderator", sub_command="update")
|
||||
def raids_patch(self, request, _):
|
||||
self.bot.send_private_message(self.character_service.resolve_char_to_id(self.raidbot().get_value()),
|
||||
"!raids",
|
||||
add_color=False)
|
||||
return "Das Updaten der Raidliste wurde eingeleitet... Sollte es neues geben, " \
|
||||
"Informiere ich Alle Mitglieder für dich."
|
||||
|
||||
@timerevent(budatime="12h", description="Update Raid list")
|
||||
def check_for_raids(self, _, _2):
|
||||
if self.raidbot().get_value() == "":
|
||||
return
|
||||
self.bot.send_private_message(self.character_service.resolve_char_to_id(self.raidbot().get_value()),
|
||||
"!raids",
|
||||
add_color=False)
|
||||
Reference in New Issue
Block a user