Exemple #1
0
def create_app():
    app = Flask(__name__)

    app.config['SECRET_KEY'] = '9OLWxND4o83j4K4iuopO'
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.sqlite'
    socketio = SocketIO(app)

    def random_handle():
        interval = random.randint(0, 10)
        time.sleep(interval)
        nrandom = random.randint(0, 100)
        socketio.emit('send_random', {'nrandom': nrandom})

    socketio.on_event('get_random', random_handle)

    db.init_app(app)

    login_manager = LoginManager()
    login_manager.login_view = 'auth.login'
    login_manager.init_app(app)

    from .models import User

    @login_manager.user_loader
    def load_user(user_id):
        return User.query.get(int(user_id))
    
    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app
Exemple #2
0
def create_app(config="rooaa.settings.ProdConfig"):
    """ Creates configured Flask app """
    app = Flask(__name__)

    # Load given settings
    app.config.from_object(obj=config)

    from rooaa.api.predict import predict, detect_objects
    from rooaa.api.upload import upload
    from rooaa.api.camera import camera

    #! Temporary fix for XMLHttpRequest not working
    CORS(upload)
    CORS(predict)

    # Register prediction routes
    app.register_blueprint(blueprint=predict)

    # Register image upload routes
    app.register_blueprint(blueprint=upload)

    # Register CameraApp routes
    app.register_blueprint(blueprint=camera)

    # Register error handlers
    app.register_error_handler(code_or_exception=400, f=bad_request)

    socketio = SocketIO(app)
    socketio.on_event('prediction', detect_objects, namespace='/predict')

    return socketio, app
Exemple #3
0
class WebAppController(Thread):
    def __init__(self, robot):
        super(WebAppController, self).__init__()
        self.robot = robot
        self.servo = ServoSG90(self.robot.board, [7], reverse=True)
        self.app = Flask(__name__, static_folder='/build')
        self.socketio = SocketIO(self.app)

        self.app.add_url_rule('/', view_func=self.index_page)
        self.socketio.on_event("subscribeToData", self.handle_subscription)

        self.start()

    def run(self):
        self.app.run(host='0.0.0.0', port=3001)

    def index_page(self):
        return self.app.send_static_file('index.html')

    def handle_subscription(self, message):
        t = set_interval(self.handle_subscription_1, 1.85)
        # t.cancel()

    def handle_subscription_1(self):
        data = {}

        for angle in range(0, 181, 5):
            self.servo.set_degrees(angle)
            data[angle] = statistics.median(
                [self.robot.sensors[0].get_distance() for _ in range(10)])
            data[angle] = self.robot.sensors[0].get_distance()
            time.sleep(0.05)

        self.socketio.emit("subscribeToData", data=data)
Exemple #4
0
class WsServer:
    """
    Simple websocket server.
    """
    def __init__(self):
        self.app = Flask(__name__)
        self.app.config['SECRET_KEY'] = 'secret!'
        self.socketIO = SocketIO(self.app)
        self.mongoClient = MongoClient()

        self.socketIO.on_event('broadcast', self.handleBroadcast)
        self.socketIO.on_event('getUsers', self.getUsers)

    def run(self):
        """
        Starts the websocket server.
        """
        self.socketIO.run(self.app)

    def handleBroadcast(self, msg):
        """
        Sends the given message to all connected clients.
        """
        print('broadcast: {}'.format(msg))
        emit('broadcast', msg, broadcast=True)

    def getUsers(self):
        """
        Returns all users.
        """
        users = self.mongoClient.getUsers()
        data = json.dumps(users)
        print(data)
        emit('getUsers', data)
Exemple #5
0
def create_app(register_blueprint=True):
    app = Flask(__name__)
    app.secret_key = os.urandom(42)
    if register_blueprint:
        app.register_blueprint(plotting_blueprint)

    socketio = SocketIO(app, message_queue='redis://localhost:6379/')
    socketio.on_event('connect', bootstrap_on_connect)
    return socketio, app
Exemple #6
0
class StreamWebsocketServer(Thread, Observer):
    '''Sends stream changes to web UI.'''

    def __init__(self, config, store):
        Thread.__init__(self)
        self.app = Flask(__name__)
        self.configure_flask()
        self.socketio = SocketIO(
            self.app, logger=logger, engineio_logger=False)
        self.configure_socketio()
        self.store = store

    def on_next(self, stream_change):
        '''Responds to updates to the stream_changes observable.'''
        logger.debug('Broadcasting stream change to clients...')
        logger.debug(str(stream_change))
        streams = list(map(lambda stream: stream.data,
                           self.store.read_streams()))
        streams = sorted(
            streams, key=lambda stream: stream['viewers'], reverse=True)
        self.socketio.emit('streams', streams, broadcast=True)

    def configure_flask(self):
        self.app.config['SECRET_KEY'] = 'secret!'
        def handler():
            return render_template('eternal-twitch.html')
        self.app.add_url_rule('/', 'eternal_twitch', handler)

    def configure_socketio(self):
        def handle_connection():
            self.on_next({ 'type': 'connection' })
        self.socketio.on_event('connected', handle_connection)

    def run(self):
        '''Subscribes websocket server to changes to the store.'''
        self.disposer = self.store.stream_changes.pipe(
            debounce(1)
        ).subscribe(self)
        self.socketio.run(self.app, host='0.0.0.0',
                          debug=False, use_reloader=False)

    def stop_socketio(self):
        def handler():
            self.socketio.stop()
        self.socketio.on('stop', handler)

    def stop(self):
        '''Stops sending store updates to websocket server.'''
        logger.info('Stopping stream websocket server...')
        if hasattr(self, 'disposer'):
            self.disposer.dispose()
        self.stop_socketio()
