From f2c35a8c77bfaf403feb5f664dfb28a210eb04b9 Mon Sep 17 00:00:00 2001 From: Ultracoolguy Date: Tue, 17 Nov 2020 13:15:06 -0400 Subject: [PATCH] Read configuration from bot.ini from now on This makes the bot channel agnostic and allows for someone to use it without modifying code. Add bot.in.example for an example and update README.md to reflect changes. --- README.md | 17 ++++++++++- bot.ini.example | 4 +++ bot.py | 75 +++++++++++++++++++++++++++++++------------------ 3 files changed, 67 insertions(+), 29 deletions(-) create mode 100644 bot.ini.example diff --git a/README.md b/README.md index 55a6e7a..1878cc8 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,19 @@ A simple Python bot for IRC channels that want matchmaking capabilities. -Idk what else to say :/ +## Dependencies + +You just need configparser and irctokens. You can install them doing: +``` +pip install configparser irctokens +``` +You can add `--user` if you don't want to install them system wide. + +## Installation + +Just `./bot.py` lol. + +## Configuration + +The bot uses a bot.ini for configurating the servers for connecting. Look at +bot.ini.example for an example(you know, like the extension says). diff --git a/bot.ini.example b/bot.ini.example new file mode 100644 index 0000000..fd57ebe --- /dev/null +++ b/bot.ini.example @@ -0,0 +1,4 @@ +[host] +server = chat.freenode.invalid +nickname = matchmaking-bot +channels = #matchmaking-test diff --git a/bot.py b/bot.py index e4ea921..9ac3e80 100755 --- a/bot.py +++ b/bot.py @@ -1,16 +1,12 @@ #!/bin/env python3 -import asyncio +import asyncio, configparser from irctokens import build, Line from ircrobots import Bot as BaseBot from ircrobots import Server as BaseServer from ircrobots import ConnectionParams -SERVERS = (dict([("freenode", "irc.freenode.net"), - ("tildeverse", "irc.tilde.chat")])) - -match_players = {"freenode": set(), "tildeverse": set()} - -botnick = "matchmaking-bot" +servers = [] +match_players = {} def update_file(name): file = open(f"playerlist-{name}.txt", "w") @@ -19,23 +15,22 @@ def update_file(name): for player in match_players[name]: file.write(player + '\n') -def read_file(): - for name in SERVERS: - file = open(f"playerlist-{name}.txt", "r") - for player in file: - match_players[name].add(player[:-1]) #Remove newline - file.close() +def read_file(name): + file = open(f"playerlist-{name}.txt", "r") + for player in file: + match_players[name].add(player[:-1]) #Remove newline + file.close() class Server(BaseServer): async def line_read(self, line: Line): print(f"{self.name} < {line.format()}") - if "PRIVMSG" in line.command and self.params.autojoin[0] in line.params[0]: + if "PRIVMSG" in line.command and any(channel in line.params[0] for channel in self.params.autojoin): chan = self.channels[line.params[0]].name if line.params[1].startswith(".matchmake"): channel = self.channels[line.params[0]] ping = "" - for player in match_players[self.name]: + for player in match_players[self.name + '-' + chan]: pfold = self.casefold(player) if pfold in channel.users: ping += f"{channel.users[pfold].nickname} " @@ -45,20 +40,20 @@ class Server(BaseServer): elif line.params[1].startswith(".matchadd"): user = line.source.split('!')[0] - if user in match_players[self.name]: + if user in match_players[self.name + '-' + chan]: await self.send(build("PRIVMSG", [chan, "ERROR: player already in list."])) else: - match_players[self.name].add(user) - update_file(self.name) + match_players[self.name + '-' + chan].add(user) + update_file(self.name + '-' + chan) await self.send(build("PRIVMSG", [chan, "Added to the match list."])) elif line.params[1].startswith(".matchdel"): user = line.source.split('!')[0] - if user not in match_players[self.name]: + if user not in match_players[self.name + '-' + chan]: await self.send(build("PRIVMSG", [chan, "ERROR: player isn't in list."])) else: - match_players[self.name].remove(user) - update_file(self.name) + match_players[self.name + '-' + chan].remove(user) + update_file(self.name + '-' + chan) await self.send(build("PRIVMSG", [chan, "Removed from match list."])) elif line.params[1].startswith(".help"): @@ -76,14 +71,38 @@ class Bot(BaseBot): return Server(self, name) async def main(): - read_file() + config = configparser.ConfigParser() + with open('bot.ini', 'r') as configfile: + config.read_file(configfile) + for section in config.sections(): + if not config[section]['server']: + print(f"ERROR: The section {section} on your bot.ini doesn't have a 'server' parameter.") + exit(1) + elif not config[section]['nickname']: + print(f"ERROR: The section {section} has no nickname defined.") + exit(1) + elif not config[section]['channels']: + print(f"ERROR: You didn't define any channels in section {section}.") + server = config[section]['server'] + nickname = config[section]['nickname'] + channels = set(config[section]['channels'].split(' ')) + # servers.update([(section, {'server':server, 'nickname':nickname, 'channels':channels})]) + servers.append({'name':section, 'opts':{'server':server, 'nickname':nickname, 'channels':channels}}) + for channel in channels: + match_players.update([(section + '-' + channel, set())]) + + # read_file() bot = Bot() - for name, host in SERVERS.items(): - params = ConnectionParams(botnick, host, 6697, True) - if name == "freenode": - params.autojoin = ["#among-sus"] - elif name == "tildeverse": - params.autojoin = ["#sus"] + for entry in servers: + name = entry['name'] + server = entry['opts']['server'] + botnick = entry['opts']['nickname'] + channels = entry['opts']['channels'] + + params = ConnectionParams(botnick, server, 6697, True) + for channel in channels: + params.autojoin.append(channel) + read_file(name + '-' + channel) await bot.add_server(name, params) await bot.run()