core/services/inbox/presence.py

47 lines
1.3 KiB
Python
Raw Normal View History

2023-01-10 08:15:28 +00:00
# from base.exceptions import Unauthorized
2022-12-04 14:03:55 +00:00
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)
2022-12-12 06:50:53 +00:00
async def on_connect(req, params):
2022-12-04 14:03:55 +00:00
if not isinstance(params, dict):
2022-12-12 06:50:53 +00:00
req.scope["connection_params"] = {}
2022-12-04 14:03:55 +00:00
return
token = params.get('token')
if not token:
2023-01-10 08:15:28 +00:00
# raise Unauthorized("Please login")
return {
"error": "Please login first"
}
2022-12-04 14:03:55 +00:00
else:
payload = await SessionToken.verify(token)
if payload and payload.user_id:
2022-12-12 06:50:53 +00:00
req.scope["user_id"] = payload.user_id
2022-12-04 14:03:55 +00:00
await set_online_status(payload.user_id, True)
2022-12-12 06:50:53 +00:00
async def on_disconnect(req):
user_id = req.scope.get("user_id")
2022-12-04 14:03:55 +00:00
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