Exemple #7
0
class Deployment:
    
    def __init__(self):
        """ Create a deployment object and define
            possible commands to be executed """

        self.socketio = SocketIO(message_queue='redis://')

    def update_position(self, data):
        print("updating position")

    def testing(self):
        self.socketio.emit("testing deployment socket", namespace='/test')
        self.socketio.on_event('update table', self.update_position)
Exemple #8
0
def create_app(config_name):
    f_config = config_dict[config_name]
    app = Flask(__name__,
                template_folder=f_config.STATIC_FOLDER,
                static_url_path='',
                static_folder=f_config.STATIC_FOLDER)
    CORS(app,
         resources={
             r"/dataset/*": {
                 "origin": "*"
             },
             r"/devices/*": {
                 "origin": "*"
             },
             r"/slack/*": {
                 "origin": "*"
             },
         })
    app.config.from_object(f_config)
    app.config['MONGODB_SETTINGS'] = config_database

    socket = SocketIO(app)
    socket.init_app(app, cors_allowed_origins="*")
    print('Attempt to connect to MongoDB...')
    global is_connected
    client = MongoClient()
    try:
        # The ismaster command is cheap and does not require auth.
        client.admin.command('ismaster')
        is_connected = True
        print('Connected to MongoDB!')
    except ConnectionFailure:
        print(
            'Failed to connect to MongoDB. You should restart server to reconnect!'
        )
        is_connected = False

    api = Api(app)

    api.add_resource(Main, '/', '/<path:path>')
    api.add_resource(Dataset, '/dataset')
    api.add_resource(Devices, '/devices')
    api.add_resource(Slack, '/slack/')

    socket.on_event('get_data', getData)
    socket.on_event('get_dashboard_data', get_dashboard_data)
    socket.on_event('get_data_by_command', get_data_by_command)
    socket.on_event('stop_command_run', stop_command_run)
    socket.on_event('health_check', health_check)
    return app, socket
Exemple #9
0
class PhraseSocket:
    def __init__(self, app):
        self.socketio = SocketIO(app, cors_allowed_origins="*")
        self.connections = list()
        self.socketio.on_event("join", self.on_join)
        self.db = Database()
        self.db.connect()

    def ping(self, username, phrases, stage):
        if username in self.connections:
            print("gang {}".format(phrases))
            phraseResults = list()
            for item in phrases:
                ts = item["timestamp"]
                if ts > 16048547531:  #if timestamp is in milliseconds, turn into seconds
                    ts = ts / 1000
                item["prettyTime"] = datetime.fromtimestamp(ts).strftime(
                    "%a, %b %-d %-I:%M %p")
                phraseResults.append(item)
            self.socketio.emit("my_response", {
                "phrases": phraseResults,
                "stage": stage
            },
                               room=username)

    @jwt_required
    def on_join(self, data):
        username = get_jwt_identity()
        userId = str(self.db.nameToId(username))
        self.connections.append(username)
        print("user {} has joined".format(userId))
        join_room(username)
        self.send_ini(userId, username)

    def send_ini(self, userId, username):
        phrases = self.db.getPhrases(username)
        stage = self.db.getL1Stage(userId)
        phraseResults = list()
        if phrases is None:
            return None
        for item in phrases:
            item["prettyTime"] = datetime.fromtimestamp(
                item["timestamp"]).strftime("%a, %b %-d %-I:%-M %p")
            phraseResults.append(item)
        self.socketio.emit("my_response", {
            "phrases": phraseResults,
            "stage": stage
        },
                           room=username)
def env():
    # start server
    os.environ["KFCHESS_CONFIG"] = os.path.join(os.path.dirname(__file__), "../config.py")
    app = create_app()
    socketio = SocketIO(app)
    def on_join(room):
        join_room(room, namespace="/game")
    socketio.on_event('join', on_join)

    # start polling thread
    game_resps_q = "resps:{}".format(uuid.uuid4())
    redis_db     = redis.StrictRedis()  #Todo: take redis from some configs
    t = Thread(target=poll_game_cnfs, args=(redis_db, "test_store", game_resps_q, socketio))
    t.daemon = True
    t.start()
    yield Env(app=app, socketio=socketio, q=game_resps_q, db=redis_db)
Exemple #11
0
class NetCore(threading.Thread):
    def __init__(self, engine):
        super().__init__()
        self.__engine = engine
        self.__app = Flask(__name__)
        self.__sio = SocketIO(self.__app)

    def run(self):
        self.__app.add_url_rule('/', 'core', self.core)
        self.__app.add_url_rule('/<path:path>', 'res', self.res)
        self.__sio.on_event('connect', self.on_connect)
        self.__sio.on_event('data', self.on_data)
        self.__sio.run(self.__app, port=80)

    def core(self):
        resp = make_response(send_file('../ui/index.html'))
        return resp

    def res(self, path):
        """"""
        if os.path.exists('ui/' + path):
            resp = make_response(send_file('../ui/' + path))
            return resp
        print('FILE NOT FOUND: {}'.format('ui/' + path))
        return 'PAGE NOT FOUND: {}'.format(path)

    def send(self, data):
        print('SEND: {}'.format(data))
        print(self.__sio.__hash__())
        print(threading.current_thread().__hash__())
        self.__sio.emit('data', data)
        self.__sio.sleep()

    def on_connect(self):
        """"""
        self.__engine.info('Connected from ID: {}'.format(request.sid))
        self.__engine.on_connect(request.sid)
        resp = make_response()
        return resp

    def on_data(self, data):
        print('RECV: {}'.format(data))
        print(self.__sio.__hash__())
        print(threading.current_thread().__hash__())
        self.send(data)
        self.__engine.recv(data)
