44 lines
1.2 KiB
Python
44 lines
1.2 KiB
Python
from base.exceptions import Unauthorized
|
|
from auth.tokenstorage import SessionToken
|
|
from base.redis import redis
|
|
|
|
|
|
async def set_online_status(user_id, status):
|
|
if user_id:
|
|
if status:
|
|
await redis.execute("SADD", "users-online", user_id)
|
|
else:
|
|
await redis.execute("SREM", "users-online", user_id)
|
|
|
|
|
|
async def on_connect(req, params):
|
|
if not isinstance(params, dict):
|
|
req.scope["connection_params"] = {}
|
|
return
|
|
token = params.get('token')
|
|
if not token:
|
|
raise Unauthorized("Please login")
|
|
else:
|
|
payload = await SessionToken.verify(token)
|
|
if payload and payload.user_id:
|
|
req.scope["user_id"] = payload.user_id
|
|
await set_online_status(payload.user_id, True)
|
|
|
|
|
|
async def on_disconnect(req):
|
|
user_id = req.scope.get("user_id")
|
|
await set_online_status(user_id, False)
|
|
|
|
|
|
# FIXME: not used yet
|
|
def context_value(request):
|
|
context = {}
|
|
print(f"[inbox.presense] request debug: {request}")
|
|
if request.scope["type"] == "websocket":
|
|
# request is an instance of WebSocket
|
|
context.update(request.scope["connection_params"])
|
|
else:
|
|
context["token"] = request.META.get("authorization")
|
|
|
|
return context
|