From 13c84aa2baf557ecc441f8e26a57124719e3f7ec Mon Sep 17 00:00:00 2001 From: Tianhao Wang Date: Tue, 28 Mar 2023 12:07:19 +0200 Subject: init --- main.py | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 main.py (limited to 'main.py') diff --git a/main.py b/main.py new file mode 100644 index 0000000..1416e3c --- /dev/null +++ b/main.py @@ -0,0 +1,116 @@ +from mastodon import Mastodon +import config +import time +import re +import random +import os +from patterns import * + + +def create_app(): + Mastodon.create_app(client_name='void**** cat',api_base_url='https://vnil.de',to_file='vnil_bot.secret') + +# create_app() + +def login_refresh_token(): + session = Mastodon(client_id=config.CLIENTID) + session.log_in(username=config.UNAME, password=config.PW, to_file=config.TOKEN) + return session + +def restore_session(): + return Mastodon(client_id=config.CLIENTID, access_token=config.TOKEN) + + +class VnilCat: + def __init__(self,config): + self.session = restore_session() + try: + self.session.account_verify_credentials() + except: + try: + self.session = login_refresh_token() + except: + exit() + + + def reply_meow(self, ori_status): + print("replying meow to ", ori_status["id"]) + self.session.status_reply(to_status=ori_status, status=random.choice(cat_sounds)) + + + # For now we don't handle other interaction types + def handle_mention(self, notification): + nid = notification["id"] + # in the case of mention, + # notification['status']['account'] and + # notification['account'] are the same thing + acc = notification["account"] + status = notification["status"] + sid = status["id"] + # created_at = notification["created_at"] + # pleroma = notification["pleroma"] + print("we have a mention > ",nid) + content = status["content"] + if re_contains_meow.search(content) is not None: + self.reply_meow(status) + + print("dismissing notification ", nid) + self.session.notifications_dismiss(nid) + + def handle_follow(self, notification): + nid = notification["id"] + uid = notification['account']['id'] + rel = self.session.account_relationships(uid) + if rel[0]['following'] == False: + print("follow ", uid) + self.session.account_follow(uid, reblogs=False, notify=False) + else: + print("already following", uid) + self.session.notifications_dismiss(nid) + + def scan_local(self,session): + print("TODO") + + def handle_notification(self): + ns = self.session.notifications() + for n in ns: + if n['type'] == "mention": + self.handle_mention(n) + if n['type'] == "follow": + self.handle_follow(n) + + +# TODO re-organize auth mgmt. But it involves a lot of mamual testing so I'll +# leave it to the future... +def init_bot(): + Mastodon.create_app(config.APPNAME, api_base_url=config.BASEURL, + to_file=config.CLIENTID) + session = login_refresh_token() + + +def run(): + # print("HELLO") + cat = VnilCat(config) + # print(cat.session.notifications()) + + # print(session.notifications()) + # session.toot("WTF") + + while True: + time.sleep(config.POLL_INTERVAL) + try: + cat.handle_notification() + except: + print("something wrong...") + + +if __name__ == "__main__": + # check session data + if not os.path.isfile(config.CLIENTID): + print("client data doesn't exist..creating...") + init_bot() + + run() + + + -- cgit v1.2.3-70-g09d2