add enable/disable (#12) and enhanced help output
This commit is contained in:
		
							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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user