bitbot-3.11-fork/modules/channel_log.py

60 lines
2.3 KiB
Python

#--depends-on config
#--depends-on format_activity
import datetime, os.path
from src import ModuleManager, utils
SETTING = utils.BoolSetting("channel-log",
"Enable/disable channel logging")
@utils.export("channelset",utils.BoolSetting("log",
"Enable/disable channel logging"))
@utils.export("serverset", SETTING)
@utils.export("botset", SETTING)
class Module(ModuleManager.BaseModule):
def _enabled(self, server, channel):
return channel.get_setting("log",
server.get_setting("channel-log",
self.bot.get_setting("channel-log", False)))
def _file(self, server_name, channel_name):
# if a channel name has os.path.sep (e.g. "/") in it, the channel's log
# file will create a subdirectory.
#
# to avoid this, we'll replace os.path.sep with "," (0x2C) as it is
# forbidden in channel names.
sanitised_name = channel_name.replace(os.path.sep, ",")
return self.data_directory("%s/%s.log" % (server_name, sanitised_name))
def _log(self, server, channel, line):
if self._enabled(server, channel):
timestamp = utils.datetime.format.datetime_human(
datetime.datetime.now())
log_line = "%s %s" % (timestamp, line)
if "log-key" in self.bot.config:
log_line = "\x02%s" % utils.security.a_encrypt(
self.bot.config["log-key"], log_line)
with open(self._file(str(server), str(channel)), "a") as log_file:
log_file.write("%s\n" % log_line)
@utils.hook("formatted.message.channel")
@utils.hook("formatted.notice.channel")
@utils.hook("formatted.join")
@utils.hook("formatted.part")
@utils.hook("formatted.nick")
@utils.hook("formatted.invite")
@utils.hook("formatted.mode.channel")
@utils.hook("formatted.topic")
@utils.hook("formatted.topic-timestamp")
@utils.hook("formatted.kick")
@utils.hook("formatted.quit")
@utils.hook("formatted.rename")
@utils.hook("formatted.chghost")
@utils.hook("formatted.account")
def on_formatted(self, event):
if event["channel"]:
self._log(event["server"], event["channel"], event["line"])
elif event["user"]:
for channel in event["user"].channels:
self._log(event["server"], channel, event["line"])