Esempio n. 1
0
def update_nick(msg):
    log.info("publisher nick change requested")

    old_nick = publishers[request.sid].nick
    try:
        new_nick = msg['new']
    except KeyError:
        emit("log_message", {"data": "obey the API! (missing key 'new')"})
        return
    if old_nick == new_nick:
        emit("log_message", {"data": f"Your nick is already {new_nick}"})
        return
    else:
        subscribers_nicks = {z.nick for z in subscribers.values()}
        other_nicks = subscribers_nicks.union(
            {z.nick
             for z in publishers.values()})
        if new_nick in other_nicks:
            emit("log_message", {"data": f"Nick {new_nick} already exists"})
            return

    publishers[request.sid].nick = new_nick

    emit('log_message', {'data': f"nick updated to {new_nick}"},
         broadcast=False)
    emit('update publishers', {
        'data': clean_publishers(),
        'new': new_nick,
        'old': old_nick
    },
         namespace='/subscribe',
         broadcast=True)
Esempio n. 2
0
def connect_publisher():
    log.info(f"Connecting publisher {request.sid}")
    other_publisher_nicks = {z.nick for z in publishers.values()}
    other_nicks = other_publisher_nicks.union(
        {z.nick
         for z in subscribers.values()})

    if request.sid in publishers:
        raise RuntimeError(f"{request.sid} (publisher) Connected twice.")
    for i in range(10):
        x = str(random.randint(1, 10000))
        if x not in other_nicks:
            publishers[request.sid] = Publisher(sid=request.sid, nick=x)
            other_publisher_nicks.add(x)
            other_nicks.add(x)
            break
    else:
        log.info("Couldn't assign a nick, disconnecting the publisher...")
        emit("log_message", {
            "data": "Failed to assign you a nick",
            "fatal": True
        })
        return

    log.info(f"A publisher just connected (id={request.sid}, nick={x})"
             f" - total publishers: {len(publishers)}")
    emit('update publishers', {
        'data': clean_publishers(),
        'new': x,
        'old': None
    },
         namespace='/subscribe',
         broadcast=True)
    return True
Esempio n. 3
0
def update_nick(msg):
    log.info("publisher nick change requested")

    old_nick = publishers[request.sid].nick
    try:
        new_nick = msg['new']
    except KeyError:
        emit("log message", {"data": "obey the API! (missing key 'new')"})
        return
    if old_nick == new_nick:
        emit("log message",
             {"data": "Your nick is already {}".format(new_nick)})
        return
    else:
        subscribers_nicks = {z.nick for z in subscribers.values()}
        other_nicks = subscribers_nicks.union(
            {z.nick for z in publishers.values()})
        if new_nick in other_nicks:
            emit("log message",
                 {"data": "Nick {} already exists".format(new_nick)})
            return

    publishers[request.sid].nick = new_nick

    emit('log message', {'data': "nick updated to {}".format(new_nick)},
         broadcast=False)
    emit('update publishers',
         {'data': clean_publishers(), 'new': new_nick, 'old': old_nick},
         namespace='/subscribe', broadcast=True)
Esempio n. 4
0
def connect_publisher():
    log.info("Connecting publisher {}".format(request.sid))
    other_publisher_nicks = {z.nick for z in publishers.values()}
    other_nicks = other_publisher_nicks.union(
        {z.nick for z in subscribers.values()})

    if request.sid in publishers:
        raise RuntimeError(
            "{} (publisher) Connected twice.".format(request.sid))
    for i in range(10):
        x = str(random.randint(1, 10000))
        if x not in other_nicks:
            publishers[request.sid] = Publisher(sid=request.sid, nick=x)
            other_publisher_nicks.add(x)
            other_nicks.add(x)
            break
    else:
        log.info("Couldn't assign a nick, disconnecting the publisher...")
        emit("log message",
             {"data": "Failed to assign you a nick", "fatal": True})
        return

    log.info(
        "A publisher just connected (id={}, nick={})".format(request.sid, x) +
        " - total publishers: {})".format(len(publishers)))
    emit('update publishers',
         {'data': clean_publishers(), 'new': x, 'old': None},
         namespace='/subscribe', broadcast=True)
    return True
