李勇

1.修复课堂中老师异常离开之后,学生进入时课堂依旧显示正在上课中的问题

2.修复录制回放时seek之后,聊天消息顺序倒着的问题
此 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 }