| @@ -0,0 +1,104 @@ | |||||
| import json | |||||
| from os import environ | |||||
| from enum import Enum | |||||
| class Command: | |||||
| name: str | |||||
| message: str | |||||
| def __init__(self, name: str, message: str): | |||||
| self.name = name | |||||
| self.message = message | |||||
| @classmethod | |||||
| def from_dict(cls, params: dict): | |||||
| return Command(params['name'], params['message']) | |||||
| class TimerStrategy(Enum): | |||||
| ROUND_ROBIN = "round-robin" | |||||
| SHUFFLE = "shuffle" | |||||
| class Timer: | |||||
| time_between: int | |||||
| msgs_between: int | |||||
| strategy: TimerStrategy | |||||
| messages: [str] | |||||
| def __init__( | |||||
| self, | |||||
| time_between: int = 10, | |||||
| msgs_between: int = 10, | |||||
| strategy: TimerStrategy = TimerStrategy.ROUND_ROBIN, | |||||
| messages: [str] = [] | |||||
| ): | |||||
| self.time_between = time_between | |||||
| self.msgs_between = msgs_between | |||||
| self.strategy = strategy | |||||
| self.messages = messages | |||||
| @classmethod | |||||
| def from_dict(cls, param: dict): | |||||
| return Timer( | |||||
| time_between=param.get('between', {}).get('time', 10), | |||||
| msgs_between=param.get('between', {}).get('messages', 10), | |||||
| strategy=TimerStrategy(param.get('strategy', 'round-robin')), | |||||
| messages=param.get('messages', []) | |||||
| ) | |||||
| class Config: | |||||
| channel: str | |||||
| nickname: str | |||||
| token: str | |||||
| command_prefix: str | |||||
| commands: [Command] | |||||
| timer: Timer | |||||
| def __init__( | |||||
| self, | |||||
| channel: str, | |||||
| nickname: str, | |||||
| token: str, | |||||
| command_prefix: str, | |||||
| commands: [Command], | |||||
| timer: Timer | |||||
| ): | |||||
| self.nickname = nickname | |||||
| self.channel = channel | |||||
| self.token = token | |||||
| self.command_prefix = command_prefix | |||||
| self.commands = commands | |||||
| self.timer = timer | |||||
| @classmethod | |||||
| def from_dict(cls, params: dict, token: str): | |||||
| commands_prefix = params.get('command_prefix', '!') | |||||
| commands = [] | |||||
| help_command = Command("help", "Voici les commandes disponibles : ") | |||||
| for command in params.get('commands', []): | |||||
| commands.append(Command.from_dict(command)) | |||||
| help_command.message = "%s %s%s" % (help_command.message, commands_prefix, command['name']) | |||||
| if params.get('help', True): | |||||
| commands.append(help_command) | |||||
| return Config( | |||||
| params.get('channel'), | |||||
| params.get('nickname'), | |||||
| token, | |||||
| commands_prefix, | |||||
| commands, | |||||
| Timer.from_dict(params.get('timer', {})) | |||||
| ) | |||||
| def get_config(): | |||||
| with open('config.json', 'r') as config_file: | |||||
| token = environ['TWITCH_TOKEN'] | |||||
| return Config.from_dict(json.loads(config_file.read()), token) | |||||
| @@ -0,0 +1,74 @@ | |||||
| import irc3 | |||||
| from .config import get_config, TimerStrategy | |||||
| from random import shuffle | |||||
| from datetime import datetime, timedelta | |||||
| @irc3.plugin | |||||
| class TwitchBot: | |||||
| def __init__(self, bot): | |||||
| self.config = get_config() | |||||
| self.messages_stack = [] | |||||
| self.bot = bot | |||||
| self.log = self.bot.log | |||||
| self.last_timer_date = datetime.now() | |||||
| self.nb_messages_since_timer = 0 | |||||
| def connection_made(self): | |||||
| print('connected') | |||||
| def server_ready(self): | |||||
| print('ready') | |||||
| def connection_lost(self): | |||||
| print('connection lost') | |||||
| @staticmethod | |||||
| def _parse_variables(in_str: str, mask: str = None): | |||||
| variables = { | |||||
| 'author': mask.split('!')[0] | |||||
| } | |||||
| for key in variables: | |||||
| value = variables[key] | |||||
| in_str = in_str.replace('{%s}' % key, value) | |||||
| return in_str | |||||
| @irc3.event(irc3.rfc.PRIVMSG) | |||||
| def on_msg(self, target, mask, data, **_): | |||||
| print(target) | |||||
| for command in self.config.commands: | |||||
| if ('%s ' % data.lower()).startswith('%s%s ' % (self.config.command_prefix, command.name.lower())): | |||||
| print('%s: %s%s' % (mask, self.config.command_prefix, command.name)) | |||||
| self.bot.privmsg(target, self._parse_variables(command.message, mask)) | |||||
| break | |||||
| self.nb_messages_since_timer += 1 | |||||
| self.play_timer() | |||||
| def play_timer(self): | |||||
| print(self.messages_stack) | |||||
| if not self.messages_stack: | |||||
| print('Filling the timer messages stack in') | |||||
| self.messages_stack = self.config.timer.messages.copy() | |||||
| if self.config.timer.strategy == TimerStrategy.SHUFFLE: | |||||
| print('Shuffle!') | |||||
| shuffle(self.messages_stack) | |||||
| if self.nb_messages_since_timer < self.config.timer.msgs_between or \ | |||||
| datetime.now() < self.last_timer_date + timedelta(minutes=self.config.timer.time_between): | |||||
| return | |||||
| message = self.messages_stack.pop(0) | |||||
| print("Timer: %s" % message) | |||||
| self.bot.privmsg('#%s' % self.config.channel, message) | |||||
| self.nb_messages_since_timer = 0 | |||||
| self.last_timer_date = datetime.now() | |||||
| @irc3.event(irc3.rfc.JOIN) | |||||
| def on_join(self, mask, channel, **_): | |||||
| print('JOINED %s as %s' % (channel, mask)) | |||||
| @@ -1,104 +1,26 @@ | |||||
| #!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
| import irc3 | import irc3 | ||||
| import json | |||||
| from os import environ | |||||
| from _twitchbot.config import get_config | |||||
| from _twitchbot import twitchbot | |||||
| TWITCH_IRC_SERVER = "irc.chat.twitch.tv" | TWITCH_IRC_SERVER = "irc.chat.twitch.tv" | ||||
| TWITCH_IRC_PORT = 6697 | TWITCH_IRC_PORT = 6697 | ||||
| class Command: | |||||
| name: str | |||||
| message: str | |||||
| def __init__(self, name: str, message: str): | |||||
| self.name = name | |||||
| self.message = message | |||||
| @classmethod | |||||
| def from_dict(cls, params: dict): | |||||
| return Command(params['name'], params['message']) | |||||
| class Config: | |||||
| channel: str | |||||
| nickname: str | |||||
| token: str | |||||
| commands: [Command] | |||||
| def __init__(self, channel: str, nickname: str, token: str, commands: [Command] = None): | |||||
| self.nickname = nickname | |||||
| self.channel = channel | |||||
| self.token = token | |||||
| self.commands = commands if commands is not None else [] | |||||
| @classmethod | |||||
| def from_dict(cls, params: dict, token: str): | |||||
| commands = [] | |||||
| for command in params['commands']: | |||||
| commands.append(Command.from_dict(command)) | |||||
| return Config( | |||||
| params['channel'], | |||||
| params['nickname'], | |||||
| token, | |||||
| commands | |||||
| ) | |||||
| @irc3.plugin | |||||
| class TwitchBot: | |||||
| def __init__(self, bot): | |||||
| self.config = get_config() | |||||
| self.bot = bot | |||||
| self.log = self.bot.log | |||||
| def connection_made(self): | |||||
| print('connected') | |||||
| def server_ready(self): | |||||
| print('ready') | |||||
| def connection_lost(self): | |||||
| print('connection lost') | |||||
| @irc3.event(irc3.rfc.PRIVMSG) | |||||
| def on_msg(self, target, mask, data, event): | |||||
| author_name = mask.split('!')[0] | |||||
| for command in self.config.commands: | |||||
| print(command.name) | |||||
| print('%s ' % data) | |||||
| if ('%s ' % data).startswith('!%s ' % command.name): | |||||
| self.bot.privmsg(target, command.message) | |||||
| @irc3.event(irc3.rfc.JOIN) | |||||
| def on_join(self, mask, channel, **kw): | |||||
| print('JOINED') | |||||
| print(mask) | |||||
| print(channel) | |||||
| print(kw) | |||||
| def get_config(): | |||||
| with open('config.json', 'r') as config_file: | |||||
| token = environ['TWITCH_TOKEN'] | |||||
| return Config.from_dict(json.loads(config_file.read()), token) | |||||
| def main() -> int: | def main() -> int: | ||||
| config = get_config() | config = get_config() | ||||
| print(config.timer.messages) | |||||
| bot = irc3.IrcBot.from_config({ | bot = irc3.IrcBot.from_config({ | ||||
| 'nick': config.nickname, | 'nick': config.nickname, | ||||
| 'password': config.token, | 'password': config.token, | ||||
| 'autojoins': ['%s' % config.channel], | |||||
| 'autojoins': [config.channel], | |||||
| 'host': TWITCH_IRC_SERVER, | 'host': TWITCH_IRC_SERVER, | ||||
| 'port': TWITCH_IRC_PORT, | 'port': TWITCH_IRC_PORT, | ||||
| 'ssl': True, | 'ssl': True, | ||||
| 'includes': [__name__] | |||||
| 'includes': [twitchbot.__name__] | |||||
| }) | }) | ||||
| bot.run(forever=True) | bot.run(forever=True) | ||||