Esempio n. 5
0
 def __process_timeout(self):
     log.info(
         "{}: no ping reply in {} seconds, setting latency to -1".format(
             self.__sid, self.TIMEOUT_THRESHOLD))
     self.latency = -1
     self.__timeout = eventlet.greenthread.spawn_after(
         self.TIMEOUT_THRESHOLD, self.__process_timeout)
     socketio.emit('update publishers',
                   {'data': clean_publishers(), 'update': self.nick,
                    'show': False}, namespace='/subscribe', broadcast=True)
Esempio n. 6
0
 def __process_timeout(self):
     log.info(
         "{}: no ping reply in {} seconds, setting latency to -1".format(
             self.__sid, self.TIMEOUT_THRESHOLD))
     self.latency = -1
     self.__timeout = eventlet.greenthread.spawn_after(
         self.TIMEOUT_THRESHOLD, self.__process_timeout)
     socketio.emit('update publishers', {
         'data': clean_publishers(),
         'update': self.nick,
         'show': False
     },
                   namespace='/subscribe',
                   broadcast=True)
Esempio n. 7
0
    def pong(self, token):
        log.debug("{}: pong received".format(self.__sid))
        if not self.__ping_token == token:
            log.warning("{}: Invalid token, ignoring...".format(self.__sid))
            return
        self.latency = round(time.time() - self.__ping_ts, 3)
        socketio.emit('update publishers',
                      {'data': clean_publishers(), 'update': self.nick,
                       'show': False}, namespace='/subscribe', broadcast=True)

        # reset timeout
        self.__timeout.cancel()
        self.__timeout = eventlet.greenthread.spawn_after(
            self.TIMEOUT_THRESHOLD, self.__process_timeout)
Esempio n. 8
0
def disconnect_publisher():
    try:
        old_nick = publishers[request.sid].nick
        publishers[request.sid].remove_timeouts()
        del publishers[request.sid]
    except KeyError:  # nick was never assigned
        log.info(
            'publisher {} just disconnected without a '.format(request.sid) +
            'nick ever been assigned - total: {}'.format(len(publishers)))
    else:
        log.info(
            'publisher {} just disconnected - total: {}'.format(
                request.sid, len(publishers)))
        emit('update publishers',
             {'data': clean_publishers(), 'new': None, 'old': old_nick},
             namespace='/subscribe', broadcast=True)
Esempio n. 9
0
def connect_subscriber():
    log.info(f"Connecting subscriber {request.sid}")
    other_nicks = {z.nick for z in subscribers.values()}.union(
        {z.nick for z in publishers.values()})

    if request.sid in subscribers:
        raise RuntimeError(f"{request.sid} (subscriber) Connected twice.")

    nicks_pool = subscribers_nick_presets
    for used_nick in other_nicks:
        try:
            nicks_pool.remove(used_nick)
        except ValueError:  # user is using a non-preset nick
            pass

    colors_pool = subscribers_color_presets
    for used_color in {z.color for z in subscribers.values()}:
        try:
            colors_pool.remove(used_color)
        except ValueError:  # user is using a non-preset color
            pass

    if nicks_pool and colors_pool:
        assigned_nick = random.choice(nicks_pool)
        assigned_color = random.choice(colors_pool)
        subscribers[request.sid] = Subscriber(
            nick=assigned_nick, color=assigned_color)
    else:
        log.info("Couldn't assign a nick, disconnecting the subscriber...")
        emit("log_message",
             {"data": "Failed to assign you a nick", "fatal": True})
        return

    log.info("Someone (id={}, nick={}) just subscribed! - total: {}".format(
        request.sid, assigned_nick, len(subscribers)))
    emit(
        'nick change', {
            'new': assigned_nick, 'old': None,
            "color": assigned_color, 'complete': clean_subscribers(),
        }, broadcast=False)
    emit('update subscriptions',
         {'complete': clean_subscribers(), 'new': assigned_nick, 'old': None},
         broadcast=True, include_self=False)

    emit('update publishers',
         {'data': clean_publishers(), 'state': current_state.value})
    return True
