-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathporacle.py
136 lines (107 loc) · 3.99 KB
/
poracle.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys, logging, errno, subprocess, Queue, time
from alarm import filter
from utils.args import args as get_args
from utils.mysql import verify_database_schema
from gevent import wsgi, spawn, pool
from flask import Flask, request, abort
import ujson as json
from threading import Thread
app = Flask(__name__)
hook_q = Queue.Queue()
abspath = os.path.abspath(__file__)
reload(sys)
sys.setdefaultencoding('UTF8')
# create logger
log = logging.getLogger('Poracle')
log.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s [%(threadName)18s][%(module)14s]' +
'[%(levelname)8s] %(message)s')
ch.setFormatter(formatter)
log.addHandler(ch)
args = get_args()
def make_configs():
if not os.path.isfile('./config/monsters.json'):
log.info('Creating monster dts config')
template = json.loads(open(os.path.join(os.path.dirname(
abspath), 'config/monsters.json.example')).read())
with open('./config/monsters.json', 'w') as monconf:
json.dump(template, monconf, indent=4, sort_keys=False)
if not os.path.isfile('./config/raid.json'):
log.info('Creating raids dts config')
template = json.loads(open(os.path.join(os.path.dirname(
abspath), 'config/raid.json.example')).read())
with open('./config/raid.json', 'w') as raidconf:
json.dump(template, raidconf, indent=4, sort_keys=False)
if not os.path.isfile('./config/egg.json'):
log.info('Creating egg dts config')
template = json.loads(open(os.path.join(os.path.dirname(
abspath), 'config/egg.json.example')).read())
with open('./config/egg.json', 'w') as eggconf:
json.dump(template, eggconf, indent=4, sort_keys=False)
try:
os.remove('config.json')
except OSError as e:
if e.errno != errno.ENOENT:
raise
template = json.loads(open(os.path.join(os.path.dirname(abspath),'utils/discord/config.json')).read())
template['token'] = args.token
template['bot']['commands_prefix'] = args.prefix
with open('config.json', 'w') as config:
json.dump(template, config, indent=4, sort_keys=False)
def runserver():
t = Thread(target=provision_bot,)
t.daemon = True
t.start() # Start thread for discord bot
log.info("Poracle is running on: http://{}:{}".format(args.host,
args.port))
threads = pool.Pool(args.concurrency)
server = wsgi.WSGIServer(
(args.host, args.port), app, log=logging.getLogger('Webserver'),
spawn = threads)
server.serve_forever()
def provision_bot():
p = run_bot()
while True:
res = p.poll()
if res is not None:
log.warn("Discord bot {} was killed, restarting it.".format(p.pid))
p = run_bot()
time.sleep(1)
def run_bot():
return subprocess.Popen('python -m disco.cli', shell=True)
@app.route('/', methods=['GET'])
def index():
return "Schwing!"
@app.route('/', methods=['POST'])
def accept_webhook():
try:
data = json.loads(request.data)
for frame in data:
if args.debug:
di = json.dumps(frame, indent=4, sort_keys=True)
log.debug("{} Sent me:\n{}".format(request.remote_addr, di))
hook_q.put(frame)
spawn(send_hooks_to_filter, hook_q)
except Exception as e:
log.error(
"I am unhappy! computer says: {}: {}".format(
type(e).__name__, e))
abort(400)
return "OK" # request ok
hook_q.join()
def send_hooks_to_filter(q):
while not q.empty():
if q.qsize() > 300:
log.warning("Not cool, I have {} jobs to do".format(q.qsize()))
data = q.get()
filter(data)
q.task_done()
if __name__ == '__main__':
log.info("Poracle initializing.")
verify_database_schema()
make_configs()
runserver()