-> !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
@@ -94,7 +94,8 @@ class AccountController:
# 0 is member,
# any number above 0 indicates that its an org_member of the same ID)
self.account_service.account_add_member(user.char_id)
self.buddy_service.add_buddy(user.char_id, "member")
for char in self.account_service.get_alts(user.char_id):
self.buddy_service.add_buddy(char.char_id, "member")
self.account_service.add_log(request.sender.char_id, "system",
f"Opened Account for <highlight>{user.name}</highlight>.",
request.sender.char_id)
@@ -256,7 +257,7 @@ class AccountController:
response += f" Status: {'<green>Open</green>' if alts[0].disabled == 0 else '<red>Closed</red>'}\n"
response += f" Created at: <notice>{self.util.format_datetime(alts[0].created)}</notice>\n"
if last_seen:
response += f" Last seen on <notice>{last_seen.name}</notice> <highlight>{self.util.time_to_readable(time.time()-last_seen.last_seen)}</highlight> ago\n"
response += f" Last seen on <notice>{last_seen.name}</notice> <highlight>{self.util.time_to_readable(time.time() - last_seen.last_seen)}</highlight> ago\n"
response += f" Permissions: <notice>{', '.join(perms)}</notice>\n"
if alts[0].discord_joined == 1:
joined = ' (Joined server)'
@@ -5,13 +5,13 @@ from core.buddy_service import BuddyService
from core.db import DB, SqlException
from core.decorators import instance, timerevent, event
from core.dict_object import DictObject
from core.igncore import IgnCore
from core.logger import Logger
from core.lookup.character_service import CharacterService
from core.lookup.pork_service import PorkService
from core.setting_service import SettingService
from core.setting_types import BooleanSettingType
from core.text import Text
from core.igncore import IgnCore
from modules.core.accounting.services.access_service import AccessService
@@ -184,6 +184,14 @@ class AccountService:
"where a.char_id=? and a.char_id not in (SELECT char_id from org_bots)",
[char_id]) or DictObject({})
def set_logon(self, char_id, logon="") -> DictObject:
return self.db.exec("UPDATE account SET logon=? where char_id=?",
[logon, char_id])
def set_logoff(self, char_id, logoff="") -> DictObject:
return self.db.exec("UPDATE account SET logoff=? where char_id=?",
[logoff, char_id])
def add_pending_alt(self, main, alt) -> [str, bool]:
data = self.check_alt(alt)
if data:
@@ -4,18 +4,20 @@ from core.buddy_service import BuddyService
from core.chat_blob import ChatBlob
from core.command_param_types import Character, Multiple
from core.db import DB, SqlException
from core.decorators import instance, command, event
from core.decorators import instance, command, event, setting
from core.dict_object import DictObject
from core.igncore import IgnCore
from core.lookup.character_service import CharacterService
from core.lookup.pork_service import PorkService
from core.private_channel_service import PrivateChannelService
from core.setting_service import SettingService
from core.setting_types import BooleanSettingType
from core.text import Text
from core.translation_service import TranslationService
from core.igncore import IgnCore
from core.util import Util
from modules.core.accounting.services.account_service import AccountService
from modules.core.ban.ban_service import BanService
from modules.orgbot.org.org_controller import OrgChannelController
from modules.standard.online.online_display import OnlineDisplay
@@ -76,7 +78,14 @@ class PrivateChannelController:
return hjson.load(f)
def handle_incoming_relay_message(self, ctx):
self.bot.send_private_channel_message(ctx.formatted_message, fire_outgoing_event=False)
if not self.display_main().get_value() == "1" and ctx.source == "org_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_private_channel_message(name + ": " + ctx.message, fire_outgoing_event=False)
else:
self.bot.send_private_channel_message(ctx.formatted_message, fire_outgoing_event=False)
@event(event_type="member_logon", description="Send autoinvites to players logging in")
def logon_event(self, _, data):
@@ -85,7 +94,7 @@ class PrivateChannelController:
account = data.account
if account.disabled == 1:
return
if account.member == self.bot.public_channel_service.org_id:
if self.pork.get_character_info(data.packet.char_id).org_id == self.bot.public_channel_service.org_id:
return
if account.auto_invite == 1:
self.reinvite.append(data.packet.char_id)
@@ -210,7 +219,7 @@ class PrivateChannelController:
if self.online_controller:
afk_list = self.online_controller.afk_list
od = OnlineDisplay(self.text, self.util, self.db, afk_list)
od = OnlineDisplay(self.text, self.util, self.db)
# od = OnlineDisplay(self.text, self.util, self.db)
params = [self.bot.name, self.bot.get_char_id()]
self.bot.send_mass_message(event_data.char_id,
od.format_blob(od.format_by_channel_prof("and channel_id IN (1, 2) ", params)))
@@ -248,3 +257,7 @@ class PrivateChannelController:
None,
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 -3
View File
@@ -46,7 +46,7 @@ class UtilController:
{"char": char.name,
"rank_main": char.access_level["label"]})
@command(command="macro", params=[Any("command1|command2|command3...")], access_level="member",
@command(command="macro", params=[Any("command1|command2|command3...")], access_level="moderator",
description="Execute multiple commands at once")
def macro_cmd(self, request, commands):
commands = commands.split("|")
@@ -58,7 +58,7 @@ class UtilController:
request.reply,
request.conn)
@command(command="echo", params=[Any("message")], access_level="member",
@command(command="echo", params=[Any("message")], access_level="moderator",
description="Echo back a message")
def echo_cmd(self, _, message):
return html.escape(message)
@@ -96,7 +96,7 @@ class UtilController:
bots_connected += f"{_id} - {conn.char_name} ({conn.char_id})\n"
for channel_id, name in self.public_channel_service.get_all_public_channels().items():
pub_channels += f"{name} - <highlight>{channel_id:d}</highlight>\n"
pub_channels += f"{name} - <highlight>{channel_id}</highlight>\n"
for event_type in self.event_service.get_event_types():
event_types += f"{event_type}\n"