#!/usr/bin/env python3 import emoji import json import os import re import socket import sys from mastodon import Mastodon server = ("127.0.0.1", 6667) channels = [] if len(sys.argv) > 1: for c in sys.argv[1:]: channels.append("#" + c) botnick = "tooter" # read masto creds path = os.path.dirname(os.path.abspath(__file__)) tildeverse_file = os.path.join(path, "tildeverse.json") with open(tildeverse_file) as f: tildeverse_config = json.load(f) tildeverse = Mastodon( client_id=tildeverse_config["client_id"], client_secret=tildeverse_config["client_secret"], access_token=tildeverse_config["access_token"], api_base_url=tildeverse_config["base_url"], ) tildeteam_file = os.path.join(path, "tildeteam.json") with open(tildeteam_file) as f: tildeteam_config = json.load(f) tildeteam = Mastodon( client_id=tildeteam_config["client_id"], client_secret=tildeteam_config["client_secret"], access_token=tildeteam_config["access_token"], api_base_url=tildeteam_config["base_url"], ) def rawsend(msg): print(msg) ircsock.send(f"{msg}\r\n".encode()) def send(chan, msg): rawsend(f"PRIVMSG #{chan} :{msg}") def eventloop(chan, nick, msg): words = re.split("[ \t\s]+", msg) if len(words) > 0 and nick != "tooter": if words[0] == "!toot": status = emoji.emojize("".join(words[1:]), use_aliases=True) print(f"{status} posted by {nick}") if chan == "#team": res = tildeteam.toot(status) else: res = tildeverse.toot(status) print(res) send(chan, "tooted! {}".format(res["url"])) elif words[0] == "!source": send(chan, "https://tildegit.org/ben/tooter") elif words[0] == "!botlist" or words[0] == "!toothelp": send( chan, "helo i can send toots from irc: https://tilde.zone/~tildeverse - (https://tilde.zone/~tildeteam from the #team channel)", ) if __name__ == "__main__": ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ircsock.connect(server) rawsend(f"NICK {botnick}") rawsend(f"USER {botnick} 0 * :mastodon tooter") while 1: ircmsg = ircsock.recv(2048).decode().split("\r\n") for msg in ircmsg: print(msg) if "PING" in msg: rawsend(msg.replace("I", "O", 1)) if "INVITE" in msg: chan = msg.split(":")[-1] rawsend(f"JOIN {chan}") if "001" in msg: for c in channels: rawsend(f"JOIN {c}") rawsend(f"MODE {botnick} +B") m = re.match(":(?P[^ ]+)!.*PRIVMSG #(?P\w+) :(?P.*)", msg) if m and m.groupdict(): m = m.groupdict() eventloop(m["chan"], m["nick"], m["msg"])