Esempio n. 10
0
def set_ua(msg):
    log.info("publisher ua change requested")

    try:
        ua = msg['user_agent']
    except KeyError:
        emit("log message",
             {"data": "obey the API! (missing key 'user_agent')"})
        return

    publishers[request.sid].ua = ua
    nick = publishers[request.sid].nick

    emit('log message', {'data': "ua set to {}".format(ua)}, broadcast=False)
    emit('update publishers',
         {'data': clean_publishers(), 'update': nick, 'show': False},
         namespace='/subscribe', broadcast=True)
Esempio n. 11
0
    def pong(self, token):
        log.debug(f"{self.__sid}: pong received")
        if not self.__ping_token == token:
            log.warning(f"{self.__sid}: Invalid token, ignoring...")
            return
        self.latency = round(time.time() - self.__ping_ts, 3)
        socketio.emit('update publishers', {
            'data': clean_publishers(),
            'update': self.nick,
            'show': False
        },
                      namespace='/subscribe',
                      broadcast=True)

        # reset timeout
        self.__timeout.cancel()
        self.__timeout = eventlet.greenthread.spawn_after(
            self.TIMEOUT_THRESHOLD, self.__process_timeout)
Esempio n. 12
0
def disconnect_publisher():
    try:
        old_nick = publishers[request.sid].nick
        publishers[request.sid].remove_timeouts()
        del publishers[request.sid]
    except KeyError:  # nick was never assigned
        log.info(f'publisher {request.sid} just disconnected without a '
                 f'nick ever been assigned - total: {len(publishers)}')
    else:
        log.info('publisher {} just disconnected - total: {}'.format(
            request.sid, len(publishers)))
        emit('update publishers', {
            'data': clean_publishers(),
            'new': None,
            'old': old_nick
        },
             namespace='/subscribe',
             broadcast=True)
Esempio n. 13
0
def message_trigger(message):
    log.info(f"Publisher state updated: {message}")
    nick = publishers[request.sid].nick
    # TODO: accept partial updates
    try:
        status = message['status']
        title = message['title']
        position = message['position']
        length = message['length']
        show = message.get('show', False)
        suggest_sync = message.get('suggest_sync', None)
    except KeyError as e:
        msg = f"Received missing data: {e}"
        log.error(msg)
        emit('log_message', {'data': msg},
             namespace='/publish',
             broadcast=False)
        return False
    else:
        try:
            publishers[request.sid].status = PlayerState(status).value
        except ValueError:
            msg = f"Received bad state: {status}"
            log.error(msg)
            emit('log_message', {'data': msg})
            publishers[request.sid].status = PlayerState.UNKNOWN.value
            return False
        else:
            publishers[request.sid].title = title
            publishers[request.sid].position = position
            publishers[request.sid].length = length

        emit('update publishers', {
            'data': clean_publishers(),
            'update': nick,
            'show': show
        },
             namespace='/subscribe',
             broadcast=True)

        if suggest_sync:
            broadcast_sync_suggestion(suggest_sync, PlayerState(status),
                                      position)
Esempio n. 14
0
def message_trigger(message):
    log.info("Publisher state updated: {}".format(message))
    nick = publishers[request.sid].nick
    # TODO: accept partial updates
    try:
        publishers[request.sid].status = message['status']
        publishers[request.sid].title = message['title']
        publishers[request.sid].position = message['position']
        show = message.get('show', False)
    except KeyError as e:
        msg = "Received missing data: {}".format(e)
        log.error(msg)
        emit('log message', {'data': msg}, namespace='/publish',
             broadcast=False)
        return False
    else:
        emit('update publishers',
             {'data': clean_publishers(), 'update': nick, 'show': show},
             namespace='/subscribe', broadcast=True)
Esempio n. 15
0
def set_ua(msg):
    log.info("publisher ua change requested")

    try:
        ua = msg['user_agent']
    except KeyError:
        emit("log_message",
             {"data": "obey the API! (missing key 'user_agent')"})
        return

    publishers[request.sid].ua = ua
    nick = publishers[request.sid].nick

    emit('log_message', {'data': f"ua set to {ua}"}, broadcast=False)
    emit('update publishers', {
        'data': clean_publishers(),
        'update': nick,
        'show': False
    },
         namespace='/subscribe',
         broadcast=True)