actions.ts 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import { useRtcStore } from '/@/store/modules/rtc';
  2. import type { ChatContentType, UserInfoType } from '/@/store/modules/rtc';
  3. import Dialog from '/@/components/basic/dialog';
  4. import { getApp, useApp } from '/@/hooks/userApp';
  5. import consola from 'consola';
  6. import { useSocket } from '/@/hooks/userSocket';
  7. import { useRoom } from '/@/hooks/useRoom';
  8. interface ActionDataType {
  9. type: string;
  10. data: any;
  11. members?: UserInfoType[];
  12. open?: boolean;
  13. user?: UserInfoType;
  14. userId?: string;
  15. words?: boolean;
  16. muted?: boolean;
  17. }
  18. export function handleActions({
  19. data,
  20. type,
  21. members,
  22. open,
  23. user,
  24. userId,
  25. words,
  26. muted,
  27. }: ActionDataType) {
  28. switch (type) {
  29. case 'user-init':
  30. handleUserInit();
  31. break;
  32. case 'danmumsg':
  33. handleDanMumSg(data);
  34. break;
  35. case 'changeScene':
  36. handleChangeScene(data);
  37. break;
  38. case 'user-join':
  39. handleUserJoin(members, user);
  40. break;
  41. case 'user-leave':
  42. break;
  43. case 'users-muted':
  44. handleUserMuted(userId, muted, members);
  45. break;
  46. case 'users-words':
  47. handleUserSetWords(userId, words, members);
  48. break;
  49. case 'leader-dismiss':
  50. handleUserLeave(user, members);
  51. break;
  52. case 'user-paint':
  53. handleUserPaint(open);
  54. break;
  55. case 'tagclick':
  56. break;
  57. case 'tagclose':
  58. break;
  59. case 'tag-image-index':
  60. handleTagImageIndex(data);
  61. break;
  62. case 'ask-currentscene':
  63. handleAskCurrentscene(data);
  64. break;
  65. case 'error':
  66. Dialog.toast({ content: `房间未找到`, type: 'error' });
  67. default:
  68. break;
  69. }
  70. if (members?.length) {
  71. console.log('发烧的', members);
  72. }
  73. }
  74. //被动处理初始化
  75. async function handleUserInit() {
  76. const rtcStore = useRtcStore();
  77. if (rtcStore.role === 'leader') {
  78. const app = await useApp();
  79. app.Connect.follow.sync();
  80. // setTimeout(() => {
  81. // socket.value.emit("action", {
  82. // type: "leader-avatar",
  83. // data: { avatar: leaderAvatar.value },
  84. // });
  85. // if (tagclick.value && tagclick.value.type == "goodlist") {
  86. // socket.value.emit("action", {
  87. // type: "tagclick",
  88. // data: {
  89. // sid: tagclick.value.data.sid,
  90. // },
  91. // });
  92. // if (tagImageIndex.value != null) {
  93. // setTimeout(() => {
  94. // socket.value.emit("action", {
  95. // type: "tag-image-index",
  96. // data: {
  97. // index: tagImageIndex.value,
  98. // },
  99. // });
  100. // }, 200);
  101. // }
  102. // }
  103. // }, 200);
  104. }
  105. }
  106. // 被动处理弹幕
  107. function handleDanMumSg(data: ChatContentType) {
  108. const rtcStore = useRtcStore();
  109. if (data.role == 'leader') {
  110. data.Nickname = '主持人';
  111. }
  112. rtcStore.addToChatList(data);
  113. }
  114. // 其他用户进入
  115. function handleUserJoin(members?: UserInfoType[], user?: UserInfoType) {
  116. consola.info({
  117. tag: 'socket',
  118. message: '有人进来了',
  119. });
  120. const rtcStore = useRtcStore();
  121. members && rtcStore.setMemberList(members);
  122. if (user) {
  123. let name = user.Nickname;
  124. if (user.Role === 'leader') {
  125. const { socket } = useSocket();
  126. name = '主持人';
  127. Dialog.toast({ content: `主持人进入房间` });
  128. socket.emit('action', { type: 'user-init' });
  129. }
  130. const data: ChatContentType = {
  131. role: user?.Role,
  132. mode: rtcStore.mode,
  133. Nickname: name,
  134. UserId: user?.UserId,
  135. text: '进入房间',
  136. };
  137. if (rtcStore.isLeader) {
  138. rtcStore.addToChatList(data);
  139. }
  140. }
  141. }
  142. // 其他用户开起画笔通知
  143. async function handleUserPaint(open: boolean | undefined) {
  144. const app = await useApp();
  145. const rtcStore = useRtcStore();
  146. if (!rtcStore.isLeader) {
  147. if (open) {
  148. console.log(open);
  149. app.Connect.paint.show({
  150. role: rtcStore.role,
  151. paint: false,
  152. });
  153. Dialog.toast({ content: `主持人开启画笔` });
  154. } else {
  155. Dialog.toast({ content: `主持人关闭画笔` });
  156. app.Connect.paint.hide();
  157. }
  158. }
  159. }
  160. const handleChangeScene = (data) => {
  161. const { changeScene } = useRoom();
  162. // debugger
  163. changeScene(data);
  164. };
  165. //
  166. const handleAskCurrentscene = (data) => {};
  167. const handleTagImageIndex = (data) => {};
  168. const handleUserSetWords = (UserId?: string, words?: boolean, members?: UserInfoType[]) => {
  169. const rtcStore = useRtcStore();
  170. console.log('handleUserSetWords', UserId, words);
  171. UserId &&
  172. rtcStore.updateMemberDatabyId(UserId, {
  173. IsWords: words,
  174. });
  175. if (UserId == rtcStore.userId) {
  176. Dialog.toast({
  177. content: !words ? `主持人设置了禁言` : `主持人已解除禁言`,
  178. });
  179. }
  180. };
  181. const handleUserMuted = (UserId?: string, muted?: boolean, members?: UserInfoType[]) => {
  182. const rtcStore = useRtcStore();
  183. console.log('handleUserSetWords', UserId, muted);
  184. UserId &&
  185. rtcStore.updateMemberDatabyId(UserId, {
  186. IsMuted: muted,
  187. });
  188. if (UserId == rtcStore.userId) {
  189. rtcStore.setMute(!!muted);
  190. }
  191. };
  192. //被动处理用离开
  193. const handleUserLeave = (user, members) => {};