71 lines
2.7 KiB
Python
Executable file
71 lines
2.7 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
#Curious Greg - Curious Cat to Mastodon crossposter
|
|
# 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 json, time
|
|
from mastodon import Mastodon
|
|
import requests
|
|
import mysql.connector
|
|
|
|
cfg = json.load(open('meta.json'))
|
|
|
|
db = mysql.connector.connect(user=cfg['dbuser'], password=cfg['dbpass'], database=cfg['dbname'])
|
|
c = db.cursor()
|
|
dc = db.cursor(dictionary=True)
|
|
|
|
dc.execute("SELECT * FROM data")
|
|
for row in dc.fetchall():
|
|
print(row['cc'])
|
|
settings = json.loads(row['settings'])
|
|
t = int(time.time())
|
|
next_check = row['last_check'] + row['time_between_checks'] * 60
|
|
print("current time: {} waiting for: {}".format(t, next_check))
|
|
if next_check <= t:
|
|
row['time_between_checks'] = cfg['min_time_between_checks']
|
|
#time to check
|
|
if row['cc'] != "None" and row['cc'] != None:
|
|
r = requests.get("https://curiouscat.me/api/v2/profile?username={}&count=100&min_timestamp={}".format(row['cc'], row['latest_post']))
|
|
j = r.json()
|
|
if 'error' in j:
|
|
continue
|
|
posted = False
|
|
if len(j['posts']) > 0 and not (len(j['posts']) == 1 and int(j['posts'][0]['timestamp']) == int(row['latest_post'])):
|
|
#they've made some new posts, log in to masto
|
|
try:
|
|
client = Mastodon(client_id=row['client_id'], client_secret=row['client_secret'], access_token=row['secret'], api_base_url=row['instance'])
|
|
except:
|
|
continue
|
|
for post in j['posts']:
|
|
if post['senderData']['id'] == False:
|
|
sender = "(anonymous)"
|
|
else:
|
|
sender = post['senderData']['username']
|
|
|
|
if int(post['timestamp']) <= int(row['latest_post']):
|
|
#this is the one we've already seen
|
|
continue
|
|
|
|
#if we get to this point, they've definitely made a post
|
|
posted = True
|
|
|
|
toot = "Curious Cat user {} asks: {}\n\nMy answer: {}\n\nhttps://curiouscat.me/{}/post/{}".format(sender, post['comment'], post['reply'], row['cc'], post['id']) #TODO: what if this is over 500 characters?
|
|
try:
|
|
if settings['cw']:
|
|
client.status_post(toot, spoiler_text="Curious Cat post")
|
|
else:
|
|
client.status_post(toot)
|
|
except:
|
|
continue
|
|
c.execute("UPDATE data SET last_check = %s, time_between_checks = %s, latest_post = %s", (t, cfg['min_time_between_checks'], j['posts'][0]['timestamp']))
|
|
if not posted:
|
|
#we checked, and they haven't made a post
|
|
tbc = int(row['time_between_checks']) + 1
|
|
if tbc > int(cfg['max_time_between_checks']):
|
|
tbc = cfg['max_time_between_checks']
|
|
c.execute("UPDATE data SET last_check = %s, time_between_checks = %s", (t, tbc))
|
|
db.commit()
|
|
|
|
db.commit()
|
|
|