Ejemplo n.º 1
0
Archivo: bop.py Proyecto: boppreh/bop
    def __init__(self, page_cls):
        self.flask = flask.Flask(__name__)

        self.page_cls = page_cls

        self.publisher = Publisher()
        self.context_by_pageid = {}
        self.user_by_id = {}
        self.page_by_id = {}
        self.world = _Channel(self.publisher, 'world')

        @self.flask.route('/sse.js')
        def server_sse():
            return flask.Response(open('sse.js').read(),
                                  content_type='application/javascript')

        @self.flask.route('/sse/subscribe/<pageid>')
        def subscribe(pageid):
            context = self.context_by_pageid[pageid]
            response = flask.Response(context.subscription,
                                      content_type='text/event-stream')
            return response

        @self.flask.route('/call/<method_name>', methods=['POST'])
        def action(method_name):
            pageid = flask.request.form['pageid']
            page = self.page_by_id[pageid]

            params = [value
                      for key, value in sorted(flask.request.form.items())
                      if key != 'pageid']

            method = getattr(page, method_name)
            return method(*params) or ''

        @self.flask.route('/')
        @self.flask.route('/<resource>')
        def root(resource='/'):
            pageid = str(uuid4())
            page = self._get_page(pageid)

            response = flask.make_response(str(page))
            response.set_cookie('pageid', pageid)
            if flask.request.cookies.get('userid') is None:
                response.set_cookie('userid', self._get_user_channel().id)

            return response
Ejemplo n.º 2
0
 def test_multiple(self):
     p = Publisher()
     s1 = p.subscribe()
     s2 = p.subscribe()
     s3 = p.subscribe()
     p.publish('test')
     p.close()
     self.assertEqual(self.read(s1), 'data: test')
     self.assertEqual(self.read(s2), 'data: test')
     self.assertEqual(self.read(s3), 'data: test')
Ejemplo n.º 3
0
 def test_initial_data(self):
     p = Publisher()
     s = p.subscribe(initial_data=['start 1', 'start 2'])
     p.publish('test')
     p.close()
     self.assertEqual(self.read(s), 'data: start 1\n\n'
                      'data: start 2\n\n'
                      'data: test')
Ejemplo n.º 4
0
    def test_channel(self):
        p = Publisher()
        s1 = p.subscribe('channel 1')
        s2 = p.subscribe('channel 2')
        s3 = p.subscribe(['channel 1', 'channel 2'])

        p.publish('test1', 'channel 1')
        p.publish('test2', 'channel 2')
        p.close()

        self.assertEqual(self.read(s1), 'data: test1')
        self.assertEqual(self.read(s2), 'data: test2')
        self.assertEqual(self.read(s3), 'data: test1\n\ndata: test2')
Ejemplo n.º 5
0
    def test_custom(self):
        p = Publisher()
        s1 = p.subscribe(properties=1)
        s2 = p.subscribe(properties=2)

        p.publish(lambda properties: properties)
        p.close()

        self.assertEqual(self.read(s1), 'data: 1')
        self.assertEqual(self.read(s2), 'data: 2')
Ejemplo n.º 6
0
 def test_multiple(self):
     p = Publisher()
     s1 = p.subscribe()
     s2 = p.subscribe()
     s3 = p.subscribe()
     p.publish('test')
     p.close()
     self.assertEqual(self.read(s1), 'data: test')
     self.assertEqual(self.read(s2), 'data: test')
     self.assertEqual(self.read(s3), 'data: test')
Ejemplo n.º 7
0
 def test_initial_data(self):
     p = Publisher()
     s = p.subscribe(initial_data=['start 1', 'start 2'])
     p.publish('test')
     p.close()
     self.assertEqual(self.read(s),
                      'data: start 1\n\n'
                      'data: start 2\n\n'
                      'data: test')
Ejemplo n.º 8
0
    def test_channel(self):
        p = Publisher()
        s1 = p.subscribe('channel 1')
        s2 = p.subscribe('channel 2')
        s3 = p.subscribe(['channel 1', 'channel 2'])

        p.publish('test1', 'channel 1')
        p.publish('test2', 'channel 2')
        p.close()

        self.assertEqual(self.read(s1), 'data: test1')
        self.assertEqual(self.read(s2), 'data: test2')
        self.assertEqual(self.read(s3), 'data: test1\n\ndata: test2')
