add enable/disable (#12) and enhanced help output
parent
0da04acc4e
commit
1aa17eebfb
116
pinhook/bot.py
116
pinhook/bot.py
|
@ -1,10 +1,11 @@
|
||||||
|
from collections import OrderedDict
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
import imp
|
import imp
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import ssl
|
import ssl
|
||||||
import time
|
import time
|
||||||
import pinhook.plugin
|
from . import plugin
|
||||||
|
|
||||||
import irc.bot
|
import irc.bot
|
||||||
|
|
||||||
|
@ -32,13 +33,16 @@ class Bot(irc.bot.SingleServerIRCBot):
|
||||||
self.chanlist = channels
|
self.chanlist = channels
|
||||||
self.bot_nick = nickname
|
self.bot_nick = nickname
|
||||||
self.start_logging(self.log_level)
|
self.start_logging(self.log_level)
|
||||||
self.output_message = pinhook.plugin.message
|
self.output_message = plugin.message
|
||||||
self.output_action = pinhook.plugin.action
|
self.output_action = plugin.action
|
||||||
self.internal_commands = {
|
self.internal_commands = {
|
||||||
self.cmd_prefix + 'join': 'join a channel',
|
'join': 'join a channel',
|
||||||
self.cmd_prefix + 'quit': 'force the bot to quit',
|
'quit': 'force the bot to quit',
|
||||||
self.cmd_prefix + 'reload': 'force bot to reload all plugins'
|
'reload': 'force bot to reload all plugins',
|
||||||
|
'enable': 'enable a plugin',
|
||||||
|
'disable': 'disable a plugin'
|
||||||
}
|
}
|
||||||
|
self.internal_commands = {self.cmd_prefix + k: v for k,v in self.internal_commands.items()}
|
||||||
self.load_plugins()
|
self.load_plugins()
|
||||||
|
|
||||||
class Message:
|
class Message:
|
||||||
|
@ -93,7 +97,7 @@ class Bot(irc.bot.SingleServerIRCBot):
|
||||||
def load_plugins(self):
|
def load_plugins(self):
|
||||||
# clear plugin list to ensure no old plugins remain
|
# clear plugin list to ensure no old plugins remain
|
||||||
self.logger.info('clearing plugin cache')
|
self.logger.info('clearing plugin cache')
|
||||||
pinhook.plugin.clear_plugins()
|
plugin.clear_plugins()
|
||||||
# ensure plugin folder exists
|
# ensure plugin folder exists
|
||||||
self.logger.info('checking plugin directory')
|
self.logger.info('checking plugin directory')
|
||||||
if not os.path.exists(self.plugin_dir):
|
if not os.path.exists(self.plugin_dir):
|
||||||
|
@ -111,10 +115,10 @@ class Bot(irc.bot.SingleServerIRCBot):
|
||||||
self.logger.exception('could not load plugin')
|
self.logger.exception('could not load plugin')
|
||||||
# gather all commands and listeners
|
# gather all commands and listeners
|
||||||
if self.use_prefix_for_plugins: # use prefixes if needed
|
if self.use_prefix_for_plugins: # use prefixes if needed
|
||||||
pinhook.plugin.cmds = {self.cmd_prefix + k: v for k,v in pinhook.plugin.cmds.items()}
|
plugin.cmds = {self.cmd_prefix + k: v for k,v in plugin.cmds.items()}
|
||||||
for cmd in pinhook.plugin.cmds:
|
for cmd in plugin.cmds:
|
||||||
self.logger.debug('adding command {}'.format(cmd))
|
self.logger.debug('adding command {}'.format(cmd))
|
||||||
for lstnr in pinhook.plugin.lstnrs:
|
for lstnr in plugin.lstnrs:
|
||||||
self.logger.debug('adding listener {}'.format(lstnr))
|
self.logger.debug('adding listener {}'.format(lstnr))
|
||||||
|
|
||||||
def on_welcome(self, c, e):
|
def on_welcome(self, c, e):
|
||||||
|
@ -134,15 +138,16 @@ class Bot(irc.bot.SingleServerIRCBot):
|
||||||
def on_action(self, c, e):
|
def on_action(self, c, e):
|
||||||
self.process_event(c, e)
|
self.process_event(c, e)
|
||||||
|
|
||||||
def call_help(self, op):
|
def call_help(self, nick, op):
|
||||||
cmds = [i for i in pinhook.plugin.cmds if not pinhook.plugin.cmds[i].ops]
|
cmds = {k:v.help_text for k,v in plugin.cmds.items() if not plugin.cmds[k].ops}
|
||||||
cmds.append(self.cmd_prefix + 'help')
|
cmds.update({self.cmd_prefix + 'help': 'returns this output to private message'})
|
||||||
if op:
|
if op:
|
||||||
cmds += [i for i in pinhook.plugin.cmds if pinhook.plugin.cmds[i].ops]
|
cmds.update({k:v.help_text for k,v in plugin.cmds.items() if plugin.cmds[k].ops})
|
||||||
cmds += [i for i in self.internal_commands]
|
cmds.update({k:v for k,v in self.internal_commands.items()})
|
||||||
helplist = sorted(cmds)
|
helpout = OrderedDict(sorted(cmds.items()))
|
||||||
msg = ', '.join(helplist)
|
for h in helpout:
|
||||||
return self.output_message('Available commands: {}'.format(msg))
|
self.connection.privmsg(nick, '{} -- {}'.format(h, helpout[h]))
|
||||||
|
return None
|
||||||
|
|
||||||
def call_internal_commands(self, channel, nick, cmd, text, arg, c):
|
def call_internal_commands(self, channel, nick, cmd, text, arg, c):
|
||||||
output = None
|
output = None
|
||||||
|
@ -159,23 +164,39 @@ class Bot(irc.bot.SingleServerIRCBot):
|
||||||
c.quit("See y'all later!")
|
c.quit("See y'all later!")
|
||||||
quit()
|
quit()
|
||||||
elif cmd == self.cmd_prefix + 'help':
|
elif cmd == self.cmd_prefix + 'help':
|
||||||
output = self.call_help(op)
|
self.call_help(nick, op)
|
||||||
elif cmd == self.cmd_prefix + 'reload' and op:
|
elif cmd == self.cmd_prefix + 'reload' and op:
|
||||||
self.logger.info('reloading plugins per request of {}'.format(nick))
|
self.logger.info('reloading plugins per request of {}'.format(nick))
|
||||||
self.load_plugins()
|
self.load_plugins()
|
||||||
output = self.output_message('Plugins reloaded')
|
output = self.output_message('Plugins reloaded')
|
||||||
|
elif cmd == self.cmd_prefix + 'enable' and op:
|
||||||
|
if arg in plugin.plugins:
|
||||||
|
if plugin.plugins[arg].enabled:
|
||||||
|
output = self.output_message("{}: '{}' already enabled".format(nick, arg))
|
||||||
|
else:
|
||||||
|
plugin.plugins[arg].enable()
|
||||||
|
output = self.output_message("{}: '{}' enabled!".format(nick, arg))
|
||||||
|
else:
|
||||||
|
output = self.output_message("{}: '{}' not found".format(nick, arg))
|
||||||
|
elif cmd == self.cmd_prefix + 'disable' and op:
|
||||||
|
if arg in plugin.plugins:
|
||||||
|
if not plugin.plugins[arg].enabled:
|
||||||
|
output = self.output_message("{}: '{}' already disabled".format(nick, arg))
|
||||||
|
else:
|
||||||
|
plugin.plugins[arg].disable()
|
||||||
|
output = self.output_message("{}: '{}' disabled!".format(nick, arg))
|
||||||
return output
|
return output
|
||||||
|
|
||||||
def call_plugins(self, privmsg, action, notice, chan, cmd, text, nick_list, nick, arg):
|
def call_plugins(self, privmsg, action, notice, chan, cmd, text, nick_list, nick, arg):
|
||||||
output = None
|
output = None
|
||||||
if cmd in pinhook.plugin.cmds:
|
if cmd in plugin.cmds:
|
||||||
try:
|
try:
|
||||||
if pinhook.plugin.cmds[cmd].ops and nick not in self.ops:
|
if plugin.cmds[cmd].ops and nick not in self.ops:
|
||||||
if pinhook.plugin.cmds[cmd].ops_msg:
|
if plugin.cmds[cmd].ops_msg:
|
||||||
output = self.output_message(pinhook.plugin.cmds[cmd].ops_msg)
|
output = self.output_message(plugin.cmds[cmd].ops_msg)
|
||||||
else:
|
elif plugin.cmds[cmd].enabled:
|
||||||
self.logger.debug('executing {}'.format(cmd))
|
self.logger.debug('executing {}'.format(cmd))
|
||||||
output = pinhook.plugin.cmds[cmd].run(self.Message(
|
output = plugin.cmds[cmd].run(self.Message(
|
||||||
bot=self,
|
bot=self,
|
||||||
channel=chan,
|
channel=chan,
|
||||||
cmd=cmd,
|
cmd=cmd,
|
||||||
|
@ -192,26 +213,27 @@ class Bot(irc.bot.SingleServerIRCBot):
|
||||||
except Exception:
|
except Exception:
|
||||||
self.logger.exception('issue with command {}'.format(cmd))
|
self.logger.exception('issue with command {}'.format(cmd))
|
||||||
else:
|
else:
|
||||||
for lstnr in pinhook.plugin.lstnrs:
|
for lstnr in plugin.lstnrs:
|
||||||
try:
|
if plugin.lstnrs[lstnr].enabled:
|
||||||
self.logger.debug('whispering to listener: {}'.format(lstnr))
|
try:
|
||||||
listen_output = pinhook.plugin.lstnrs[lstnr](self.Message(
|
self.logger.debug('whispering to listener: {}'.format(lstnr))
|
||||||
bot=self,
|
listen_output = plugin.lstnrs[lstnr].run(self.Message(
|
||||||
channel=chan,
|
bot=self,
|
||||||
text=text,
|
channel=chan,
|
||||||
nick_list=nick_list,
|
text=text,
|
||||||
nick=nick,
|
nick_list=nick_list,
|
||||||
privmsg=privmsg,
|
nick=nick,
|
||||||
action=action,
|
privmsg=privmsg,
|
||||||
notice=notice,
|
action=action,
|
||||||
botnick=self.bot_nick,
|
notice=notice,
|
||||||
ops=self.ops,
|
botnick=self.bot_nick,
|
||||||
logger=self.logger
|
ops=self.ops,
|
||||||
))
|
logger=self.logger
|
||||||
if listen_output:
|
))
|
||||||
output = listen_output
|
if listen_output:
|
||||||
except Exception:
|
output = listen_output
|
||||||
self.logger.exception('issue with listener {}'.format(lstnr))
|
except Exception:
|
||||||
|
self.logger.exception('issue with listener {}'.format(lstnr))
|
||||||
if output:
|
if output:
|
||||||
self.logger.debug(f'returning output: {output.msg}')
|
self.logger.debug(f'returning output: {output.msg}')
|
||||||
return output
|
return output
|
||||||
|
@ -258,14 +280,14 @@ class Bot(irc.bot.SingleServerIRCBot):
|
||||||
if not output.msg:
|
if not output.msg:
|
||||||
return
|
return
|
||||||
for msg in output.msg:
|
for msg in output.msg:
|
||||||
if output.msg_type == pinhook.plugin.OutputType.Message:
|
if output.msg_type == plugin.OutputType.Message:
|
||||||
self.logger.debug('output message: {}'.format(msg))
|
self.logger.debug('output message: {}'.format(msg))
|
||||||
try:
|
try:
|
||||||
c.privmsg(chan, msg)
|
c.privmsg(chan, msg)
|
||||||
except irc.client.MessageTooLong:
|
except irc.client.MessageTooLong:
|
||||||
self.logger.error('output message too long: {}'.format(msg))
|
self.logger.error('output message too long: {}'.format(msg))
|
||||||
break
|
break
|
||||||
elif output.msg_type == pinhook.plugin.OutputType.Action:
|
elif output.msg_type == plugin.OutputType.Action:
|
||||||
self.logger.debug('output action: {}'.format(msg))
|
self.logger.debug('output action: {}'.format(msg))
|
||||||
try:
|
try:
|
||||||
c.action(chan, msg)
|
c.action(chan, msg)
|
||||||
|
|
Loading…
Reference in New Issue