101 lines
2.8 KiB
Python
Executable File
101 lines
2.8 KiB
Python
Executable File
#!/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<nick>[^ ]+)!.*PRIVMSG #(?P<chan>\w+) :(?P<msg>.*)", msg)
|
|
if m and m.groupdict():
|
|
m = m.groupdict()
|
|
eventloop(m["chan"], m["nick"], m["msg"])
|
|
|