Ejemplo n.º 9
0
    def test_custom(self):
        p = Publisher()
        s1 = p.subscribe(properties=1)
        s2 = p.subscribe(properties=2)

        p.publish(lambda properties: properties)
        p.close()

        self.assertEqual(self.read(s1), 'data: 1')
        self.assertEqual(self.read(s2), 'data: 2')
Ejemplo n.º 10
0
Archivo: bop.py Proyecto: boppreh/bop
class App(object):
    def __init__(self, page_cls):
        self.flask = flask.Flask(__name__)

        self.page_cls = page_cls

        self.publisher = Publisher()
        self.context_by_pageid = {}
        self.user_by_id = {}
        self.page_by_id = {}
        self.world = _Channel(self.publisher, 'world')

        @self.flask.route('/sse.js')
        def server_sse():
            return flask.Response(open('sse.js').read(),
                                  content_type='application/javascript')

        @self.flask.route('/sse/subscribe/<pageid>')
        def subscribe(pageid):
            context = self.context_by_pageid[pageid]
            response = flask.Response(context.subscription,
                                      content_type='text/event-stream')
            return response

        @self.flask.route('/call/<method_name>', methods=['POST'])
        def action(method_name):
            pageid = flask.request.form['pageid']
            page = self.page_by_id[pageid]

            params = [value
                      for key, value in sorted(flask.request.form.items())
                      if key != 'pageid']

            method = getattr(page, method_name)
            return method(*params) or ''

        @self.flask.route('/')
        @self.flask.route('/<resource>')
        def root(resource='/'):
            pageid = str(uuid4())
            page = self._get_page(pageid)

            response = flask.make_response(str(page))
            response.set_cookie('pageid', pageid)
            if flask.request.cookies.get('userid') is None:
                response.set_cookie('userid', self._get_user_channel().id)

            return response

    def serve(self, public=False, debug=True, ssl_context=None):
        if public:
            bind = '0.0.0.0'
            if ssl_context:
                from flask_sslify import SSLify
                port = 443
                SSLify(self.flask, permanent=True)
            else:
                port = 80
        else:
            bind = '127.0.0.1'
            port = 8080
        self.flask.run(debug=debug, host=bind, threaded=True, port=port,
                ssl_context=ssl_context)

    def _get_user_channel(self):
        userid = flask.request.cookies.get('userid') or str(uuid4())

        try:
            return self.user_by_id[userid]
        except KeyError:
            user = _Channel(self.publisher, userid)
            user.id = userid
            self.user_by_id[userid] = user
            return user

    def _get_page(self, pageid):
        try:
            return self.context_by_pageid[pageid]
        except KeyError:
            page_channel = _Channel(self.publisher, pageid)
            user_channel = self._get_user_channel()
            world_channel = self.world


            channel_names = ['world', user_channel.id, pageid]
            subscription = self.publisher.subscribe(channel_names)

            context = _Context(page_channel, user_channel, world_channel,
                               subscription)

            page = self.page_cls(context)

            self.context_by_pageid[pageid] = context
            self.page_by_id[pageid] = page
            return page
Ejemplo n.º 11
0
import flask
import pprint
import string
import socket
import threading

from pathlib import Path
from config import Config
from flask import render_template

import voice

from sse import Publisher
from makedirs import MakeDirs

publisher = Publisher()

_threadFacebook = None
_threadTwitch = None
_threadYoutube = None
_threadDouyu = None

_now_timestamp = int(time.time())
_now_array = time.localtime(_now_timestamp)
_now_day_string = time.strftime("%Y-%m-%d", _now_array)

# ==============================
# Flask Route
# ==============================

app = flask.Flask(__name__)
Ejemplo n.º 12
0
 def test_single(self):
     p = Publisher()
     s = p.subscribe()
     p.publish('test')
     p.close()
     self.assertEqual(self.read(s), 'data: test')
Ejemplo n.º 13
0
 def test_multiline(self):
     p = Publisher()
     s = p.subscribe()
     p.publish('line 1\nline 2')
     p.close()
     self.assertEqual(self.read(s), 'data: line 1\ndata: line 2')
Ejemplo n.º 14
0
 def test_single(self):
     p = Publisher()
     s = p.subscribe()
     p.publish('test')
     p.close()
     self.assertEqual(self.read(s), 'data: test')
Ejemplo n.º 15
0
 def test_multiline(self):
     p = Publisher()
     s = p.subscribe()
     p.publish('line 1\nline 2')
     p.close()
     self.assertEqual(self.read(s), 'data: line 1\ndata: line 2')