9f1da9a00d
Changed the setting registration, removed the warnings. Loot roll messages are more obvious now. Superadmins are meant to stay mostily hidden, but are being exposed in !system again.
204 lines
10 KiB
Python
204 lines
10 KiB
Python
import time
|
|
|
|
from core.command_alias_service import CommandAliasService
|
|
from core.command_param_types import Const, Character, Options
|
|
from core.db import DB
|
|
from core.decorators import instance, command, timerevent, event
|
|
from core.lookup.character_service import CharacterService
|
|
from core.private_channel_service import PrivateChannelService
|
|
from core.setting_service import SettingService
|
|
from core.setting_types import ColorSettingType, BooleanSettingType
|
|
from core.text import Text
|
|
from core.igncore import Tyrbot
|
|
from modules.core.accounting.services.access_service import AccessService
|
|
|
|
|
|
@instance()
|
|
class LeaderController:
|
|
NOT_LEADER_MSG = "Error! You must be raid leader, or have higher access " \
|
|
"level than the raid leader to use this command."
|
|
|
|
def __init__(self):
|
|
self.leader = None
|
|
self.last_activity = None
|
|
self.echo = False
|
|
|
|
def inject(self, registry):
|
|
self.db: DB = registry.get_instance("db")
|
|
self.text: Text = registry.get_instance("text")
|
|
self.access_service: AccessService = registry.get_instance("access_service")
|
|
self.character_service: CharacterService = registry.get_instance("character_service")
|
|
self.bot: Tyrbot = registry.get_instance("bot")
|
|
self.setting_service: SettingService = registry.get_instance("setting_service")
|
|
self.command_alias_service: CommandAliasService = registry.get_instance("command_alias_service")
|
|
|
|
def pre_start(self):
|
|
self.command_alias_service.add_alias("repeat", "leader echo")
|
|
self.setting_service.register(self.module_name, "leader_echo_color", "#00FF00", ColorSettingType(),
|
|
"Color with which the leader's messages will be echoed with")
|
|
self.setting_service.register(self.module_name, "leader_auto_echo", True, BooleanSettingType(),
|
|
"If turned on, when someone assume the leader role, "
|
|
"leader echo will automatically be activated for said person")
|
|
|
|
@command(command="leader", params=[], access_level="member",
|
|
description="Show the current raid leader")
|
|
def leader_show_command(self, _):
|
|
if self.leader:
|
|
return "The current raid leader is <highlight>{leader}<end>.".format(leader=self.leader.name)
|
|
else:
|
|
return "There is no current raid leader. Use <highlight><symbol>leader set<end> to become the raid leader."
|
|
|
|
@command(command="leader", params=[Const("echo"), Options(["on", "off"])], access_level="leader",
|
|
description="Echo whatever the current leader types in channel, in a distinctive color", sub_command="mgn")
|
|
def leader_echo_command(self, request, _2, switch_to):
|
|
if self.leader:
|
|
if self.can_use_command(request.sender.char_id):
|
|
self.echo = switch_to == "on"
|
|
return f"Raidleader echo for <highlight>{self.leader.name}<end> has been turned " \
|
|
f"<highlight>{switch_to}<end>."
|
|
else:
|
|
return "Insufficient access level."
|
|
elif self.leader is None and switch_to == "on":
|
|
return "No current leader set, can't turn on leader echo."
|
|
|
|
@command(command="leader", params=[Const("echo")], access_level="leader",
|
|
description="See the current status for leader echoing", sub_command="mgn")
|
|
def leader_echo_status_command(self, _1, _2):
|
|
if self.leader:
|
|
on_off = "on" if self.echo else "off"
|
|
return f"<highlight>{self.leader.name}<end> is set as leader, leader echo is <highlight>{on_off}<end>"
|
|
else:
|
|
return "No current leader set, echo is off."
|
|
|
|
@command(command="leader", params=[Const("clear")], access_level="leader",
|
|
description="Clear the current raid leader", sub_command="mgn")
|
|
def leader_clear_command(self, request, _):
|
|
return self.set_raid_leader(request.sender, None)
|
|
|
|
@command(command="leader", params=[Const("set")], access_level="leader", sub_command="mgn",
|
|
description="Set (or unset) yourself as raid leader")
|
|
def leader_set_self_command(self, request, _):
|
|
return self.set_raid_leader(request.sender, request.sender)
|
|
|
|
@command(command="leader",
|
|
params=[Const("set", is_optional=True), Character("character")],
|
|
access_level="leader",
|
|
sub_command="mgn1",
|
|
description="Set another character as raid leader")
|
|
def leader_set_other_command(self, request, _, char):
|
|
if not char.char_id:
|
|
return "Could not find <highlight>{player}<end>.".format(player=char)
|
|
|
|
return self.set_raid_leader(request.sender, char)
|
|
|
|
@timerevent(budatime="1h", description="Remove raid leader if raid leader hasn't been active for more than 1 hour")
|
|
def leader_auto_remove(self, _1, _2):
|
|
if self.last_activity:
|
|
if self.last_activity - int(time.time()) > 3600:
|
|
self.leader = None
|
|
self.last_activity = None
|
|
self.echo = False
|
|
|
|
self.bot.send_private_channel_message("Raid leader has been cleared automatically "
|
|
"because of inactivity.")
|
|
|
|
@event(PrivateChannelService.LEFT_PRIVATE_CHANNEL_EVENT, "Remove raid leader if raid leader leaves private channel")
|
|
def leader_remove_on_leave_private(self, _, event_data):
|
|
if self.leader:
|
|
if self.leader.char_id == event_data.char_id:
|
|
self.leader = None
|
|
self.last_activity = None
|
|
self.echo = False
|
|
self.bot.send_private_channel_message(
|
|
f"{self.character_service.resolve_char_to_name(event_data.char_id)} "
|
|
f"left private channel, and has been cleared as raid leader.")
|
|
|
|
@event(PrivateChannelService.PRIVATE_CHANNEL_MESSAGE_EVENT, "Echo leader messages from private channel",
|
|
is_hidden=True)
|
|
def leader_echo_private_event(self, _, event_data):
|
|
if self.leader and self.echo:
|
|
if self.leader.char_id == event_data.char_id:
|
|
if self.setting_service.get("symbol").get_value() != event_data.message[0]:
|
|
self.leader_echo(event_data.char_id, event_data.message)
|
|
|
|
def leader_echo(self, char_id, message):
|
|
sender = self.character_service.resolve_char_to_name(char_id)
|
|
color = self.setting_service.get("leader_echo_color").get_value()
|
|
|
|
self.bot.send_private_channel_message(f"{sender}: <font color={color}>{message}</font>",
|
|
fire_outgoing_event=False)
|
|
|
|
self.activity_done()
|
|
|
|
def activity_done(self):
|
|
self.last_activity = int(time.time())
|
|
|
|
def can_use_command(self, char_id):
|
|
if not self.leader or self.access_service.has_sufficient_access_level(char_id, self.leader.char_id):
|
|
self.activity_done()
|
|
return True
|
|
|
|
return False
|
|
|
|
def set_raid_leader(self, sender, set_to):
|
|
if set_to is None:
|
|
if not self.leader:
|
|
return "There is no current raid leader."
|
|
elif self.leader.char_id == sender.char_id:
|
|
self.leader = None
|
|
self.echo = False
|
|
return "You have been removed as raid leader."
|
|
elif self.can_use_command(sender.char_id):
|
|
old_leader = self.leader
|
|
self.leader = None
|
|
self.echo = False
|
|
self.bot.send_private_message(old_leader.char_id,
|
|
f"You have been removed as raid leader "
|
|
f"by <highlight>{sender.name}<end>.")
|
|
return f"You have removed <highlight>{old_leader.name}<end> as raid leader."
|
|
else:
|
|
return f"You do not have a high enough access level to remove raid leader " \
|
|
f"from <highlight>{self.leader.name}<end>."
|
|
elif sender.char_id == set_to.char_id:
|
|
if not self.leader:
|
|
self.leader = sender
|
|
self.echo = self.setting_service.get("leader_auto_echo").get_value()
|
|
reply = "You have been set as raid leader."
|
|
if self.echo:
|
|
reply += " Leader echo is <green>enabled<end>."
|
|
return reply
|
|
elif self.leader.char_id == sender.char_id:
|
|
self.leader = None
|
|
self.echo = False
|
|
return "You have been removed as raid leader."
|
|
elif self.can_use_command(sender.char_id):
|
|
old_leader = self.leader
|
|
self.leader = sender
|
|
self.echo = self.setting_service.get("leader_auto_echo").get_value()
|
|
reply = f"<highlight>{sender.name}<end> has taken raid leader from you."
|
|
if self.echo:
|
|
reply += " Leader echo is <green>enabled<end>."
|
|
self.bot.send_private_message(old_leader.char_id, reply)
|
|
reply = f"You have taken raid leader from <highlight>{old_leader.name}<end>."
|
|
if self.echo:
|
|
reply += " Leader echo is <green>enabled<end>."
|
|
return reply
|
|
else:
|
|
return f"You do not have a high enough access level to " \
|
|
f"take raid leader from <highlight>{self.leader.name}<end>."
|
|
else:
|
|
if self.can_use_command(sender.char_id):
|
|
self.leader = set_to
|
|
self.echo = self.setting_service.get("leader_auto_echo").get_value()
|
|
reply = f"<highlight>{sender.name}<end> has set you as raid leader."
|
|
if self.echo:
|
|
reply += " Leader echo is <green>enabled<end>."
|
|
self.bot.send_private_message(set_to.char_id, reply)
|
|
reply = f"<highlight>{set_to.name}<end> has been set as raid leader by {sender.name}."
|
|
if self.echo:
|
|
reply += " Leader echo is <green>enabled<end>."
|
|
return reply
|
|
else:
|
|
return f"You do not have a high enough access level to " \
|
|
f"take raid leader from <highlight>{self.leader.name}<end>."
|