import time
from core.chat_blob import ChatBlob
from core.command_alias_service import CommandAliasService
from core.command_param_types import Const, Character, Any, Int
from core.db import DB
from core.decorators import instance, command
from core.event_service import EventService
from core.lookup.character_history_service import CharacterHistoryService
from core.lookup.character_service import CharacterService
from core.lookup.pork_service import PorkService
from core.message_hub_service import MessageHubService
from core.setting_service import SettingService
from core.text import Text
from core.igncore import Tyrbot
from core.util import Util
from modules.core.accounting.services.account_service import AccountService
@instance()
class RegisterController:
def inject(self, registry):
self.bot: Tyrbot = registry.get_instance("bot")
self.buddy_service = registry.get_instance("buddy_service")
self.util: Util = registry.get_instance("util")
self.db: DB = registry.get_instance("db")
self.character_service: CharacterService = registry.get_instance("character_service")
self.account_service: AccountService = registry.get_instance("account_service")
self.event_service: EventService = registry.get_instance("event_service")
self.pork_service: PorkService = registry.get_instance("pork_service")
self.text: Text = registry.get_instance("text")
self.setting_service: SettingService = registry.get_instance("setting_service")
self.character_history_service: CharacterHistoryService = registry.get_instance("character_history_service")
self.command_alias_service: CommandAliasService = registry.get_instance("command_alias_service")
self.messagehub: MessageHubService = registry.get_instance("message_hub_service")
def start(self):
self.command_alias_service.add_alias("pending", "register pending")
self.command_alias_service.add_alias("recommend", "register recommend")
self.messagehub.register_message_source("registration")
@command(command="register", params=[Const("pending"), Int('count', is_optional=True)],
description="Show the latest Recommendations", sub_command="mng", access_level="admin")
def register_pending(self, _, _1, limit):
limit = limit or 25
latest = self.db.query("SELECT "
"main.char_id as main_id, "
"alt.char_id as alt_id, "
"recommender.char_id as recommender_id, "
"main.name as main_name, "
"alt.name as alt_name, "
"recommender.name as recommender_name, "
"main.faction as main_faction, "
"alt.faction as alt_faction, "
"recommender.faction as recommender_faction, "
"main.level as main_level, "
"alt.level as alt_level, "
"recommender.level as main_level, "
"alt.ai_level as alt_ai_level, "
"main.ai_level as main_ai_level, "
"recommender.ai_level as recommender_ai_level, "
"reason "
"from pending_accounts p "
"left join player alt on alt.char_id = p.alt "
"left join player main on main.char_id = p.main "
"left join player recommender on recommender.char_id = p.recommender where answered=0 "
"order by time desc limit ?", [limit])
blob = ""
for entry in latest:
blob += self.format_pending(entry, buttons=True)
return ChatBlob("Latest recommendations", blob)
@command(command="register", params=[Const("pending"), Const('latest'), Int('count', is_optional=True)],
description="Show the latest Recommendations", sub_command="mng", access_level="admin")
def register_pending_latest(self, _, _1, _2, limit):
limit = limit or 25
latest = self.db.query("SELECT "
"main.char_id as main_id, "
"alt.char_id as alt_id, "
"recommender.char_id as recommender_id, "
"main.name as main_name, "
"alt.name as alt_name, "
"recommender.name as recommender_name, "
"main.faction as main_faction, "
"alt.faction as alt_faction, "
"recommender.faction as recommender_faction, "
"main.level as main_level, "
"alt.level as alt_level, "
"recommender.level as main_level, "
"alt.ai_level as alt_ai_level, "
"main.ai_level as main_ai_level, "
"recommender.ai_level as recommender_ai_level, "
"reason "
"from pending_accounts p "
"left join player alt on alt.char_id = p.alt "
"left join player main on main.char_id = p.main "
"left join player recommender on recommender.char_id = p.recommender "
"order by time desc limit ?", [limit])
blob = ""
for entry in latest:
blob += self.format_pending(entry)
return ChatBlob("Latest recommendations", blob)
# noinspection LongLine
def format_pending(self, entry, buttons=False):
button = "[" + self.text.make_tellcmd(name="APPROVE", msg=f"pending approve {entry.alt_name}",
style="style='text-decoration:none'") + "] - [" + self.text.make_tellcmd(
name="DENY", msg=f"pending deny {entry.alt_name}",
style="style='text-decoration:none'") + "]" if buttons else ""
if entry.main_id == entry.alt_id:
text = f"[ACC] <{entry.main_faction.lower()}>{entry.main_name}{entry.main_faction.lower()}> ({entry.main_level}/{entry.main_ai_level}) " \
f" [{self.text.make_tellcmd('W', f'whois {entry.main_name}')}] " \
f"[{self.text.make_tellcmd('H', f'history {entry.main_name}')}]\n" \
f"Recommender: <{entry.recommender_faction.lower()}>{entry.recommender_name}{entry.recommender_faction.lower()}> Why: {entry.reason}\n" \
f"{button}"
else:
account = self.account_service.get_account(entry.main_id)
text = f"[ALT] <{entry.alt_faction.lower()}>{entry.alt_name}{entry.alt_faction.lower()}> ({entry.alt_level}/{entry.alt_ai_level}) " \
f" [{self.text.make_tellcmd('W', f'whois {entry.alt_name}')}] " \
f"[{self.text.make_tellcmd('H', f'history {entry.alt_name}')}]\n" \
f"Main: <{entry.main_faction.lower()}>{entry.main_name}{entry.main_faction.lower()}> ({entry.main_level}/{entry.main_ai_level}) [Join: {self.util.format_datetime(account.created)}]" \
f" - [{self.text.make_tellcmd('W', f'whois {entry.main_name}')}] " \
f"[{self.text.make_tellcmd('H', f'history {entry.main_name}')}]\n" \
f"{button}"
return text + "\n\n"
@command(command="register", params=[Const("pending"), Const('deny'), Character('character')],
description="Deny (and disable) a pending account", sub_command="mng", access_level="admin")
def register_pending_deny(self, request, _1, _2, user):
pending = self.account_service.is_pending(user.char_id)
if not pending:
return f"There's no pending registration for {user.name}."
self.account_service.create_users([(pending.alt, pending.alt, -1, time.time(), time.time())])
self.account_service.add_log(request.sender.char_id, "system",
f"Created {user.name}'s account.",
request.sender.char_id)
self.account_service.add_log(user.char_id, "system",
f"Account closed by {request.sender.name}.",
request.sender.char_id)
self.db.exec("UPDATE pending_accounts set answered = 1 where alt=?", [pending.alt])
self.account_service.account_disable(user.char_id)
self.send_notify(self.Notify.DENIED, user.name, user.name)
# noinspection LongLine
@command(command="register", params=[Const("pending"), Const('approve'), Character('character')],
description="Approve (and activate) a pending account", sub_command="mng", access_level="admin")
def register_pending_approve(self, request, _1, _2, user):
pending = self.account_service.is_pending(user.char_id)
if not pending:
return f"There's no pending registration for {user.name}."
self.account_service.create_users([(pending.alt, pending.alt, 0, time.time(), time.time())])
if pending.alt == pending.main:
self.db.exec("UPDATE pending_accounts set answered = 1 where alt=?", [pending.alt])
self.account_service.add_log(request.sender.char_id, "system",
f"Opened {user.name}'s account.",
request.sender.char_id)
self.account_service.add_log(user.char_id, "system",
f"Account opened by {request.sender.name}.",
request.sender.char_id)
recommender: str = self.character_service.get_char_name(pending.recommender)
self.buddy_service.add_buddy(user.char_id, "member")
self.bot.send_mass_message(user.char_id,
f"Your Account has been opened by "
f"{request.sender.name}. "
f"{recommender.capitalize()} has recommended you.")
self.send_notify(self.Notify.APPROVAL_MAIN, user.name, user.name)
else:
msg, typ = self.account_service.add_alt(pending.main, pending.alt, approve=True)
if msg == "success":
self.db.exec("UPDATE pending_accounts set answered = 1 where alt=?", [pending.alt])
self.account_service.add_log(request.sender.char_id, "system",
f"Added {user.name} as an alt of {self.character_service.resolve_char_to_name(pending.main)}.",
request.sender.char_id)
self.account_service.add_log(user.char_id, "system",
f"Request to add {user.name} as an alt "
f"has been approved by {request.sender.name}.",
request.sender.char_id)
self.send_notify(self.Notify.APPROVAL_ALT,
self.character_service.resolve_char_to_name(pending.main),
user.name)
else:
return "Something went wrong.."
@command(command="register", params=[Const('alt'), Character('character')],
description="Add an alt", access_level="member")
def register_alt(self, request, _, alt):
manual = self.setting_service.get_value("alt_verification") == "1"
if not alt.char_id:
return "Character does not exist"
if not manual:
return "This command is currently disabled, please use !alts add"
msg, _ = self.account_service.add_pending_alt(request.sender.char_id, alt.char_id)
if msg in ["another_main", "already_main"]:
return f"You cannot add {alt.name} as an alt, because it already has a main."
elif msg == "pending_alt":
return f"There's already a pending registration for the alt {alt.name}, " \
f"please wait for an admin to confirm it."
elif msg == "success":
self.send_notify(self.Notify.REQUEST_ALT, request.sender.name, alt.name)
return f"You requested to add {alt.name} as an alt."
@command(command="register", params=[Const('recommend'), Character('character'), Any('reason')],
description="Recommend someone as a raider", access_level="member")
def register_account(self, request, _, user, reason):
if not user.char_id:
return "Character does not exist"
if self.account_service.get_account(user.char_id):
return f"There's already an account for {user.name} registered."
msg, _ = self.account_service.add_pending_account(request.sender.char_id, user.char_id, reason)
if msg in ["another_main", "already_main"]:
return f"You cannot recommend {user.name}, " \
f"because the character is already registered."
elif msg == "pending_alt":
return f"There's already a pending registration for the character {user.name}, " \
f"please wait for an admin to confirm it."
elif msg == "success":
self.send_notify(self.Notify.REQUEST_MAIN, user.name, user.name)
def send_notify(self, notify_type, main, alt):
message = "[PG] "
if notify_type == self.Notify.APPROVAL_MAIN:
message += f"[Main] Approved: {main}'s Account has been opened."
elif notify_type == self.Notify.APPROVAL_ALT:
message += f"[Alt] Approved: {alt} " \
f"has been assigned to {main}."
elif notify_type == self.Notify.DENIED:
message += f"Denied: {main}'s Account has been closed."
elif notify_type == self.Notify.REQUEST_ALT:
message += f"[Alt] Request: {alt} => {main}"
elif notify_type == self.Notify.REQUEST_MAIN:
message += f"[Main] Request: {main} as a new " \
f"raider"
self.messagehub.send_message("registration", None, f"{message}", f"{message}")
class Notify:
APPROVAL_MAIN = "approval-main"
APPROVAL_ALT = "approval-alt"
DENIED = "denied"
REQUEST_ALT = "req-alt"
REQUEST_MAIN = "req-main"