import re, datetime, os, urllib, json, django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'greaterwms.settings') os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" django.setup() from rest_framework.exceptions import APIException from staff.models import ListModel as staff CONECTINGS = {} async def websocket_application(scope, receive, send): while True: event = await receive() if event['type'] == 'websocket.connect': await send({'type': 'websocket.accept'}) query_string = scope.get('query_string', b'').decode() qs = urllib.parse.parse_qs(query_string) openid = qs.get('openid', [''])[0] sender = qs.get('sender', [''])[0] + '-' + openid CONECTINGS[sender] = send elif event['type'] == 'websocket.receive': query_string = scope.get('query_string', b'').decode() qs = urllib.parse.parse_qs(query_string) openid = qs.get('openid', [''])[0] sender = qs.get('sender', [''])[0] receiver = qs.get('receiver', [''])[0] if staff.objects.filter(openid=openid, staff_name=receiver).exists(): sender_guy = sender + '-' + openid receiver_guy = receiver + '-' + openid text = { "sender": sender, "receiver": receiver, "detail": str(event['text']), "create_time": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "update_time": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), } send = CONECTINGS[sender_guy] if receiver_guy in CONECTINGS: send = CONECTINGS[receiver_guy] await send({ 'type': 'websocket.send', 'text': str(text).replace('\'', '\"') }) else: raise APIException({"detail": "Can Not Send Message To Who Not Yours"}) elif event['type'] == 'websocket.disconnect': try: query_string = scope.get('query_string', b'').decode() qs = urllib.parse.parse_qs(query_string) openid = qs.get('openid', [''])[0] sender = qs.get('sender', [''])[0] + '-' + openid CONECTINGS.pop(sender) break except: break else: pass