AlexWang

实际内部Confer内部处理用户禁言及全局禁言

PDU新增字段
@@ -25,12 +25,12 @@ class ConferApe extends Ape { @@ -25,12 +25,12 @@ class ConferApe extends Ape {
25 ApeConsts.CONFERENCE_SESSION_TAG 25 ApeConsts.CONFERENCE_SESSION_TAG
26 ); 26 );
27 27
28 - this.rosters = {};//用户列表  
29 - this.timerCounter = new TimerCounter();//计时器 28 + this.rosters = {}; //用户列表
  29 + this.timerCounter = new TimerCounter(); //计时器
30 30
31 //第三方消息控制 parent和Iframe直接的通讯 31 //第三方消息控制 parent和Iframe直接的通讯
32 - this.thirdMessage=new ThirdMessage();  
33 - this.thirdMessage.on(ThirdMessage.RECIVE_MESSAGE,this.onThirdReciveParentMessage.bind(this)); 32 + this.thirdMessage = new ThirdMessage();
  33 + this.thirdMessage.on(ThirdMessage.RECIVE_MESSAGE, this.onThirdReciveParentMessage.bind(this));
34 34
35 // Ape Models 35 // Ape Models
36 this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer); 36 this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
@@ -49,9 +49,9 @@ class ConferApe extends Ape { @@ -49,9 +49,9 @@ class ConferApe extends Ape {
49 49
50 this.on(pdu.RCPDU_SESSION_JOIN_RESPONSE, this._joinSessionHandler.bind(this)); 50 this.on(pdu.RCPDU_SESSION_JOIN_RESPONSE, this._joinSessionHandler.bind(this));
51 51
52 - this.on(pdu.RCPDU_SEND_CONFERENCE_DATA_REQUEST, this.conferMsgComingHandler.bind(this));//这个是课堂消息类型,flash里在使用这里不再使用,各个模块的消息由模块自己来处理  
53 - this.on(pdu.RCPDU_CONFERENCE_RECORD_REQUEST, this.onSendConferRecordRequestHandler.bind(this));//发送录制和停止录制消息  
54 - this.on(pdu.RCPDU_THIRD_BROADCAST_DATA_REQUEST, this.onThirdBroadcastDataHandler.bind(this));//第三方广播消息 52 + this.on(pdu.RCPDU_SEND_CONFERENCE_DATA_REQUEST, this.conferMsgComingHandler.bind(this)); //这个是课堂消息类型,flash里在使用这里不再使用,各个模块的消息由模块自己来处理
  53 + this.on(pdu.RCPDU_CONFERENCE_RECORD_REQUEST, this.onSendConferRecordRequestHandler.bind(this)); //发送录制和停止录制消息
  54 + this.on(pdu.RCPDU_THIRD_BROADCAST_DATA_REQUEST, this.onThirdBroadcastDataHandler.bind(this)); //第三方广播消息
55 } 55 }
56 56
57 //加入课堂 57 //加入课堂
@@ -64,9 +64,9 @@ class ConferApe extends Ape { @@ -64,9 +64,9 @@ class ConferApe extends Ape {
64 userDataPdu.skype = ''; 64 userDataPdu.skype = '';
65 65
66 nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer(); 66 nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer();
67 - nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType;//设备类型 67 + nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType; //设备类型
68 68
69 - loger.log('开始加入->',nodeInfoRecordPdu); 69 + loger.log('开始加入->', nodeInfoRecordPdu);
70 70
71 let item = new pdu['RCRegistryRosterItemPdu']; 71 let item = new pdu['RCRegistryRosterItemPdu'];
72 item.nodeId = nodeInfoRecordPdu.nodeId; 72 item.nodeId = nodeInfoRecordPdu.nodeId;
@@ -92,51 +92,51 @@ class ConferApe extends Ape { @@ -92,51 +92,51 @@ class ConferApe extends Ape {
92 this.sendUniform(adapterPdu, true); 92 this.sendUniform(adapterPdu, true);
93 } 93 }
94 //获取角色信息 94 //获取角色信息
95 - getNodeInfo(){ 95 + getNodeInfo() {
96 let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu']; 96 let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu'];
97 - nodeInfoRecordPdu.nodeId= GlobalConfig.nodeId;  
98 - nodeInfoRecordPdu.name= GlobalConfig.userName;  
99 - nodeInfoRecordPdu.role= ApeConsts.userTypesToId[GlobalConfig.userRole] || 1; //NR_NORMAL用户的身份,根据用户登录时的身份设置;  
100 - nodeInfoRecordPdu.level= GlobalConfig.level; 97 + nodeInfoRecordPdu.nodeId = GlobalConfig.nodeId;
  98 + nodeInfoRecordPdu.selfSilence = JSON.stringify(GlobalConfig.selfSilence);
  99 + nodeInfoRecordPdu.name = GlobalConfig.userName;
  100 + nodeInfoRecordPdu.role = ApeConsts.userTypesToId[GlobalConfig.userRole] || 1; //NR_NORMAL用户的身份,根据用户登录时的身份设置;
  101 + nodeInfoRecordPdu.level = GlobalConfig.level;
101 //nodeInfoRecordPdu.audioRecords= GlobalConfig.audioRecords; 102 //nodeInfoRecordPdu.audioRecords= GlobalConfig.audioRecords;
102 //nodeInfoRecordPdu.videoRecords= GlobalConfig.videoRecords; 103 //nodeInfoRecordPdu.videoRecords= GlobalConfig.videoRecords;
103 //nodeInfoRecordPdu.status= GlobalConfig.status; 104 //nodeInfoRecordPdu.status= GlobalConfig.status;
104 - nodeInfoRecordPdu.userData= GlobalConfig.userData;  
105 - nodeInfoRecordPdu.userId= GlobalConfig.userId;  
106 - nodeInfoRecordPdu.handUpTime= GlobalConfig.handUpTime; 105 + nodeInfoRecordPdu.userData = GlobalConfig.userData;
  106 + nodeInfoRecordPdu.userId = GlobalConfig.userId;
  107 + nodeInfoRecordPdu.handUpTime = GlobalConfig.handUpTime;
107 //nodeInfoRecordPdu.deviceType= GlobalConfig.deviceType; 108 //nodeInfoRecordPdu.deviceType= GlobalConfig.deviceType;
108 //nodeInfoRecordPdu.mobileDirection= GlobalConfig.mobileDirection; 109 //nodeInfoRecordPdu.mobileDirection= GlobalConfig.mobileDirection;
109 - nodeInfoRecordPdu.microphones= GlobalConfig.microphones;  
110 - nodeInfoRecordPdu.cameras= GlobalConfig.cameras;  
111 - nodeInfoRecordPdu.openCamera= GlobalConfig.openCamera;  
112 - nodeInfoRecordPdu.openMicrophones= GlobalConfig.openMicrophones;  
113 - nodeInfoRecordPdu.videoQuality= GlobalConfig.videoQuality;  
114 - nodeInfoRecordPdu.userIp= GlobalConfig.userIp;  
115 -  
116 - nodeInfoRecordPdu.curVideoQuality=GlobalConfig.curVideoQuality;  
117 - nodeInfoRecordPdu.micGain= GlobalConfig.micGain;  
118 - nodeInfoRecordPdu.speakerVolume=GlobalConfig.speakerVolume;  
119 - nodeInfoRecordPdu.micCode= GlobalConfig.micCode;  
120 - nodeInfoRecordPdu.curCamera=GlobalConfig.curCamera;  
121 - nodeInfoRecordPdu.curMicrophone=GlobalConfig.curMicrophone;  
122 -  
123 -  
124 - nodeInfoRecordPdu.country=GlobalConfig.country ;//国家  
125 - nodeInfoRecordPdu.city=GlobalConfig.city ;//城市  
126 - nodeInfoRecordPdu.province= GlobalConfig.province;//服务商  
127 - nodeInfoRecordPdu.isp=GlobalConfig.isp;//服务商 110 + nodeInfoRecordPdu.microphones = GlobalConfig.microphones;
  111 + nodeInfoRecordPdu.cameras = GlobalConfig.cameras;
  112 + nodeInfoRecordPdu.openCamera = GlobalConfig.openCamera;
  113 + nodeInfoRecordPdu.openMicrophones = GlobalConfig.openMicrophones;
  114 + nodeInfoRecordPdu.videoQuality = GlobalConfig.videoQuality;
  115 + nodeInfoRecordPdu.userIp = GlobalConfig.userIp;
  116 +
  117 + nodeInfoRecordPdu.curVideoQuality = GlobalConfig.curVideoQuality;
  118 + nodeInfoRecordPdu.micGain = GlobalConfig.micGain;
  119 + nodeInfoRecordPdu.speakerVolume = GlobalConfig.speakerVolume;
  120 + nodeInfoRecordPdu.micCode = GlobalConfig.micCode;
  121 + nodeInfoRecordPdu.curCamera = GlobalConfig.curCamera;
  122 + nodeInfoRecordPdu.curMicrophone = GlobalConfig.curMicrophone;
  123 +
  124 + nodeInfoRecordPdu.country = GlobalConfig.country; //国家
  125 + nodeInfoRecordPdu.city = GlobalConfig.city; //城市
  126 + nodeInfoRecordPdu.province = GlobalConfig.province; //服务商
  127 + nodeInfoRecordPdu.isp = GlobalConfig.isp; //服务商
128 128
129 //用户的MS列表 129 //用户的MS列表
130 - let msListAll=GlobalConfig.msListAll;  
131 - for(let k=0;k<msListAll.length;k++){  
132 - let msItem=msListAll[k];  
133 - if(msItem){ 130 + let msListAll = GlobalConfig.msListAll;
  131 + for (let k = 0; k < msListAll.length; k++) {
  132 + let msItem = msListAll[k];
  133 + if (msItem) {
134 let msListItemPdu = new pdu['MsListItemPdu']; 134 let msListItemPdu = new pdu['MsListItemPdu'];
135 - msListItemPdu.ip=msItem.ip||"";  
136 - msListItemPdu.port=msItem.port||"";  
137 - msListItemPdu.country=msItem.country||"";  
138 - msListItemPdu.province=msItem.province||"";  
139 - msListItemPdu.city=msItem.city||""; 135 + msListItemPdu.ip = msItem.ip || "";
  136 + msListItemPdu.port = msItem.port || "";
  137 + msListItemPdu.country = msItem.country || "";
  138 + msListItemPdu.province = msItem.province || "";
  139 + msListItemPdu.city = msItem.city || "";
140 nodeInfoRecordPdu.msList.push(msListItemPdu); 140 nodeInfoRecordPdu.msList.push(msListItemPdu);
141 } 141 }
142 } 142 }
@@ -144,15 +144,15 @@ class ConferApe extends Ape { @@ -144,15 +144,15 @@ class ConferApe extends Ape {
144 } 144 }
145 145
146 //更新角色数据 146 //更新角色数据
147 - updateUserInfo(){ 147 + updateUserInfo() {
148 let nodeInfoRecordPdu = this.getNodeInfo(); 148 let nodeInfoRecordPdu = this.getNodeInfo();
149 - loger.log('更新用户信息->',nodeInfoRecordPdu); 149 + loger.log('更新用户信息->', nodeInfoRecordPdu);
150 let userDataPdu = new pdu['RCNodeInfoUserDataPdu']; 150 let userDataPdu = new pdu['RCNodeInfoUserDataPdu'];
151 userDataPdu.qq = ''; 151 userDataPdu.qq = '';
152 userDataPdu.skype = ''; 152 userDataPdu.skype = '';
153 153
154 nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer(); 154 nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer();
155 - nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType;//设备类型 155 + nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType; //设备类型
156 156
157 let item = new pdu['RCRegistryRosterItemPdu']; 157 let item = new pdu['RCRegistryRosterItemPdu'];
158 item.nodeId = nodeInfoRecordPdu.nodeId; 158 item.nodeId = nodeInfoRecordPdu.nodeId;
@@ -193,8 +193,8 @@ class ConferApe extends Ape { @@ -193,8 +193,8 @@ class ConferApe extends Ape {
193 193
194 let conferSendPdu = new pdu['RCConferenceSendDataRequestPdu']; 194 let conferSendPdu = new pdu['RCConferenceSendDataRequestPdu'];
195 conferSendPdu.type = pdu.RCPDU_SEND_CONFERENCE_DATA_REQUEST; 195 conferSendPdu.type = pdu.RCPDU_SEND_CONFERENCE_DATA_REQUEST;
196 - conferSendPdu.initiator = this._classInfo.nodeId;//发起人  
197 - conferSendPdu.peer = parseInt(_messageInfo.to);//发送给谁,公聊的时候是0,私聊的时候是指定的用户id 196 + conferSendPdu.initiator = this._classInfo.nodeId; //发起人
  197 + conferSendPdu.peer = parseInt(_messageInfo.to); //发送给谁,公聊的时候是0,私聊的时候是指定的用户id
198 198
199 conferSendPdu.userData = this._rCArrayBufferUtil.strToUint8Array("h5" + _messageInfo.message); 199 conferSendPdu.userData = this._rCArrayBufferUtil.strToUint8Array("h5" + _messageInfo.message);
200 //conferSendPdu.userData =UTF8.setBytesFromString(_messageInfo.message); 200 //conferSendPdu.userData =UTF8.setBytesFromString(_messageInfo.message);
@@ -216,7 +216,7 @@ class ConferApe extends Ape { @@ -216,7 +216,7 @@ class ConferApe extends Ape {
216 sendConferRecordMsg(_param) { 216 sendConferRecordMsg(_param) {
217 if (!this.mcu.connected) { 217 if (!this.mcu.connected) {
218 loger.warn(GlobalConfig.getCurrentStatus()); 218 loger.warn(GlobalConfig.getCurrentStatus());
219 - return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"}; 219 + return { "code": ApeConsts.RETURN_FAILED, "data": "已经断开连接" };
220 } 220 }
221 if (_param == null) { 221 if (_param == null) {
222 loger.warn("控制录制状的消息发送失败,参数错误", _param); 222 loger.warn("控制录制状的消息发送失败,参数错误", _param);
@@ -235,13 +235,13 @@ class ConferApe extends Ape { @@ -235,13 +235,13 @@ class ConferApe extends Ape {
235 235
236 let conferRecordSendPdu = new pdu['RCConferenceRecordRequestPdu']; 236 let conferRecordSendPdu = new pdu['RCConferenceRecordRequestPdu'];
237 conferRecordSendPdu.type = pdu.RCPDU_CONFERENCE_RECORD_REQUEST; 237 conferRecordSendPdu.type = pdu.RCPDU_CONFERENCE_RECORD_REQUEST;
238 - conferRecordSendPdu.peer = 0;//channel 为0 238 + conferRecordSendPdu.peer = 0; //channel 为0
239 conferRecordSendPdu.isPublic = true; 239 conferRecordSendPdu.isPublic = true;
240 240
241 - conferRecordSendPdu.initiator = this._classInfo.nodeId;//发起人 241 + conferRecordSendPdu.initiator = this._classInfo.nodeId; //发起人
242 conferRecordSendPdu.record = GlobalConfig.recordStatus; 242 conferRecordSendPdu.record = GlobalConfig.recordStatus;
243 //conferRecordSendPdu.classTime = GlobalConfig.classTimestamp;//不能使用课堂进行时间,这个时间结束课堂的时候会被清除 243 //conferRecordSendPdu.classTime = GlobalConfig.classTimestamp;//不能使用课堂进行时间,这个时间结束课堂的时候会被清除
244 - conferRecordSendPdu.classTime = GlobalConfig.recordTimestamp;//课堂录制的累积时间,不会被清除 244 + conferRecordSendPdu.classTime = GlobalConfig.recordTimestamp; //课堂录制的累积时间,不会被清除
245 conferRecordSendPdu.filename = GlobalConfig.recordFileName || GlobalConfig.classId + "_" + EngineUtils.creatTimestampYMD() + ".rec"; 245 conferRecordSendPdu.filename = GlobalConfig.recordFileName || GlobalConfig.classId + "_" + EngineUtils.creatTimestampYMD() + ".rec";
246 this.sendChatUniform(conferRecordSendPdu); 246 this.sendChatUniform(conferRecordSendPdu);
247 // to, message 247 // to, message
@@ -251,8 +251,8 @@ class ConferApe extends Ape { @@ -251,8 +251,8 @@ class ConferApe extends Ape {
251 //开启录制 251 //开启录制
252 startRecord() { 252 startRecord() {
253 //如果录制的时间长超出设定的最大录制时间就不再录制 253 //如果录制的时间长超出设定的最大录制时间就不再录制
254 - if(GlobalConfig.recordTimestamp>=GlobalConfig.allowRecordMaxTime){  
255 - loger.warn('不能再录制,录制时间已经达到最大限制',GlobalConfig.recordTimestamp); 254 + if (GlobalConfig.recordTimestamp >= GlobalConfig.allowRecordMaxTime) {
  255 + loger.warn('不能再录制,录制时间已经达到最大限制', GlobalConfig.recordTimestamp);
256 return; 256 return;
257 } 257 }
258 258
@@ -260,33 +260,32 @@ class ConferApe extends Ape { @@ -260,33 +260,32 @@ class ConferApe extends Ape {
260 //如果是host 260 //如果是host
261 if (GlobalConfig.isHost) { 261 if (GlobalConfig.isHost) {
262 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 262 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
263 - this.sendConferRecordMsg({"recordStatus": true}); 263 + this.sendConferRecordMsg({ "recordStatus": true });
264 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 264 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
265 - this._emit(MessageTypes.CLASS_RECORD_START);//课堂开始录制 265 + this._emit(MessageTypes.CLASS_RECORD_START); //课堂开始录制
266 } 266 }
267 } 267 }
268 268
269 //停止录制 269 //停止录制
270 stopRecord(isForce) { 270 stopRecord(isForce) {
271 loger.log('stopRecord', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus); 271 loger.log('stopRecord', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus);
272 - if(isForce&&isForce==true){ 272 + if (isForce && isForce == true) {
273 //强制停止,可以是host之外的身份(比如当前课堂老师异常退出,没有老师,会随机选择一个人来做释放操作) 273 //强制停止,可以是host之外的身份(比如当前课堂老师异常退出,没有老师,会随机选择一个人来做释放操作)
274 if (GlobalConfig.recordStatus) { 274 if (GlobalConfig.recordStatus) {
275 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 275 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
276 - this.sendConferRecordMsg({"recordStatus": false}); 276 + this.sendConferRecordMsg({ "recordStatus": false });
277 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 277 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
278 } 278 }
279 - }else { 279 + } else {
280 //身份是host,并且当前正在录制中 280 //身份是host,并且当前正在录制中
281 if (GlobalConfig.isHost && GlobalConfig.recordStatus) { 281 if (GlobalConfig.isHost && GlobalConfig.recordStatus) {
282 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 282 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
283 - this.sendConferRecordMsg({"recordStatus": false}); 283 + this.sendConferRecordMsg({ "recordStatus": false });
284 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 284 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
285 } 285 }
286 } 286 }
287 } 287 }
288 288
289 -  
290 //主动离开课堂,发送通知到服务器 289 //主动离开课堂,发送通知到服务器
291 leaveClass() { 290 leaveClass() {
292 let nodeInfoRecordPdu = this.mcu.mcuClassInfo.self; 291 let nodeInfoRecordPdu = this.mcu.mcuClassInfo.self;
@@ -328,10 +327,25 @@ class ConferApe extends Ape { @@ -328,10 +327,25 @@ class ConferApe extends Ape {
328 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 327 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
329 this.stopRecord(); 328 this.stopRecord();
330 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 329 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
331 - this.sendUpdaterClassStatusInfo({"actionType": 0,isStopAllPublishMedia:true}); 330 + this.sendUpdaterClassStatusInfo({ "actionType": 0, isStopAllPublishMedia: true });
332 loger.log('restorClass'); 331 loger.log('restorClass');
333 } 332 }
334 333
  334 + // 全局禁言
  335 + silenceClass(isSilence) {
  336 + if (GlobalConfig.isHost) {
  337 + GlobalConfig.silence = !!isSilence;
  338 +
  339 + //禁言状态改变
  340 + this._emit(MessageTypes.CLASS_SILENCE_CHANGE, GlobalConfig.silence);
  341 +
  342 + //同步禁言状态
  343 + this.sendUpdaterClassStatusInfo();
  344 + } else {
  345 + loger.warn('没有开始课堂的权限');
  346 + }
  347 + }
  348 +
335 //开始上课 349 //开始上课
336 startClass(_param) { 350 startClass(_param) {
337 if (GlobalConfig.isHost) { 351 if (GlobalConfig.isHost) {
@@ -342,8 +356,7 @@ class ConferApe extends Ape { @@ -342,8 +356,7 @@ class ConferApe extends Ape {
342 //如果录制的文件名不存在,需要创建一个名字 356 //如果录制的文件名不存在,需要创建一个名字
343 let timestampYMD = EngineUtils.creatTimestampYMD(); 357 let timestampYMD = EngineUtils.creatTimestampYMD();
344 GlobalConfig.recordFileName = GlobalConfig.recordFileName || 358 GlobalConfig.recordFileName = GlobalConfig.recordFileName ||
345 - GlobalConfig.siteId + "/" + timestampYMD + "/"  
346 - + GlobalConfig.classId + "_" + timestampYMD + ".rec";//4、文件名称 $RECORD_HOME/`site id`/`日期`/`filename` 例:/data/record/su/20161216/`filename` 359 + GlobalConfig.siteId + "/" + timestampYMD + "/" + GlobalConfig.classId + "_" + timestampYMD + ".rec"; //4、文件名称 $RECORD_HOME/`site id`/`日期`/`filename` 例:/data/record/su/20161216/`filename`
347 360
348 if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT) { 361 if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT) {
349 //之前是为开始状态,第一次点开始 362 //之前是为开始状态,第一次点开始
@@ -356,7 +369,7 @@ class ConferApe extends Ape { @@ -356,7 +369,7 @@ class ConferApe extends Ape {
356 //课堂状态改变 369 //课堂状态改变
357 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 370 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
358 //同步课堂状态 371 //同步课堂状态
359 - this.sendUpdaterClassStatusInfo({"actionType": 1,isStopAllPublishMedia:true}); 372 + this.sendUpdaterClassStatusInfo({ "actionType": 1, isStopAllPublishMedia: true });
360 373
361 //开始计时 374 //开始计时
362 this.startTimerCounter(); 375 this.startTimerCounter();
@@ -375,8 +388,8 @@ class ConferApe extends Ape { @@ -375,8 +388,8 @@ class ConferApe extends Ape {
375 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 388 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
376 389
377 this.stopRecord(); 390 this.stopRecord();
378 - this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE,_param);  
379 - this.sendUpdaterClassStatusInfo({"actionType": 2,isStopAllPublishMedia:true}); 391 + this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE, _param);
  392 + this.sendUpdaterClassStatusInfo({ "actionType": 2, isStopAllPublishMedia: true });
380 this.stopTimerCounter(); 393 this.stopTimerCounter();
381 } 394 }
382 395
@@ -390,58 +403,77 @@ class ConferApe extends Ape { @@ -390,58 +403,77 @@ class ConferApe extends Ape {
390 this.stopTimerCounter(); 403 this.stopTimerCounter();
391 this.restorClass(); 404 this.restorClass();
392 //把所有人都踢出课堂 405 //把所有人都踢出课堂
393 - this.sendConferMsg({"to": 0, "message": "所有人退出课堂", "actionType": ApeConsts.CLASS_ACTION_CLOSE_ALL}); 406 + this.sendConferMsg({ "to": 0, "message": "所有人退出课堂", "actionType": ApeConsts.CLASS_ACTION_CLOSE_ALL });
394 } 407 }
395 //更新设备信息 408 //更新设备信息
396 - updateDeviceInfo(_param){  
397 - loger.log('更新用户的设备信息->',_param); 409 + updateDeviceInfo(_param) {
  410 + loger.log('更新用户的设备信息->', _param);
  411 + this.updateUserInfo();
  412 + }
  413 +
  414 + // 禁言控制
  415 + controlSilenceStatus(_param) {
  416 + //控制用户的禁言状态
  417 + if (!_param || !_param.nodeId) {
  418 + loger.log('控制禁言状态->失败->参数错误', _param);
  419 + return;
  420 + }
  421 + let msgObj = {};
  422 + msgObj.nodeId = _param.nodeId;
  423 + msgObj.silence = _param.silence || '';
  424 + this.sendConferMsg({ "to": _param.nodeId, "message": JSON.stringify(msgObj), "actionType": ApeConsts.USER_ACTION_SILENCE_STATUS_CHANGE });
  425 + }
  426 +
  427 + changeSilenceStatus(_param) {
  428 + loger.log('切换禁言状态->', _param);
  429 + GlobalConfig.selfSilence = _param.silence;
398 this.updateUserInfo(); 430 this.updateUserInfo();
399 } 431 }
400 432
401 //控制举手状态 433 //控制举手状态
402 - controlHandUpStatus(_param){ 434 + controlHandUpStatus(_param) {
403 //控制用户的举手状态 435 //控制用户的举手状态
404 - if(!_param||!_param.nodeId){  
405 - loger.log('控制举手状态->失败->参数错误',_param); 436 + if (!_param || !_param.nodeId) {
  437 + loger.log('控制举手状态->失败->参数错误', _param);
406 return; 438 return;
407 } 439 }
408 - let msgObj={};  
409 - msgObj.nodeId=_param.nodeId;  
410 - msgObj.isHandUp=false;  
411 - if(_param&&_param.isHandUp==true){  
412 - msgObj.isHandUp=true; 440 + let msgObj = {};
  441 + msgObj.nodeId = _param.nodeId;
  442 + msgObj.isHandUp = false;
  443 + if (_param && _param.isHandUp == true) {
  444 + msgObj.isHandUp = true;
413 } 445 }
414 - this.sendConferMsg({"to":_param.nodeId, "message":JSON.stringify(msgObj), "actionType": ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE}); 446 + this.sendConferMsg({ "to": _param.nodeId, "message": JSON.stringify(msgObj), "actionType": ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE });
415 } 447 }
  448 +
416 //切换举手状态 449 //切换举手状态
417 - changeHandUpStatus(_param){  
418 - loger.log('切换举手状态->',_param);  
419 - if(_param&&_param.isHandUp==true){ 450 + changeHandUpStatus(_param) {
  451 + loger.log('切换举手状态->', _param);
  452 + if (_param && _param.isHandUp == true) {
420 //举手 453 //举手
421 - GlobalConfig.handUpTime=EngineUtils.creatTimestamp();  
422 - }else {  
423 - GlobalConfig.handUpTime=0;//默认0是没有举手的状态(大于0就是举手) 454 + GlobalConfig.handUpTime = EngineUtils.creatTimestamp();
  455 + } else {
  456 + GlobalConfig.handUpTime = 0; //默认0是没有举手的状态(大于0就是举手)
424 } 457 }
425 this.updateUserInfo(); 458 this.updateUserInfo();
426 } 459 }
427 //课堂的场景模块发送改变 460 //课堂的场景模块发送改变
428 - sceneTableChange(_param){  
429 - if(GlobalConfig.isRecordPlayBack){ 461 + sceneTableChange(_param) {
  462 + if (GlobalConfig.isRecordPlayBack) {
430 return; 463 return;
431 } 464 }
432 - loger.log('切换文档-媒体-屏幕模块切换->',_param); 465 + loger.log('切换文档-媒体-屏幕模块切换->', _param);
433 //如果是host身份 466 //如果是host身份
434 if (GlobalConfig.isHost) { 467 if (GlobalConfig.isHost) {
435 - if(_param){  
436 - GlobalConfig.currentSceneTableId=parseInt(_param.currentSceneTableId)||0;//当前场景显示的模块 0=文档模块、1=屏幕共享、2=媒体共享 468 + if (_param) {
  469 + GlobalConfig.currentSceneTableId = parseInt(_param.currentSceneTableId) || 0; //当前场景显示的模块 0=文档模块、1=屏幕共享、2=媒体共享
437 //保存数据到Sass 470 //保存数据到Sass
438 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 471 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
439 //同步消息给其他人 472 //同步消息给其他人
440 - this.sendUpdaterClassStatusInfo({"actionType": 1,isStopAllPublishMedia:false}); 473 + this.sendUpdaterClassStatusInfo({ "actionType": 1, isStopAllPublishMedia: false });
441 } 474 }
442 } 475 }
443 476
444 -  
445 } 477 }
446 //更新课堂信息 478 //更新课堂信息
447 sendUpdaterClassStatusInfo(_param) { 479 sendUpdaterClassStatusInfo(_param) {
@@ -452,7 +484,7 @@ class ConferApe extends Ape { @@ -452,7 +484,7 @@ class ConferApe extends Ape {
452 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG); 484 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
453 return; 485 return;
454 } 486 }
455 - let itemIdx = ApeConsts.CONFERENCE_OBJ_TABLE_ID;// itemIdx=_param.itemIdx; 487 + let itemIdx = ApeConsts.CONFERENCE_OBJ_TABLE_ID; // itemIdx=_param.itemIdx;
456 let modelPdu = this.packPdu(_param, itemIdx); 488 let modelPdu = this.packPdu(_param, itemIdx);
457 loger.log(modelPdu); 489 loger.log(modelPdu);
458 if (modelPdu == null) { 490 if (modelPdu == null) {
@@ -463,19 +495,17 @@ class ConferApe extends Ape { @@ -463,19 +495,17 @@ class ConferApe extends Ape {
463 495
464 let tableItemPdu = new pdu['RCRegistryTableItemPdu']; 496 let tableItemPdu = new pdu['RCRegistryTableItemPdu'];
465 tableItemPdu.itemIdx = itemIdx; 497 tableItemPdu.itemIdx = itemIdx;
466 - tableItemPdu.owner = 0;//收到flash的是这个值,不清楚先写固定 498 + tableItemPdu.owner = 0; //收到flash的是这个值,不清楚先写固定
467 tableItemPdu.registerObjId = ApeConsts.CONFERENCE_OBJ_TABLE_ID; 499 tableItemPdu.registerObjId = ApeConsts.CONFERENCE_OBJ_TABLE_ID;
468 tableItemPdu.itemData = modelPdu.toArrayBuffer(); 500 tableItemPdu.itemData = modelPdu.toArrayBuffer();
469 501
470 -  
471 //updater 502 //updater
472 let tableUpdateItem = new pdu['RCRegistryTableUpdateItemPdu']; 503 let tableUpdateItem = new pdu['RCRegistryTableUpdateItemPdu'];
473 //optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU]; 504 //optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
474 //repeated RCRegistryTableItemPdu items = 2; 505 //repeated RCRegistryTableItemPdu items = 2;
475 - tableUpdateItem.type = pdu.RCPDU_REG_TABLE_UPDATE_PDU;// 506 + tableUpdateItem.type = pdu.RCPDU_REG_TABLE_UPDATE_PDU; //
476 tableUpdateItem.items.push(tableItemPdu); 507 tableUpdateItem.items.push(tableItemPdu);
477 508
478 -  
479 let updateObjPdu = new pdu['RCRegistryUpdateObjPdu']; 509 let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
480 updateObjPdu.objId = ApeConsts.CONFERENCE_OBJ_TABLE_ID; 510 updateObjPdu.objId = ApeConsts.CONFERENCE_OBJ_TABLE_ID;
481 updateObjPdu.subType = tableUpdateItem.type; 511 updateObjPdu.subType = tableUpdateItem.type;
@@ -493,7 +523,6 @@ class ConferApe extends Ape { @@ -493,7 +523,6 @@ class ConferApe extends Ape {
493 this.sendUniform(adapterPdu, true); 523 this.sendUniform(adapterPdu, true);
494 } 524 }
495 525
496 -  
497 /////收到消息处理///////////////////////////////////////////////////////////////////////////////// 526 /////收到消息处理/////////////////////////////////////////////////////////////////////////////////
498 //加入channel成功 527 //加入channel成功
499 onJoinChannelHandlerSuccess() { 528 onJoinChannelHandlerSuccess() {
@@ -506,12 +535,12 @@ class ConferApe extends Ape { @@ -506,12 +535,12 @@ class ConferApe extends Ape {
506 535
507 //如果是host ,开始录制 536 //如果是host ,开始录制
508 this.startRecord(); 537 this.startRecord();
509 - }else if(GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT&&  
510 - GlobalConfig.isHost&& GlobalConfig.isAutoStartClass&&  
511 - !GlobalConfig.isRecordPlayBack){ 538 + } else if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT &&
  539 + GlobalConfig.isHost && GlobalConfig.isAutoStartClass &&
  540 + !GlobalConfig.isRecordPlayBack) {
512 //自动开始上课的4个条件 541 //自动开始上课的4个条件
513 //1.如果自己是host,2.Sass配置的是自动开始上课,3.并且当前是未开始状态,4.当前不是录制回放,开始自动上课 542 //1.如果自己是host,2.Sass配置的是自动开始上课,3.并且当前是未开始状态,4.当前不是录制回放,开始自动上课
514 - loger.log('自动开始上课->classStatus:', GlobalConfig.classStatus, " isHost:",GlobalConfig.isHost, " isAutoStartClass:",GlobalConfig.isAutoStartClass, " isRecordPlayBack:",GlobalConfig.isRecordPlayBack); 543 + loger.log('自动开始上课->classStatus:', GlobalConfig.classStatus, " isHost:", GlobalConfig.isHost, " isAutoStartClass:", GlobalConfig.isAutoStartClass, " isRecordPlayBack:", GlobalConfig.isRecordPlayBack);
515 this.startClass(); 544 this.startClass();
516 } 545 }
517 } 546 }
@@ -519,7 +548,7 @@ class ConferApe extends Ape { @@ -519,7 +548,7 @@ class ConferApe extends Ape {
519 //开启计时器 548 //开启计时器
520 startTimerCounter() { 549 startTimerCounter() {
521 this.stopTimerCounter(); 550 this.stopTimerCounter();
522 - if(this.timerCounter){ 551 + if (this.timerCounter) {
523 this.timerCounter.startTimer(); 552 this.timerCounter.startTimer();
524 } 553 }
525 554
@@ -527,7 +556,7 @@ class ConferApe extends Ape { @@ -527,7 +556,7 @@ class ConferApe extends Ape {
527 556
528 //停止计时器 557 //停止计时器
529 stopTimerCounter() { 558 stopTimerCounter() {
530 - if(this.timerCounter){ 559 + if (this.timerCounter) {
531 this.timerCounter.stopTimer(); 560 this.timerCounter.stopTimer();
532 } 561 }
533 562
@@ -543,15 +572,14 @@ class ConferApe extends Ape { @@ -543,15 +572,14 @@ class ConferApe extends Ape {
543 loger.warn('当前课堂已经暂停或者未开始,不计时', "classStatus-->", GlobalConfig.classStatus); 572 loger.warn('当前课堂已经暂停或者未开始,不计时', "classStatus-->", GlobalConfig.classStatus);
544 return; 573 return;
545 } 574 }
546 - GlobalConfig.classTimestamp = GlobalConfig.classTimestamp + 1;//计时 575 + GlobalConfig.classTimestamp = GlobalConfig.classTimestamp + 1; //计时
547 576
548 //老师身份的时候要记录录制的时间 577 //老师身份的时候要记录录制的时间
549 - if(GlobalConfig.isHost){  
550 - GlobalConfig.recordTimestamp=GlobalConfig.recordTimestamp+1; 578 + if (GlobalConfig.isHost) {
  579 + GlobalConfig.recordTimestamp = GlobalConfig.recordTimestamp + 1;
551 } 580 }
552 //loger.log('课堂进行时间',GlobalConfig.classTimestamp); 581 //loger.log('课堂进行时间',GlobalConfig.classTimestamp);
553 - this._emit(MessageTypes.CLASS_UPDATE_TIMER, {"classTimestamp": GlobalConfig.classTimestamp});  
554 - 582 + this._emit(MessageTypes.CLASS_UPDATE_TIMER, { "classTimestamp": GlobalConfig.classTimestamp });
555 583
556 if (GlobalConfig.classTimestamp % GlobalConfig.updateClassInfoDelay == 0) { 584 if (GlobalConfig.classTimestamp % GlobalConfig.updateClassInfoDelay == 0) {
557 //如果是host身份,需要同步时间给其他人,同时把当前的状态上传到服务器 585 //如果是host身份,需要同步时间给其他人,同时把当前的状态上传到服务器
@@ -560,12 +588,12 @@ class ConferApe extends Ape { @@ -560,12 +588,12 @@ class ConferApe extends Ape {
560 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 588 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
561 589
562 //同步消息给其他人 590 //同步消息给其他人
563 - this.sendUpdaterClassStatusInfo({"actionType": 1,isStopAllPublishMedia:false}); 591 + this.sendUpdaterClassStatusInfo({ "actionType": 1, isStopAllPublishMedia: false });
564 } 592 }
565 } 593 }
566 594
567 //进行MS动态选点,选择最快的MS服务器地址(录制回放不做处理) 595 //进行MS动态选点,选择最快的MS服务器地址(录制回放不做处理)
568 - if (!GlobalConfig.isRecordPlayBack&&GlobalConfig.classTimestamp % GlobalConfig.msDynamicChooseIpDelay == 0) { 596 + if (!GlobalConfig.isRecordPlayBack && GlobalConfig.classTimestamp % GlobalConfig.msDynamicChooseIpDelay == 0) {
569 this._emit(MessageTypes.SWITCH_MS_IP); 597 this._emit(MessageTypes.SWITCH_MS_IP);
570 } 598 }
571 } 599 }
@@ -573,22 +601,22 @@ class ConferApe extends Ape { @@ -573,22 +601,22 @@ class ConferApe extends Ape {
573 tableUpdateHandler(owner, itemIdx, itemData) { 601 tableUpdateHandler(owner, itemIdx, itemData) {
574 try { 602 try {
575 let model = this.unPackPdu(owner, itemIdx, itemData); 603 let model = this.unPackPdu(owner, itemIdx, itemData);
576 - loger.log('课堂数据更新->',model); 604 + loger.log('课堂数据更新->', model);
577 605
578 //处理课堂更新的信息 606 //处理课堂更新的信息
579 if (model && model.classStatusInfo) { 607 if (model && model.classStatusInfo) {
580 GlobalConfig.setClassStatusInfo(model.classStatusInfo); 608 GlobalConfig.setClassStatusInfo(model.classStatusInfo);
581 609
582 - if( model.classStatusInfo.isStopAllPublishMedia){ 610 + if (model.classStatusInfo.isStopAllPublishMedia) {
583 //课堂状态发送改变 需要对当前正在推的流进行停止,因为录制的问题; 611 //课堂状态发送改变 需要对当前正在推的流进行停止,因为录制的问题;
584 this._emit(MessageTypes.STOP_ALL_MEDIA_PUBLISH); 612 this._emit(MessageTypes.STOP_ALL_MEDIA_PUBLISH);
585 } 613 }
586 } 614 }
587 615
588 //通知应用层更新课堂状态 616 //通知应用层更新课堂状态
589 - let classInfo=GlobalConfig.classStatusInfo; 617 + let classInfo = GlobalConfig.classStatusInfo;
590 loger.log('通知应用层更新课堂状态->CLASS_UPTATE_STATUS') 618 loger.log('通知应用层更新课堂状态->CLASS_UPTATE_STATUS')
591 - this._emit(MessageTypes.CLASS_UPTATE_STATUS,classInfo); 619 + this._emit(MessageTypes.CLASS_UPTATE_STATUS, classInfo);
592 620
593 //如果MCU已经断开连接,停止计时器 621 //如果MCU已经断开连接,停止计时器
594 if (!this.mcu.connected) { 622 if (!this.mcu.connected) {
@@ -609,7 +637,6 @@ class ConferApe extends Ape { @@ -609,7 +637,6 @@ class ConferApe extends Ape {
609 } 637 }
610 } 638 }
611 639
612 -  
613 conferMsgComingHandler(_data) { 640 conferMsgComingHandler(_data) {
614 //flash RCConferenceSendDataRequestPdu 641 //flash RCConferenceSendDataRequestPdu
615 //loger.warn('conferMsgComingHandler needs to be handled.'); 642 //loger.warn('conferMsgComingHandler needs to be handled.');
@@ -623,22 +650,33 @@ class ConferApe extends Ape { @@ -623,22 +650,33 @@ class ConferApe extends Ape {
623 chatMsg.toNodeID = chatReceivePdu.peer; 650 chatMsg.toNodeID = chatReceivePdu.peer;
624 chatMsg.message = this._rCArrayBufferUtil.uint8ArrayToStr(chatReceivePdu.userData, 2); 651 chatMsg.message = this._rCArrayBufferUtil.uint8ArrayToStr(chatReceivePdu.userData, 2);
625 chatMsg.actionType = chatReceivePdu.actionType; 652 chatMsg.actionType = chatReceivePdu.actionType;
626 - loger.log("conferMsgComingHandler", chatMsg);//{"fromNodeID":418883112,"toNodeID":0,"message":"所有人退出课堂","actionType":1} 653 + loger.log("conferMsgComingHandler", chatMsg); //{"fromNodeID":418883112,"toNodeID":0,"message":"所有人退出课堂","actionType":1}
627 switch (chatMsg.actionType) { 654 switch (chatMsg.actionType) {
628 case ApeConsts.CLASS_ACTION_CLOSE_ALL: 655 case ApeConsts.CLASS_ACTION_CLOSE_ALL:
629 loger.log(chatMsg.message); 656 loger.log(chatMsg.message);
630 //收到课堂关闭,所有人都退出,执行自己关闭的流程 657 //收到课堂关闭,所有人都退出,执行自己关闭的流程
631 - this._emit(MessageTypes.CLASS_RUN_EXIT,{'type':1}); 658 + this._emit(MessageTypes.CLASS_RUN_EXIT, { 'type': 1 });
632 break; 659 break;
633 case ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE: 660 case ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE:
634 - console.log('chatMsg',chatMsg);  
635 - let msgObj=null;  
636 - try{  
637 - msgObj =JSON.parse(chatMsg.message);  
638 - if(msgObj&&msgObj.nodeId==GlobalConfig.nodeId){ 661 + console.log('chatMsg', chatMsg);
  662 + let msgObj = null;
  663 + try {
  664 + msgObj = JSON.parse(chatMsg.message);
  665 + if (msgObj && msgObj.nodeId == GlobalConfig.nodeId) {
639 this.changeHandUpStatus(msgObj); 666 this.changeHandUpStatus(msgObj);
640 } 667 }
641 - }catch (err){ 668 + } catch (err) {
  669 + loger.warn('chatMsg->JSON数据解析失败');
  670 + }
  671 + break;
  672 + case ApeConsts.USER_ACTION_SILENCE_STATUS_CHANGE:
  673 + let msgObj = null;
  674 + try {
  675 + msgObj = JSON.parse(chatMsg.message);
  676 + if (msgObj && msgObj.nodeId == GlobalConfig.nodeId) {
  677 + this.changeSilenceStatus(msgObj);
  678 + }
  679 + } catch (err) {
642 loger.warn('chatMsg->JSON数据解析失败'); 680 loger.warn('chatMsg->JSON数据解析失败');
643 } 681 }
644 break; 682 break;
@@ -649,13 +687,13 @@ class ConferApe extends Ape { @@ -649,13 +687,13 @@ class ConferApe extends Ape {
649 687
650 //-------------第三方消息------------------------------ 688 //-------------第三方消息------------------------------
651 //收到父级页面的消息,需要广播发送出去 689 //收到父级页面的消息,需要广播发送出去
652 - onThirdReciveParentMessage(_msg){  
653 - loger.log('收到页面的消息->广播给其他模块->',_msg);  
654 - this.sendThirdBroadcastData({to:0,message:_msg}); 690 + onThirdReciveParentMessage(_msg) {
  691 + loger.log('收到页面的消息->广播给其他模块->', _msg);
  692 + this.sendThirdBroadcastData({ to: 0, message: _msg });
655 } 693 }
656 //发送第三方广播消息 694 //发送第三方广播消息
657 - sendThirdBroadcastData(_param){  
658 - loger.log("发送第三方广播消息->",_param); 695 + sendThirdBroadcastData(_param) {
  696 + loger.log("发送第三方广播消息->", _param);
659 if (this._classInfo == null || EngineUtils.isEmptyObject(this._classInfo)) { 697 if (this._classInfo == null || EngineUtils.isEmptyObject(this._classInfo)) {
660 loger.log('发送第三方广播消息->失败->SDK还未初始化数据!'); 698 loger.log('发送第三方广播消息->失败->SDK还未初始化数据!');
661 if (GlobalConfig.getCurrentStatus().code == 0 || GlobalConfig.getCurrentStatus().code == 1) { 699 if (GlobalConfig.getCurrentStatus().code == 0 || GlobalConfig.getCurrentStatus().code == 1) {
@@ -667,8 +705,8 @@ class ConferApe extends Ape { @@ -667,8 +705,8 @@ class ConferApe extends Ape {
667 705
668 let thirdBroadcastSendPdu = new pdu['RCThirdSendBroadcastDataRequestPdu']; 706 let thirdBroadcastSendPdu = new pdu['RCThirdSendBroadcastDataRequestPdu'];
669 thirdBroadcastSendPdu.type = pdu.RCPDU_THIRD_BROADCAST_DATA_REQUEST; 707 thirdBroadcastSendPdu.type = pdu.RCPDU_THIRD_BROADCAST_DATA_REQUEST;
670 - thirdBroadcastSendPdu.initiator = this._classInfo.nodeId;//发起人  
671 - thirdBroadcastSendPdu.peer = parseInt(_param.to)||0;//发送给谁,公聊的时候是0,私聊的时候是指定的用户id 708 + thirdBroadcastSendPdu.initiator = this._classInfo.nodeId; //发起人
  709 + thirdBroadcastSendPdu.peer = parseInt(_param.to) || 0; //发送给谁,公聊的时候是0,私聊的时候是指定的用户id
672 thirdBroadcastSendPdu.isPublic = true; 710 thirdBroadcastSendPdu.isPublic = true;
673 thirdBroadcastSendPdu.message = this._rCArrayBufferUtil.strToUint8Array("h5" + _param.message); 711 thirdBroadcastSendPdu.message = this._rCArrayBufferUtil.strToUint8Array("h5" + _param.message);
674 712
@@ -681,9 +719,8 @@ class ConferApe extends Ape { @@ -681,9 +719,8 @@ class ConferApe extends Ape {
681 } 719 }
682 } 720 }
683 721
684 -  
685 //监听第三方消息通道消息 722 //监听第三方消息通道消息
686 - onThirdBroadcastDataHandler(_data){ 723 + onThirdBroadcastDataHandler(_data) {
687 //loger.log("监听第三方消息通道消息->",_data); 724 //loger.log("监听第三方消息通道消息->",_data);
688 let thirdBroadcastReceivePdu = pdu['RCThirdSendBroadcastDataRequestPdu'].decode(_data); 725 let thirdBroadcastReceivePdu = pdu['RCThirdSendBroadcastDataRequestPdu'].decode(_data);
689 let thirdMessage = {}; 726 let thirdMessage = {};
@@ -692,7 +729,7 @@ class ConferApe extends Ape { @@ -692,7 +729,7 @@ class ConferApe extends Ape {
692 //loger.log("监听第三方消息通道消息->1", thirdMessage); 729 //loger.log("监听第三方消息通道消息->1", thirdMessage);
693 thirdMessage.message = this._rCArrayBufferUtil.uint8ArrayToStr(thirdBroadcastReceivePdu.message, 2); 730 thirdMessage.message = this._rCArrayBufferUtil.uint8ArrayToStr(thirdBroadcastReceivePdu.message, 2);
694 loger.log("监听第三方消息通道消息->", thirdMessage); 731 loger.log("监听第三方消息通道消息->", thirdMessage);
695 - if(this.thirdMessage){ 732 + if (this.thirdMessage) {
696 this.thirdMessage.sendMessageToParent(thirdMessage.message); 733 this.thirdMessage.sendMessageToParent(thirdMessage.message);
697 } 734 }
698 } 735 }
@@ -703,8 +740,8 @@ class ConferApe extends Ape { @@ -703,8 +740,8 @@ class ConferApe extends Ape {
703 try { 740 try {
704 let conferRecordSendPdu = pdu['RCConferenceRecordRequestPdu'].decode(_data); 741 let conferRecordSendPdu = pdu['RCConferenceRecordRequestPdu'].decode(_data);
705 // {"initiator":820461225,"record":false,"classTime":3213,"filename":"h5dev/20170410/1437784290_20170410.rec"} 742 // {"initiator":820461225,"record":false,"classTime":3213,"filename":"h5dev/20170410/1437784290_20170410.rec"}
706 - loger.log("录制回放控制操作成功->",conferRecordSendPdu);  
707 - if(conferRecordSendPdu&&conferRecordSendPdu.record==true||conferRecordSendPdu.record=="true"){ 743 + loger.log("录制回放控制操作成功->", conferRecordSendPdu);
  744 + if (conferRecordSendPdu && conferRecordSendPdu.record == true || conferRecordSendPdu.record == "true") {
708 //每次开启录制的时候,需要把当前显示的文档数据更新一次,否则无法录制已经显示的文件 745 //每次开启录制的时候,需要把当前显示的文档数据更新一次,否则无法录制已经显示的文件
709 this._emit(MessageTypes.CLASS_RECORD_SUCCESS); 746 this._emit(MessageTypes.CLASS_RECORD_SUCCESS);
710 } 747 }
@@ -726,20 +763,20 @@ class ConferApe extends Ape { @@ -726,20 +763,20 @@ class ConferApe extends Ape {
726 763
727 //更新人员列表数据 764 //更新人员列表数据
728 rosterUpdateHandler(nodeId, nodeData) { 765 rosterUpdateHandler(nodeId, nodeData) {
729 - nodeData.userRole=ApeConsts.userTypes[nodeData.role]; 766 + nodeData.userRole = ApeConsts.userTypes[nodeData.role];
730 //如果是自己的信息,不处理跳过 767 //如果是自己的信息,不处理跳过
731 if (nodeId == GlobalConfig.nodeId) { 768 if (nodeId == GlobalConfig.nodeId) {
732 //loger.log("自己加入课堂的消息->",nodeId,"role-->", nodeData.role, ApeConsts.userTypes[nodeData.role]); 769 //loger.log("自己加入课堂的消息->",nodeId,"role-->", nodeData.role, ApeConsts.userTypes[nodeData.role]);
733 //自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂: 770 //自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂:
734 // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中) 771 // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中)
735 - let rosterLen=Object.keys(this.rosters).length;  
736 - if(rosterLen<1&&!GlobalConfig.isHost&&GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED){ 772 + let rosterLen = Object.keys(this.rosters).length;
  773 + if (rosterLen < 1 && !GlobalConfig.isHost && GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) {
737 loger.warn("当前课堂没有老师->暂停课堂"); 774 loger.warn("当前课堂没有老师->暂停课堂");
738 - this.pauseClass({isForce:true}); 775 + this.pauseClass({ isForce: true });
739 this.stopRecord(true); 776 this.stopRecord(true);
740 } 777 }
741 //处理用户信息 778 //处理用户信息
742 - this.unPackRosterInfo(nodeId,nodeData); 779 + this.unPackRosterInfo(nodeId, nodeData);
743 return; 780 return;
744 } 781 }
745 782
@@ -752,10 +789,10 @@ class ConferApe extends Ape { @@ -752,10 +789,10 @@ class ConferApe extends Ape {
752 if (nodeData.role == ApeConsts.NR_HOST && GlobalConfig.isHost) { 789 if (nodeData.role == ApeConsts.NR_HOST && GlobalConfig.isHost) {
753 this.kickOutRoster(); 790 this.kickOutRoster();
754 return; 791 return;
755 - }else if(nodeData.userId==GlobalConfig.userId&&GlobalConfig.userId!="0"){  
756 - loger.log("异地登陆->userId->",GlobalConfig.userId); 792 + } else if (nodeData.userId == GlobalConfig.userId && GlobalConfig.userId != "0") {
  793 + loger.log("异地登陆->userId->", GlobalConfig.userId);
757 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_REMOTE_LANDING); 794 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_REMOTE_LANDING);
758 - this._emit(MessageTypes.CLASS_RUN_EXIT,{'type':1}); 795 + this._emit(MessageTypes.CLASS_RUN_EXIT, { 'type': 1 });
759 } 796 }
760 } 797 }
761 /*if (parseInt(nodeId) > GlobalConfig.nodeId) { 798 /*if (parseInt(nodeId) > GlobalConfig.nodeId) {
@@ -779,10 +816,10 @@ class ConferApe extends Ape { @@ -779,10 +816,10 @@ class ConferApe extends Ape {
779 }*/ 816 }*/
780 817
781 //处理用户信息 818 //处理用户信息
782 - this.unPackRosterInfo(nodeId,nodeData); 819 + this.unPackRosterInfo(nodeId, nodeData);
783 } 820 }
784 //处理用户信息 821 //处理用户信息
785 - unPackRosterInfo(nodeId,nodeData){ 822 + unPackRosterInfo(nodeId, nodeData) {
786 let rosterExists = this.rosters[nodeId]; 823 let rosterExists = this.rosters[nodeId];
787 this.rosters[nodeId] = nodeData; 824 this.rosters[nodeId] = nodeData;
788 let userDataObj = null; 825 let userDataObj = null;
@@ -795,19 +832,19 @@ class ConferApe extends Ape { @@ -795,19 +832,19 @@ class ConferApe extends Ape {
795 let newNodeData = nodeData; 832 let newNodeData = nodeData;
796 newNodeData.userData = userDataObj; 833 newNodeData.userData = userDataObj;
797 //如果是监课,不告诉其他人 834 //如果是监课,不告诉其他人
798 - if (nodeData.role == ApeConsts.NR_INVISIBLE&&GlobalConfig.userRole!=ApeConsts.invisible) { 835 + if (nodeData.role == ApeConsts.NR_INVISIBLE && GlobalConfig.userRole != ApeConsts.invisible) {
799 loger.log("NR_INVISIBLE"); 836 loger.log("NR_INVISIBLE");
800 return; 837 return;
801 } 838 }
802 if (!rosterExists) { 839 if (!rosterExists) {
803 - loger.log("人员加入->",newNodeData);  
804 - this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData}); 840 + loger.log("人员加入->", newNodeData);
  841 + this._emit(MessageTypes.CLASS_INSERT_ROSTER, { "nodeId": nodeId, "nodeData": newNodeData });
805 this.emitRosterChange(); 842 this.emitRosterChange();
806 843
807 } else { 844 } else {
808 //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists); 845 //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists);
809 - loger.log("人员更新信息->",newNodeData);  
810 - this._emit(MessageTypes.CLASS_UPDATE_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData}); 846 + loger.log("人员更新信息->", newNodeData);
  847 + this._emit(MessageTypes.CLASS_UPDATE_ROSTER, { "nodeId": nodeId, "nodeData": newNodeData });
811 } 848 }
812 849
813 } 850 }
@@ -815,7 +852,7 @@ class ConferApe extends Ape { @@ -815,7 +852,7 @@ class ConferApe extends Ape {
815 //踢出用户 852 //踢出用户
816 kickOutRoster() { 853 kickOutRoster() {
817 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_KICK_OUT); 854 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_KICK_OUT);
818 - this._emit(MessageTypes.CLASS_RUN_EXIT,{'type':1}); 855 + this._emit(MessageTypes.CLASS_RUN_EXIT, { 'type': 1 });
819 } 856 }
820 857
821 //视频模块发生更新,人员状态需要更新 858 //视频模块发生更新,人员状态需要更新
@@ -824,7 +861,7 @@ class ConferApe extends Ape { @@ -824,7 +861,7 @@ class ConferApe extends Ape {
824 //如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的 861 //如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的
825 if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING && this.rosters[_param.fromNodeId] == null) { 862 if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING && this.rosters[_param.fromNodeId] == null) {
826 loger.log("媒体模块被占用->占有人已经不存在课堂中->释放->", _param); 863 loger.log("媒体模块被占用->占有人已经不存在课堂中->释放->", _param);
827 - this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": _param.fromNodeId}); 864 + this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, { "nodeId": _param.fromNodeId });
828 } 865 }
829 866
830 /* if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING) { 867 /* if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING) {
@@ -855,8 +892,8 @@ class ConferApe extends Ape { @@ -855,8 +892,8 @@ class ConferApe extends Ape {
855 }*/ 892 }*/
856 } 893 }
857 //设备状态更新 894 //设备状态更新
858 - updaterUserDeviecStatusChange(_data){  
859 - loger.log("音视频设备状态更新->",_data); 895 + updaterUserDeviecStatusChange(_data) {
  896 + loger.log("音视频设备状态更新->", _data);
860 this.updateUserInfo(); 897 this.updateUserInfo();
861 } 898 }
862 899
@@ -865,15 +902,15 @@ class ConferApe extends Ape { @@ -865,15 +902,15 @@ class ConferApe extends Ape {
865 if (GlobalConfig.nodeId == nodeId) { 902 if (GlobalConfig.nodeId == nodeId) {
866 loger.log("自己离开课堂"); 903 loger.log("自己离开课堂");
867 // 自己退出 904 // 自己退出
868 - this._emit(MessageTypes.CLASS_RUN_EXIT,{'type':0}); 905 + this._emit(MessageTypes.CLASS_RUN_EXIT, { 'type': 0 });
869 } else { 906 } else {
870 - let user=this.rosters[nodeId];  
871 - if(user){  
872 - loger.log(nodeId, "->离开课堂->身份->",user.role); 907 + let user = this.rosters[nodeId];
  908 + if (user) {
  909 + loger.log(nodeId, "->离开课堂->身份->", user.role);
873 } 910 }
874 delete this.rosters[nodeId]; 911 delete this.rosters[nodeId];
875 this.emitRosterChange(); 912 this.emitRosterChange();
876 - this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId": nodeId}); 913 + this._emit(MessageTypes.CLASS_DELETE_ROSTER, { "nodeId": nodeId });
877 914
878 //当前人员列表中抽一个人来检查离开人员是否占用频道 915 //当前人员列表中抽一个人来检查离开人员是否占用频道
879 for (let key in this.rosters) { 916 for (let key in this.rosters) {
@@ -881,10 +918,10 @@ class ConferApe extends Ape { @@ -881,10 +918,10 @@ class ConferApe extends Ape {
881 //如果抽到的人是自己就处理以下操作 918 //如果抽到的人是自己就处理以下操作
882 if (randNodeId == GlobalConfig.nodeId) { 919 if (randNodeId == GlobalConfig.nodeId) {
883 loger.log(randNodeId, "有权限检查离开的人员是否占用channel"); 920 loger.log(randNodeId, "有权限检查离开的人员是否占用channel");
884 - this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": nodeId}); 921 + this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, { "nodeId": nodeId });
885 //如果离开的人员是老师,需要暂停当前的课堂 922 //如果离开的人员是老师,需要暂停当前的课堂
886 923
887 - if(user&&user.role==ApeConsts.NR_HOST){ 924 + if (user && user.role == ApeConsts.NR_HOST) {
888 this.pauseClass(); 925 this.pauseClass();
889 //强制停止录制 926 //强制停止录制
890 this.stopRecord(true); 927 this.stopRecord(true);
@@ -912,28 +949,29 @@ class ConferApe extends Ape { @@ -912,28 +949,29 @@ class ConferApe extends Ape {
912 return null; 949 return null;
913 } 950 }
914 let classStatusInfo = new pdu['RCClassStatusInfoPdu']; 951 let classStatusInfo = new pdu['RCClassStatusInfoPdu'];
915 - classStatusInfo.nodeId = GlobalConfig.nodeId;//mcu中的唯一ID 952 + classStatusInfo.nodeId = GlobalConfig.nodeId; //mcu中的唯一ID
916 classStatusInfo.userId = GlobalConfig.userId; 953 classStatusInfo.userId = GlobalConfig.userId;
917 classStatusInfo.userName = GlobalConfig.userName; 954 classStatusInfo.userName = GlobalConfig.userName;
918 - classStatusInfo.siteId = GlobalConfig.siteId;//站点号 955 + classStatusInfo.siteId = GlobalConfig.siteId; //站点号
919 classStatusInfo.classId = GlobalConfig.classId; 956 classStatusInfo.classId = GlobalConfig.classId;
920 classStatusInfo.className = GlobalConfig.className; 957 classStatusInfo.className = GlobalConfig.className;
921 - classStatusInfo.classType = GlobalConfig.classType;//课堂类型  
922 - classStatusInfo.classStatus = GlobalConfig.classStatus;//课堂的状态  
923 - classStatusInfo.classStartTime = GlobalConfig.classStartTime;//课堂点击开始时间  
924 - classStatusInfo.classStopTime = GlobalConfig.classStopTime;//最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳  
925 - classStatusInfo.classTimestamp = GlobalConfig.classTimestamp;//相对于点开始课堂的时间戳  
926 - classStatusInfo.classBeginTime = GlobalConfig.classBeginTime;//课堂创建的时间,这个是Sass返回的  
927 - classStatusInfo.classEndTime = GlobalConfig.classEndTime;//课堂结束的时间,这个是Sass返回的  
928 - classStatusInfo.recordStatus = GlobalConfig.recordStatus;//当前录制状态  
929 - classStatusInfo.recordTimestamp = GlobalConfig.recordTimestamp;//相对于首次开始录制的时间戳  
930 - classStatusInfo.recordFileName = GlobalConfig.recordFileName;//录制的文件名  
931 - classStatusInfo.recordDownloadUrl = GlobalConfig.recordDownloadUrl;//下载地址  
932 - classStatusInfo.serverTimestamp = GlobalConfig.serverTimestamp;//当前的系统时间戳  
933 - classStatusInfo.activeDocId = GlobalConfig.activeDocId;//当前激活的文档id  
934 - classStatusInfo.activeDocCurPage = GlobalConfig.activeDocCurPage;//当前激活的文档的当前页  
935 - classStatusInfo.isStopAllPublishMedia=_param.isStopAllPublishMedia||false;  
936 - classStatusInfo.currentSceneTableId=GlobalConfig.currentSceneTableId; 958 + classStatusInfo.classType = GlobalConfig.classType; //课堂类型
  959 + classStatusInfo.classStatus = GlobalConfig.classStatus; //课堂的状态
  960 + classStatusInfo.classStartTime = GlobalConfig.classStartTime; //课堂点击开始时间
  961 + classStatusInfo.classStopTime = GlobalConfig.classStopTime; //最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳
  962 + classStatusInfo.classTimestamp = GlobalConfig.classTimestamp; //相对于点开始课堂的时间戳
  963 + classStatusInfo.classBeginTime = GlobalConfig.classBeginTime; //课堂创建的时间,这个是Sass返回的
  964 + classStatusInfo.classEndTime = GlobalConfig.classEndTime; //课堂结束的时间,这个是Sass返回的
  965 + classStatusInfo.recordStatus = GlobalConfig.recordStatus; //当前录制状态
  966 + classStatusInfo.recordTimestamp = GlobalConfig.recordTimestamp; //相对于首次开始录制的时间戳
  967 + classStatusInfo.recordFileName = GlobalConfig.recordFileName; //录制的文件名
  968 + classStatusInfo.recordDownloadUrl = GlobalConfig.recordDownloadUrl; //下载地址
  969 + classStatusInfo.serverTimestamp = GlobalConfig.serverTimestamp; //当前的系统时间戳
  970 + classStatusInfo.activeDocId = GlobalConfig.activeDocId; //当前激活的文档id
  971 + classStatusInfo.activeDocCurPage = GlobalConfig.activeDocCurPage; //当前激活的文档的当前页
  972 + classStatusInfo.isStopAllPublishMedia = _param.isStopAllPublishMedia || false;
  973 + classStatusInfo.currentSceneTableId = GlobalConfig.currentSceneTableId;
  974 + classStatusInfo.silence = GlobalConfig.silence;
937 //loger.log("classStatusInfo--->", classStatusInfo); 975 //loger.log("classStatusInfo--->", classStatusInfo);
938 976
939 /* 977 /*
@@ -896,6 +896,7 @@ message RCNodeInfoRecordPdu { @@ -896,6 +896,7 @@ message RCNodeInfoRecordPdu {
896 optional string province=27; 896 optional string province=27;
897 optional string isp=28; 897 optional string isp=28;
898 repeated MsListItemPdu msList = 29; 898 repeated MsListItemPdu msList = 29;
  899 + optional string selfSilence = 30;
899 } 900 }
900 901
901 message RCVotingPollSettingsPdu { 902 message RCVotingPollSettingsPdu {
@@ -991,6 +992,7 @@ message RCClassStatusInfoPdu { @@ -991,6 +992,7 @@ message RCClassStatusInfoPdu {
991 optional uint32 active_doc_cur_page=21;//当前激活的文档的当前页 992 optional uint32 active_doc_cur_page=21;//当前激活的文档的当前页
992 optional bool isStopAllPublishMedia=22;//是否停止推流 993 optional bool isStopAllPublishMedia=22;//是否停止推流
993 optional uint32 currentSceneTableId=23;//文档区域的当前模块id 994 optional uint32 currentSceneTableId=23;//文档区域的当前模块id
  995 + optional bool silence=24;//课堂禁言
994 } 996 }
995 997
996 message RCConferenceRecordRequestPdu { 998 message RCConferenceRecordRequestPdu {