李勇

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

2.修复录制回放时seek之后,聊天消息顺序倒着的问题
此 diff 太大无法显示。
... ... @@ -26,7 +26,7 @@ import ArrayBufferUtil from 'libs/ArrayBufferUtil';
import UTF8 from 'utf-8';
let loger = Loger.getLoger('MessageEntrance');
let _sdkInfo = {"version": "v.1.8.13.20170409", "author": "www.3mang.com"};
let _sdkInfo = {"version": "v.1.8.16.20170410", "author": "www.3mang.com"};
//APE
let _sass;
... ... @@ -232,7 +232,7 @@ export default class MessageEntrance extends Emiter {
loger.warn("不能保存课堂状态", GlobalConfig.getCurrentStatus());
return;
}
this._sassSaveClassStatusInfo();
this._sassSaveClassStatusInfo(_param);
}
//如果是第一次点击开始上课,需要创建录制时的文件名
... ... @@ -540,8 +540,15 @@ export default class MessageEntrance extends Emiter {
}
//保存课堂状态信息
_sassSaveClassStatusInfo() {
if (GlobalConfig.isHost) {
_sassSaveClassStatusInfo(_param) {
//{isForce:true} isForce->是否强制提交(true为是)
//这个是特殊权限
let isForce=false;
if(_param&&_param.isForce==true){
isForce=true;
}
if (GlobalConfig.isHost||isForce) {
//只有加入课堂之后才能保存数据
if (GlobalConfig.getCurrentStatus().code == GlobalConfig.statusCode_2.code) {
//POST 保存数据
... ...
... ... @@ -13,7 +13,6 @@ import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
import TimerCounter from "TimerCounter";
let parseBuffer;
// 日志对象
const loger = Loger.getLoger('RecordPlayBackParse');
... ... @@ -29,12 +28,10 @@ class RecordPlayBackParse extends Emiter {
loger.log("RecordPlayBackParse");
parseBuffer = new ByteBuffer(ByteBuffer.DEFAULT_CAPACITY, ByteBuffer.LITTLE_ENDIAN);
parseBuffer.clear();
//console.log(parseBuffer);
this._recordPlaybackTimestamp = 0;//回放的时间
this._recordPlaybackMaxTime = 0;//录制回放的总时间
this._isReady = false;//录制回放是否已经准备完成
this._apes = {};
//this._messages = {};
this._conferApeMssages = {};//会议数据
this._chatApeMssages = {};//聊天数据
... ... @@ -312,14 +309,6 @@ class RecordPlayBackParse extends Emiter {
GlobalConfig.recordPlaybackMaxTime = this._recordPlaybackMaxTime;
loger.log("录制回放数据解析完成,录制回放的总时间长为->", this._recordPlaybackMaxTime);
//console.log("_messages", this._messages);
//loger.log("_conferApeMssages", this._conferApeMssages);
//loger.log("_chatApeMssages", this._chatApeMssages);
//loger.log("_docApeMssages", this._docApeMssages);
//loger.log("_whiteApeMssages", this._whiteApeMssages);
//loger.log("_videoApeMssages", this._videoApeMssages);
//loger.log("_audioApeMssages", this._audioApeMssages);
this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, {"recordPlaybackMaxTime": this._recordPlaybackMaxTime});
}
... ... @@ -356,7 +345,7 @@ class RecordPlayBackParse extends Emiter {
if (!this._isReady) {
return {"code": ApeConsts.RETURN_FAILED, "data": "录制回放还未准备完成"};
}
console.log("classStatusInfo",GlobalConfig.classStatusInfo);
loger.log("classStatusInfo",GlobalConfig.classStatusInfo);
this._startTimerCounter();
this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE, {"status": PLAY});
}
... ... @@ -400,13 +389,12 @@ class RecordPlayBackParse extends Emiter {
//查找关键帧,找到关键帧后再继续播放
this._searchApeMessageKeyfram(this._conferApeMssages, ApeConsts.CONFERENCE_SESSION_ID);
this._searchApeMessageKeyfram(this._docApeMssages, ApeConsts.DOCSHARING_SESSION_ID);
//this._searchApeMessageKeyfram(this._whiteApeMssages, ApeConsts.WHITEBOARD_SESSION_ID);
this._searchApeMessageKeyfram(this._videoApeMssages, ApeConsts.VIDEO_SESSION_ID);
this._searchApeMessageKeyfram(this._audioApeMssages, ApeConsts.AUDIO_SESSION_ID);
//聊天模块、白板标注模块的比较特殊,消息是累计的,默认最多30条
this._searchApeHistoryMessageKeyfram(this._chatApeMssages, ApeConsts.CHAT_SESSION_ID);
this._searchApeHistoryMessageKeyfram(this._whiteApeMssages, ApeConsts.WHITEBOARD_SESSION_ID);
this._searchChatHistoryMessageKeyfram(this._chatApeMssages, ApeConsts.CHAT_SESSION_ID);
this._searchWhiteboradHistoryMessageKeyfram(this._whiteApeMssages, ApeConsts.WHITEBOARD_SESSION_ID);
//各个ape模块无论有没有找到关键帧数据,都继续播放
this._startTimerCounter();
... ... @@ -438,19 +426,46 @@ class RecordPlayBackParse extends Emiter {
}
//查找聊天模块ape关键帧数据,聊天模块比较特殊,消息是累积的,当前时间戳之前的都需要显示
_searchApeHistoryMessageKeyfram(_apeMessages) {
_searchChatHistoryMessageKeyfram(_apeMessages) {
//最多30条数据
let counter=0;
let messageItem;
let mssageArr=[];
for (let i = this._recordPlaybackTimestamp; i > 0; i--) {
messageItem = _apeMessages[i];
if (messageItem) {
//把时间点对应的数据发送,同一秒内有存在多个数据的情况
for (let i = 0; i < messageItem.length; i++) {
//this._everSocketMsgReceivedHandler(messageItem[i].byteData, 0);
mssageArr.push(messageItem[i].byteData);
counter++;
if(counter>30){
loger.warn("SEEK->最多处理历史消息30条");
break;
}
}
}
}
//mssageArr记录的数据是按时间最大排序的,发消息的时候需要从时间小的开始,倒着发数据
let len=mssageArr.length;
if(len>0){
for (let k=len-1;k>=0;k--){
this._everSocketMsgReceivedHandler(mssageArr[k], 0);
}
}
}
//查找白板标注模块ape关键帧数据,聊天模块比较特殊,消息是累积的,当前时间戳之前的都需要显示
_searchWhiteboradHistoryMessageKeyfram(_apeMessages) {
//最多30条数据
let counter=0;
let messageItem;
let keyFrameSeek = 0;
//let mssageArr=[];
for (let i = this._recordPlaybackTimestamp; i > 0; i--) {
messageItem = _apeMessages[i];
if (messageItem) {
//把时间点对应的数据发送,同一秒内有存在多个数据的情况
for (let i = 0; i < messageItem.length; i++) {
this._everSocketMsgReceivedHandler(messageItem[i].byteData, 0);
//mssageArr.push(messageItem[i].byteData);
counter++;
if(counter>30){
loger.warn("SEEK->最多处理历史消息30条");
... ... @@ -459,13 +474,6 @@ class RecordPlayBackParse extends Emiter {
}
}
}
////mssageArr记录的数据是按时间最大排序的,发消息的时候需要从时间小的开始,倒着发数据
//let len=mssageArr.length;
//if(len>0){
// for (let k=len-1;k>0;k--){
// this._everSocketMsgReceivedHandler(mssageArr[k], 0);
// }
//}
}
}
... ...
... ... @@ -296,7 +296,7 @@ class ConferApe extends Ape {
}
}
//暂停上课
//暂停上课 {isForce:true} isForce->是否强制提交(true为是)
pauseClass(_param) {
if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT) {
loger.warn('还没有开始,不能点暂停');
... ... @@ -306,7 +306,7 @@ class ConferApe extends Ape {
GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
this.stopRecord();
this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE,_param);
this.sendUpdaterClassStatusInfo({"actionType": 2});
this.stopTimerCounter();
}
... ... @@ -524,7 +524,17 @@ class ConferApe extends Ape {
rosterUpdateHandler(nodeId, nodeData) {
//如果是自己的信息,不处理跳过
if (nodeId == GlobalConfig.nodeId) {
loger.log("自己加入课堂的消息,不需要处理");
loger.log("自己加入课堂的消息->",nodeId,"role-->", nodeData.role, ApeConsts.userTypes[nodeData.role]);
//自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂:
// 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中)
let rosterLen=Object.keys(this.rosters).length;
if(rosterLen<1&&!GlobalConfig.isHost&&GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED){
loger.warn("当前课堂没有老师->暂停课堂");
this.pauseClass({isForce:true});
this.stopRecord(true);
}
//自己添加到列表
this.rosters[nodeId] = nodeData;
return;
}
... ...