aboutsummaryrefslogblamecommitdiffstats
path: root/termcast_server/web.py
blob: b3048fae77d6e350ae9a15ce15fccdcfbc0e48eb (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
                                         
           










                                                           




                                      

                                  





                                                                   







                                                                     




                                                                 
 
                       
                                        
                                                                    
 
                                                                           

                                             
 










                                        



                                                 

                        

                                    
                                                             

      

                                           
                                                               

                                            
from pkg_resources import resource_string
import json
import tornado
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.websocket

class RootHandler(tornado.web.RequestHandler):
    def get(self):
        self.write(resource_string(__name__, "index.html"))

class WebSocketHandler(tornado.websocket.WebSocketHandler):
    def initialize(self, publisher):
        self.publisher = publisher
        self.watching_id = None
        self.initialized = False
        self.publisher.subscribe(self)

    def on_message(self, message):
        print(message)
        data = json.loads(message)
        if data["type"] == "request_streamer_list":
            streamers = self.publisher.request_all("get_streamers")
            reply = {
                "type": "streamer_list",
                "streamers": [
                    {
                        "id": s["id"],
                        "name": s["name"].decode('utf-8', 'replace'),
                        "idle_since": s["idle_since"],
                        "created_at": s["created_at"],
                    } for s in streamers
                ],
            }
            self.write_message(json.dumps(reply))
        elif data["type"] == "start_watching":
            self.watching_id = data["who"]
            self.publisher.notify("new_viewer", self.watching_id)

    def on_close(self):
        self.publisher.unsubscribe(self)
        self.publisher.notify("viewer_disconnect", self.watching_id)

    def msg_new_data(self, connection_id, prev_buf, data, screen, updates):
        if self.watching_id != connection_id:
            return

        if updates:
            reply = {
                "type": "update_screen",
                "updates": updates,
            }
        else:
            reply = {
                "type": "redraw_screen",
                "screen": screen,
            }

        try:
            self.write_message(json.dumps(reply))
        except:
            self.publisher.unsubscribe(self)

def make_app(publisher):
    return tornado.web.Application([
        ('/', RootHandler),
        ('/-/', WebSocketHandler, dict(publisher=publisher)),
    ])

def start_server(sock, publisher, pemfile):
    # XXX set up ssl with pemfile
    server = tornado.httpserver.HTTPServer(make_app(publisher))
    server.add_socket(sock)
    tornado.ioloop.IOLoop.instance().start()