1.修复课堂中老师异常离开之后,学生进入时课堂依旧显示正在上课中的问题
2.修复录制回放时seek之后,聊天消息顺序倒着的问题
正在显示
4 个修改的文件
包含
58 行增加
和
33 行删除
此 diff 太大无法显示。
| @@ -26,7 +26,7 @@ import ArrayBufferUtil from 'libs/ArrayBufferUtil'; | @@ -26,7 +26,7 @@ import ArrayBufferUtil from 'libs/ArrayBufferUtil'; | ||
| 26 | import UTF8 from 'utf-8'; | 26 | import UTF8 from 'utf-8'; |
| 27 | 27 | ||
| 28 | let loger = Loger.getLoger('MessageEntrance'); | 28 | let loger = Loger.getLoger('MessageEntrance'); |
| 29 | -let _sdkInfo = {"version": "v.1.8.13.20170409", "author": "www.3mang.com"}; | 29 | +let _sdkInfo = {"version": "v.1.8.16.20170410", "author": "www.3mang.com"}; |
| 30 | 30 | ||
| 31 | //APE | 31 | //APE |
| 32 | let _sass; | 32 | let _sass; |
| @@ -232,7 +232,7 @@ export default class MessageEntrance extends Emiter { | @@ -232,7 +232,7 @@ export default class MessageEntrance extends Emiter { | ||
| 232 | loger.warn("不能保存课堂状态", GlobalConfig.getCurrentStatus()); | 232 | loger.warn("不能保存课堂状态", GlobalConfig.getCurrentStatus()); |
| 233 | return; | 233 | return; |
| 234 | } | 234 | } |
| 235 | - this._sassSaveClassStatusInfo(); | 235 | + this._sassSaveClassStatusInfo(_param); |
| 236 | } | 236 | } |
| 237 | 237 | ||
| 238 | //如果是第一次点击开始上课,需要创建录制时的文件名 | 238 | //如果是第一次点击开始上课,需要创建录制时的文件名 |
| @@ -540,8 +540,15 @@ export default class MessageEntrance extends Emiter { | @@ -540,8 +540,15 @@ export default class MessageEntrance extends Emiter { | ||
| 540 | } | 540 | } |
| 541 | 541 | ||
| 542 | //保存课堂状态信息 | 542 | //保存课堂状态信息 |
| 543 | - _sassSaveClassStatusInfo() { | ||
| 544 | - if (GlobalConfig.isHost) { | 543 | + _sassSaveClassStatusInfo(_param) { |
| 544 | + //{isForce:true} isForce->是否强制提交(true为是) | ||
| 545 | + //这个是特殊权限 | ||
| 546 | + let isForce=false; | ||
| 547 | + if(_param&&_param.isForce==true){ | ||
| 548 | + isForce=true; | ||
| 549 | + } | ||
| 550 | + | ||
| 551 | + if (GlobalConfig.isHost||isForce) { | ||
| 545 | //只有加入课堂之后才能保存数据 | 552 | //只有加入课堂之后才能保存数据 |
| 546 | if (GlobalConfig.getCurrentStatus().code == GlobalConfig.statusCode_2.code) { | 553 | if (GlobalConfig.getCurrentStatus().code == GlobalConfig.statusCode_2.code) { |
| 547 | //POST 保存数据 | 554 | //POST 保存数据 |
| @@ -13,7 +13,6 @@ import GlobalConfig from 'GlobalConfig'; | @@ -13,7 +13,6 @@ import GlobalConfig from 'GlobalConfig'; | ||
| 13 | import EngineUtils from 'EngineUtils'; | 13 | import EngineUtils from 'EngineUtils'; |
| 14 | import TimerCounter from "TimerCounter"; | 14 | import TimerCounter from "TimerCounter"; |
| 15 | 15 | ||
| 16 | - | ||
| 17 | let parseBuffer; | 16 | let parseBuffer; |
| 18 | // 日志对象 | 17 | // 日志对象 |
| 19 | const loger = Loger.getLoger('RecordPlayBackParse'); | 18 | const loger = Loger.getLoger('RecordPlayBackParse'); |
| @@ -29,12 +28,10 @@ class RecordPlayBackParse extends Emiter { | @@ -29,12 +28,10 @@ class RecordPlayBackParse extends Emiter { | ||
| 29 | loger.log("RecordPlayBackParse"); | 28 | loger.log("RecordPlayBackParse"); |
| 30 | parseBuffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN); | 29 | parseBuffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN); |
| 31 | parseBuffer.clear(); | 30 | parseBuffer.clear(); |
| 32 | - //console.log(parseBuffer); | ||
| 33 | this._recordPlaybackTimestamp = 0;//回放的时间 | 31 | this._recordPlaybackTimestamp = 0;//回放的时间 |
| 34 | this._recordPlaybackMaxTime = 0;//录制回放的总时间 | 32 | this._recordPlaybackMaxTime = 0;//录制回放的总时间 |
| 35 | this._isReady = false;//录制回放是否已经准备完成 | 33 | this._isReady = false;//录制回放是否已经准备完成 |
| 36 | this._apes = {}; | 34 | this._apes = {}; |
| 37 | - //this._messages = {}; | ||
| 38 | 35 | ||
| 39 | this._conferApeMssages = {};//会议数据 | 36 | this._conferApeMssages = {};//会议数据 |
| 40 | this._chatApeMssages = {};//聊天数据 | 37 | this._chatApeMssages = {};//聊天数据 |
| @@ -312,14 +309,6 @@ class RecordPlayBackParse extends Emiter { | @@ -312,14 +309,6 @@ class RecordPlayBackParse extends Emiter { | ||
| 312 | 309 | ||
| 313 | GlobalConfig.recordPlaybackMaxTime = this._recordPlaybackMaxTime; | 310 | GlobalConfig.recordPlaybackMaxTime = this._recordPlaybackMaxTime; |
| 314 | loger.log("录制回放数据解析完成,录制回放的总时间长为->", this._recordPlaybackMaxTime); | 311 | loger.log("录制回放数据解析完成,录制回放的总时间长为->", this._recordPlaybackMaxTime); |
| 315 | - //console.log("_messages", this._messages); | ||
| 316 | - //loger.log("_conferApeMssages", this._conferApeMssages); | ||
| 317 | - //loger.log("_chatApeMssages", this._chatApeMssages); | ||
| 318 | - //loger.log("_docApeMssages", this._docApeMssages); | ||
| 319 | - //loger.log("_whiteApeMssages", this._whiteApeMssages); | ||
| 320 | - //loger.log("_videoApeMssages", this._videoApeMssages); | ||
| 321 | - //loger.log("_audioApeMssages", this._audioApeMssages); | ||
| 322 | - | ||
| 323 | this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, {"recordPlaybackMaxTime": this._recordPlaybackMaxTime}); | 312 | this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, {"recordPlaybackMaxTime": this._recordPlaybackMaxTime}); |
| 324 | } | 313 | } |
| 325 | 314 | ||
| @@ -356,7 +345,7 @@ class RecordPlayBackParse extends Emiter { | @@ -356,7 +345,7 @@ class RecordPlayBackParse extends Emiter { | ||
| 356 | if (!this._isReady) { | 345 | if (!this._isReady) { |
| 357 | return {"code": ApeConsts.RETURN_FAILED, "data": "录制回放还未准备完成"}; | 346 | return {"code": ApeConsts.RETURN_FAILED, "data": "录制回放还未准备完成"}; |
| 358 | } | 347 | } |
| 359 | - console.log("classStatusInfo",GlobalConfig.classStatusInfo); | 348 | + loger.log("classStatusInfo",GlobalConfig.classStatusInfo); |
| 360 | this._startTimerCounter(); | 349 | this._startTimerCounter(); |
| 361 | this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE, {"status": PLAY}); | 350 | this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE, {"status": PLAY}); |
| 362 | } | 351 | } |
| @@ -400,13 +389,12 @@ class RecordPlayBackParse extends Emiter { | @@ -400,13 +389,12 @@ class RecordPlayBackParse extends Emiter { | ||
| 400 | //查找关键帧,找到关键帧后再继续播放 | 389 | //查找关键帧,找到关键帧后再继续播放 |
| 401 | this._searchApeMessageKeyfram(this._conferApeMssages, ApeConsts.CONFERENCE_SESSION_ID); | 390 | this._searchApeMessageKeyfram(this._conferApeMssages, ApeConsts.CONFERENCE_SESSION_ID); |
| 402 | this._searchApeMessageKeyfram(this._docApeMssages, ApeConsts.DOCSHARING_SESSION_ID); | 391 | this._searchApeMessageKeyfram(this._docApeMssages, ApeConsts.DOCSHARING_SESSION_ID); |
| 403 | - //this._searchApeMessageKeyfram(this._whiteApeMssages, ApeConsts.WHITEBOARD_SESSION_ID); | ||
| 404 | this._searchApeMessageKeyfram(this._videoApeMssages, ApeConsts.VIDEO_SESSION_ID); | 392 | this._searchApeMessageKeyfram(this._videoApeMssages, ApeConsts.VIDEO_SESSION_ID); |
| 405 | this._searchApeMessageKeyfram(this._audioApeMssages, ApeConsts.AUDIO_SESSION_ID); | 393 | this._searchApeMessageKeyfram(this._audioApeMssages, ApeConsts.AUDIO_SESSION_ID); |
| 406 | 394 | ||
| 407 | //聊天模块、白板标注模块的比较特殊,消息是累计的,默认最多30条 | 395 | //聊天模块、白板标注模块的比较特殊,消息是累计的,默认最多30条 |
| 408 | - this._searchApeHistoryMessageKeyfram(this._chatApeMssages, ApeConsts.CHAT_SESSION_ID); | ||
| 409 | - this._searchApeHistoryMessageKeyfram(this._whiteApeMssages, ApeConsts.WHITEBOARD_SESSION_ID); | 396 | + this._searchChatHistoryMessageKeyfram(this._chatApeMssages, ApeConsts.CHAT_SESSION_ID); |
| 397 | + this._searchWhiteboradHistoryMessageKeyfram(this._whiteApeMssages, ApeConsts.WHITEBOARD_SESSION_ID); | ||
| 410 | 398 | ||
| 411 | //各个ape模块无论有没有找到关键帧数据,都继续播放 | 399 | //各个ape模块无论有没有找到关键帧数据,都继续播放 |
| 412 | this._startTimerCounter(); | 400 | this._startTimerCounter(); |
| @@ -438,19 +426,46 @@ class RecordPlayBackParse extends Emiter { | @@ -438,19 +426,46 @@ class RecordPlayBackParse extends Emiter { | ||
| 438 | } | 426 | } |
| 439 | 427 | ||
| 440 | //查找聊天模块ape关键帧数据,聊天模块比较特殊,消息是累积的,当前时间戳之前的都需要显示 | 428 | //查找聊天模块ape关键帧数据,聊天模块比较特殊,消息是累积的,当前时间戳之前的都需要显示 |
| 441 | - _searchApeHistoryMessageKeyfram(_apeMessages) { | 429 | + _searchChatHistoryMessageKeyfram(_apeMessages) { |
| 430 | + //最多30条数据 | ||
| 431 | + let counter=0; | ||
| 432 | + let messageItem; | ||
| 433 | + let mssageArr=[]; | ||
| 434 | + for (let i = this._recordPlaybackTimestamp; i > 0; i--) { | ||
| 435 | + messageItem = _apeMessages[i]; | ||
| 436 | + if (messageItem) { | ||
| 437 | + //把时间点对应的数据发送,同一秒内有存在多个数据的情况 | ||
| 438 | + for (let i = 0; i < messageItem.length; i++) { | ||
| 439 | + //this._everSocketMsgReceivedHandler(messageItem[i].byteData, 0); | ||
| 440 | + mssageArr.push(messageItem[i].byteData); | ||
| 441 | + counter++; | ||
| 442 | + if(counter>30){ | ||
| 443 | + loger.warn("SEEK->最多处理历史消息30条"); | ||
| 444 | + break; | ||
| 445 | + } | ||
| 446 | + } | ||
| 447 | + } | ||
| 448 | + } | ||
| 449 | + //mssageArr记录的数据是按时间最大排序的,发消息的时候需要从时间小的开始,倒着发数据 | ||
| 450 | + let len=mssageArr.length; | ||
| 451 | + if(len>0){ | ||
| 452 | + for (let k=len-1;k>=0;k--){ | ||
| 453 | + this._everSocketMsgReceivedHandler(mssageArr[k], 0); | ||
| 454 | + } | ||
| 455 | + } | ||
| 456 | + } | ||
| 457 | + | ||
| 458 | + //查找白板标注模块ape关键帧数据,聊天模块比较特殊,消息是累积的,当前时间戳之前的都需要显示 | ||
| 459 | + _searchWhiteboradHistoryMessageKeyfram(_apeMessages) { | ||
| 442 | //最多30条数据 | 460 | //最多30条数据 |
| 443 | let counter=0; | 461 | let counter=0; |
| 444 | let messageItem; | 462 | let messageItem; |
| 445 | - let keyFrameSeek = 0; | ||
| 446 | - //let mssageArr=[]; | ||
| 447 | for (let i = this._recordPlaybackTimestamp; i > 0; i--) { | 463 | for (let i = this._recordPlaybackTimestamp; i > 0; i--) { |
| 448 | messageItem = _apeMessages[i]; | 464 | messageItem = _apeMessages[i]; |
| 449 | if (messageItem) { | 465 | if (messageItem) { |
| 450 | //把时间点对应的数据发送,同一秒内有存在多个数据的情况 | 466 | //把时间点对应的数据发送,同一秒内有存在多个数据的情况 |
| 451 | for (let i = 0; i < messageItem.length; i++) { | 467 | for (let i = 0; i < messageItem.length; i++) { |
| 452 | this._everSocketMsgReceivedHandler(messageItem[i].byteData, 0); | 468 | this._everSocketMsgReceivedHandler(messageItem[i].byteData, 0); |
| 453 | - //mssageArr.push(messageItem[i].byteData); | ||
| 454 | counter++; | 469 | counter++; |
| 455 | if(counter>30){ | 470 | if(counter>30){ |
| 456 | loger.warn("SEEK->最多处理历史消息30条"); | 471 | loger.warn("SEEK->最多处理历史消息30条"); |
| @@ -459,13 +474,6 @@ class RecordPlayBackParse extends Emiter { | @@ -459,13 +474,6 @@ class RecordPlayBackParse extends Emiter { | ||
| 459 | } | 474 | } |
| 460 | } | 475 | } |
| 461 | } | 476 | } |
| 462 | - ////mssageArr记录的数据是按时间最大排序的,发消息的时候需要从时间小的开始,倒着发数据 | ||
| 463 | - //let len=mssageArr.length; | ||
| 464 | - //if(len>0){ | ||
| 465 | - // for (let k=len-1;k>0;k--){ | ||
| 466 | - // this._everSocketMsgReceivedHandler(mssageArr[k], 0); | ||
| 467 | - // } | ||
| 468 | - //} | ||
| 469 | } | 477 | } |
| 470 | 478 | ||
| 471 | } | 479 | } |
| @@ -296,7 +296,7 @@ class ConferApe extends Ape { | @@ -296,7 +296,7 @@ class ConferApe extends Ape { | ||
| 296 | } | 296 | } |
| 297 | } | 297 | } |
| 298 | 298 | ||
| 299 | - //暂停上课 | 299 | + //暂停上课 {isForce:true} isForce->是否强制提交(true为是) |
| 300 | pauseClass(_param) { | 300 | pauseClass(_param) { |
| 301 | if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT) { | 301 | if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT) { |
| 302 | loger.warn('还没有开始,不能点暂停'); | 302 | loger.warn('还没有开始,不能点暂停'); |
| @@ -306,7 +306,7 @@ class ConferApe extends Ape { | @@ -306,7 +306,7 @@ class ConferApe extends Ape { | ||
| 306 | GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); | 306 | GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); |
| 307 | 307 | ||
| 308 | this.stopRecord(); | 308 | this.stopRecord(); |
| 309 | - this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); | 309 | + this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE,_param); |
| 310 | this.sendUpdaterClassStatusInfo({"actionType": 2}); | 310 | this.sendUpdaterClassStatusInfo({"actionType": 2}); |
| 311 | this.stopTimerCounter(); | 311 | this.stopTimerCounter(); |
| 312 | } | 312 | } |
| @@ -524,7 +524,17 @@ class ConferApe extends Ape { | @@ -524,7 +524,17 @@ class ConferApe extends Ape { | ||
| 524 | rosterUpdateHandler(nodeId, nodeData) { | 524 | rosterUpdateHandler(nodeId, nodeData) { |
| 525 | //如果是自己的信息,不处理跳过 | 525 | //如果是自己的信息,不处理跳过 |
| 526 | if (nodeId == GlobalConfig.nodeId) { | 526 | if (nodeId == GlobalConfig.nodeId) { |
| 527 | - loger.log("自己加入课堂的消息,不需要处理"); | 527 | + loger.log("自己加入课堂的消息->",nodeId,"role-->", nodeData.role, ApeConsts.userTypes[nodeData.role]); |
| 528 | + //自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂: | ||
| 529 | + // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中) | ||
| 530 | + let rosterLen=Object.keys(this.rosters).length; | ||
| 531 | + if(rosterLen<1&&!GlobalConfig.isHost&&GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED){ | ||
| 532 | + loger.warn("当前课堂没有老师->暂停课堂"); | ||
| 533 | + this.pauseClass({isForce:true}); | ||
| 534 | + this.stopRecord(true); | ||
| 535 | + } | ||
| 536 | + | ||
| 537 | + //自己添加到列表 | ||
| 528 | this.rosters[nodeId] = nodeData; | 538 | this.rosters[nodeId] = nodeData; |
| 529 | return; | 539 | return; |
| 530 | } | 540 | } |
-
请 注册 或 登录 后发表评论