rotate.service.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. import { Injectable, Logger } from '@nestjs/common';
  2. import { CacheService } from 'src/cache/cache.service';
  3. @Injectable()
  4. export class RotateService {
  5. constructor(private cacheService: CacheService) {}
  6. private actionRequestPool = {};
  7. private logger: Logger = new Logger('rotateService');
  8. private Actions = {
  9. Clicking: 1,
  10. Rotation: 1014,
  11. Joystick: 15,
  12. };
  13. private users = {};
  14. private replies = {};
  15. init(app_id, userId) {
  16. const user = {
  17. appId: null,
  18. userId: null,
  19. breakPointId: null,
  20. roomId: null,
  21. player: {
  22. position: { x: -700, y: 0, z: 0 },
  23. angle: {
  24. pitch: 0,
  25. yaw: 0,
  26. roll: 0,
  27. },
  28. },
  29. camera: {
  30. position: { x: -1145, y: 0, z: 160 },
  31. angle: {
  32. pitch: 0,
  33. yaw: 0,
  34. roll: 0,
  35. },
  36. },
  37. rotateInfo: {
  38. frameIndex: 0,
  39. horizontal_move: 0,
  40. mediaSrc: null,
  41. },
  42. moveInfo: {},
  43. // traceIds: [],
  44. // actionResponses:[]
  45. };
  46. user.appId = app_id;
  47. user.userId = userId;
  48. user.breakPointId = 100;
  49. this.users[userId] = user;
  50. const reply = {
  51. traceIds: [],
  52. vehicle: null,
  53. mediaSrc: null,
  54. newUserStates: [
  55. {
  56. userId: 'dcff36ae4fc1d',
  57. playerState: {
  58. roomTypeId: '',
  59. person: 0,
  60. avatarId: '',
  61. skinId: '',
  62. roomId: '',
  63. isHost: false,
  64. isFollowHost: false,
  65. skinDataVersion: '',
  66. avatarComponents: '',
  67. nickName: '',
  68. movingMode: 0,
  69. attitude: '',
  70. areaName: '',
  71. pathName: '',
  72. pathId: '',
  73. avatarSize: 1,
  74. extra: '',
  75. prioritySync: false,
  76. player: {
  77. position: { x: -700, y: 0, z: 0 },
  78. angle: {
  79. pitch: 0,
  80. yaw: 0,
  81. roll: 0,
  82. },
  83. },
  84. camera: {
  85. position: { x: -1145, y: 0, z: 160 },
  86. angle: {
  87. pitch: 0,
  88. yaw: 0,
  89. roll: 0,
  90. },
  91. },
  92. cameraCenter: { x: -700, y: 0, z: 0 },
  93. },
  94. renderInfo: {
  95. renderType: 0,
  96. videoFrame: null,
  97. cameraStateType: 3,
  98. isMoving: 0,
  99. needIfr: 0,
  100. isVideo: 0,
  101. stillFrame: 0,
  102. isRotating: 0,
  103. isFollowing: 0,
  104. clientPanoTitlesBitmap: [],
  105. clientPanoTreceId: '',
  106. prefetchVideoId: '',
  107. noMedia: false,
  108. },
  109. event: null,
  110. relation: 1,
  111. },
  112. ],
  113. actionResponses: [
  114. // {
  115. // "actionType": 15,
  116. // "pointType": 100,
  117. // "extra": "",
  118. // "traceId": "d0864cd0-378d-4d49-b7b0-3e8e1b9494c3",
  119. // "packetId": "d44bd2f5-f877-4dd7-868b-803c64f99082",
  120. // "nps": [],
  121. // "peopleNum": 0,
  122. // "zoneId": "",
  123. // "echoMsg": "",
  124. // "reserveDetail": null,
  125. // "userWithAvatarList": [],
  126. // "newUserStates": [],
  127. // "code": 0,
  128. // "msg": ""
  129. // }
  130. ],
  131. getStateType: 0,
  132. code: 0,
  133. msg: 'OK',
  134. };
  135. reply['newUserStates'][0]['userId'] = userId;
  136. this.replies[userId] = reply;
  137. return reply;
  138. }
  139. async rotate(actionRequest) {
  140. try {
  141. const userId = actionRequest['user_id'];
  142. if (this.actionRequestPool[userId]) {
  143. this.actionRequestPool[userId].push(actionRequest);
  144. } else {
  145. this.actionRequestPool[userId] = [];
  146. this.actionRequestPool[userId].push(actionRequest);
  147. }
  148. const reply = this.replies[userId];
  149. const actionRequests = this.actionRequestPool[userId];
  150. const user = this.users[userId];
  151. // debugger;
  152. let horizontal_move = user.rotateInfo.horizontal_move;
  153. //const traceIds = user.traceIds;
  154. let sub = 0;
  155. for (let i = 0; i < actionRequests.length; ++i) {
  156. if (actionRequests[i].action_type == this.Actions.Rotation) {
  157. horizontal_move += actionRequests[i].rotation_action.horizontal_move;
  158. reply.traceIds.push(actionRequests[i].trace_id);
  159. const actionResponse = this.createActionResponse(
  160. actionRequests[i].action_type,
  161. actionRequests[i].trace_id,
  162. );
  163. reply.actionResponses.push(actionResponse);
  164. ++sub;
  165. } else {
  166. break;
  167. }
  168. }
  169. actionRequests.splice(0, sub);
  170. const hAngle = horizontal_move * 90;
  171. if (Math.abs(hAngle) < 1) {
  172. user.rotateInfo.horizontal_move = horizontal_move;
  173. //user.traceIds = traceIds;
  174. this.replies[userId] = reply;
  175. return null;
  176. }
  177. return this.rotateForAngle(userId, hAngle);
  178. /*
  179. user.rotateInfo.frameIndex += Math.floor(hAngle);
  180. if (user.rotateInfo.frameIndex < 0) {
  181. user.rotateInfo.frameIndex = 360 - user.rotateInfo.frameIndex;
  182. } else if (user.rotateInfo.frameIndex > 359) {
  183. user.rotateInfo.frameIndex -= 360;
  184. }
  185. reply['traceIds'] = traceIds;
  186. reply['newUserStates'][0]['userId'] = userId;
  187. //从redis里取
  188. //let key = user.appId + "-"+user.breakPointId+"-"+user.rotateInfo.frameIndex;
  189. const key =
  190. 'rotateframe:app_id:' +
  191. user.appId +
  192. ':frame_index:' +
  193. user.rotateInfo.frameIndex +
  194. ':break_point_id:' +
  195. user.breakPointId;
  196. // const value = null;
  197. const redisData = await this.cacheService.get(key);
  198. const value = JSON.parse(redisData);
  199. console.log('redis', value);
  200. user.camera['position'] = value ? value.cameraPosition : '';
  201. user.camera['angle'] = value ? value.cameraAngle : '';
  202. //this.reply['newUserStates'][0]['playerState'] .player
  203. reply['newUserStates'][0]['playerState'].camera.position =
  204. user.camera['position'];
  205. reply['newUserStates'][0]['playerState'].camera.angle =
  206. user.camera['angle'];
  207. reply['newUserStates'][0]['playerState'].cameraCenter =
  208. user.player.position;
  209. // debugger
  210. reply.mediaSrc =
  211. '/' +
  212. '0000000001' +
  213. '/' +
  214. user.breakPointId +
  215. '/' +
  216. value.directory +
  217. '/' +
  218. value.fileName +
  219. '?m=' +
  220. new Date().getTime();
  221. this.replies[userId].traceIds = [];
  222. this.replies[userId].actionResponses = [];
  223. return reply;
  224. */
  225. } catch (error) {
  226. console.log('RotateService', error);
  227. }
  228. }
  229. async rotateForAngle(userId, hAngle) {
  230. try {
  231. const user = this.users[userId];
  232. user.rotateInfo.frameIndex += Math.floor(hAngle);
  233. if (user.rotateInfo.frameIndex < 0) {
  234. user.rotateInfo.frameIndex = 360 - user.rotateInfo.frameIndex;
  235. } else if (user.rotateInfo.frameIndex > 359) {
  236. user.rotateInfo.frameIndex -= 360;
  237. }
  238. const reply = JSON.parse(JSON.stringify(this.replies[userId]));
  239. reply['newUserStates'][0]['userId'] = userId;
  240. //从redis里取
  241. //let key = user.appId + "-"+user.breakPointId+"-"+user.rotateInfo.frameIndex;
  242. const key =
  243. 'rotateframe:app_id:' +
  244. user.appId +
  245. ':frame_index:' +
  246. user.rotateInfo.frameIndex +
  247. ':break_point_id:' +
  248. user.breakPointId;
  249. // const value = null;
  250. const redisData = await this.cacheService.get(key);
  251. if (redisData && redisData.length > 0) {
  252. const value = redisData ? JSON.parse(redisData) : null;
  253. console.log('rotate-service', value);
  254. user.camera['position'] = value ? value.cameraPosition : '';
  255. user.camera['angle'] = value ? value.cameraAngle : '';
  256. reply['newUserStates'][0]['playerState'].player.position =
  257. user.player.position;
  258. reply['newUserStates'][0]['playerState'].player.angle =
  259. user.player.angle;
  260. //this.reply['newUserStates'][0]['playerState'] .player
  261. reply['newUserStates'][0]['playerState'].camera.position =
  262. user.camera['position'];
  263. reply['newUserStates'][0]['playerState'].camera.angle =
  264. user.camera['angle'];
  265. reply['newUserStates'][0]['playerState'].cameraCenter =
  266. user.player.position;
  267. // debugger
  268. reply.mediaSrc =
  269. '/' +
  270. '0000000001' +
  271. '/' +
  272. user.breakPointId +
  273. '/' +
  274. value.directory +
  275. '/' +
  276. value.fileName +
  277. '?m=' +
  278. new Date().getTime();
  279. this.replies[userId].traceIds = [];
  280. this.replies[userId].actionResponses = [];
  281. user.rotateInfo.horizontal_move = 0;
  282. return reply;
  283. } else {
  284. return null;
  285. }
  286. } catch (error) {
  287. this.logger.error('rotateForAngle::function', error);
  288. }
  289. }
  290. createActionResponse(actionType, traceId) {
  291. const actionResponse = {
  292. actionType: actionType,
  293. pointType: 100,
  294. extra: '',
  295. traceId: traceId,
  296. packetId: '',
  297. nps: [],
  298. peopleNum: 0,
  299. zoneId: '',
  300. echoMsg: '',
  301. reserveDetail: null,
  302. userWithAvatarList: [],
  303. newUserStates: [],
  304. code: 0,
  305. msg: '',
  306. };
  307. return actionResponse;
  308. }
  309. getNewUserStateRequest(actionRequest) {
  310. try {
  311. const userId = actionRequest['user_id'];
  312. const actionType = actionRequest['action_type'];
  313. const traceId = actionRequest['trace_id'];
  314. const reply = {
  315. actionType: actionType,
  316. pointType: 100,
  317. extra: '',
  318. traceId: traceId,
  319. packetId: '',
  320. nps: [],
  321. peopleNum: 0,
  322. zoneId: '',
  323. echoMsg: '',
  324. reserveDetail: null,
  325. userWithAvatarList: [],
  326. newUserStates: [],
  327. code: 0,
  328. msg: '',
  329. };
  330. const userIds = Object.keys(this.users);
  331. for (let i = 0; i < userIds.length; ++i) {
  332. const _user = this.users[userIds[i]];
  333. const newUserState = {
  334. userId: userIds[i],
  335. playerState: {
  336. roomTypeId: '',
  337. person: 0,
  338. avatarId: 'KGe_Boy',
  339. skinId: '10089',
  340. roomId: 'e629ef3e-022d-4e64-8654-703bb96410eb',
  341. isHost: false,
  342. isFollowHost: false,
  343. skinDataVersion: '1008900008',
  344. avatarComponents: '',
  345. nickName: userIds[i],
  346. movingMode: 0,
  347. attitude: 'walk',
  348. areaName: '',
  349. pathName: 'thirdwalk',
  350. pathId: 'thirdwalk',
  351. avatarSize: 1,
  352. extra: '{"removeWhenDisconnected":true}',
  353. prioritySync: false,
  354. player: {
  355. position: _user.player.position,
  356. angle: _user.player.angle,
  357. },
  358. camera: null,
  359. cameraCenter: null,
  360. },
  361. renderInfo: {
  362. renderType: 0,
  363. videoFrame: null,
  364. cameraStateType: 0,
  365. isMoving: 0,
  366. needIfr: 0,
  367. isVideo: 0,
  368. stillFrame: 0,
  369. isRotating: 0,
  370. isFollowing: 0,
  371. clientPanoTitlesBitmap: [],
  372. clientPanoTreceId: '',
  373. prefetchVideoId: '',
  374. noMedia: false,
  375. },
  376. event: {
  377. id: '',
  378. type: 0,
  379. points: [],
  380. rotateEvent: null,
  381. removeVisitorEvent: null,
  382. },
  383. relation: 0,
  384. };
  385. reply['newUserStates'].push(newUserState);
  386. }
  387. return reply;
  388. } catch (error) {
  389. this.logger.error('getNewUserStateRequest::function', error);
  390. }
  391. }
  392. async ech(userId) {
  393. const user = this.users[userId];
  394. const reply = JSON.parse(JSON.stringify(this.replies[userId]));
  395. reply['newUserStates'][0]['userId'] = userId;
  396. reply['newUserStates'][0]['playerState'].player.position = user.player.position;
  397. reply['newUserStates'][0]['playerState'].player.angle = user.player.angle;
  398. reply['newUserStates'][0]['playerState'].camera.position = user.camera['position'];
  399. reply['newUserStates'][0]['playerState'].camera.angle = user.camera['angle'];
  400. reply['newUserStates'][0]['playerState'].cameraCenter = user.player.position;
  401. const key ='rotateframe:app_id:' +user.appId +':frame_index:' + user.rotateInfo.frameIndex +':break_point_id:' +user.breakPointId;
  402. const redisData = await this.cacheService.get(key);
  403. if (redisData && redisData.length > 0) {
  404. const value = redisData ? JSON.parse(redisData) : null;
  405. reply.mediaSrc ='/' +'0000000001' +'/' +user.breakPointId +'/' +value.directory +'/' +value.fileName +'?m=' +new Date().getTime();
  406. return reply;
  407. }
  408. else{
  409. return null;
  410. }
  411. }
  412. }