Exemple #12
0
class Uplink(object):
    def __init__(self, app=None, secret="top_secret_1!"):
        self.app = app
        self.app.config['SECRET_KEY'] = secret
        self.sio = SocketIO(self.app)
        self.initialized = False
        self.sio.on_event('connect', self.update_render, namespace='/')
        self.func = None
        self.funcs = {}

    def update_render(self):
        if not self.func:
            return
        emit('update_content', self.func())

    def render(self):
        def dec(f):
            @wraps(f)
            def wrapper(*msg):
                self.func = f
                if not self.initialized:
                    self.initialized = True
                    return html_wrapper
                return emit('update_content', f())

            return wrapper

        return dec

    def event(self, channel_id):
        def test(burp):
            if channel_id not in self.funcs:
                print("No func found")
                return
            self.funcs[channel_id]()
            emit('update_content', self.func())

        self.sio.on_event(channel_id, test, namespace='/')

        def dec(f):
            self.funcs[channel_id] = f

        return dec

    def run(self):
        self.sio.run(self.app)
Exemple #13
0
def create_app(name):
    app = Flask(
        name,
        template_folder=settings["TEMPLATE_FOLDER"],
        static_folder=settings["STATIC_FOLDER"],
        static_url_path=settings["STATIC_URL_PATH"],
    )
    app.config["DEBUG"] = settings["FLASK_DEBUG"]
    app.config["ENV"] = settings["FLASK_ENV"]
    app.config["SECRET_KEY"] = settings["SECRET_KEY"]

    socketio = SocketIO()
    socketio.init_app(app)
    socketio.on_event("chat", handle_message)

    app = add_routes(app)
    socketio = add_socketio_handlers(socketio)

    return app, socketio
Exemple #14
0
def create_app(config_name):
    f_config = config_dict[config_name]
    app = Flask(__name__,
                template_folder=f_config.STATIC_FOLDER,
                static_url_path='',
                static_folder=f_config.STATIC_FOLDER)
    app.config.from_object(f_config)
    CORS(app, resources={r"*": {"origins": "*"}})

    socket = SocketIO(app)
    socket.init_app(app, cors_allowed_origins="*")

    api = Api(app)
    api.add_resource(Main, '/')

    socket.on_event('request_start', communicate_with_guider)
    socket.on_event('request_stop', disconnect_with_guider)

    return app, socket
Exemple #15
0
class MessagingServer(Messager):
    def __init__(self):
        super().__init__()
        self.host, self.port = get_server_host_and_port()
        self.app = get_flask_instance()
        self.sio = SocketIO(self.app)

        self.sio.on_event(EVENT_PUBLIC_KEYS, self.return_pubkeys)
        self.sio.on_event(EVENT_AES_KEY, self.unencrypt_and_set_aes_key)
        self.sio.on_event(EVENT_MESSAGE, self.print_message)

    def unencrypt_and_set_aes_key(self, data):
        key = decrypt_message(data, self.a, self.p)
        self.aes_secret_key = key

        self.set_aes_cipher()

        self.set_keys_exchanged()
        self.sio.emit(EVENT_KEYS_EXCHANGED)

    def return_pubkeys(self, data):
        self.set_pubkeys(data)
        self.sio.emit(EVENT_PUBLIC_KEYS,
                      data={
                          "p": self.p,
                          "g": self.g,
                          "b": self.b
                      })

    def start_server(self):
        self.sio.run(self.app, host="0.0.0.0", port=self.port)

    def start(self):
        threading.Thread(target=self.start_server).start()
        self.message_loop(self.sio)
Exemple #16
0
def create_app(config_name):
    f_config = config_dict[config_name]
    app = Flask(__name__,
                template_folder=f_config.STATIC_FOLDER,
                static_url_path='',
                static_folder=f_config.STATIC_FOLDER)
    app.config.from_object(f_config)
    app.config['MONGODB_SETTINGS'] = config_database

    socket = SocketIO(app)
    socket.init_app(app, cors_allowed_origins="*")
    # TODO: exception handling for mongo-engine
    db.init_app(app)

    api = Api(app)

    api.add_resource(Main, '/', '/<path:path>')
    api.add_resource(Slack, '/slack/')

    socket.on_event('request_start', communicate_with_guider)
    socket.on_event('request_stop', disconnect_with_guider)
    return app, socket
Exemple #17
0
    def __init__(self, conn_list_instance, deauth_fn, port=8080):
        self._conn_list_instance = conn_list_instance
        self._deauth_fn = deauth_fn

        app = Flask(__name__, static_folder='static', static_url_path=None)
        app.config['SECRET_KEY'] = 'secret!'

        @app.route("/")
        def root():
            return app.send_static_file('index.html')

        socketio = SocketIO(app)

        socketio.on_event("send_connections_list", self._send_connections_list)
        socketio.on_event("start_deauth", self._start_deauth)

        t = threading.Thread(target=lambda: socketio.run(app, port=port))
        t.daemon = True

        def start():
            t.start()
            print "Started server on localhost:%i" % (port)

        self.start = start
