91 lines
3.4 KiB
Python
91 lines
3.4 KiB
Python
![]() |
# -*- coding: utf-8 -*-
|
||
|
import urllib
|
||
|
|
||
|
from asgiref.sync import sync_to_async
|
||
|
from channels.db import database_sync_to_async
|
||
|
from channels.generic.websocket import AsyncJsonWebsocketConsumer, AsyncWebsocketConsumer
|
||
|
import json
|
||
|
|
||
|
from jwt import InvalidSignatureError
|
||
|
|
||
|
from application import settings
|
||
|
from dvadmin.system.models import MessageCenter
|
||
|
|
||
|
send_dict = {}
|
||
|
|
||
|
# 发送消息结构体
|
||
|
def message(sender, msg_type, msg):
|
||
|
text = {
|
||
|
'sender': sender,
|
||
|
'contentType': msg_type,
|
||
|
'content': msg,
|
||
|
}
|
||
|
return text
|
||
|
|
||
|
#异步获取消息中心的目标用户
|
||
|
@database_sync_to_async
|
||
|
def _get_message_center_instance(message_id):
|
||
|
_MessageCenter = MessageCenter.objects.filter(id=message_id).values_list('target_user',flat=True)
|
||
|
if _MessageCenter:
|
||
|
return _MessageCenter
|
||
|
else:
|
||
|
return []
|
||
|
|
||
|
|
||
|
def request_data(scope):
|
||
|
query_string = scope.get('query_string', b'').decode('utf-8')
|
||
|
qs = urllib.parse.parse_qs(query_string)
|
||
|
return qs
|
||
|
|
||
|
class DvadminWebSocket(AsyncJsonWebsocketConsumer):
|
||
|
async def connect(self):
|
||
|
try:
|
||
|
import jwt
|
||
|
self.service_uid = self.scope["url_route"]["kwargs"]["service_uid"]
|
||
|
params = request_data(self.scope)
|
||
|
room = params.get('room')[0]
|
||
|
decoded_result = jwt.decode(self.service_uid, settings.SECRET_KEY, algorithms=["HS256"])
|
||
|
if decoded_result:
|
||
|
self.user_id = decoded_result.get('user_id')
|
||
|
self.chat_group_name = room
|
||
|
#收到连接时候处理,
|
||
|
await self.channel_layer.group_add(
|
||
|
self.chat_group_name,
|
||
|
self.channel_name
|
||
|
)
|
||
|
# 将该客户端的信息发送函数与客户端的唯一身份标识绑定,保存至自定义的字典中
|
||
|
if len(send_dict)==0:
|
||
|
send_dict.setdefault(self.chat_group_name, {})
|
||
|
for room in send_dict.keys():
|
||
|
if room == self.chat_group_name:
|
||
|
send_dict[self.chat_group_name][self.user_id] = self.send
|
||
|
else:
|
||
|
send_dict.setdefault(self.chat_group_name,{})
|
||
|
await self.accept()
|
||
|
await self.send_json(message('system', 'INFO', '连接成功'))
|
||
|
except InvalidSignatureError:
|
||
|
await self.disconnect(None)
|
||
|
|
||
|
|
||
|
async def disconnect(self, close_code):
|
||
|
# 删除 send_dict 中对应的信息
|
||
|
del send_dict[self.chat_group_name][self.user_id]
|
||
|
# Leave room group
|
||
|
await self.channel_layer.group_discard(self.chat_group_name, self.channel_name)
|
||
|
print("连接关闭")
|
||
|
await self.close(close_code)
|
||
|
|
||
|
async def receive(self, text_data=None, byte_text_data=None):
|
||
|
print(text_data)
|
||
|
try:
|
||
|
text_data_json = json.loads(text_data)
|
||
|
except Exception as e:
|
||
|
print('数据无法被json格式化', e)
|
||
|
await self.disconnect(400)
|
||
|
else:
|
||
|
print(123,text_data_json)
|
||
|
# 获取将要推送信息的目标身份标识,调用保存在 send_dict中的信息发送函数
|
||
|
message_id = text_data_json.get('message_id', None)
|
||
|
user_list = await _get_message_center_instance(message_id)
|
||
|
for send_user in user_list:
|
||
|
await send_dict[self.chat_group_name][send_user](text_data=json.dumps(text_data_json))
|