import os import logging import net.mapserv as mapserv from loggers import chatlog from utils import extends __all__ = [ 'PLUGIN', 'init', 'ChatLogHandler' ] PLUGIN = { 'name': 'chatlogfile', 'requires': (), 'blocks': (), 'default_config' : {'chatlog_dir': 'chatlogs'} } class ChatLogHandler(logging.Handler): def __init__(self, chat_log_dir): logging.Handler.__init__(self, 0) self.chat_log_dir = chat_log_dir self.loggers = {} if not os.path.exists(self.chat_log_dir): os.makedirs(self.chat_log_dir) self._count = 0 def emit(self, record): try: user = record.user except AttributeError: return user = ''.join(map(lambda c: c if c.isalnum() else '_', user)) if user in self.loggers: logger = self.loggers[user] else: logger = chatlog.getChild(user) self.loggers[user] = logger handler = logging.FileHandler(os.path.join( self.chat_log_dir, user + ".txt")) logger.addHandler(handler) self._count += 1 logger.count = self._count if len(self.loggers) > 5: min_count = self._count old_user = '' for usr, lgr in self.loggers.items(): if lgr.count < min_count: old_user = user min_count = lgr.count self.loggers[old_user].handlers[0].close() del self.loggers[old_user] message = self.format(record) logger.info(message) def log(message, user='General'): chatlog.info(message, extra={'user': user}) @extends('smsg_being_chat') def being_chat(data): log(data.message) @extends('smsg_player_chat') def player_chat(data): message = data.message log(message) @extends('smsg_whisper') def got_whisper(data): nick, message = data.nick, data.message m = "[{} ->] {}".format(nick, message) log(m, nick) @extends('smsg_whisper_response') def send_whisper_result(data): if data.code == 0: m = "[-> {}] {}".format(mapserv.last_whisper['to'], mapserv.last_whisper['msg']) log(m, mapserv.last_whisper['to']) @extends('smsg_party_chat') def party_chat(data): nick = mapserv.party_members.get(data.id, str(data.id)) msg = data.message m = "[Party] {} : {}".format(nick, msg) log(m, "Party") def init(config): chatlog_dir = config.get('chatlogfile', 'chatlog_dir') clh = ChatLogHandler(chatlog_dir) clh.setFormatter(logging.Formatter("[%(asctime)s] %(message)s", datefmt="%Y-%m-%d %H:%M:%S")) chatlog.addHandler(clh) chatlog.setLevel(logging.INFO)