You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.2 KiB
100 lines
3.2 KiB
from clicker_control import clicker_manager,CLICKER_PATH
|
|
from http import server
|
|
from threading import Thread
|
|
from urllib.parse import urlparse,parse_qs
|
|
import argparse
|
|
import json
|
|
import os
|
|
|
|
class handler(server.BaseHTTPRequestHandler):
|
|
|
|
def do_GET(self):
|
|
params = parse_qs(urlparse(self.path).query)
|
|
ret = {}
|
|
self.server.manager.update()
|
|
if params['q'][0] == 'status':
|
|
ret['status'] = 'on' if self.server.manager.on else 'off'
|
|
self.send_response(200)
|
|
self.end_headers()
|
|
resp = json.dumps(ret).encode()
|
|
self.wfile.write(resp)
|
|
return
|
|
|
|
def do_POST(self):
|
|
params = parse_qs(urlparse(self.path).query)
|
|
action = params['action'][0]
|
|
print(action)
|
|
ret = {}
|
|
self.server.manager.update()
|
|
if action == 'on':
|
|
self.server.manager.turn_on()
|
|
ret['status'] = 'on'
|
|
elif action == 'off':
|
|
self.server.manager.turn_off()
|
|
ret['status'] = 'off'
|
|
elif action == 'toggle':
|
|
self.server.manager.toggle()
|
|
if self.server.manager.on:
|
|
ret['status'] = 'on'
|
|
else:
|
|
ret['status'] = 'off'
|
|
elif action == 'kill':
|
|
self.server.manager.kill()
|
|
self.send_response(204)
|
|
self.end_headers()
|
|
print('server being killed')
|
|
self.server.serve = False
|
|
return
|
|
elif action == 'set':
|
|
try:
|
|
state = params['state'][0]
|
|
assert(state in ('on','off'))
|
|
self.server.manager.on = state == 'on'
|
|
resp='Toggle state set to {}'.format(state).encode()
|
|
self.send_response(201)
|
|
self.end_headers()
|
|
self.wfile.write(resp)
|
|
return
|
|
except AssertionError:
|
|
self.send_response(400)
|
|
self.end_headers()
|
|
resp = "State must either be `on` or `off`".encode()
|
|
self.wfile.write(resp)
|
|
return
|
|
except KeyError:
|
|
self.send_response(400)
|
|
self.end_headers()
|
|
resp = "No state specified".encode()
|
|
self.wfile.write(resp)
|
|
return
|
|
else:
|
|
self.send_response(400)
|
|
self.end_headers()
|
|
resp = "Action not recognized".encode()
|
|
self.wfile.write(resp)
|
|
return
|
|
self.send_response(201)
|
|
self.end_headers()
|
|
resp = json.dumps(ret).encode()
|
|
self.wfile.write(resp)
|
|
|
|
class clicker_server(server.HTTPServer):
|
|
def __init__(self,location):
|
|
self.manager = clicker_manager()
|
|
self.serve = True
|
|
super().__init__(location,handler)
|
|
|
|
def serve_forever(self):
|
|
while self.serve:
|
|
self.handle_request()
|
|
self.socket.close()
|
|
|
|
def start_server(hostname,port):
|
|
httpd = clicker_server((hostname,args.port))
|
|
httpd.serve_forever()
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-p','--port',type=int,default=5138)
|
|
args = parser.parse_args()
|
|
start_server('localhost',args.port)
|