Guest User

Untitled

a guest
Jan 25th, 2022
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.71 KB | None | 0 0
  1. import json
  2. import pprint
  3.  
  4. from asgiref.sync import sync_to_async
  5. from channels.exceptions import StopConsumer
  6. from channels.generic.websocket import AsyncWebsocketConsumer
  7. from django.utils.encoding import force_bytes
  8. from django.utils.http import urlsafe_base64_encode
  9. from django.template.loader import render_to_string
  10. from .tokens import account_activation_token
  11. from django.contrib.auth.models import User
  12. from django.core.mail import EmailMessage
  13.  
  14. roomsDict = {}
  15. usersInRoom = {}
  16. usersChannels = {}
  17. objectsInRoom = {}
  18. kickedRoom = {}
  19.  
  20. pp = pprint.PrettyPrinter(indent=4)
  21.  
  22.  
  23. # получить всех пользователей
  24. @sync_to_async
  25. def get_all_users():
  26. return list(User.objects.all())
  27.  
  28.  
  29. # получить профиль
  30. @sync_to_async
  31. def get_profile(user):
  32. return user.profile
  33.  
  34.  
  35. # заполнить кандидата
  36. @sync_to_async
  37. def fill_candidate(profile, hash_ice):
  38. profile.ice_candidates_temp = hash_ice
  39. return profile
  40.  
  41.  
  42. # сохранить профиль
  43. @sync_to_async
  44. def save_profile(profile):
  45. profile.save()
  46. return profile
  47.  
  48.  
  49. # класс потребителя
  50. class ChatConsumer(AsyncWebsocketConsumer):
  51. async def connect(self): # функция соединения
  52. self.room_group_name = 'Test-Room'
  53. await self.channel_layer.group_add(
  54. self.room_group_name,
  55. self.channel_name
  56. )
  57. self.user = self.scope["user"]
  58. print(self.user)
  59. self.user_room_name = "notif_room_for_user_"+str(self.user) ##Notification room name
  60. await self.channel_layer.group_add(
  61. self.user_room_name,
  62. self.channel_name
  63. )
  64.  
  65. print(self.channel_layer, dir(self.channel_layer), self.channel_layer.groups)
  66.  
  67.  
  68.  
  69. await self.accept()
  70.  
  71. async def disconnect(self, close_code): # функция отключения
  72. await self.channel_layer.group_discard(
  73. self.room_group_name,
  74. self.channel_name
  75. )
  76. try:
  77. user = usersChannels[self.channel_name]
  78. for usersList in usersInRoom.values(): # удаление пользователей из списков
  79. if user in usersList:
  80. usersList.remove(user)
  81. if user + "_roomadmin" in usersList:
  82. usersList.remove(user + "_roomadmin")
  83. except KeyError:
  84. print(KeyError)
  85.  
  86. for key, value in list(usersInRoom.items()): # удаление комнат
  87. if len(value) == 0:
  88. usersInRoom.pop(key)
  89.  
  90. for objectsList in objectsInRoom.values(): # удаление объектов
  91. if self in objectsList:
  92. objectsList.remove(self)
  93.  
  94. for key, value in list(objectsInRoom.items()): # удаление комнат
  95. if len(value) == 0:
  96. objectsInRoom.pop(key)
  97.  
  98. raise StopConsumer()
  99.  
  100. async def receive(self, text_data): # функция получения сигнала
  101. receive_dict = json.loads(text_data) # полученные данные
  102. message = receive_dict['message'] # сообщение
  103. action = receive_dict['action'] # действие
  104. room = receive_dict['room'] # комната
  105. username = "test"
  106. try:
  107. roompass = receive_dict['roomPass'] # пароль от комнаты
  108. username = receive_dict['peer'] # имя пользователя
  109. except KeyError:
  110. pass
  111.  
  112. print(self.channel_layer, self.channel_layer.groups)
  113.  
  114.  
  115. print(receive_dict)
  116.  
  117. # if action == 'new-answer' or action == 'new-offer': # защита по ICE
  118. # all_users = await get_all_users()
  119. # profile = ""
  120. # for i in all_users:
  121. # if username == i.username:
  122. # user = i
  123. # profile = await get_profile(i)
  124. # sdp = message['sdp']['sdp'].split('\n')
  125. # sdp_list = []
  126. # d = 0
  127. # for i in sdp:
  128. # if 'a=candidate' in i:
  129. # i = i.split()
  130. # i = i[:4]
  131. # i = "".join(i)
  132. # sdp_list.append(i)
  133. # d += 1
  134. # if d == 3:
  135. # break
  136. # sdp_list = tuple(sdp_list)
  137. # sdp_list = hash(sdp_list)
  138. # profile = await fill_candidate(profile, sdp_list)
  139. # profile = await save_profile(profile)
  140. # if str(sdp_list) != profile.ice_candidates: # если кандидаты не равны
  141. # if profile.first_ice: # если зашли впервые
  142. # profile.first_ice = False
  143. # profile = await save_profile(profile)
  144. # else: # отправить письмо с проверкой
  145. # receiver_channel_name = receive_dict['message']['receiver_channel_name']
  146. # await self.channel_layer.send(
  147. # list(usersChannels.keys())[list(usersChannels.values()).index(username)],
  148. # {
  149. # 'type': 'channel_message',
  150. # 'action': 'wrong_ice',
  151. # 'room': 'room',
  152. # 'message': {username: '1'},
  153. # }
  154. # )
  155. # current_site = self.scope['headers'][0][1].decode()
  156. # mail_subject = 'Обновите ваши данные.'
  157. # message = render_to_string('chat/acc_active_ice.html', {
  158. # 'user': user,
  159. # 'domain': current_site,
  160. # 'uid': urlsafe_base64_encode(force_bytes(user.pk)),
  161. # 'token': account_activation_token.make_token(user),
  162. # })
  163. # to_email = user.email
  164. # email = EmailMessage(
  165. # mail_subject, message, to=[to_email]
  166. # )
  167. # email.content_subtype = 'html'
  168. # email.send()
  169. # return
  170. print('1')
  171. if action != 'disconnect':
  172. try: # проверка пользователя на исключение
  173. if kickedRoom[room]:
  174. for i in kickedRoom[room]:
  175. if i in usersInRoom[room]:
  176. return
  177. except KeyError:
  178. print(KeyError)
  179.  
  180.  
  181.  
  182.  
  183. if room not in [a for a in roomsDict.keys()]: # словарь комнат с паролями
  184. if action != 'check-room' and action != 'check-admin' and action != 'onhold':
  185. roomsDict[room] = roompass
  186.  
  187. print(roomsDict)
  188.  
  189. if action == 'kick': # при исключении
  190. username = message['peer']
  191. try:
  192. kickedRoom[room].append(username)
  193. except KeyError:
  194. kickedRoom[room] = [username]
  195.  
  196. await self.channel_layer.send(
  197. list(usersChannels.keys())[list(usersChannels.values()).index(message['peer'])],
  198. {
  199. "type": 'channel_message',
  200. 'action': 'kick',
  201. 'room': room,
  202. 'message': {username: '1'}
  203. }
  204. )
  205.  
  206. print('2')
  207.  
  208. if action == 'pass': # при передаче прав админа пользователю
  209. curadmin = username
  210. newadmin = message['peer']
  211. newadminind = usersInRoom[room].index(newadmin)
  212. usersInRoom[room].append(newadmin + "_roomadmin")
  213. del usersInRoom[room][newadminind]
  214. usersInRoom[room].append(curadmin)
  215. oldadminind = usersInRoom[room].index(curadmin + "_roomadmin")
  216. del usersInRoom[room][oldadminind]
  217. await self.channel_layer.group_send(
  218. self.room_group_name,
  219. {
  220. 'type': 'channel_message',
  221. 'action': 'pass-admin',
  222. 'room': room,
  223. 'message': newadmin,
  224. }
  225. )
  226. return
  227.  
  228.  
  229.  
  230. if action == 'check-room': # при проверке комнаты
  231. receive_dict['message']['receiver_channel_name'] = self.channel_name
  232. print(self.channel_layer.channels)
  233. if room in [a for a in roomsDict.keys()]:
  234. await self.channel_layer.group_send(
  235. self.user_room_name,
  236. {
  237. 'type': 'channel_message',
  238. 'action': 'check-room',
  239. 'room': room,
  240. 'message': '1'
  241. }
  242. )
  243. return
  244. else:
  245. await self.channel_layer.group_send(
  246. self.user_room_name,
  247. {
  248. 'type': 'channel_message',
  249. 'action': 'check-room',
  250. 'room': room,
  251. 'message': '0'
  252. }
  253. )
  254. return
  255.  
  256. # if action == 'check-room': # при проверке комнаты
  257. # receive_dict['message']['receiver_channel_name'] = self.channel_name
  258. # print(self.channel_layer.channels)
  259. # if room in [a for a in roomsDict.keys()]:
  260. # await self.channel_layer.send(
  261. # self.channel_name,
  262. # {
  263. # 'type': 'channel_message',
  264. # 'action': 'check-room',
  265. # 'room': room,
  266. # 'message': '1'
  267. # }
  268. # )
  269. # return
  270. # else:
  271. # await self.channel_layer.send(
  272. # self.channel_name,
  273. # {
  274. # 'type': 'channel_message',
  275. # 'action': 'check-room',
  276. # 'room': room,
  277. # 'message': '0'
  278. # }
  279. # )
  280. # return
  281. print('3')
  282.  
  283. if action == 'check-admin': # проверка на администратора
  284. try:
  285. if usersInRoom[room]:
  286. users = usersInRoom[room]
  287. for user in users:
  288. if "_roomadmin" in user:
  289. try:
  290. if self in objectsInRoom[room]:
  291. await self.channel_layer.group_send(
  292. self.room_group_name,
  293. {
  294. 'type': 'channel_message',
  295. 'action': 'check-admin',
  296. 'room': room,
  297. 'message': [user[:-10], '1'],
  298. }
  299. )
  300. return
  301. else:
  302. if self in objectsInRoom[room]:
  303. for i in objectsInRoom[room]:
  304. if i != self:
  305. await i.channel_layer.group_send(
  306. i.room_group_name,
  307. {
  308. 'type': 'channel_message',
  309. 'action': 'check-admin',
  310. 'room': room,
  311. 'message': [user[:-10], '1'],
  312. }
  313. )
  314. return
  315. except KeyError:
  316. pass
  317. except KeyError:
  318. pass
  319.  
  320. try: # добавляем пользователя в usersChannels
  321. if list(usersChannels.keys())[list(usersChannels.values()).index(username)]:
  322. pass
  323. except ValueError:
  324. usersChannels[self.channel_name] = username
  325. print(3.5)
  326.  
  327. if action == "check-pass": # проверка пароля
  328. if room in [a for a in roomsDict.keys()]:
  329. if roompass == roomsDict[room]:
  330. if self.room_group_name != room:
  331. print(3.6)
  332. await self.channel_layer.group_discard(
  333. self.room_group_name,
  334. self.channel_name
  335. )
  336. self.room_group_name = room
  337. await self.channel_layer.group_add(
  338. self.room_group_name,
  339. self.channel_name
  340.  
  341. )
  342. self.room_group_name = room
  343. peer = receive_dict['peer']
  344. print(3.7)
  345. if room in [a for a in roomsDict.keys()]:
  346. if roompass != roomsDict[room]:
  347. await self.channel_layer.send(
  348. list(usersChannels.keys())[list(usersChannels.values()).index(peer)],
  349. {
  350. 'type': 'channel.message',
  351. 'action': 'check-pass',
  352. 'room': room,
  353. 'message': '0'
  354. }
  355. )
  356. return
  357. else:
  358. print(3.8)
  359. print(list(usersChannels.keys())[list(usersChannels.values()).index(peer)])
  360. await self.channel_layer.send(
  361. list(usersChannels.keys())[list(usersChannels.values()).index(peer)],
  362. {
  363. 'type': 'channel.message',
  364. 'action': 'check-pass',
  365. 'room': room,
  366. 'message': [roompass, '1'],
  367. }
  368. )
  369. print(3.9)
  370.  
  371. return
  372. print('4')
  373.  
  374. if action == 'new-offer' or action == 'new-answer': # новое предложение / новый ответ
  375. try:
  376. if kickedRoom[room]:
  377. for i in kickedRoom[room]:
  378. if i in usersInRoom[room]:
  379. return
  380. else:
  381. receiver_channel_name = receive_dict['message']['receiver_channel_name']
  382. receive_dict['message']['receiver_channel_name'] = self.channel_name
  383. await self.channel_layer.send(
  384. receiver_channel_name,
  385. {
  386. 'type': 'send.sdp',
  387. 'receive_dict': receive_dict
  388. }
  389. )
  390. return
  391. except KeyError:
  392. receiver_channel_name = receive_dict['message']['receiver_channel_name']
  393. receive_dict['message']['receiver_channel_name'] = self.channel_name
  394. await self.channel_layer.send(
  395. receiver_channel_name,
  396. {
  397. 'type': 'send.sdp',
  398. 'receive_dict': receive_dict
  399. }
  400. )
  401. return
  402.  
  403. receive_dict['message']['receiver_channel_name'] = self.channel_name
  404. if action != 'check-admin' and action != "onhold" and action != "kick" and action != "pass": # обмен SDP
  405. await self.channel_layer.group_send(
  406. self.room_group_name,
  407. {
  408. 'type': 'send.sdp',
  409. 'receive_dict': receive_dict
  410. }
  411. )
  412.  
  413. if action == 'onhold': # поставили на удержание
  414. print(list(usersChannels.keys())[list(usersChannels.values()).index(message['peer'])])
  415. await self.channel_layer.send(
  416. list(usersChannels.keys())[list(usersChannels.values()).index(message['peer'])],
  417. {
  418. 'type': 'channel_message',
  419. 'action': 'onhold',
  420. 'room': 'room',
  421. 'message': {message['peer']: '1'},
  422. }
  423. )
  424. return
  425.  
  426. # if action == 'unhold': # убрали с удержания
  427. # print("UNHOLD!!!!")
  428. # print(dir(self.channel_layer), self.channel_layer.groups)
  429. # print(self.channel_layer, self.channel_name, self.channel_layer.channels, list(usersChannels.keys())[list(usersChannels.values()).index(message['peer'])])
  430. # print(self.channel_layer.groups["notif_room_for_user_"+message['peer']])
  431. # await self.channel_layer.group_send(
  432. # "notif_room_for_user_"+message['peer'],
  433. # {
  434. # 'type': 'channel_message',
  435. # 'action': 'unhold',
  436. # 'room': 'room',
  437. # 'message': {message['peer']: '1'},
  438. # }
  439. # )
  440. # return
  441.  
  442. if action == 'unhold': # убрали с удержания
  443. print("UNHOLD!!!!")
  444. print(list(usersChannels.keys())[list(usersChannels.values()).index(message['peer'])])
  445. print(dir(self.channel_layer))
  446. print(self.channel_layer, self.channel_name, self.channel_layer.channels, list(usersChannels.keys())[list(usersChannels.values()).index(message['peer'])])
  447. await self.channel_layer.send(
  448. list(usersChannels.keys())[list(usersChannels.values()).index(message['peer'])],
  449. {
  450. 'type': 'channel_message',
  451. 'action': 'unhold',
  452. 'room': 'room',
  453. 'message': {message['peer']: '1'},
  454. }
  455. )
  456. return
  457. print('5')
  458.  
  459. if action != 'check-admin': # добавление объектов в комнату
  460. if objectsInRoom.get(room) is None:
  461. objectsInRoom[room] = objectsInRoom.get(room, []) + [self]
  462. else:
  463. if self not in objectsInRoom.get(room, []):
  464. objectsInRoom[room] = objectsInRoom.get(room, []) + [self]
  465.  
  466. if action != 'disconnect' and action != 'check-admin': # добавление пользователей в комнату
  467. if usersInRoom.get(room) is None:
  468. usersInRoom[room] = usersInRoom.get(room, []) + [username + "_roomadmin"]
  469. else:
  470. if username not in usersInRoom.get(room, []) and username + "_roomadmin" not in usersInRoom.get(room, []):
  471. usersInRoom[room] = usersInRoom.get(room, []) + [username]
  472.  
  473. if action == 'disconnect': # отключение пользователя
  474. try:
  475. for roomUser in usersInRoom[room]:
  476. if username + "_roomadmin" == roomUser:
  477. usersInRoom.get(room).remove(username + '_roomadmin')
  478. if len(usersInRoom.get(room)) > 0:
  479. firstuser = usersInRoom.get(room)[0]
  480. firstuser = firstuser + '_roomadmin'
  481. usersInRoom.get(room).pop(0)
  482. usersInRoom.get(room).append(firstuser)
  483. if len(usersInRoom.get(room)) == 0:
  484. usersInRoom.pop(room, None)
  485. roomsDict.pop(room, None)
  486. print("Комната удалена")
  487. kickedRoom.pop(room, None)
  488. if username == roomUser:
  489. usersInRoom.get(room).remove(username)
  490. if len(usersInRoom.get(room)) == 0:
  491. usersInRoom.pop(room, None)
  492. roomsDict.pop(room, None)
  493. print("Комната удалена")
  494. kickedRoom.pop(room, None)
  495.  
  496. if self in objectsInRoom[room]:
  497. objectsInRoom.get(room).remove(self)
  498.  
  499. if len(objectsInRoom.get(room)) == 0:
  500. objectsInRoom.pop(room, None)
  501.  
  502. await self.channel_layer.group_discard(
  503. self.room_group_name,
  504. self.channel_name
  505. )
  506.  
  507. self.room_group_name = 'Test-Room'
  508.  
  509. await self.channel_layer.group_add(
  510. self.room_group_name,
  511. self.channel_name
  512. )
  513.  
  514. await self.channel_layer.send(
  515. self.channel_name,
  516. {
  517. 'type': 'channel_message',
  518. 'action': 'disconnect',
  519. 'room': 'room',
  520. 'message': {username: '1'},
  521. }
  522. )
  523. return
  524. except KeyError:
  525. print("В комнате никого нет")
  526. usersInRoom.pop(room, None)
  527. roomsDict.pop(room, None)
  528. kickedRoom.pop(room, None)
  529. print('6')
  530.  
  531. async def send_sdp(self, event): # отправка SDP
  532. receive_dict = event['receive_dict']
  533. await self.send(text_data=json.dumps(receive_dict))
  534.  
  535. async def channel_message(self, event): # канальное сообщение
  536. print("Канальное сообщение", event)
  537. message = event['message']
  538. action = event['action']
  539. room = event['room']
  540.  
  541. await self.send(text_data=json.dumps({
  542. 'message': message,
  543. 'action': action,
  544. 'room': room,
  545. }))
Add Comment
Please, Sign In to add comment