-
Notifications
You must be signed in to change notification settings - Fork 0
/
adminbot.py
98 lines (85 loc) · 2.8 KB
/
adminbot.py
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
import json
import re
import threading
import os
from flask import Flask, request
from flask_httpauth import HTTPBasicAuth
import pinhook.bot
from werkzeug.security import check_password_hash
bot = None
app = Flask(__name__)
auth = HTTPBasicAuth()
with open('users.json') as u:
users = json.load(u)
class AdminBot(pinhook.bot.Bot):
townie_re = re.compile('townie-[a-f0-9]{16}')
modteam = [
'aliasless',
'fluora',
'spacecadet',
]
def _add_known_nick(self, nick):
nicks = self.known_nicks
nicks.append(nick)
nicks.sort()
with open('known_nicks.json', 'w') as k:
json.dump(nicks, k, indent=2)
def _check_for_nick_file(self):
if 'known_nicks.json' not in os.listdir():
with open('known_nicks.json', 'w') as k:
json.dump([], k)
@property
def known_nicks(self):
self._check_for_nick_file()
with open('known_nicks.json') as k:
nicks = json.load(k)
return nicks
def on_join(self, c, e):
nick = e.source.nick
if nick not in self.known_nicks and e.target == '#tildetown' and not self.townie_re.match(nick):
welcome = "Welcome, {}! I hope you're well. If you haven't seen it yet, please read over our wiki page about this chat: https://tilde.town/wiki/socializing/irc".format(nick)
c.privmsg(nick, welcome)
self._add_known_nick(nick)
def on_invite(self, c, e):
if e.arguments[0] in self.chanlist:
c.join(e.arguments[0])
self.logger.info('Joining {} at request of {}'.format(e.arguments[0], e.source))
def call_help(self, nick, op):
# this is going to be handled by a listener plugin
pass
def get_bot():
if bot:
return bot
else:
raise Exception("bot has not been intialized")
@auth.verify_password
def verify_password(username, password):
with open('users.json') as u:
users = json.load(u)
if username in users:
return check_password_hash(users.get(username), password)
return False
@app.route('/notify', methods=['POST'])
@auth.login_required
def notify_admins():
bot_instance = get_bot()
channel = request.json['channel']
message = request.json['message']
bot_instance.connection.privmsg(channel, message)
return 'message sent'
if __name__ == '__main__':
with open('pw.secret') as p:
pw = p.read().strip()
with open('channels.json') as c:
channels = json.load(c)
ops = [
'vilmibm',
'archangelic',
'equa',
'l0010o0001l'
]
bot = AdminBot(channels, 'adminbot', 'localhost', ops=ops, ns_pass=pw)
bot_thread = threading.Thread(target=bot.start)
bot_thread.start()
flask_thread = threading.Thread(target=app.run)
flask_thread.start()