From 8c2197a0d7b74cd8ffe761670aca4213039a7aff Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Mon, 9 May 2022 16:42:31 -0400 Subject: fix new ircrobots stuff --- tooter.py | 121 ++++++++++++++++++++++++++++---------------------------------- 1 file changed, 54 insertions(+), 67 deletions(-) (limited to 'tooter.py') diff --git a/tooter.py b/tooter.py index 6447801..9c16e71 100644 --- a/tooter.py +++ b/tooter.py @@ -1,89 +1,61 @@ #!/usr/bin/env python3 +from argparse import ArgumentParser -from .config import Config +from config import Config, load as config_load from ircrobots import Bot as BaseBot from ircrobots import ConnectionParams, SASLUserPass from ircrobots import Server as BaseServer from irctokens import build, Line -from mastodon import Mastodon import asyncio import emoji -import glob -import json -import os -import sys - -HELP_TEXT = "helo i can send toots from irc: @tildeverse@tilde.zone - from @tildeteam from the #team channel)" - -masto = {} -assigned_channels = {} -# load masto creds -for cred in glob.glob("tilde*.json"): - shortname, _ = os.path.splitext(cred) - with open(cred, "r") as f: - conf = json.load(f) - if "channel" in conf: - assigned_channels[conf["channel"]] = shortname - masto[shortname] = Mastodon( - client_id=conf["client_id"], - client_secret=conf["client_secret"], - access_token=conf["access_token"], - api_base_url=conf["base_url"], - ) - -if "tildeverse" not in masto: - print("you must populate tildeverse.json with mastodon credentials") - exit(1) - -# do setup -with open("config.json", "r") as f: - config = json.load(f) -with open("account.json", "r") as f: - account = json.load(f) - -channels = config["channels"] -if len(sys.argv) > 1: - for c in sys.argv[1:]: - channels.append("#" + c) - - -def think(line): + +HELP_TEXT = "helo i can send toots from irc" +SOURCE_URL = "https://tildegit.org/ben/tooter" + + +def think(self, line): chan = line.params[0] cmd, *words = line.params[1].split(" ") cmd = cmd.lower()[1:] if cmd == "source": - return "https://tildegit.org/ben/tooter" + return SOURCE_URL elif cmd in ["botlist", "toothelp"]: return HELP_TEXT elif cmd == "toot": if len(words) >= 2: - status = emoji.emojize(" ".join(words[1:]), use_aliases=True) + status = emoji.emojize(" ".join(words), use_aliases=True) author = line.tags.get("account", line.hostmask.nickname) - res = masto[ - assigned_channels[chan] if chan in assigned_channels else "tildeverse" - ].toot(f"{status}\n~{author}") - return "tooted! {}".format(res["url"]) + + if chan in self._config.assigned_channels: + account = self._config.mastodon_accounts[self._config.assigned_channels[chan]] + else: + account = self._config.mastodon_accounts.get("tildeverse") + + if account: + res = account.toot(f"{status}\n~{author}") + if res: + return "tooted! {}".format(res["url"]) else: return HELP_TEXT class Server(BaseServer): def __init__(self, - bot: BaseBot, - name: str, - config: Config): + bot: BaseBot, + name: str, + cfg: Config): super().__init__(bot, name) - self._config = config + self._config = cfg async def line_send(self, line: Line): - print(f"{self.name} > {line.format()}") + print(f"> {line.format()}") async def line_read(self, line: Line): - print(f"{self.name} < {line.format()}") + print(f"< {line.format()}") if line.command == "001": - await self.send(build("JOIN", [",".join(channels)])) + await self.send(build("JOIN", [",".join(self._config.channel)])) await self.send(build("MODE", [self.nickname, "+B"])) if line.command == "INVITE": @@ -99,29 +71,44 @@ class Server(BaseServer): and not ("batch" in line.tags and line.tags["batch"] == "1") and line.params[1].startswith("!") ): - response = think(line) + response = think(self, line) if response is not None: await self.send(build("PRIVMSG", [line.params[0], response])) class Bot(BaseBot): + def __init__(self, cfg: Config): + super().__init__() + self._config = cfg + def create_server(self, name: str): - return Server(self, name) + return Server(self, name, self._config) + + +async def main(cfg: Config): + bot = Bot(cfg) + host, port, tls = cfg.server + sasl_user, sasl_pass = cfg.sasl -async def main(): params = ConnectionParams( - config.get("botnick", "tooter"), - config.get("address", "127.0.0.1"), - config.get("port", 6667), - config.get("tls", False), - sasl=SASLUserPass(account["username"], account["password"]), + cfg.nickname, + host, + port, + tls, + username=cfg.username, + realname=cfg.realname, + sasl=SASLUserPass(sasl_user, sasl_pass), + autojoin=[cfg.channel] ) - - bot = Bot() - await bot.add_server("tilde", params) + await bot.add_server(host, params) await bot.run() if __name__ == "__main__": - asyncio.run(main()) + parser = ArgumentParser() + parser.add_argument("config") + args = parser.parse_args() + config = config_load(args.config) + + asyncio.run(main(config)) -- cgit 1.4.1