Files
igncore/modules/standard/raid/assist_controller.py
T
Minidodo 810c2c8c4d Fix for mrelay - some bots are sending malformed messages, caused by wrong usage of their modules.
Accessing an external service through the bot for gathering tower data is nolonger supported; and should be done via external scripts.
Fix for callers, and missing alias'es for loot tables.
!accounts will only show mains now.
the character order of all alt lists has been reversed: [main] high => low instead of [main] low => high
!account add <name> also marks accounts as type 0, if an account gets re-enabled. might cause strange behaviour with member-logs, if used in onlinebots.
Member type is being displayed in !account now. [Member (X)]
2021-09-19 14:09:44 +02:00

100 lines
4.3 KiB
Python

import time
from core.chat_blob import ChatBlob
from core.command_alias_service import CommandAliasService
from core.command_param_types import Any, Const, Character, Options
from core.decorators import instance, command, event, timerevent
from core.igncore import IgnCore
from core.text import Text
from modules.core.config.alias_controller import AliasController
from modules.standard.raid.leader_controller import LeaderController
@instance()
class AssistController:
def __init__(self):
self.assist = []
self.last_mod = 0
def inject(self, registry):
self.leader_controller: LeaderController = registry.get_instance("leader_controller")
self.command_alias_service: CommandAliasService = registry.get_instance("command_alias_service")
self.bot: IgnCore = registry.get_instance("bot")
self.text: Text = registry.get_instance("text")
def start(self):
self.command_alias_service.add_alias("callers", "caller")
self.command_alias_service.add_alias("assist", "caller")
@command(command="caller", params=[], access_level="member",
description="Show current assist targets")
def assist_command(self, _):
blob = ""
for caller in self.assist:
blob += caller.capitalize()
blob += f" - [{self.text.make_chatcmd('assist', f'assist {caller}')}]"
blob += f" [{self.text.make_tellcmd('REM', f'assist del {caller}')}]<br>"
blob += self.get_assist_output()
self.last_mod = time.time()
return ChatBlob(f"Callers ({len(self.assist)})", blob)
@command(command="caller", params=[Const("clear")], access_level="leader",
description="Clear all assist targets", sub_command="modify")
def assist_clear_command(self, request, _):
if not self.leader_controller.can_use_command(request.sender.char_id):
return LeaderController.NOT_LEADER_MSG
if not self.assist:
return "No assist targets set."
self.assist = []
return "Assist targets have been cleared."
@command(command="caller", params=[Options(["rem", "del"]), Character("char")], access_level="leader",
description="Remove an assisting target", sub_command="modify")
def assist_remove_command(self, request, _, char):
if not self.leader_controller.can_use_command(request.sender.char_id):
return LeaderController.NOT_LEADER_MSG
if not self.assist:
return "No assist targets set."
self.last_mod = time.time()
try:
self.assist.remove(char.name.lower())
return f"<highlight>{char.name}</highlight> is no longer a caller. " \
f"Use: <highlight>{self.get_assist_output()}</highlight>"
except ValueError:
return f"<highlight>{char.name}</highlight> is not on the caller list."
@command(command="caller", params=[Any("assist_targets")], access_level="leader",
description="Set one or more assist targets",
sub_command="modify",
extended_description="Multiple assist targets should be space-delimited")
def assist_set_command(self, request, assist_targets):
targets = assist_targets.split(" ")
if not self.leader_controller.can_use_command(request.sender.char_id):
return LeaderController.NOT_LEADER_MSG
for caller in targets:
if caller.lower() not in self.assist:
self.assist.append(caller.lower())
return self.assist_command(request)
def get_assist_output(self):
if not self.assist:
return "No assist targets set."
return "/macro assist " + "\\n ".join(map(lambda x: "/assist " + x.capitalize(), reversed(self.assist)))
@event("RAID_END", "automatic caller clearing on raid end")
def leader_remove_on_leave_private(self, _, event_data):
if self.assist:
self.assist = []
@timerevent("15m", "Purge callers if there's no raid interaction within 60 minutes")
def callers_purge(self, event_type, event_data):
if not self.assist:
return
if self.last_mod < (time.time()-3600):
self.assist = []
self.bot.send_private_channel_message("Callers have been cleared, "
"as there was no interaction with them for more than 60 minutes.")