about summary refs log blame commit diff
path: root/tooter.py
blob: 21e54cb844bc19dc23f38b5ab1cd7bf54731f7ba (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                             






                                                  


                                

                  
                                                      








                                                     
                                                     






















                                                    

                                                                        
                              


                                             

                                                       










                                                                                                                                          
                                                        






















                                                                                       

                                                         
#!/usr/bin/env python3

import emoji
import json
import os
import re
import socket
import sys
from mastodon import Mastodon

path = os.path.dirname(os.path.abspath(__file__))

with open(os.path.join(path, "config.json")) as f:
    config = json.load(f)

botnick = config["botnick"]
channels = config["channels"]
if len(sys.argv) > 1:
    for c in sys.argv[1:]:
        channels.append("#" + c)

# read masto creds
with open(os.path.join(path, "tildeverse.json")) 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"],
)

with open(os.path.join(path, "tildeteam.json")) 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((config["address"], config["port"]))
    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<nick>[^ ]+)!.*PRIVMSG #(?P<chan>\w+) :(?P<msg>.*)", msg)
            if m and m.groupdict():
                m = m.groupdict()
                eventloop(m["chan"], m["nick"], m["msg"])