Exemple #18
0
def generate_socketio(hardware={}):
    """
    Sets up a Flask server for DSSServer

     start a central server
       the additional keyword arguments for DSSServer are
         import_path   - (str) a path whose corresponding module has a 
                               'station_configuration' function (default None)
         config_args   - (tuple/list) passed to 'station_configuration' 
                                      (default None)
         config_kwargs - (dict) passed to 'station_configuration'
                                (default None) 
         **kwargs      - (dict) keyword arguments for Pyro4Server
    """
    logger.debug("generate_socketio: hardware: %s", hardware)
    server = DSSServer('WBDC2_K2',
                       parent=FlaskServer(),
                       logger=logging.getLogger(__name__ + ".DSSServer"),
                       config_args={"hardware": hardware},
                       boresight_manager_file_paths=[],
                       boresight_manager_kwargs=dict(reload=True,
                                                     dump_cache=False))

    # initialize a Flask app
    app = Flask(server.name)
    logger.debug("generate_socketio: Flask initialized")
    app.config['SECRET_KEY'] = "radio_astronomy_is_cool"
    socketio = SocketIO(app, json=JSONWrapper(), cors_allowed_origins="*")
    logger.debug("generate_socketio: SocketIO initialized")

    # flaskify the server
    app, socketio, server = DSSServer.flaskify_io(server,
                                                  app=app,
                                                  socketio=socketio)
    logger.debug("generate_socketio: server IO flaskified")

    def init(data):
        logger.debug("generate_socketio.init: got {}".format(data))

    def hostname():
        logger.debug("generate_socketio.hostname: called")
        host = socket.gethostname()
        with app.app_context():
            socketio.emit("hostname", host)
        logger.debug("generate_socketio.hostname: host: {}".format(host))

    def teardown():
        logger.debug("generate_socketio.teardown: disconnect at %s",
                     datetime.datetime.now().ctime())
        server.save_info()

    socketio.on_event("init", init)
    socketio.on_event("hostname", hostname)
    socketio.on_event("disconnect", teardown)
    return app, socketio, server
Exemple #19
0
class NetCore:
    def __init__(self):
        self.app = Flask(__name__)
        self.sio = SocketIO(self.app)
        self.address = None

    def create_server(self, address=None):
        self.address = address
        self.app.add_url_rule('/', 'core', self.core)
        self.app.add_url_rule('/<path:path>', 'res', self.res)
        self.sio.on_event('connect', self.on_connect)
        self.sio.on_event('msg', self.on_msg)
        self.sio.on_event('test', self.test)
        t = threading.Thread(target=self.server_core)
        t.run()

    def server_core(self):
        if self.address:
            config = {
                'host': self.address[0],
                'port': self.address[1],
                'debug': False
            }
            self.sio.run(self.app, **config)
        else:
            self.sio.run(self.app)

    def on_connect(self):
        print('Connected!')
        print('ID: {}'.format(request.sid))
        print('Cookie ID: {}'.format(request.cookies.get('sid')))
        self.sio.emit('msg', 'msg')
        res = make_response()
        res.set_cookie('sid', request.sid)
        return res

    def on_msg(self, msg):
        print(msg)

    def core(self):
        with open('front/index.html', encoding='utf-8') as f:
            return f.read()

    def res(self, path):
        if os.path.exists('front/' + path):
            with open('front/' + path, 'r', encoding='utf-8') as f:
                return f.read()
        print('FILE NOT FOUND: {}'.format('front/' + path))
        return 'PAGE NOT FOUND: {}'.format(path)

    def test(self, msg):
        print(msg)
Exemple #20
0
def create_app(config_name):
    f_config = config_dict[config_name]
    app = Flask(__name__,
                template_folder=f_config.STATIC_FOLDER,
                static_url_path='',
                static_folder=f_config.STATIC_FOLDER)
    CORS(app,
         resources={
             r"/dataset/*": {
                 "origin": "*"
             },
             r"/devices/*": {
                 "origin": "*"
             },
             r"/slack/*": {
                 "origin": "*"
             },
         })
    app.config.from_object(f_config)
    app.config['MONGODB_SETTINGS'] = config_database

    socket = SocketIO(app)
    socket.init_app(app, cors_allowed_origins="*")

    try:
        db.init_app(app)
    except Exception as e:
        print('Failed to connect MongoDB', e)

    api = Api(app)

    api.add_resource(Main, '/', '/<path:path>')
    api.add_resource(Dataset, '/dataset')
    api.add_resource(Devices, '/devices')
    api.add_resource(Slack, '/slack/')

    socket.on_event('get_dashboard_data', get_dashboard_data)
    socket.on_event('get_data_by_command', get_data_by_command)
    socket.on_event('stop_command_run', stop_command_run)
    socket.on_event('health_check', health_check)
    return app, socket
Exemple #21
0
def get_io(
    *, check_user_creds_usecase: CheckUserCredentialsUseCase,
    add_online_user_usecase: AddOnlineUserUseCase,
    remove_online_user_usecase: RemoveOnlineUserUseCase,
    publish_online_user_usecase: PublishOnlineUserUseCase
) -> Tuple[Flask, SocketIO]:
    api = Flask(__name__)
    io = SocketIO(api)

    # dependencies
    flask_base_sockets = FlaskBaseSockets(
        check_user_creds_usecase=check_user_creds_usecase,
        add_online_user_usecase=add_online_user_usecase,
        remove_online_user_usecase=remove_online_user_usecase,
        publish_online_user_usecase=publish_online_user_usecase)

    # register (maybe we will do it better later so it doesn't be messy right? :D
    io.on_event('connect', flask_base_sockets.on_connect)
    io.on_event('disconnect', flask_base_sockets.on_disconnect)
    io.on_event('message', FlaskMessageSockets().on_message)

    return api, io
