Files
igncore/modules/onlinebot/accounting/account_service.py
T
2022-04-17 02:41:29 +02:00

96 lines
4.6 KiB
Python

from core.command_service import CommandService
from core.decorators import instance, command
from modules.core.accounting.preference_controller import PreferenceController
from modules.core.accounting.services.account_service import AccountService
@instance(name="account_service", override=True)
class AccountServiceOnlineBot(AccountService):
registered = []
def inject(self, registry):
super().inject(registry)
self.preference_controller: PreferenceController = registry.get_instance("preference_controller")
def pre_start(self):
super().pre_start()
self.db.exec("CREATE TABLE IF NOT EXISTS registered (char_id int primary key)")
self.registered = [x.char_id for x in self.db.query("SELECT * from registered")]
self.access_service.register_access_level("unregistered", 95, self.check_unregistered)
@command(command="opt-in", params=[],
description="Register yourself in the bot",
access_level="unregistered")
def cmd_opt_in(self, request):
player = self.pork.get_character_info(request.sender.name)
if player.org_id in self.get_orgs():
if self.is_registered((main := self.get_main(request.sender.char_id)).char_id):
return "You're already registered."
self.db.exec("INSERT IGNORE INTO registered VALUES (?)", [main.char_id])
pref_autoinvite = int(self.setting_service.get_value("pref_autoinvite"))
pref_raidinvite = int(self.setting_service.get_value("pref_raidinvite"))
pref_raidspam = int(self.setting_service.get_value("pref_raidspam"))
pref_newsspam = int(self.setting_service.get_value("pref_newsspam"))
self.registered.append(main.char_id)
self.preference_controller.set_pref(main.char_id, "news", pref_newsspam)
self.preference_controller.set_pref(main.char_id, "raidspam", pref_raidspam)
self.preference_controller.set_pref(main.char_id, "autoinvite", pref_autoinvite)
# This one is of no use in Onlinebots,
# as the command taking advantage of it
# is only implemented in the raidbot modules.
# raidspam is used instead.
self.preference_controller.set_pref(main.char_id, "raidinvite", pref_raidinvite)
return "You've been registered successfully, and your preferences have been set to the defaults."
@command(command="opt-out", params=[],
description="Unregister yourself from the bot",
access_level="member")
def cmd_opt_out(self, request):
main = self.get_main(request.sender.char_id)
if self.is_registered(main.char_id):
self.db.exec("DELETE FROM registered where char_id = ?", [main.char_id])
self.registered.remove(main.char_id)
self.db.exec("UPDATE account SET disabled=1 where char_id=?", [main.char_id])
return "You've been unregistered successfully. For re-registering, " \
"you may need to contact an Administrator, " \
"as you may only register once as a spam protection. " \
"Further tells will get ignored."
else:
return "You're not registered, and thus cannot unregister yourself."
def is_registered(self, char_id):
return char_id in self.registered
def simple_checks(self, account):
main = account.get("main", -1)
if main and main in self.registered:
return super().simple_checks(account)
return False
def check_unregistered(self, char_id) -> bool:
account = self.get_account(char_id) or {}
return super().simple_checks(account)
def check_member(self, char_id) -> bool:
account = self.get_account(char_id) or {}
if self.simple_checks(account):
return True
return False
@instance(name="command_service", override=True)
class AccountServiceOnlineBot(CommandService):
def access_denied_response(self, message, sender, cmd_config, reply, channel):
self.relay_hub_service.send_message("access_denied_logger", sender, f"[DENIED] {sender.name}: {message}",
f"[DENIED] {sender.name}: {message}")
if sender.access_level["label"] != "all":
if sender.access_level['label'] == "unregistered":
self.bot.send_mass_message(sender.char_id,
"You are not registered yet. To gain access to my commands, you'll need to use <highlight><symbol>opt-in</highlight>")
return
self.bot.send_mass_message(sender.char_id, self.getresp("global", "access_denied"))