commits
tags
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')