foxygit / infodisplay Log in
commits tags

/kiosk/addons/livechat/events.py · 3.22 KB

raw
from flask import request
from flask_socketio import Namespace
import extensions
from .routes import chat_tokens


class ChatNamespace(Namespace):
    _users    = {}  # sid -> {name, color, emoji, avatar_url}
    _messages = []  # recent message history (last 50)

    def on_connect(self):
        sid = request.sid
        if self._messages:
            extensions.socketio.emit('chat_history', self._messages, to=sid, namespace='/chat')
        extensions.socketio.emit('viewer_count', {'count': len(self._users)}, to=sid, namespace='/chat')

    def on_join(self, data):
        token = str(data.get('token', '')).strip()
        if not token:
            return
        user_info = chat_tokens.get(token)
        if not user_info:
            self.emit('auth_error', {'error': 'Ogiltig token, logga in igen'})
            return
        if request.sid in self._users:
            return
        username   = user_info['username']
        emoji      = user_info['emoji']
        color      = user_info['color']
        avatar_url = user_info.get('avatar_url')
        self._users[request.sid] = {'name': username, 'color': color, 'emoji': emoji, 'avatar_url': avatar_url}
        # Re-send history to authenticated client so chat-mobile gets it after login
        if self._messages:
            extensions.socketio.emit('chat_history', self._messages, to=request.sid, namespace='/chat')
        extensions.socketio.emit('viewer_count', {'count': len(self._users)}, namespace='/chat')

    def on_chat_message(self, data):
        user = self._users.get(request.sid)
        if not user:
            return
        text = str(data.get('text', '')).strip()[:300]
        if not text:
            return
        msg = {
            'name':       user['name'],
            'color':      user['color'],
            'emoji':      user.get('emoji'),
            'avatar_url': user.get('avatar_url'),
            'text':       text,
        }
        self._messages.append(msg)
        if len(self._messages) > 50:
            self._messages.pop(0)
        extensions.socketio.emit('chat_message', msg, namespace='/chat')

    def on_play_suggestion(self, data):
        user = self._users.get(request.sid)
        if not user:
            return
        url = str(data.get('url', '')).strip()[:500]
        if not url or not url.startswith(('http://', 'https://')):
            return
        msg = {
            'name':       user['name'],
            'color':      user['color'],
            'emoji':      user.get('emoji'),
            'avatar_url': user.get('avatar_url'),
            'text':       url,
            'kind':       'play_suggestion',
        }
        self._messages.append(msg)
        if len(self._messages) > 50:
            self._messages.pop(0)
        # Skicka till alla i /chat-namespacet (display + mobil)
        extensions.socketio.emit('play_suggestion', msg, namespace='/chat')
        # Notifiera admin-panelen via huvud-namespacet
        extensions.socketio.emit('play_suggestion', {
            'name': user['name'], 'color': user['color'], 'url': url,
        })

    def on_disconnect(self):
        user = self._users.pop(request.sid, None)
        if user:
            extensions.socketio.emit('viewer_count', {'count': len(self._users)}, namespace='/chat')