#!/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? if settings['cw']: client.status_post(toot, spoiler_text="Curious Cat post") else: client.status_post(toot) 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()