actions.ts 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  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. import { useI18n } from '/@/hooks/useI18n';
  9. interface ActionDataType {
  10. type: string;
  11. data: any;
  12. members?: UserInfoType[];
  13. open?: boolean;
  14. user?: UserInfoType;
  15. userId?: string;
  16. words?: boolean;
  17. muted?: boolean;
  18. }
  19. export function handleActions({
  20. data,
  21. type,
  22. members,
  23. open,
  24. user,
  25. userId,
  26. words,
  27. muted,
  28. }: ActionDataType) {
  29. switch (type) {
  30. case 'user-init':
  31. handleUserInit();
  32. break;
  33. case 'danmumsg':
  34. handleDanMumSg(data);
  35. break;
  36. case 'changeScene':
  37. handleChangeScene(data);
  38. break;
  39. case 'user-join':
  40. handleUserJoin(members, user);
  41. break;
  42. case 'user-leave':
  43. handleUserLeave(user, members);
  44. break;
  45. case 'users-muted':
  46. handleUserMuted(userId, muted, members);
  47. break;
  48. case 'users-words':
  49. handleUserSetWords(userId, words, members);
  50. break;
  51. case 'leader-dismiss':
  52. handleLeaderDismiss();
  53. break;
  54. case 'user-paint':
  55. handleUserPaint(open);
  56. break;
  57. case 'tagclick':
  58. break;
  59. case 'tagclose':
  60. break;
  61. case 'tag-image-index':
  62. handleTagImageIndex(data);
  63. break;
  64. case 'ask-currentscene':
  65. handleAskCurrentscene(data);
  66. break;
  67. case 'error':
  68. // Dialog.toast({ content: `房间未找到`, type: 'error' });
  69. handleError();
  70. default:
  71. break;
  72. }
  73. if (members?.length) {
  74. console.log('发烧的', members);
  75. }
  76. }
  77. //被动处理初始化
  78. async function handleUserInit() {
  79. const rtcStore = useRtcStore();
  80. if (rtcStore.role === 'leader') {
  81. const app = await useApp();
  82. app.Connect.follow.sync();
  83. // setTimeout(() => {
  84. // socket.value.emit("action", {
  85. // type: "leader-avatar",
  86. // data: { avatar: leaderAvatar.value },
  87. // });
  88. // if (tagclick.value && tagclick.value.type == "goodlist") {
  89. // socket.value.emit("action", {
  90. // type: "tagclick",
  91. // data: {
  92. // sid: tagclick.value.data.sid,
  93. // },
  94. // });
  95. // if (tagImageIndex.value != null) {
  96. // setTimeout(() => {
  97. // socket.value.emit("action", {
  98. // type: "tag-image-index",
  99. // data: {
  100. // index: tagImageIndex.value,
  101. // },
  102. // });
  103. // }, 200);
  104. // }
  105. // }
  106. // }, 200);
  107. }
  108. }
  109. // 被动处理弹幕
  110. function handleDanMumSg(data: ChatContentType) {
  111. const { t } = useI18n();
  112. const rtcStore = useRtcStore();
  113. if (data.role == 'leader') {
  114. data.Nickname = t('action.hoster');
  115. }
  116. rtcStore.addToChatList(data);
  117. }
  118. // 其他用户进入
  119. function handleUserJoin(members?: UserInfoType[], user?: UserInfoType) {
  120. const { t } = useI18n();
  121. consola.info({
  122. tag: 'socket',
  123. message: '有人进来了',
  124. });
  125. const rtcStore = useRtcStore();
  126. // const { closeSocket } = useSocket();
  127. members && rtcStore.setMemberList(members);
  128. const isMaxAlert = rtcStore.memberList.length > Number(import.meta.env.VITE_ROOM_MEMBER);
  129. if (user && !isMaxAlert) {
  130. let name = user.Nickname;
  131. if (user.Role === 'leader') {
  132. const { socket } = useSocket();
  133. name = t('action.hoster');
  134. Dialog.toast({ content: t('action.hosterEnterRoom') });
  135. socket.emit('action', { type: 'user-init' });
  136. }
  137. const data: ChatContentType = {
  138. role: user?.Role,
  139. mode: rtcStore.mode,
  140. Nickname: name,
  141. UserId: user?.UserId,
  142. text: t('action.enterRoom'),
  143. };
  144. if (rtcStore.isLeader) {
  145. rtcStore.addToChatList(data);
  146. }
  147. }
  148. }
  149. // 其他用户开起画笔通知
  150. async function handleUserPaint(open: boolean | undefined) {
  151. const { t } = useI18n();
  152. const app = await useApp();
  153. const rtcStore = useRtcStore();
  154. if (!rtcStore.isLeader) {
  155. if (open) {
  156. console.log(open);
  157. app.Connect.paint.show({
  158. role: rtcStore.role,
  159. paint: false,
  160. });
  161. Dialog.toast({ content: t('action.hosterOpenDraw') });
  162. } else {
  163. Dialog.toast({ content: t('action.hosterCloseDraw') });
  164. app.Connect.paint.hide();
  165. }
  166. }
  167. }
  168. const handleChangeScene = (data: SceneItemType) => {
  169. const { changeScene } = useRoom();
  170. console.log('handleChangeScene', data);
  171. data && changeScene(data);
  172. };
  173. //
  174. const handleAskCurrentscene = (data) => {
  175. console.log('data', data);
  176. };
  177. const handleTagImageIndex = (data) => {
  178. console.log('data', data);
  179. };
  180. const handleUserSetWords = (UserId?: string, words?: boolean, members?: UserInfoType[]) => {
  181. console.log('members', members);
  182. const { t } = useI18n();
  183. const rtcStore = useRtcStore();
  184. console.log('handleUserSetWords', UserId, words);
  185. UserId &&
  186. rtcStore.updateMemberDatabyId(UserId, {
  187. IsWords: words,
  188. });
  189. if (UserId == rtcStore.userId) {
  190. Dialog.toast({
  191. content: !words ? t('action.hostBanInput') : t('action.hostAllowInput'),
  192. });
  193. }
  194. };
  195. const handleUserMuted = (UserId?: string, muted?: boolean, members?: UserInfoType[]) => {
  196. const rtcStore = useRtcStore();
  197. console.log('members', members);
  198. console.log('handleUserSetWords', UserId, muted);
  199. UserId &&
  200. rtcStore.updateMemberDatabyId(UserId, {
  201. IsMuted: muted,
  202. });
  203. if (UserId == rtcStore.userId) {
  204. rtcStore.setMute(!!muted);
  205. }
  206. };
  207. //被动处理用离开
  208. const handleUserLeave = (user?: UserInfoType, members?: UserInfoType[]) => {
  209. const { t } = useI18n();
  210. const rtcStore = useRtcStore();
  211. const isMaxAlert = rtcStore.memberList.length > Number(import.meta.env.VITE_ROOM_MEMBER);
  212. console.log('有人离开了', user?.UserId, isMaxAlert);
  213. if (user && !isMaxAlert) {
  214. let name = user.Nickname;
  215. if (user.Role == 'leader') {
  216. name = t('action.hoster');
  217. Dialog.toast({ content: t('action.hostExitRoom') });
  218. }
  219. const data = {
  220. role: user.Role,
  221. mode: '',
  222. Nickname: name,
  223. UserId: user.UserId,
  224. text: t('action.exitRoom'),
  225. };
  226. console.log('members', user, members);
  227. rtcStore.addToChatList(data);
  228. members && rtcStore.setMemberList(members);
  229. }
  230. };
  231. //被动处理用离开 全员解散
  232. const handleLeaderDismiss = () => {
  233. const { closeSocket } = useSocket();
  234. const { t } = useI18n();
  235. Dialog.toast({ content: t('action.hosterDismissRoom') });
  236. closeSocket();
  237. };
  238. //
  239. const handleError = () => {
  240. const rtcStore = useRtcStore();
  241. const { t } = useI18n();
  242. rtcStore.showBaseDialog(
  243. {
  244. title: t('base.tips'),
  245. desc: t('action.endUpRoom'),
  246. okTxt: t('base.confirm'),
  247. closeTxt: t('base.cancel'),
  248. isSingle: true,
  249. },
  250. () => {
  251. const { closeSocket } = useSocket();
  252. closeSocket();
  253. },
  254. );
  255. };