Exemple #22
0
class Executer:
    def __init__(self, threads):
        self.pool = ThreadPoolExecutor(threads)
        self.queue = queue.Queue()
        self.warehouse = Warehouse(19999)
        self.robots = []
        self.tasks = []
        self.app = Flask("Warehouse")
        self.socketio = SocketIO(self.app, pingTimeout=60, pingInterval=60)
        self.socketio.on_event("addTask", self.handleAddTask)
        self.socketio.on_event("addRobot", self.handleAddRobot)
        self.loop = threading.Thread(target=self._dispatcher)
        self.freeRobots = threading.Semaphore(value=0)
        self.mutex = threading.Lock()
        self.app.add_url_rule("/<path:path>",
                              "sendFile",
                              self.sendFile,
                              methods=["GET"])
        self.app.add_url_rule("/",
                              "sendHomePage",
                              self.sendHomePage,
                              methods=["GET"])
        self.app.add_url_rule("/getTasks", "sendTasksHTTP", self.sendTasksHTTP)
        self.app.add_url_rule("/getRobotsPos", "sendRobotsPos",
                              self.sendRobotsPos)

    def handle_message(self, data):
        print("received message: " + data)

    def handleGetTask(self):
        self.socketio.emit("get")

    def sendFile(self, path):
        return flask.send_from_directory("./", path)

    def sendHomePage(self):
        return flask.send_file("./html/index.html")

    def sendRobotsPos(self):
        pos = []
        for robot in self.robots:
            curPos = robot.getPos()
            mappedPos = self.warehouse.warehouse_to_img(curPos[0], curPos[1])
            pos.append({
                "id": robot.id,
                "angle": robot.getAngle(),
                "x": mappedPos[0],
                "y": mappedPos[1],
            })
        return jsonify(pos)

    def sendTasksHTTP(self):
        return jsonify(self.tasks)

    def startHTTPServer(self):
        self.socketio.run(self.app, host="0.0.0.0")

    def stopHTTP(self):
        self.finishAll()
        status_code = flask.Response(status=201)
        return status_code

    def handleAddTask(self, data):
        data = json.loads(data)
        self.addTask(data)
        self.socketio.emit("newTask", data)
        self.tasks.append(data)

    def handleAddRobot(self):
        if not request.json or not "robot" in request.json:
            abort(400)
        self.addRobot(request.json["robot"]["suffix"])
        status_code = flask.Response(status=201)
        print(request.json)
        return status_code

    def startListening(self):
        self.loop.start()

    def _dispatcher(self):
        while True:
            print("waiting")
            points = self.queue.get()
            if points == None:
                break
            print("Preparing to dispatch", points)
            self.mutex.acquire()
            self.freeRobots.acquire()
            print("Dispatching", points)
            self.pool.submit(self._assignTask, points)

    def addRobot(self, name):
        self.robots.append(Robot(self.warehouse.client, name))
        self.freeRobots.release()

    def addTask(self, stop):
        self.queue.put(stop)

    def release(self, num):
        print("Releasing")
        self.robots[num].makeFree()
        self.freeRobots.release()

    def _assignTask(self, task):
        print(type(task))
        pickup, drop = (task["pickup"]["x"], task["pickup"]["y"]), (
            task["drop"]["x"],
            task["drop"]["y"],
        )
        print(pickup, drop)
        for i in range(len(self.robots)):
            if not self.robots[i].busy:
                print("Angle = ", self.robots[i].getAngle())
                self.robots[i].makeBusy(task)
                self.mutex.release()
                task["robot"] = self.robots[i].id
                self.socketio.emit("assignTo", {
                    "uuid": task["uuid"],
                    "robot": self.robots[i].id
                })
                task["status"] = "Computing Path"
                self.socketio.emit("updateStatus", {
                    "uuid": task["uuid"],
                    "status": "Computing Path"
                })
                finder = PathFinder(self.warehouse)
                _, pos = sim.simxGetObjectPosition(
                    self.warehouse.client,
                    self.robots[i].base,
                    -1,
                    sim.simx_opmode_blocking,
                )
                start = self.warehouse.warehouse_to_img(pos[0], pos[1])
                pickupPathImg, pickupPath = finder.find(
                    start, pickup, self.robots[i].getAngle())
                print("pick found")
                if len(pickupPath) == 0:
                    print("No")
                    task["status"] = "No route"
                    self.socketio.emit("updateStatus", {
                        "uuid": task["uuid"],
                        "status": task["status"]
                    })
                    self.release(i)
                    return
                dropPathImg, dropPath = finder.find(pickup, drop)
                print("drop found")
                if len(dropPath) == 0:
                    print("No")
                    task["status"] = "No route"
                    self.socketio.emit("updateStatus", {
                        "uuid": task["uuid"],
                        "status": task["status"]
                    })
                    self.release(i)
                    return
                task["pickupPath"] = pickupPathImg
                task["dropPath"] = dropPathImg
                self.socketio.emit(
                    "path",
                    {
                        "uuid": task["uuid"],
                        "pickup": pickupPathImg,
                        "drop": dropPathImg,
                    },
                )
                task["status"] = "In Transit"
                self.socketio.emit("updateStatus", {
                    "uuid": task["uuid"],
                    "status": "In Transit"
                })
                print(task["package"]["id"])
                tracker = PathTracker(
                    pickupPath,
                    dropPath,
                    2.8,
                    5,
                    self.robots[i],
                    self.warehouse,
                    self.socketio,
                    task["package"]["id"],
                )
                tracker.track()
                curPos = self.robots[i].getPos()
                mappedPos = self.warehouse.warehouse_to_img(
                    curPos[0], curPos[1])
                self.robots[i].task["status"] = "Finished"
                self.socketio.emit(
                    "updateStatus",
                    {
                        "uuid": self.robots[i].task["uuid"],
                        "status": "Finished"
                    },
                )
                self.socketio.emit(
                    "updateRobotPos",
                    {
                        "id": self.robots[i].id,
                        "x": mappedPos[0],
                        "y": mappedPos[1]
                    },
                )
                self.release(i)
                return

    def finishAll(self):
        self.queue.put(None)
        self.loop.join()
        self.mutex.acquire()
        self.pool.shutdown()
