✨(backend) attribute a color to each participant
Color is stored in participant's metadata. Using a hash of some participant's info allow to persist the color for logged-in participant without storing the color in db. Please feel free to tune the saturation and lightness range. Code is inspired by a tutorial found online.
This commit is contained in:
committed by
aleb_the_flash
parent
c16c27fa50
commit
8b2750c413
@@ -2,6 +2,10 @@
|
||||
Utils functions used in the core app
|
||||
"""
|
||||
|
||||
# ruff: noqa:S311
|
||||
|
||||
import json
|
||||
import random
|
||||
from typing import Optional
|
||||
from uuid import uuid4
|
||||
|
||||
@@ -10,6 +14,24 @@ from django.conf import settings
|
||||
from livekit.api import AccessToken, VideoGrants
|
||||
|
||||
|
||||
def generate_color(identity: str) -> str:
|
||||
"""Generates a consistent HSL color based on a given identity string.
|
||||
|
||||
The function seeds the random generator with the identity's hash,
|
||||
ensuring consistent color output. The HSL format allows fine-tuned control
|
||||
over saturation and lightness, empirically adjusted to produce visually
|
||||
appealing and distinct colors. HSL is preferred over hex to constrain the color
|
||||
range and ensure predictability.
|
||||
"""
|
||||
|
||||
random.seed(hash(identity))
|
||||
hue = random.randint(0, 360)
|
||||
saturation = random.randint(50, 75)
|
||||
lightness = random.randint(25, 60)
|
||||
|
||||
return f"hsl({hue}, {saturation}%, {lightness}%)"
|
||||
|
||||
|
||||
def generate_token(room: str, user, username: Optional[str] = None) -> str:
|
||||
"""Generate a LiveKit access token for a user in a specific room.
|
||||
|
||||
@@ -49,6 +71,7 @@ def generate_token(room: str, user, username: Optional[str] = None) -> str:
|
||||
.with_grants(video_grants)
|
||||
.with_identity(identity)
|
||||
.with_name(username or default_username)
|
||||
.with_metadata(json.dumps({"color": generate_color(identity)}))
|
||||
)
|
||||
|
||||
return token.to_jwt()
|
||||
|
||||
Reference in New Issue
Block a user