fix new ircrobots stuff

This commit is contained in:
Ben Harris 2022-05-09 16:42:31 -04:00
parent 570dba09a6
commit 8c2197a0d7
5 changed files with 78 additions and 77 deletions

View File

@ -11,6 +11,6 @@ mastodon:
client_id: 1234566
client_secret: beeeep
access_token: you do not want to know
base_url: https://tilde.zone
api_base_url: https://tilde.zone
channels:
- '#club'

View File

@ -1,20 +1,22 @@
from dataclasses import dataclass
from os.path import expanduser
from re import compile as re_compile
from typing import List, Pattern, Tuple
from mastodon import Mastodon
from typing import Tuple, Dict
import yaml
@dataclass
class Config(object):
server: Tuple[str, int, bool]
server: Tuple[str, int, bool]
nickname: str
username: str
realname: str
password: str
channel: str
channel: str
sasl: Tuple[str, str]
mastodon_accounts: Dict[str, Mastodon]
assigned_channels: Dict[str, str]
def load(filepath: str):
with open(filepath) as file:
@ -22,22 +24,34 @@ def load(filepath: str):
nickname = config_yaml["nickname"]
server = config_yaml["server"]
server = config_yaml["server"]
hostname, port_s = server.split(":", 1)
tls = False
tls = False
if port_s.startswith("+"):
tls = True
tls = True
port_s = port_s.lstrip("+")
port = int(port_s)
accounts = {}
channels = {}
for acct in config_yaml["mastodon"]:
accounts[acct["name"]] = Mastodon(
client_id=acct["client_id"],
client_secret=acct["client_secret"],
access_token=acct["access_token"],
api_base_url=acct["api_base_url"],
)
if "channel" in acct:
channels[acct["channel"]] = acct["name"]
return Config(
(hostname, port, tls),
nickname,
config_yaml.get("username", nickname),
config_yaml.get("realname", nickname),
config_yaml["password"],
config_yaml["channel"],
(config_yaml["sasl"]["username"], config_yaml["sasl"]["password"]),
mastodon_accounts=accounts,
assigned_channels=channels,
)

View File

@ -1,3 +1,4 @@
Mastodon.py==1.5.1
emoji==1.7.0
ircrobots==0.6.1
PyYAML==6.0

115
tooter.py
View File

@ -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)
HELP_TEXT = "helo i can send toots from irc"
SOURCE_URL = "https://tildegit.org/ben/tooter"
def think(line):
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():
async def main(cfg: Config):
bot = Bot(cfg)
host, port, tls = cfg.server
sasl_user, sasl_pass = cfg.sasl
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))

View File

@ -13,4 +13,3 @@ StartLimitBurst=3
[Install]
WantedBy=default.target