about summary refs log tree commit diff
path: root/tooter.py
diff options
context:
space:
mode:
authorBen Harris <ben@tilde.team>2019-05-29 21:03:12 -0400
committerBen Harris <ben@tilde.team>2019-05-29 21:15:52 -0400
commiteda932ec06c1b4b275569b4e7dadb9384a3859eb (patch)
tree8cd5ed8c39311e52b5fc42e044921c858ea67943 /tooter.py
init
Diffstat (limited to 'tooter.py')
-rwxr-xr-xtooter.py101
1 files changed, 101 insertions, 0 deletions
diff --git a/tooter.py b/tooter.py
new file mode 100755
index 0000000..66b1afc
--- /dev/null
+++ b/tooter.py
@@ -0,0 +1,101 @@
+#!/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 = ["#bots", "#meta", "#team"]
+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(words[2:], use_aliases=True)
+            if chan == "#team":
+                res = tildeteam.toot(status)
+            else:
+                res = tildeverse.toot(status)
+            send(chan, f"tooted! {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<nick>[^ ]+)!.*PRIVMSG #(?P<chan>\w+) :(?P<msg>.*)", msg)
+            if m and m.groupdict():
+                m = m.groupdict()
+                try:
+                    eventloop(m["chan"], m["nick"], m["msg"])
+                except Exception as e:
+                    print("ERROR" + str(m))
+                    print(e)