Exemple #23
0
def create_app() -> Tuple[Flask, SocketIO]:
    app = Flask(__name__)
    app.register_blueprint(bp)
    CORS(app)
    socketio = SocketIO(app, cors_allowed_origins="*")
    socketio.on_event('join', join_agreement, namespace='/')
    socketio.on_event('leave', leave_agreement, namespace='/')
    socketio.on_event('change', agreement_change, namespace='/')
    socketio.on_event('join_chat', join_chat, namespace='/')
    socketio.on_event('leave_chat', leave_chat, namespace='/')
    socketio.on_event('send', message_sent, namespace='/')
    return app, socketio
Exemple #24
0
def register_handlers(sio: SocketIO):
    sio.on_event('self_introduction', on_self_introduction)
    sio.on_event('message', on_message)

@socketio.on('other custom event')
def get_request_event(data):
    global request_event_data
    request_event_data = request.event
    emit('my custom response', data)


def get_request_event2(data):
    global request_event_data
    request_event_data = request.event
    emit('my custom response', data)


socketio.on_event('yet another custom event', get_request_event2)


@socketio.on('my custom namespace event', namespace='/test')
def on_custom_event_test(data):
    emit('my custom namespace response', data, namespace='/test')


def on_custom_event_test2(data):
    emit('my custom namespace response', data, namespace='/test')


socketio.on_event('yet another custom namespace event',
                  on_custom_event_test2,
                  namespace='/test')
def register_events(events: List, socketio: SocketIO) -> None:
    for event in events:
        socketio.on_event(event.get("event"), event.get("func"), event.get("namespace"))
Exemple #27
0
        return data


@socketio.on('other custom event')
def get_request_event(data):
    global request_event_data
    request_event_data = request.event
    emit('my custom response', data)


def get_request_event2(data):
    global request_event_data
    request_event_data = request.event
    emit('my custom response', data)

socketio.on_event('yet another custom event', get_request_event2)


@socketio.on('my custom namespace event', namespace='/test')
def on_custom_event_test(data):
    emit('my custom namespace response', data, namespace='/test')


def on_custom_event_test2(data):
    emit('my custom namespace response', data, namespace='/test')

socketio.on_event('yet another custom namespace event', on_custom_event_test2,
                  namespace='/test')


@socketio.on('my custom broadcast event')
Exemple #28
0
def handle_my_custom_namespace_event(json):
    print("received json: " + str(json))
    emit('my response', json)

    # Sending multiple arguments
    emit('my response', 'foo', namespace='/test')


# Without decorator
def my_function_handler(data):
    print("received my function handler: " + str(data))


socketio.on_event(
    "my function handler event",
    my_function_handler,
    namespace='/'
)


# Sending Message
# ===============
# With callback
def ack():
    print 'callback message was received'


@socketio.on('my event ack')
def handle_my_event_ack(json):
    emit('my response', json, callback=ack)
Exemple #29
0
from flask_mongoengine import MongoEngine
from delhivery.models import DelhiveryUser
from api.utils import get_notifications_for_dashboard
from app.settings import MONGODB_SETTINGS
import app.main_sockets as main_sockets
app = Flask(__name__)
app.secret_key = 'delhiverySECRET'
app.config['TEMPLATES_AUTO_RELOAD'] = True
app.config['MONGODB_SETTINGS'] = MONGODB_SETTINGS
app.config['WTF_CSRF_SECRET_KEY']="SECRETCSRFKEY"
CORS(app)
socketio = SocketIO(manage_session=False)
socketio.init_app(app,message_queue='redis://')
login_manager = LoginManager(app)
db = MongoEngine(app)
socketio.on_event('connect',main_sockets.connect)
socketio.on_event('create_room',main_sockets.create_room)
socketio.on_event('disconnect',main_sockets.disconnect)
socketio.on_event('send_message',main_sockets.send_message)
socketio.on_event('typing',main_sockets.typing_message)
socketio.on_event('no_longer_typing',main_sockets.no_longer_typing)
def notify_user(person_id):
    notifications = get_notifications_for_dashboard(person_id)
    socketio.emit('received_friend_request',notifications,room=person_id)


def refresh_online_friends(user_id):
    socketio.emit('refresh_online_friends',room = user_id)

def refresh_tasks_delivery_agent(room):
    socketio.emit('refresh_tasks', room=room)
Exemple #30
0
from flask_mongoengine import MongoEngine
from fakebook.models import FakeBookUser
from api.utils import get_notifications_for_dashboard
from settings import MONGODB_SETTINGS
import main_sockets
app = Flask(__name__)
app.secret_key = 'FAKEBOOKSECRET'
app.config['TEMPLATES_AUTO_RELOAD'] = True
app.config['MONGODB_SETTINGS'] = MONGODB_SETTINGS
app.config['WTF_CSRF_SECRET_KEY']="SECRETCSRFKEY"
CORS(app)
socketio = SocketIO(manage_session=False)
socketio.init_app(app,message_queue='redis://')
login_manager = LoginManager(app)
db = MongoEngine(app)
socketio.on_event('connect',main_sockets.connect)
socketio.on_event('create_room',main_sockets.create_room)
socketio.on_event('disconnect',main_sockets.disconnect)
socketio.on_event('send_message',main_sockets.send_message)
socketio.on_event('typing',main_sockets.typing_message)
socketio.on_event('no_longer_typing',main_sockets.no_longer_typing)
def notify_user(person_id):
    notifications = get_notifications_for_dashboard(person_id)
    socketio.emit('received_friend_request',notifications,room=person_id)

