AlexWang

合并延迟

此 diff 太大无法显示。
@@ -22,6 +22,8 @@ import CursorApe from 'apes/CursorApe'; @@ -22,6 +22,8 @@ import CursorApe from 'apes/CursorApe';
22 22
23 import EngineUtils from "EngineUtils"; 23 import EngineUtils from "EngineUtils";
24 import GlobalConfig from 'GlobalConfig'; 24 import GlobalConfig from 'GlobalConfig';
  25 +import SystemConfig from 'SystemConfig';
  26 +
25 import ApeConsts from 'apes/ApeConsts'; 27 import ApeConsts from 'apes/ApeConsts';
26 import Base64 from 'base64-js'; 28 import Base64 from 'base64-js';
27 import ArrayBufferUtil from 'libs/ArrayBufferUtil'; 29 import ArrayBufferUtil from 'libs/ArrayBufferUtil';
@@ -30,11 +32,10 @@ import MediaModule from 'apes/MediaModule'; @@ -30,11 +32,10 @@ import MediaModule from 'apes/MediaModule';
30 import MediaSharedApe from 'apes/MediaSharedApe'; 32 import MediaSharedApe from 'apes/MediaSharedApe';
31 import MusicSharedApe from 'apes/MusicSharedApe'; 33 import MusicSharedApe from 'apes/MusicSharedApe';
32 import QuestionApe from 'apes/QuestionApe'; 34 import QuestionApe from 'apes/QuestionApe';
33 -import mdetect from "mdetect";  
34 import UTF8 from 'utf-8'; 35 import UTF8 from 'utf-8';
35 36
36 let loger = Loger.getLoger('McuClient'); 37 let loger = Loger.getLoger('McuClient');
37 -let _sdkInfo = { "version": "v1.40.0.20170706", "author": "www.3mang.com" }; 38 +let _sdkInfo = { "version": "v1.45.1.20170717", "author": "www.3mang.com" };
38 39
39 //APE 40 //APE
40 let _sass; 41 let _sass;
@@ -59,14 +60,10 @@ export default class MessageEntrance extends Emiter { @@ -59,14 +60,10 @@ export default class MessageEntrance extends Emiter {
59 //sdk 信息 60 //sdk 信息
60 this.sdkInfo = _sdkInfo; 61 this.sdkInfo = _sdkInfo;
61 loger.warn(this.sdkInfo); 62 loger.warn(this.sdkInfo);
62 - //检查是否是移动端  
63 - GlobalConfig.isMobile = mdetect.isMobileUA();  
64 - if (GlobalConfig.isMobile) {  
65 - loger.warn("当前设备是移动设备");  
66 - } else {  
67 - loger.warn("当前设备是PC");  
68 - } 63 + //获取设备和系统信息
  64 + SystemConfig.getSystemInfo();
69 65
  66 + this.classRecordStatusUpdateTimer=0;//课堂录制状态发生改变后同步当前所有模块数据的计时器
70 //初始化状态 67 //初始化状态
71 this.isGetUserIpCallback = false; //是否获取IP信息返回 68 this.isGetUserIpCallback = false; //是否获取IP信息返回
72 this.isGetFastestMcuCallback = false; //是否MCU选点结束 69 this.isGetFastestMcuCallback = false; //是否MCU选点结束
@@ -253,6 +250,7 @@ export default class MessageEntrance extends Emiter { @@ -253,6 +250,7 @@ export default class MessageEntrance extends Emiter {
253 this.switchMediaServer = this._switchMediaServer.bind(this); //手动切换ms服务器 250 this.switchMediaServer = this._switchMediaServer.bind(this); //手动切换ms服务器
254 this.setDebugInfo = this._setDebugInfo.bind(this); //设置debug信息 251 this.setDebugInfo = this._setDebugInfo.bind(this); //设置debug信息
255 } 252 }
  253 +
256 _setDebugInfo(_data) { 254 _setDebugInfo(_data) {
257 loger.log("设置debug信息-->", _data); 255 loger.log("设置debug信息-->", _data);
258 if (_data) { 256 if (_data) {
@@ -263,14 +261,6 @@ export default class MessageEntrance extends Emiter { @@ -263,14 +261,6 @@ export default class MessageEntrance extends Emiter {
263 _setDeviceInfo(_data) { 261 _setDeviceInfo(_data) {
264 loger.log("设置设备信息-->", _data); 262 loger.log("设置设备信息-->", _data);
265 if (_data) { 263 if (_data) {
266 - /* GlobalConfig.videoQuality=_data.videoQuality||2;//画面质量 0-低;1-中;2-高;  
267 - GlobalConfig.cameras=_data.cameras||[];//摄像头列表  
268 - GlobalConfig.microphones=_data.microphones||[];//麦克风列表  
269 - GlobalConfig.curCamera=_data.curCamera||'';//当前选择的摄像头  
270 - GlobalConfig.curMicrophone=_data.curMicrophone||'';//当前选择的麦克风  
271 - GlobalConfig.curVideoQuality=_data.curVideoQuality||2;//当前选择的分辨率  
272 - GlobalConfig.micGain=_data.micGain||50;//音量(0-80)*/  
273 -  
274 GlobalConfig.cameras = _data.cameras || []; 264 GlobalConfig.cameras = _data.cameras || [];
275 GlobalConfig.microphones = _data.microphones || []; 265 GlobalConfig.microphones = _data.microphones || [];
276 GlobalConfig.videoQuality = parseInt(_data.videoQuality); 266 GlobalConfig.videoQuality = parseInt(_data.videoQuality);
@@ -356,7 +346,13 @@ export default class MessageEntrance extends Emiter { @@ -356,7 +346,13 @@ export default class MessageEntrance extends Emiter {
356 346
357 //开启录制成功 347 //开启录制成功
358 _onClassRecordSuccess(_param) { 348 _onClassRecordSuccess(_param) {
359 - this.updaterRecordAllApeStatus(_param); 349 + clearTimeout(this.classRecordStatusUpdateTimer);
  350 + let _this=this;
  351 + this.classRecordStatusUpdateTimer=setTimeout(function(){
  352 + clearTimeout(this.classRecordStatusUpdateTimer);
  353 + _this.updaterRecordAllApeStatus(_param);
  354 + },2000);
  355 +
360 } 356 }
361 357
362 //录制状态发送改变,更新所有模块的当前数据发送到MCU 358 //录制状态发送改变,更新所有模块的当前数据发送到MCU
@@ -803,6 +799,13 @@ export default class MessageEntrance extends Emiter { @@ -803,6 +799,13 @@ export default class MessageEntrance extends Emiter {
803 joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL; 799 joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL;
804 joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示 800 joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示
805 joinClassSuccessCallBackData.serverAndLoacTimeDistanc = GlobalConfig.serverAndLoacTimeDistanc; 801 joinClassSuccessCallBackData.serverAndLoacTimeDistanc = GlobalConfig.serverAndLoacTimeDistanc;
  802 +
  803 + joinClassSuccessCallBackData.deviceType = GlobalConfig.deviceType;
  804 + joinClassSuccessCallBackData.language = GlobalConfig.language;
  805 + joinClassSuccessCallBackData.explorer = GlobalConfig.explorer;
  806 + joinClassSuccessCallBackData.explorerVersion = GlobalConfig.explorerVersion;
  807 + joinClassSuccessCallBackData.os = GlobalConfig.os;
  808 +
806 loger.log('加入课堂成功->'); 809 loger.log('加入课堂成功->');
807 loger.log(joinClassSuccessCallBackData); 810 loger.log(joinClassSuccessCallBackData);
808 811
@@ -1274,6 +1277,8 @@ export default class MessageEntrance extends Emiter { @@ -1274,6 +1277,8 @@ export default class MessageEntrance extends Emiter {
1274 try { 1277 try {
1275 GlobalConfig.setClassStatusInfo(JSON.parse(_data.currentInfo)); 1278 GlobalConfig.setClassStatusInfo(JSON.parse(_data.currentInfo));
1276 } catch (err) { 1279 } catch (err) {
  1280 + loger.warn("从Sass获取的课堂数据JSON转换失败->");
  1281 + console.log("currentInfo",_data.currentInfo);
1277 GlobalConfig.setClassStatusInfo(_data.currentInfo); 1282 GlobalConfig.setClassStatusInfo(_data.currentInfo);
1278 } 1283 }
1279 loger.log(GlobalConfig.classStatusInfo); 1284 loger.log(GlobalConfig.classStatusInfo);
@@ -1630,26 +1635,29 @@ export default class MessageEntrance extends Emiter { @@ -1630,26 +1635,29 @@ export default class MessageEntrance extends Emiter {
1630 1635
1631 //文档加入频道成功,同步到MCU服务器上的数据 1636 //文档加入频道成功,同步到MCU服务器上的数据
1632 docJoinChannelSuccess() { 1637 docJoinChannelSuccess() {
1633 - loger.log("docJoinChannelSuccess->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.docListPrepare.length); 1638 + loger.log("docJoinChannelSuccess->isHost=", GlobalConfig.isHost,"当前总人数:",GlobalConfig.rosterNumber, "sassDoclength=", GlobalConfig.docListPrepare.length);
1634 //loger.log("docJoinChannelSuccess docListPrepare="); 1639 //loger.log("docJoinChannelSuccess docListPrepare=");
1635 //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传 1640 //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
1636 - if (GlobalConfig.isHost && GlobalConfig.docListPrepare.length > 0) {  
1637 - for (let i = 0; i < GlobalConfig.docListPrepare.length; i++) {  
1638 - let value = GlobalConfig.docListPrepare[i];  
1639 - if (value) {  
1640 - //loger.log("判断是否需要把提前上传的文档上传到mcu", value);  
1641 - let paramInfo = {  
1642 - "pageNum": value.pdfSize,  
1643 - "fileName": value.name,  
1644 - "fileType": value.type,  
1645 - "relativeUrl": value.relativeLocation,  
1646 - "url": value.absoluteLocation,  
1647 - "creatUserId": value.createUserID,  
1648 - "docId": value.id,  
1649 - "md5": value.MD5,  
1650 - "visible": false  
1651 - };  
1652 - this._sendDocumentUpload(paramInfo); 1641 + if(GlobalConfig.docListPrepare&& GlobalConfig.docListPrepare.length > 0){
  1642 + //如果当前身份是老师或者当前课堂内只有一个人,有权限同步文档到MCU
  1643 + if (GlobalConfig.isHost||GlobalConfig.rosterNumber<=1) {
  1644 + for (let i = 0; i < GlobalConfig.docListPrepare.length; i++) {
  1645 + let value = GlobalConfig.docListPrepare[i];
  1646 + if (value) {
  1647 + //loger.log("判断是否需要把提前上传的文档上传到mcu", value);
  1648 + let paramInfo = {
  1649 + "pageNum": value.pdfSize,
  1650 + "fileName": value.name,
  1651 + "fileType": value.type,
  1652 + "relativeUrl": value.relativeLocation,
  1653 + "url": value.absoluteLocation,
  1654 + "creatUserId": value.createUserID,
  1655 + "docId": value.id,
  1656 + "md5": value.MD5,
  1657 + "visible": false
  1658 + };
  1659 + this._sendDocumentUpload(paramInfo);
  1660 + }
1653 } 1661 }
1654 } 1662 }
1655 } 1663 }
@@ -2002,6 +2010,13 @@ export default class MessageEntrance extends Emiter { @@ -2002,6 +2010,13 @@ export default class MessageEntrance extends Emiter {
2002 joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL; 2010 joinClassSuccessCallBackData.ssTunnelAppURL = GlobalConfig.ssTunnelAppURL;
2003 joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示 2011 joinClassSuccessCallBackData.currentSceneTableId = GlobalConfig.currentSceneTableId; //文档区域的模块显示
2004 joinClassSuccessCallBackData.serverAndLoacTimeDistanc = GlobalConfig.serverAndLoacTimeDistanc; 2012 joinClassSuccessCallBackData.serverAndLoacTimeDistanc = GlobalConfig.serverAndLoacTimeDistanc;
  2013 +
  2014 + joinClassSuccessCallBackData.deviceType = GlobalConfig.deviceType;
  2015 + joinClassSuccessCallBackData.language = GlobalConfig.language;
  2016 + joinClassSuccessCallBackData.explorer = GlobalConfig.explorer;
  2017 + joinClassSuccessCallBackData.explorerVersion = GlobalConfig.explorerVersion;
  2018 + joinClassSuccessCallBackData.os = GlobalConfig.os;
  2019 +
2005 loger.log(joinClassSuccessCallBackData); 2020 loger.log(joinClassSuccessCallBackData);
2006 //和加入课堂成功使用同样的消息处理 2021 //和加入课堂成功使用同样的消息处理
2007 this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData); 2022 this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData);
@@ -133,15 +133,19 @@ class GlobalConfig { @@ -133,15 +133,19 @@ class GlobalConfig {
133 this.classStopTime = data.classStopTime || this.classStopTime; //最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳 133 this.classStopTime = data.classStopTime || this.classStopTime; //最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳
134 this.classTimestamp = data.classTimestamp || this.classTimestamp; //相对于点开始课堂的时间戳 134 this.classTimestamp = data.classTimestamp || this.classTimestamp; //相对于点开始课堂的时间戳
135 135
136 - // 全局禁言状态  
137 - this.silence = data.silence || false;  
138 - this.silenceUsers = JSON.parse(data.silenceUsers || '{}');  
139 136
140 this.recordStatus = data.recordStatus || this.recordStatus; //当前录制状态 137 this.recordStatus = data.recordStatus || this.recordStatus; //当前录制状态
141 this.recordTimestamp = data.recordTimestamp || this.recordTimestamp; //相对于首次开始录制的时间戳 138 this.recordTimestamp = data.recordTimestamp || this.recordTimestamp; //相对于首次开始录制的时间戳
142 this.recordFileName = data.recordFileName || this.recordFileName; //录制的文件名 139 this.recordFileName = data.recordFileName || this.recordFileName; //录制的文件名
143 this.recordDownloadUrl = data.recordDownloadUrl || this.recordDownloadUrl; //下载地址 140 this.recordDownloadUrl = data.recordDownloadUrl || this.recordDownloadUrl; //下载地址
144 this.currentSceneTableId = data.currentSceneTableId || 0; //文档区域的模块显示 141 this.currentSceneTableId = data.currentSceneTableId || 0; //文档区域的模块显示
  142 +
  143 + // 全局禁言状态
  144 + this.silence = data.silence || false;
  145 + this.silenceUsers =data.silenceUsers || {};
  146 + if((typeof this.silenceUsers =='string')&& this.silenceUsers .constructor==String){
  147 + this.silenceUsers={};
  148 + }
145 } 149 }
146 150
147 // 判断自己是否主持人角色 151 // 判断自己是否主持人角色
@@ -364,7 +368,7 @@ GlobalConfig.maxMediaChannels = 0; //最大音视频路数,以音视频路数 @@ -364,7 +368,7 @@ GlobalConfig.maxMediaChannels = 0; //最大音视频路数,以音视频路数
364 GlobalConfig.hasCamera = false; //摄像头是否可用 368 GlobalConfig.hasCamera = false; //摄像头是否可用
365 GlobalConfig.hasMicrophone = false; //麦克风是否可用 369 GlobalConfig.hasMicrophone = false; //麦克风是否可用
366 370
367 -GlobalConfig.deviceType = 0; //设备类型 0:电脑 1:安卓 2:ios 371 +GlobalConfig.deviceType = 0; //设备类型 0:电脑 1:ios 2:安卓
368 GlobalConfig.userIp = ""; //用户当前IP 372 GlobalConfig.userIp = ""; //用户当前IP
369 GlobalConfig.userId = 0; 373 GlobalConfig.userId = 0;
370 GlobalConfig.userName = ""; 374 GlobalConfig.userName = "";
@@ -375,8 +379,8 @@ GlobalConfig.openMicrophones = 0; @@ -375,8 +379,8 @@ GlobalConfig.openMicrophones = 0;
375 //视频质量相关设置 379 //视频质量相关设置
376 GlobalConfig.fps = 15; //帧频 380 GlobalConfig.fps = 15; //帧频
377 GlobalConfig.gop = 3; //关键帧间隔(秒) 381 GlobalConfig.gop = 3; //关键帧间隔(秒)
378 -GlobalConfig.videoQuality = 2; //画面质量 0-低;1-中;2-高;  
379 -GlobalConfig.curVideoQuality = 2; //当前分辨率 382 +GlobalConfig.videoQuality = 1; //画面质量 0-低;1-中;2-高;
  383 +GlobalConfig.curVideoQuality = 1; //当前分辨率
380 GlobalConfig.cameras = []; //摄像头列表 384 GlobalConfig.cameras = []; //摄像头列表
381 GlobalConfig.microphones = []; //麦克风列表 385 GlobalConfig.microphones = []; //麦克风列表
382 386
@@ -476,6 +480,13 @@ GlobalConfig.ssTunnelAppURL = ''; //屏幕共享插件的地址 @@ -476,6 +480,13 @@ GlobalConfig.ssTunnelAppURL = ''; //屏幕共享插件的地址
476 GlobalConfig.serverTime = 0; //服务器当前时间戳 480 GlobalConfig.serverTime = 0; //服务器当前时间戳
477 GlobalConfig.serverAndLoacTimeDistanc = 0; //本地时间和服务器时间错的差值; 481 GlobalConfig.serverAndLoacTimeDistanc = 0; //本地时间和服务器时间错的差值;
478 482
  483 +GlobalConfig.rosterNumber=0;//当前总人数
  484 +
479 GlobalConfig.isMobile = false; //是否是移动端 485 GlobalConfig.isMobile = false; //是否是移动端
  486 +GlobalConfig.language="";//浏览器语言
  487 +GlobalConfig.platform="pc";//平台 IOS/ANDROID/PC
  488 +GlobalConfig.explorer="未知";//浏览器
  489 +GlobalConfig.explorerVersion="未知";//浏览器版本
  490 +GlobalConfig.os="未知";//系统
480 export default GlobalConfig; 491 export default GlobalConfig;
481 492
  1 +/*
  2 + * 全局数据管理
  3 + * */
  4 +import Loger from 'Loger';
  5 +import mdetect from "mdetect";
  6 +import GlobalConfig from 'GlobalConfig';
  7 +
  8 +let loger = Loger.getLoger('SystemConfig');
  9 +class SystemConfig {
  10 + constructor() {
  11 +
  12 + }
  13 + //获取系统信息
  14 + static getSystemInfo(){
  15 + //检查是否是移动端
  16 + GlobalConfig.isMobile = mdetect.isMobileUA();
  17 + if (GlobalConfig.isMobile) {
  18 + loger.warn("当前设备是移动设备");
  19 + } else {
  20 + loger.warn("当前设备是PC");
  21 + }
  22 + if(mdetect.isIOS()){
  23 + GlobalConfig.deviceType=1;//"ios";
  24 + } if(mdetect.isAndroid()){
  25 + GlobalConfig.platform=2;//"android";
  26 + }else {
  27 + GlobalConfig.platform=0;//"pc";
  28 + }
  29 +
  30 + //语言
  31 + GlobalConfig.language ="unknown";
  32 + if(navigator){
  33 + let language=navigator.language || navigator.browserLanguage;
  34 + GlobalConfig.language = language.toLocaleLowerCase();
  35 + }
  36 + let browserInfo=this.getBrowserInfo();
  37 + GlobalConfig.explorer=browserInfo.explorer||"未知";
  38 + GlobalConfig.explorerVersion=browserInfo.explorerVersion||"未知";
  39 +
  40 + GlobalConfig.os=this.detectOS();
  41 + loger.log("deviceType:"+GlobalConfig.deviceType);
  42 + loger.log("language:"+GlobalConfig.language);
  43 + loger.log("explorer:"+GlobalConfig.explorer);
  44 + loger.log("explorerVersion:"+GlobalConfig.explorerVersion);
  45 + loger.log("os:"+GlobalConfig.os);
  46 + }
  47 + //获取浏览器和信息
  48 + static getBrowserInfo(){
  49 + var Sys = {};
  50 + var ua = navigator.userAgent.toLowerCase();
  51 + var re =/(trident|msie|firefox|chrome|opera|version).*?([\d.]+)/;
  52 + var m = ua.match(re);
  53 + Sys.explorer = m[1].replace(/version/, "'safari");
  54 +
  55 + //判断是否是IE11
  56 + if(Sys.explorer=="trident"){
  57 + Sys.explorer="IE11"
  58 + Sys.explorerVersion = "11.0";
  59 + }else if(Sys.explorer=="msie"){
  60 + //IE
  61 + Sys.explorer="IE"
  62 + Sys.explorerVersion = m[2];
  63 + }else {
  64 + //非IE
  65 + Sys.explorerVersion = m[2];
  66 + }
  67 + return Sys;
  68 + }
  69 + //系统信息
  70 + static detectOS() {
  71 + var sUserAgent = navigator.userAgent;
  72 + var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");
  73 + var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") || (navigator.platform == "Macintosh") || (navigator.platform == "MacIntel");
  74 + if (isMac) return "Mac";
  75 + var isUnix = (navigator.platform == "X11") && !isWin && !isMac;
  76 + if (isUnix) return "Unix";
  77 + var isLinux = (String(navigator.platform).indexOf("Linux") > -1);
  78 + if (isLinux) return "Linux";
  79 + if (isWin) {
  80 + var isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 || sUserAgent.indexOf("Windows 2000") > -1;
  81 + if (isWin2K) return "Win2000";
  82 + var isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 || sUserAgent.indexOf("Windows XP") > -1;
  83 + if (isWinXP) return "WinXP";
  84 + var isWin2003 = sUserAgent.indexOf("Windows NT 5.2") > -1 || sUserAgent.indexOf("Windows 2003") > -1;
  85 + if (isWin2003) return "Win2003";
  86 + var isWinVista= sUserAgent.indexOf("Windows NT 6.0") > -1 || sUserAgent.indexOf("Windows Vista") > -1;
  87 + if (isWinVista) return "WinVista";
  88 + var isWin7 = sUserAgent.indexOf("Windows NT 6.1") > -1 || sUserAgent.indexOf("Windows 7") > -1;
  89 + if (isWin7) return "Win7";
  90 + }
  91 + return "other";
  92 + }
  93 +}
  94 +export default SystemConfig;
  95 +
@@ -143,6 +143,12 @@ class ConferApe extends Ape { @@ -143,6 +143,12 @@ class ConferApe extends Ape {
143 //用户当前选择的MS 143 //用户当前选择的MS
144 nodeInfoRecordPdu.msIpPort = GlobalConfig.MS_PUBLISH_IP + ":" + GlobalConfig.MS_PUBLISH_PORT; 144 nodeInfoRecordPdu.msIpPort = GlobalConfig.MS_PUBLISH_IP + ":" + GlobalConfig.MS_PUBLISH_PORT;
145 145
  146 + nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType;
  147 + nodeInfoRecordPdu.language = GlobalConfig.language;
  148 + nodeInfoRecordPdu.explorer = GlobalConfig.explorer;
  149 + nodeInfoRecordPdu.explorerVersion = GlobalConfig.explorerVersion;
  150 + nodeInfoRecordPdu.os = GlobalConfig.os;
  151 +
146 return nodeInfoRecordPdu; 152 return nodeInfoRecordPdu;
147 } 153 }
148 154
@@ -259,7 +265,7 @@ class ConferApe extends Ape { @@ -259,7 +265,7 @@ class ConferApe extends Ape {
259 return; 265 return;
260 } 266 }
261 267
262 - loger.log('startRecord', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus); 268 + loger.warn('开启录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus);
263 //如果是host 269 //如果是host
264 if (GlobalConfig.isHost) { 270 if (GlobalConfig.isHost) {
265 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 271 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
@@ -271,7 +277,7 @@ class ConferApe extends Ape { @@ -271,7 +277,7 @@ class ConferApe extends Ape {
271 277
272 //停止录制 278 //停止录制
273 stopRecord(isForce) { 279 stopRecord(isForce) {
274 - loger.log('stopRecord', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus); 280 + loger.warn('停止录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus);
275 if (isForce && isForce == true) { 281 if (isForce && isForce == true) {
276 //强制停止,可以是host之外的身份(比如当前课堂老师异常退出,没有老师,会随机选择一个人来做释放操作) 282 //强制停止,可以是host之外的身份(比如当前课堂老师异常退出,没有老师,会随机选择一个人来做释放操作)
277 if (GlobalConfig.recordStatus) { 283 if (GlobalConfig.recordStatus) {
@@ -609,10 +615,16 @@ class ConferApe extends Ape { @@ -609,10 +615,16 @@ class ConferApe extends Ape {
609 tableUpdateHandler(owner, itemIdx, itemData) { 615 tableUpdateHandler(owner, itemIdx, itemData) {
610 try { 616 try {
611 let model = this.unPackPdu(owner, itemIdx, itemData); 617 let model = this.unPackPdu(owner, itemIdx, itemData);
612 - loger.log('课堂数据更新->', model); 618 + console.log('课堂数据更新->', model);
613 619
614 //处理课堂更新的信息 620 //处理课堂更新的信息
615 if (model && model.classStatusInfo) { 621 if (model && model.classStatusInfo) {
  622 + try{
  623 + model.classStatusInfo.silenceUsers=JSON.parse( model.classStatusInfo.silenceUsers);
  624 + }catch (err){
  625 +
  626 + }
  627 +
616 GlobalConfig.setClassStatusInfo(model.classStatusInfo); 628 GlobalConfig.setClassStatusInfo(model.classStatusInfo);
617 629
618 if (model.classStatusInfo.isStopAllPublishMedia) { 630 if (model.classStatusInfo.isStopAllPublishMedia) {
@@ -778,6 +790,7 @@ class ConferApe extends Ape { @@ -778,6 +790,7 @@ class ConferApe extends Ape {
778 //自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂: 790 //自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂:
779 // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中) 791 // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中)
780 let rosterLen = Object.keys(this.rosters).length; 792 let rosterLen = Object.keys(this.rosters).length;
  793 + GlobalConfig.rosterNumber=rosterLen;//记录当前的总人数
781 if (rosterLen < 1 && !GlobalConfig.isHost && GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) { 794 if (rosterLen < 1 && !GlobalConfig.isHost && GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) {
782 loger.warn("当前课堂没有老师->暂停课堂"); 795 loger.warn("当前课堂没有老师->暂停课堂");
783 this.pauseClass({ isForce: true }); 796 this.pauseClass({ isForce: true });
@@ -623,10 +623,19 @@ class DocApe extends Ape { @@ -623,10 +623,19 @@ class DocApe extends Ape {
623 623
624 //果当前没有显示的文档,默认选择一个显示文档 624 //果当前没有显示的文档,默认选择一个显示文档
625 _showDefaultDoc() { 625 _showDefaultDoc() {
626 - //显示默认文档条件->1.非录制回放状态下 2.只有host有权限操作 3.当前激活的文档id不为0 626 + /*//显示默认文档条件->1.非录制回放状态下 2.只有host有权限操作 3.当前激活的文档id不为0
627 if (GlobalConfig.isRecordPlayBack || !GlobalConfig.isHost || GlobalConfig.activeDocId > 0) { 627 if (GlobalConfig.isRecordPlayBack || !GlobalConfig.isHost || GlobalConfig.activeDocId > 0) {
628 return; 628 return;
629 } 629 }
  630 + */
  631 + //非录制回放状态下和当前激活的文档id不为0的时候也不能操作
  632 + if (GlobalConfig.isRecordPlayBack || GlobalConfig.activeDocId > 0) {
  633 + return;
  634 + }
  635 + //如果自己不是老师,并且当前课堂内人数大于1,不能操作
  636 + if(!GlobalConfig.isHost&&GlobalConfig.rosterNumber>1){
  637 + return;
  638 + }
630 639
631 let tempDocItemIdx;//临时记录文档数据,用于显示默认文档 640 let tempDocItemIdx;//临时记录文档数据,用于显示默认文档
632 for (let key in this.docList) { 641 for (let key in this.docList) {
@@ -123,6 +123,9 @@ class MediaModule { @@ -123,6 +123,9 @@ class MediaModule {
123 return {"code": ApeConsts.RETURN_SUCCESS, 123 return {"code": ApeConsts.RETURN_SUCCESS,
124 "data":"", 124 "data":"",
125 "mediaId":freeChannel, 125 "mediaId":freeChannel,
  126 + "userId":GlobalConfig.userId,
  127 + "userName":GlobalConfig.userName,
  128 + "userRole":GlobalConfig.userRole,
126 "publishUrl": publishUrl 129 "publishUrl": publishUrl
127 }; 130 };
128 } 131 }
@@ -161,6 +164,9 @@ class MediaModule { @@ -161,6 +164,9 @@ class MediaModule {
161 }; 164 };
162 return {"code": ApeConsts.RETURN_SUCCESS, 165 return {"code": ApeConsts.RETURN_SUCCESS,
163 "data":"", 166 "data":"",
  167 + "userId":GlobalConfig.userId,
  168 + "userName":GlobalConfig.userName,
  169 + "userRole":GlobalConfig.userRole,
164 "mediaId":freeChannel, 170 "mediaId":freeChannel,
165 "publishUrl": publishUrl 171 "publishUrl": publishUrl
166 }; 172 };
@@ -202,6 +208,9 @@ class MediaModule { @@ -202,6 +208,9 @@ class MediaModule {
202 return {"code": ApeConsts.RETURN_SUCCESS, 208 return {"code": ApeConsts.RETURN_SUCCESS,
203 "data":"", 209 "data":"",
204 "mediaId":shareChannel, 210 "mediaId":shareChannel,
  211 + "userId":GlobalConfig.userId,
  212 + "userName":GlobalConfig.userName,
  213 + "userRole":GlobalConfig.userRole,
205 "publishUrl": publishUrl, 214 "publishUrl": publishUrl,
206 "streamId":streamId 215 "streamId":streamId
207 }; 216 };
@@ -298,7 +298,7 @@ class WhiteBoardApe extends Ape { @@ -298,7 +298,7 @@ class WhiteBoardApe extends Ape {
298 tableInsertHandler(owner, itemIdx, itemData) { 298 tableInsertHandler(owner, itemIdx, itemData) {
299 let whiteBoardModel = this.unPackPdu(owner, itemIdx, itemData); 299 let whiteBoardModel = this.unPackPdu(owner, itemIdx, itemData);
300 loger.log('tableInsertHandler',"activeDocId->",GlobalConfig.activeDocId ,"parentId->", whiteBoardModel.parentId); 300 loger.log('tableInsertHandler',"activeDocId->",GlobalConfig.activeDocId ,"parentId->", whiteBoardModel.parentId);
301 - loger.log(whiteBoardModel); 301 + //loger.log(whiteBoardModel);
302 if (whiteBoardModel) { 302 if (whiteBoardModel) {
303 if (GlobalConfig.activeDocId == whiteBoardModel.parentId && GlobalConfig.activeDocCurPage == whiteBoardModel.curPageNo) { 303 if (GlobalConfig.activeDocId == whiteBoardModel.parentId && GlobalConfig.activeDocCurPage == whiteBoardModel.curPageNo) {
304 //loger.log('显示新增的标注->'); 304 //loger.log('显示新增的标注->');
@@ -72,7 +72,7 @@ class MCU extends Emiter { @@ -72,7 +72,7 @@ class MCU extends Emiter {
72 joinRequestPdu.type = 2; 72 joinRequestPdu.type = 2;
73 joinRequestPdu.initiator = this.classInfo.nodeId; 73 joinRequestPdu.initiator = this.classInfo.nodeId;
74 joinRequestPdu.nodeType = PduConsts.NT_TERMINAL; //normal 74 joinRequestPdu.nodeType = PduConsts.NT_TERMINAL; //normal
75 - joinRequestPdu.classDescription = descriptorPdu; // classDescription 75 + joinRequestPdu.classDescription = descriptorPdu;// classDescription
76 76
77 let pduMsg = pdu.create_join_class_request_pdu( 77 let pduMsg = pdu.create_join_class_request_pdu(
78 joinRequestPdu.type, 78 joinRequestPdu.type,
@@ -86,7 +86,7 @@ class MCU extends Emiter { @@ -86,7 +86,7 @@ class MCU extends Emiter {
86 PduConsts.SEG_ONCE 86 PduConsts.SEG_ONCE
87 ); 87 );
88 88
89 - pduMsg.set("site", this.classInfo.siteId); //课堂号对应的名称 89 + pduMsg.set("site", this.classInfo.siteId);//课堂号对应的名称
90 pduMsg.set("userId", this.classInfo.userId); 90 pduMsg.set("userId", this.classInfo.userId);
91 pduMsg.set("userName", Base64.fromByteArray(ArrayBufferUtil.strToUint8Array(this.classInfo.userName))); 91 pduMsg.set("userName", Base64.fromByteArray(ArrayBufferUtil.strToUint8Array(this.classInfo.userName)));
92 pduMsg.set("userRole", this.classInfo.userRole); 92 pduMsg.set("userRole", this.classInfo.userRole);
@@ -210,7 +210,7 @@ class MCU extends Emiter { @@ -210,7 +210,7 @@ class MCU extends Emiter {
210 this.classInfo = _classInfo; 210 this.classInfo = _classInfo;
211 // 创建刷新nodeId 211 // 创建刷新nodeId
212 this.classInfo.nodeId = EngineUtils.creatSoleNumberFromTimestamp(); 212 this.classInfo.nodeId = EngineUtils.creatSoleNumberFromTimestamp();
213 - GlobalConfig.nodeId = this.classInfo.nodeId; //这是标识自己身份的id 213 + GlobalConfig.nodeId = this.classInfo.nodeId;//这是标识自己身份的id
214 214
215 let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu']; 215 let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu'];
216 nodeInfoRecordPdu.name = this.classInfo.userName; 216 nodeInfoRecordPdu.name = this.classInfo.userName;
@@ -223,9 +223,16 @@ class MCU extends Emiter { @@ -223,9 +223,16 @@ class MCU extends Emiter {
223 nodeInfoRecordPdu.openMicrophones = 0; 223 nodeInfoRecordPdu.openMicrophones = 0;
224 nodeInfoRecordPdu.microphones = GlobalConfig.microphones; 224 nodeInfoRecordPdu.microphones = GlobalConfig.microphones;
225 nodeInfoRecordPdu.cameras = GlobalConfig.cameras; 225 nodeInfoRecordPdu.cameras = GlobalConfig.cameras;
226 - nodeInfoRecordPdu.videoQuality = GlobalConfig.videoQuality; //设置分辨率的 226 + nodeInfoRecordPdu.videoQuality = GlobalConfig.videoQuality;//设置分辨率的
227 nodeInfoRecordPdu.userIp = GlobalConfig.userIp; 227 nodeInfoRecordPdu.userIp = GlobalConfig.userIp;
228 228
  229 + nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType;
  230 + nodeInfoRecordPdu.language = GlobalConfig.language;
  231 + nodeInfoRecordPdu.explorer = GlobalConfig.explorer;
  232 + nodeInfoRecordPdu.explorerVersion = GlobalConfig.explorerVersion;
  233 + nodeInfoRecordPdu.os = GlobalConfig.os;
  234 +
  235 +
229 let conferenceRecord = {}; //RCConferenceRecord_T 236 let conferenceRecord = {}; //RCConferenceRecord_T
230 conferenceRecord._conference_id = this.classInfo.classId; 237 conferenceRecord._conference_id = this.classInfo.classId;
231 conferenceRecord._top_node_id = this.classInfo.topNodeID; 238 conferenceRecord._top_node_id = this.classInfo.topNodeID;
@@ -891,7 +891,7 @@ message RCNodeInfoRecordPdu { @@ -891,7 +891,7 @@ message RCNodeInfoRecordPdu {
891 optional bytes user_data = 8; 891 optional bytes user_data = 8;
892 optional string user_id = 9; 892 optional string user_id = 9;
893 optional uint32 handUpTime = 10; 893 optional uint32 handUpTime = 10;
894 - optional uint32 deviceType = 11; 894 + optional uint32 deviceType = 11;//设备类型,0:pc 1:ios 2:安卓
895 optional uint32 mobileDirection = 12; 895 optional uint32 mobileDirection = 12;
896 repeated string microphones = 13; 896 repeated string microphones = 13;
897 repeated string cameras = 14; 897 repeated string cameras = 14;
@@ -912,6 +912,10 @@ message RCNodeInfoRecordPdu { @@ -912,6 +912,10 @@ message RCNodeInfoRecordPdu {
912 repeated MsListItemPdu msList = 29; 912 repeated MsListItemPdu msList = 29;
913 optional string selfSilence = 30; 913 optional string selfSilence = 30;
914 optional string msIpPort = 31; 914 optional string msIpPort = 31;
  915 + optional string language = 32;//系统语言
  916 + optional string explorer = 33;//浏览器
  917 + optional string explorerVersion = 34;//浏览器版本
  918 + optional string os = 35;//系统版本
915 } 919 }
916 920
917 message RCVotingPollSettingsPdu { 921 message RCVotingPollSettingsPdu {