summaryrefslogtreecommitdiff
path: root/main.py
blob: e6bf4031abd416111bc95b62c73a8d687b70e008 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
from mastodon import Mastodon
import config
import time
import re
import random
import os
from patterns import *


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()