def update_friends_list_for_receiver(user_id):
    socketio.emit('update_people_list',room=user_id)

def refresh_online_friends(user_id):
    socketio.emit('refresh_online_friends',room = user_id)
Exemple #31
0
class WebSocket(Module):
    """The WebSocket class is responsible for handling the websocket connection between frontend and backend.
    In addition, it also serves the web frontend and provides the web client with all the static files."""

    # Set this variable to "threading", "eventlet" or "gevent" to test the
    # different async modes, or leave it set to None for the application to choose
    # the best option based on installed packages.
    SOCKETIO_ASYNC_MODE = None  # "gevent"

    NS = '/situationboard'  # namespace
    FF = 'frontend/'  # frontend folder

    MIME_JS = 'application/javascript'

    def __init__(self, appInfo: AppInfo, settings: Settings,
                 database: Database):
        super().__init__("websocket", settings)
        self.appInfo = appInfo
        self.settings = settings
        self.database = database
        self.pluginManager: Optional[PluginManager] = None

        self.clientCount = 0

        self.app = Flask(self.appInfo.name,
                         static_url_path='',
                         static_folder=WebSocket.FF,
                         template_folder=WebSocket.FF)
        self.app.config['SECRET_KEY'] = 'secret!'

        self.socketio = SocketIO(self.app,
                                 async_mode=WebSocket.SOCKETIO_ASYNC_MODE)
        self.btask: Any = None

    def init(self, pluginManager: PluginManager) -> None:
        self.pluginManager = pluginManager

        # register flask handlers
        self.app.after_request(self.__app_add_header)
        self.app.add_url_rule('/<path:path>', 'send_static',
                              self.__app_send_static)
        self.app.add_url_rule('/', 'index', self.__app_index)
        self.app.add_url_rule('/js/situationboard.js', 'javascript_frontend',
                              self.__app_javascript_frontend)
        self.app.add_url_rule('/js/frontend/util/settings.js',
                              'javascript_settings',
                              self.__app_javascript_settings)

        # register web api (if configured)
        if self.settings.getBackendWebAPI():
            self.app.add_url_rule('/api/v1/stats', 'api_stats',
                                  self.__api_stats)
            self.app.add_url_rule('/api/v1/state', 'api_state',
                                  self.__api_state)

        # register socket io handlers
        self.socketio.on_event("connect", self.__socket_connect, WebSocket.NS)
        self.socketio.on_event("disconnect", self.__socket_disconnect,
                               WebSocket.NS)
        self.socketio.on_event("get_last_alarm_events",
                               self.__socket_get_last_alarm_events,
                               WebSocket.NS)
        self.socketio.on_event("get_stats", self.__socket_get_stats,
                               WebSocket.NS)
        self.socketio.on_event("get_header", self.__socket_get_header,
                               WebSocket.NS)
        self.socketio.on_event("get_news", self.__socket_get_news,
                               WebSocket.NS)
        self.socketio.on_event("get_state", self.__socket_get_state,
                               WebSocket.NS)

    def sleep(self, duration: int) -> None:
        self.socketio.sleep(duration)

    def start_background_task(self, target: Callable[[], None]) -> None:
        self.btask = self.socketio.start_background_task(target=target)

    def __broadcast(self, event: str, data: Dict[str, Any]) -> None:
        self.socketio.emit(event, data, namespace=WebSocket.NS, broadcast=True)

    def run(self) -> None:
        port = self.settings.getBackendServerPort()

        self.print(f"Listening on port {port}")

        try:
            self.socketio.run(self.app,
                              host=self.settings.getBackendServerHost(),
                              port=self.settings.getBackendServerPort(),
                              debug=self.settings.getBackendDebug(),
                              use_reloader=self.settings.getBackendReloader())
        except OSError as ose:
            if ose.errno == errno.EADDRINUSE:
                self.fatal(f"Port {port} is already in use")
            else:
                self.fatal("Unhandled OS exception", ose)
        except Exception as e:
            self.fatal("Unhandled exception", e)

    def app_test_client(self) -> Any:
        return self.app.test_client()

    def socket_test_client(self, appTestClient: Any = None) -> Any:
        return self.socketio.test_client(self.app,
                                         WebSocket.NS,
                                         flask_test_client=appTestClient)

    def __app_add_header(self, response: Any) -> Any:
        response.headers['Cache-Control'] = 'public, max-age=0'
        return response

    def __app_send_static(self, path: Any) -> Any:
        self.dbgPrint(f"Sending static file ({path})")
        return send_from_directory('.', path)

    def __app_javascript_frontend(self) -> Response:
        template = "js/situationboard.js"
        self.dbgPrint(f"Rendering template ({template})")
        data = render_template(template,
                               tVersion=str(self.appInfo.version),
                               tStartTimestamp=str(self.appInfo.start))
        return Response(data, mimetype=WebSocket.MIME_JS)

    def __app_javascript_settings(self) -> Response:
        template = "js/frontend/util/settings.js"
        self.dbgPrint(f"Rendering template ({template})")
        data = render_template(
            template,
            tDebug=str(self.settings.getFrontendDebug()).lower(),
            tLanguage=str(self.settings.getFrontendLanguage()),
            tAlarmDuration=str(self.settings.getFrontendAlarmDuration()),
            tAlarmShowMaps=str(self.settings.getFrontendAlarmShowMaps()),
            tCalendarURL=self.settings.getFrontendCalendarURL(),
            tCalendarUpdateDuration=str(
                self.settings.getFrontendCalendarUpdateDuration()),
            tStandbyShowStatistics=str(
                self.settings.getFrontendStandbyShowStatistics()).lower(),
            tStandbyShowClock=str(
                self.settings.getFrontendStandbyShowClock()).lower(),
            tPageReloadDuration=str(
                self.settings.getFrontendPageReloadDuration()),
            tMapService=str(self.settings.getFrontendMapService()),
            tMapAPIKey=str(self.settings.getFrontendMapAPIKey()),
            tMapZoom=str(self.settings.getFrontendMapZoom()),
            tMapType=str(self.settings.getFrontendMapType()),
            tMapEmergencyLayer=str(
                self.settings.getFrontendMapEmergencyLayer()),
            tMapHomeLatitude=str(self.settings.getFrontendMapHomeLatitude()),
            tMapHomeLongitude=str(self.settings.getFrontendMapHomeLongitude()),
            tShowSplashScreen=str(
                self.settings.getFrontendShowSplashScreen()).lower())
        return Response(data, mimetype=WebSocket.MIME_JS)

    def __app_index(self) -> Response:
        template = "index.html"
        self.dbgPrint(f"Rendering template ({template})")
        data = render_template(template)
        return Response(data)

    def __api_stats(self) -> Dict[str, Any]:
        self.dbgPrint("Answering stats Web API request")
        return {'result': 'ok', 'stats': self.__get_stats_dict()}

    def __api_state(self) -> Dict[str, Any]:
        self.dbgPrint("Answering state Web API request")
        return {'result': 'ok', 'state': self.__get_state_dict()}

    def __socket_connect(self) -> None:
        session["ClientID"] = self.clientCount
        self.clientCount += 1
        self.print(
            f"Client {session['ClientID']} connected ({request.remote_addr}, {request.sid})"
        )  # type: ignore

    def __socket_disconnect(self) -> None:
        self.print(
            f"Client {session['ClientID']} disconnected ({request.remote_addr}, {request.sid})"
        )  # type: ignore

    def __socket_get_last_alarm_events(self, message: Any) -> None:
        self.dbgPrint(
            f"Answering get_last_alarm_events (Client {session['ClientID']})")

        count = -1
        if isinstance(message, dict) and 'count' in message:
            if isinstance(message['count'], int):
                count = message['count']

        totalEvents = self.database.getEventCount(textOnly=True)
        count = count if count > 0 else totalEvents
        alarmEvents = self.database.getLastEvents(count, textOnly=True)

        emit(
            'last_alarm_events', {
                'total_events':
                totalEvents,
                'alarm_events':
                json.dumps([alarmEvent.toJSON() for alarmEvent in alarmEvents])
            })

    def __socket_get_stats(self) -> None:
        self.dbgPrint(f"Answering get_stats (Client {session['ClientID']})")
        emit('stats', self.__get_stats_dict())

    def __socket_get_state(self) -> None:
        # self.dbgPrint(f"Answering get_state (Client {session['ClientID']})")
        emit('state', self.__get_state_dict())

    def __socket_get_header(self) -> None:
        self.dbgPrint(f"Answering get_header (Client {session['ClientID']})")
        emit('header', {'header': self.settings.getFrontendHeader()})

    def __socket_get_news(self) -> None:
        self.dbgPrint(f"Answering get_news (Client {session['ClientID']})")
        emit('news', {'news': self.settings.getFrontendNews()})

    def broadcastHeader(self, header: str) -> None:
        self.__broadcast('header', {'header': header})

    def broadcastNews(self, news: str) -> None:
        self.__broadcast('news', {'news': news})

    def broadcastAlarmEvent(self, alarmEvent: AlarmEvent) -> None:
        self.__broadcast('alarm_event', alarmEvent.toJSON())

    def broadcastDatabaseChanged(self) -> None:
        self.__broadcast('database_changed', {})

    def broadcastCalendarChanged(self) -> None:
        self.__broadcast('calendar_changed', {})

    def __get_stats_dict(self) -> Dict[str, Any]:
        statsDict = {
            'total':
            self.database.getEventStats(DatabaseTimespan.TOTAL, textOnly=True),
            'year':
            self.database.getEventStats(DatabaseTimespan.YEAR, textOnly=True),
            'month':
            self.database.getEventStats(DatabaseTimespan.MONTH, textOnly=True),
            'today':
            self.database.getEventStats(DatabaseTimespan.TODAY, textOnly=True)
        }

        return statsDict

    def __get_state_dict(self) -> Dict[str, Any]:
        if self.pluginManager is None:
            self.fatal("PluginManager not available")

        state: SourceState = self.pluginManager.getSourceState()

        stateDict = {
            'version': self.appInfo.version,
            'start_timestamp': self.appInfo.start,
            'source_state': int(state)
        }

        return stateDict
@socketio.on("other custom event")
@socketio.on("and another custom event")
def get_request_event(data):
    global request_event_data
    request_event_data = request.event
    emit("my custom response", data)


def get_request_event2(data):
    global request_event_data
    request_event_data = request.event
    emit("my custom response", data)


socketio.on_event("yet another custom event", get_request_event2)


@socketio.on("my custom namespace event", namespace="/test")
def on_custom_event_test(data):
    emit("my custom namespace response", data, namespace="/test")


def on_custom_event_test2(data):
    emit("my custom namespace response", data, namespace="/test")


socketio.on_event("yet another custom namespace event",
                  on_custom_event_test2,
                  namespace="/test")