import time
from core.buddy_service import BuddyService
from core.command_param_types import Character, Int
from core.decorators import event, instance, command
from core.logger import Logger
from core.lookup.character_service import CharacterService
from core.text import Text
from core.translation_service import TranslationService
from core.igncore import IgnCore
from modules.core.accounting.services.account_service import AccountService
@instance()
class NotifyController:
def __init__(self):
self.logger = Logger(__name__)
def inject(self, registry):
self.bot: IgnCore = registry.get_instance("bot")
self.db = registry.get_instance("db")
self.util = registry.get_instance("util")
self.text: Text = registry.get_instance("text")
self.alts: AccountService = registry.get_instance("account_service")
self.buddy_service: BuddyService = registry.get_instance("buddy_service")
self.character_service: CharacterService = registry.get_instance("character_service")
self.ts: TranslationService = registry.get_instance("translation_service")
self.getresp = self.ts.get_response
def start(self):
self.db.exec("CREATE TABLE IF NOT EXISTS notify_log (id INT PRIMARY KEY AUTO_INCREMENT, char_id INT NOT NULL, "
"status TINYINT NOT NULL, time INT NOT NULL DEFAULT 0)")
@event(event_type=BuddyService.BUDDY_LOGON_EVENT, description="Record last seen info", is_hidden=True)
def notify_logon_event(self, event_type, event_data):
self.update_last_seen(event_data)
@event(event_type=BuddyService.BUDDY_LOGOFF_EVENT, description="Record last seen info", is_hidden=True)
def notify_logoff_event(self, event_type, event_data):
self.update_last_seen(event_data)
@command(command="lastseen",
params=[Character("character"), Int("number_of_entries", is_optional=True)],
access_level="org_member",
description="View when someone was last online")
def lastseen_limited_cmd(self, request, char, limit):
if not char.char_id:
return f"Character {char.name} does not exist."
alts = self.alts.get_alts(char.char_id)
if not alts:
alts = [self.alts.get_main(char.char_id)]
logs = self.get_log(alts, limit or 20)
blob = ""
if len(logs) == 0:
return f"No data for {char.name} recorded."
for log in logs:
blob += f"[{self.util.format_datetime(log.time)}] {log.name} -> " \
f"{'logged on' if log.status == 1 else 'logged off'}.\n"
return f"{char.name} was last seen at " \
f"{self.util.format_date(logs[0].time)}. {self.text.format_page('More', blob)}"
def get_log(self, char_list, length=16):
query = "SELECT n.*, p.name as name FROM notify_log n LEFT JOIN player p on n.char_id = p.char_id "
for toon in char_list:
if toon == char_list[0]:
query += f"where n.char_id={toon.char_id:d}"
else:
query += f" or n.char_id={toon.char_id:d}"
query += f" ORDER BY time DESC LIMIT {length:d}"
return self.db.query(query)
def update_last_seen(self, packet):
if self.bot.is_ready():
types = self.buddy_service.get_buddy(packet.char_id)["types"]
if "org_member" in types or "track" in types or "member" in types:
self.db.exec("INSERT INTO notify_log (char_id, status, time) VALUES (?, ?, ?)",
[packet.char_id, packet.online, time.time()])