52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
|
#!/usr/bin/env python3
|
||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||
|
|
||
|
import mastodon
|
||
|
import os, random, re
|
||
|
import create
|
||
|
from bs4 import BeautifulSoup
|
||
|
|
||
|
api_base_url = "https://botsin.space"
|
||
|
client = mastodon.Mastodon(
|
||
|
client_id="clientcred.secret",
|
||
|
access_token="usercred.secret",
|
||
|
api_base_url=api_base_url)
|
||
|
|
||
|
def extract_toot(toot):
|
||
|
#copied from main.py, see there for comments
|
||
|
soup = BeautifulSoup(toot, "html.parser")
|
||
|
for lb in soup.select("br"):
|
||
|
lb.insert_after("\n")
|
||
|
lb.decompose()
|
||
|
for p in soup.select("p"):
|
||
|
p.insert_after("\n")
|
||
|
p.unwrap()
|
||
|
for ht in soup.select("a.hashtag"):
|
||
|
ht.unwrap()
|
||
|
for link in soup.select("a"):
|
||
|
link.insert_after(link["href"])
|
||
|
link.decompose()
|
||
|
text = map(lambda a: a.strip(), soup.get_text().strip().split("\n"))
|
||
|
text = "\n".join(list(text))
|
||
|
text = re.sub("https?://([^/]+)/(@[^ ]+)", r"\2@\1", text) #put mentions back in
|
||
|
text = re.sub("^@[^@]+@[^ ]+ *", r"", text) #...but remove the initial one
|
||
|
text = text.lower() #for easier matching
|
||
|
return text
|
||
|
|
||
|
class ReplyListener(mastodon.StreamListener):
|
||
|
def on_notification(self, notification):
|
||
|
if notification['type'] == 'mention':
|
||
|
acct = "@" + notification['account']['acct']
|
||
|
post_id = notification['status']['id']
|
||
|
mention = extract_toot(notification['status']['content'])
|
||
|
toot = create.make_toot(True)['toot']
|
||
|
toot = acct + " " + toot
|
||
|
print(acct + " says " + mention)
|
||
|
client.status_post(toot, post_id, visibility=notification['status']['visibility'])
|
||
|
print("replied with " + toot)
|
||
|
|
||
|
rl = ReplyListener()
|
||
|
client.stream_user(rl)
|