actions.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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 { useApp } from '/@/hooks/userApp';
  5. import consola from 'consola';
  6. import { useSocket } from '/@/hooks/userSocket';
  7. import { useRoom, SceneItemType } 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. handleUserLeave(user, members);
  43. break;
  44. case 'users-muted':
  45. handleUserMuted(userId, muted, members);
  46. break;
  47. case 'users-words':
  48. handleUserSetWords(userId, words, members);
  49. break;
  50. case 'leader-dismiss':
  51. handleLeaderDismiss();
  52. break;
  53. case 'user-paint':
  54. handleUserPaint(open);
  55. break;
  56. case 'tagclick':
  57. break;
  58. case 'tagclose':
  59. break;
  60. case 'tag-image-index':
  61. handleTagImageIndex(data);
  62. break;
  63. case 'ask-currentscene':
  64. handleAskCurrentscene(data);
  65. break;
  66. case 'error':
  67. // Dialog.toast({ content: `房间未找到`, type: 'error' });
  68. handleError();
  69. default:
  70. break;
  71. }
  72. if (members?.length) {
  73. console.log('发烧的', members);
  74. }
  75. }
  76. //被动处理初始化
  77. async function handleUserInit() {
  78. const rtcStore = useRtcStore();
  79. if (rtcStore.role === 'leader') {
  80. const app = await useApp();
  81. app.Connect.follow.sync();
  82. // setTimeout(() => {
  83. // socket.value.emit("action", {
  84. // type: "leader-avatar",
  85. // data: { avatar: leaderAvatar.value },
  86. // });
  87. // if (tagclick.value && tagclick.value.type == "goodlist") {
  88. // socket.value.emit("action", {
  89. // type: "tagclick",
  90. // data: {
  91. // sid: tagclick.value.data.sid,
  92. // },
  93. // });
  94. // if (tagImageIndex.value != null) {
  95. // setTimeout(() => {
  96. // socket.value.emit("action", {
  97. // type: "tag-image-index",
  98. // data: {
  99. // index: tagImageIndex.value,
  100. // },
  101. // });
  102. // }, 200);
  103. // }
  104. // }
  105. // }, 200);
  106. }
  107. }
  108. // 被动处理弹幕
  109. function handleDanMumSg(data: ChatContentType) {
  110. const rtcStore = useRtcStore();
  111. if (data.role == 'leader') {
  112. data.Nickname = '主持人';
  113. }
  114. rtcStore.addToChatList(data);
  115. }
  116. // 其他用户进入
  117. function handleUserJoin(members?: UserInfoType[], user?: UserInfoType) {
  118. consola.info({
  119. tag: 'socket',
  120. message: '有人进来了',
  121. });
  122. const rtcStore = useRtcStore();
  123. // const { closeSocket } = useSocket();
  124. members && rtcStore.setMemberList(members);
  125. if (user) {
  126. let name = user.Nickname;
  127. if (user.Role === 'leader') {
  128. const { socket } = useSocket();
  129. name = '主持人';
  130. Dialog.toast({ content: `主持人进入房间` });
  131. socket.emit('action', { type: 'user-init' });
  132. }
  133. const data: ChatContentType = {
  134. role: user?.Role,
  135. mode: rtcStore.mode,
  136. Nickname: name,
  137. UserId: user?.UserId,
  138. text: '进入房间',
  139. };
  140. if (rtcStore.isLeader) {
  141. rtcStore.addToChatList(data);
  142. }
  143. }
  144. }
  145. // 其他用户开起画笔通知
  146. async function handleUserPaint(open: boolean | undefined) {
  147. const app = await useApp();
  148. const rtcStore = useRtcStore();
  149. if (!rtcStore.isLeader) {
  150. if (open) {
  151. console.log(open);
  152. app.Connect.paint.show({
  153. role: rtcStore.role,
  154. paint: false,
  155. });
  156. Dialog.toast({ content: `主持人开启画笔` });
  157. } else {
  158. Dialog.toast({ content: `主持人关闭画笔` });
  159. app.Connect.paint.hide();
  160. }
  161. }
  162. }
  163. const handleChangeScene = (data: SceneItemType) => {
  164. const { changeScene } = useRoom();
  165. changeScene(data);
  166. };
  167. //
  168. const handleAskCurrentscene = (data) => {
  169. console.log('data', data);
  170. };
  171. const handleTagImageIndex = (data) => {
  172. console.log('data', data);
  173. };
  174. const handleUserSetWords = (UserId?: string, words?: boolean, members?: UserInfoType[]) => {
  175. console.log('members', members);
  176. const rtcStore = useRtcStore();
  177. console.log('handleUserSetWords', UserId, words);
  178. UserId &&
  179. rtcStore.updateMemberDatabyId(UserId, {
  180. IsWords: words,
  181. });
  182. if (UserId == rtcStore.userId) {
  183. Dialog.toast({
  184. content: !words ? `主持人设置了禁言` : `主持人已解除禁言`,
  185. });
  186. }
  187. };
  188. const handleUserMuted = (UserId?: string, muted?: boolean, members?: UserInfoType[]) => {
  189. const rtcStore = useRtcStore();
  190. console.log('members', members);
  191. console.log('handleUserSetWords', UserId, muted);
  192. UserId &&
  193. rtcStore.updateMemberDatabyId(UserId, {
  194. IsMuted: muted,
  195. });
  196. if (UserId == rtcStore.userId) {
  197. rtcStore.setMute(!!muted);
  198. }
  199. };
  200. //被动处理用离开
  201. const handleUserLeave = (user?: UserInfoType, members?: UserInfoType[]) => {
  202. console.log('有人离开了', user?.UserId);
  203. const rtcStore = useRtcStore();
  204. if (user) {
  205. let name = user.Nickname;
  206. if (user.Role == 'leader') {
  207. name = '主持人';
  208. Dialog.toast({ content: `主持人离开了房间` });
  209. }
  210. const data = {
  211. role: user.Role,
  212. mode: '',
  213. Nickname: name,
  214. UserId: user.UserId,
  215. text: '离开房间',
  216. };
  217. console.log('members', user, members);
  218. rtcStore.addToChatList(data);
  219. members && rtcStore.setMemberList(members);
  220. }
  221. };
  222. //被动处理用离开 全员解散
  223. const handleLeaderDismiss = () => {
  224. const { closeSocket } = useSocket();
  225. Dialog.toast({ content: `主持人已解散房间` });
  226. closeSocket();
  227. };
  228. //
  229. const handleError = () => {
  230. const rtcStore = useRtcStore();
  231. rtcStore.showBaseDialog(
  232. {
  233. title: '温馨提示',
  234. desc: '带看已结束',
  235. okTxt: '确定',
  236. closeTxt: '取消',
  237. },
  238. () => {
  239. const { closeSocket } = useSocket();
  240. closeSocket();
  241. },
  242. );
  243. }