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
112
113
114
115
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()
|