general irc bot interface

This commit is contained in:
Stefan Harmuth 2021-12-18 20:48:01 +01:00
parent 898d4a8d85
commit 74df9e9287

View File

@ -1,4 +1,8 @@
from time import sleep
from .schedule import Scheduler
from .simplesocket import ClientSocket from .simplesocket import ClientSocket
from datetime import timedelta
from enum import Enum from enum import Enum
from typing import Callable, Dict, List, Union from typing import Callable, Dict, List, Union
@ -365,3 +369,43 @@ class Client:
def getChannelList(self) -> List[Channel]: def getChannelList(self) -> List[Channel]:
return list(self.__channellist.values()) return list(self.__channellist.values())
class IrcBot(Client):
def __init__(self, server: str, port: int, nick: str, username: str, realname: str = "Python Bot"):
super().__init__(server, port, nick, username, realname)
self._scheduler = Scheduler()
self._channel_commands = {}
self._privmsg_commands = {}
self.subscribe(ServerMessage.MSG_PRIVMSG, self.on_privmsg)
def on(self, *args, **kwargs):
self.subscribe(*args, **kwargs)
def schedule(self, name: str, every: timedelta, func: Callable):
self._scheduler.schedule(name, every, func)
def register_channel_command(self, command: str, channel: str, func: Callable):
if channel not in self._channel_commands:
self._channel_commands[channel] = {}
self._channel_commands[channel][command] = func
def register_privmsg_command(self, command: str, func: Callable):
self._privmsg_commands[command] = func
def on_privmsg(self, msg_from, msg_to, message):
if not message:
return
command = message.split()[0]
if msg_to in self._channel_commands and command in self._channel_commands[msg_to]:
self._channel_commands[msg_to][command](msg_from, " ".join(message.split()[1:]))
if msg_to == self.getUser().nickname and command in self._privmsg_commands:
self._privmsg_commands[command](msg_from, " ".join(message.split()[1:]))
def run(self):
while True:
self._scheduler.run_pending()
self.receive()
sleep(0.01)