im-message.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. var curPlayAudio = null;
  2. function onChangePlayAudio(playAudio) {
  3. if (curPlayAudio) {
  4. if (curPlayAudio != playAudio) {
  5. curPlayAudio.currentTime = 0;
  6. curPlayAudio.pause();
  7. curPlayAudio = playAudio;
  8. }
  9. } else {
  10. curPlayAudio = playAudio;
  11. }
  12. }
  13. //单击图片事件
  14. function imageClick(imgObj) {
  15. var imgUrls = imgObj.src;
  16. var imgUrlArr = imgUrls.split("#"); //字符分割
  17. var smallImgUrl = imgUrlArr[0];//小图
  18. var bigImgUrl = imgUrlArr[1];//大图
  19. var oriImgUrl = imgUrlArr[2];//原图
  20. var html = '<img class="img-thumbnail" src="' + bigImgUrl + '" />';
  21. $.weeboxs.open(html, {animate:false, showButton:false, showCancel:false, showOk:false, modal: true, showTitle: false, clickClose: true});
  22. }
  23. function convertMsg(msg) {
  24. return convertMsgtoHtml(msg);
  25. }
  26. function convertMsgtoHtml(msg) {
  27. var html = "", elems, elem, type, content;
  28. elems = msg.getElems();//获取消息包含的元素数组
  29. for (var i in elems) {
  30. elem = elems[i];
  31. type = elem.getType();//获取元素类型
  32. content = elem.getContent();//获取元素对象
  33. switch (type) {
  34. case webim.MSG_ELEMENT_TYPE.TEXT:
  35. var text = content.getText();
  36. if(typeof html == 'object'){
  37. html.text = text;
  38. } else {
  39. html += text;
  40. }
  41. break;
  42. case webim.MSG_ELEMENT_TYPE.FACE:
  43. html += convertFaceMsgToHtml(content);
  44. break;
  45. case webim.MSG_ELEMENT_TYPE.IMAGE:
  46. return convertImageMsgToHtml(content);
  47. case webim.MSG_ELEMENT_TYPE.SOUND:
  48. return convertSoundMsgToHtml(content);
  49. case webim.MSG_ELEMENT_TYPE.FILE:
  50. html += convertFileMsgToHtml(content);
  51. break;
  52. case webim.MSG_ELEMENT_TYPE.LOCATION://暂不支持地理位置
  53. //html += convertLocationMsgToHtml(content);
  54. break;
  55. case webim.MSG_ELEMENT_TYPE.CUSTOM:
  56. html = convertCustomMsgToHtml(content);
  57. break;
  58. case webim.MSG_ELEMENT_TYPE.GROUP_TIP:
  59. // html += convertGroupTipMsgToHtml(content);
  60. break;
  61. default:
  62. webim.Log.error('未知消息元素类型: elemType=' + type);
  63. break;
  64. }
  65. }
  66. return html;
  67. }
  68. //解析语音消息元素
  69. function convertSoundMsgToHtml(content) {
  70. var second = content.getSecond();//获取语音时长
  71. var downUrl = content.getDownUrl();
  72. if (webim.BROWSER_INFO.type == 'ie' && parseInt(webim.BROWSER_INFO.ver) <= 8) {
  73. return '[这是一条语音消息]demo暂不支持ie8(含)以下浏览器播放语音,语音URL:' + downUrl;
  74. }
  75. return '<audio src="' + downUrl + '" controls="controls" onplay="onChangePlayAudio(this)" preload="none"></audio>';
  76. }
  77. //解析图片消息元素
  78. function convertImageMsgToHtml(content) {
  79. var smallImage = content.getImage(webim.IMAGE_TYPE.SMALL);//小图
  80. var bigImage = content.getImage(webim.IMAGE_TYPE.LARGE);//大图
  81. var oriImage = content.getImage(webim.IMAGE_TYPE.ORIGIN);//原图
  82. if (!bigImage) {
  83. bigImage = smallImage;
  84. }
  85. if (!oriImage) {
  86. oriImage = smallImage;
  87. }
  88. return "<img src='" + smallImage.getUrl() + "#" + bigImage.getUrl() + "#" + oriImage.getUrl() + "' style='cursor: pointer;' id='" + content.getImageId() + "' bigImgUrl='" + bigImage.getUrl() + "' onclick='imageClick(this)' />";
  89. }
  90. function convertCustomMsgToHtml(content) {
  91. var data = content.getData();//自定义数据
  92. var desc = content.getDesc();//描述信息
  93. var msg = JSON.parse(data);
  94. var user_level, nick_name, text;
  95. switch (msg.type) {
  96. case 0: // 正常文字聊天消息
  97. user_level = msg.sender.user_level;
  98. nick_name = msg.sender.nick_name;
  99. text = msg.text;
  100. break;
  101. case 1: // 收到发送礼物消息
  102. user_level = msg.sender.user_level;
  103. nick_name = msg.sender.nick_name;
  104. var icon = msg.pc_icon || msg.icon;
  105. text = msg.desc + '&nbsp;<img class="icon" style="height:2em;position:absolute;" src="' + icon + '" />';
  106. break;
  107. case 2: // 收到弹幕消息
  108. user_level = msg.sender.user_level;
  109. nick_name = msg.sender.nick_name;
  110. text = msg.desc || msg.text;
  111. break;
  112. case 3: // 主播结束直播
  113. user_level = msg.sender.user_level;
  114. nick_name = msg.sender.nick_name;
  115. text = '直播结束';
  116. break;
  117. case 5: // 观众进入直播间消息
  118. if(typeof msg.sender.nick_name === 'undefined'){
  119. return;
  120. }
  121. user_level = 99;
  122. nick_name = '[直播消息]';
  123. text = '金光一闪,' + msg.sender.nick_name + '加入了...';
  124. break;
  125. case 6: // 观众离开直播间消息
  126. if(typeof msg.sender.nick_name === 'undefined'){
  127. return;
  128. }
  129. user_level = 99;
  130. nick_name = '[直播消息]';
  131. text = '白光闪闪,' + msg.sender.nick_name + '离开了...';
  132. break;
  133. case 7: // 主播结束直播消息,直播间内的人可收到
  134. if(msg.sender){
  135. user_level = msg.sender.user_level;
  136. nick_name = msg.sender.nick_name;
  137. } else {
  138. user_level = 99;
  139. nick_name = '[系统消息]';
  140. }
  141. text = msg.desc;
  142. break;
  143. case 8: // 红包消息
  144. user_level = msg.sender.user_level;
  145. nick_name = msg.sender.nick_name;
  146. text = msg.desc;
  147. break;
  148. case 9: // 直播消息
  149. user_level = 99;
  150. nick_name = "[直播消息]";
  151. text = msg.desc;
  152. break;
  153. case 10: // 主播离开
  154. user_level = msg.sender.user_level;
  155. nick_name = msg.sender.nick_name;
  156. text = msg.text;
  157. break;
  158. case 11: // 主播回来
  159. user_level = msg.sender.user_level;
  160. nick_name = msg.sender.nick_name;
  161. text = msg.text;
  162. break;
  163. case 12: // 点亮
  164. if (!msg.showMsg) {
  165. //return;
  166. }
  167. user_level = msg.sender.user_level;
  168. nick_name = msg.sender.nick_name;
  169. text = '我点亮了';
  170. if(typeof Emotions[msg.imageName] !== 'undefined'){
  171. text += '<img class="icon" style="height:1.5em;" src="' + Emotions[msg.imageName] + '" />';
  172. } else {
  173. text += '[' + msg.imageName + ']';
  174. }
  175. break;
  176. case 17: // 踢人
  177. user_level = msg.sender.user_level;
  178. nick_name = msg.sender.nick_name;
  179. text = msg.desc;
  180. break;
  181. case 20: // 私聊文字消息
  182. user_level = msg.sender.user_level;
  183. nick_name = msg.sender.nick_name;
  184. text = msg.text.replace(/\[(face\d+)\]/g, function(word, g1){
  185. if(typeof Emotions[g1] !== 'undefined'){
  186. return '<img class="icon" style="height:1.5em;" src="' + Emotions[g1] + '" />';
  187. }
  188. return word;
  189. });
  190. break;
  191. case 21: // 私聊语音消息
  192. user_level = msg.sender.user_level;
  193. nick_name = msg.sender.nick_name;
  194. text = msg.desc;
  195. break;
  196. case 22: // 私聊图片消息
  197. user_level = msg.sender.user_level;
  198. nick_name = msg.sender.nick_name;
  199. text = msg.desc;
  200. break;
  201. case 23: // 私聊礼物消息
  202. user_level = msg.sender.user_level;
  203. nick_name = msg.sender.nick_name;
  204. text = msg.conversationDesc + msg.from_msg + '&nbsp;<img class="icon" style="height:2em;" src="' + msg.prop_icon + '" />';
  205. break;
  206. case 18: // 任何主播的结束,服务端都会推这条消息下来,用于更新列表状态
  207. default:
  208. return;
  209. }
  210. if(msg.sender && msg.sender.user_id == loginInfo.identifier) {
  211. if(msg.sender.user_level > loginInfo.user_level){
  212. loginInfo.user_level = msg.sender.user_level;
  213. } else {
  214. user_level = loginInfo.user_level;
  215. }
  216. }
  217. return {"type": msg.type, "user_level": user_level, "nick_name": nick_name, "text": text, "ext": msg};
  218. }
  219. var im_message = {
  220. /**
  221. * 入口,所有的业务必需先调用该方法登录
  222. * @param loginInfo //sdk指定的标准接入的用户数据
  223. * @param listeners //与webim的中的listeners不同,根据renmai业务封装的监听
  224. * {loginSuccess,loginError,connectSuccess,disconnect,reconnect,recieveMsg,sendMsgOk,sendMsgFail}
  225. *
  226. * 关于listeners监听事件的回调参数说明
  227. * 1. loginSuccess 无
  228. * 2. loginError
  229. * 3. connectSuccess
  230. * 4. disconnect
  231. * 5. reconnect
  232. * 6. recieveMsg: webim.Msg列表
  233. * 7. sendMsgOk 无
  234. * 8. sendMsgFail string 错误信息
  235. *
  236. *
  237. *
  238. */
  239. init: function (loginInfo, listeners) {
  240. var listeners = this.listeners = {
  241. loginSuccess: listeners.loginSuccess||function(){},
  242. loginError: listeners.loginError||function(){},
  243. connectSuccess: listeners.connectSuccess||function(){},
  244. disconnect: listeners.disconnect||function(){},
  245. reconnect: listeners.reconnect||function(){},
  246. recieveMsg: listeners.recieveMsg||function(){},
  247. recieveGroupMsg: listeners.recieveGroupMsg||function(){},
  248. sendMsgOk: listeners.sendMsgOk||function(){},
  249. sendMsgFail: listeners.sendMsgFail||function(){}
  250. };
  251. //可选项
  252. var options = {
  253. 'isAccessFormalEnv': true,//是否访问正式环境,默认访问正式,选填
  254. 'isLogOn': false//是否开启控制台打印日志,默认开启,选填
  255. };
  256. //IE9(含)以下浏览器用到的jsonp回调函数
  257. var jsonpCallback = function(rspData) {
  258. webim.setJsonpLastRspData(rspData);
  259. };
  260. //监听连接状态回调变化事件
  261. var onConnNotify = function(resp){
  262. switch(resp.ErrorCode){
  263. case webim.CONNECTION_STATUS.ON:
  264. listeners.connectSuccess.call(listeners,resp);
  265. break;
  266. case webim.CONNECTION_STATUS.OFF:
  267. listeners.disconnect.call(listeners,resp);
  268. break;
  269. case webim.CONNECTION_STATUS.RECONNECT:
  270. listeners.reconnect.call(listeners,resp);
  271. break;
  272. default:
  273. //webim.Log.error('未知连接状态: ='+resp.ErrorInfo);
  274. break;
  275. }
  276. };
  277. //登录后需要监听的事件
  278. var webim_listeners = {
  279. "onConnNotify": onConnNotify, //监听连接状态回调变化事件,必填
  280. "jsonpCallback": jsonpCallback, //IE9(含)以下浏览器用到的jsonp回调函数,
  281. "onMsgNotify": listeners.recieveMsg, //监听新消息(私聊,普通群(非直播聊天室)消息,全员推送消息)事件,必填
  282. "onBigGroupMsgNotify": listeners.recieveGroupMsg, //监听新消息(直播聊天室)事件,直播场景下必填
  283. /* 以下事件本系统业务暂不监听
  284. "onGroupSystemNotifys": onGroupSystemNotifys, //监听(多终端同步)群系统消息事件,如果不需要监听,可不填
  285. "onGroupInfoChangeNotify": onGroupInfoChangeNotify, //监听群资料变化事件,选填
  286. "onFriendSystemNotifys": onFriendSystemNotifys, //监听好友系统通知事件,选填
  287. "onProfileSystemNotifys": onProfileSystemNotifys//监听资料系统(自己或好友)通知事件,选填
  288. */
  289. };
  290. webim.login(loginInfo, webim_listeners, options,
  291. function (resp) {
  292. listeners.loginSuccess.call(listeners);
  293. },
  294. function (err) {
  295. listeners.loginError.call(listeners,err);
  296. }
  297. );
  298. },
  299. //发文本消息
  300. sendTextMsg:function(to_uid, text, type, is_c2c){
  301. var type = type || 0;
  302. if(! text){
  303. return;
  304. }
  305. var selSess = this.selSess;
  306. if(! this.selSess || is_c2c){
  307. var selType = webim.SESSION_TYPE.C2C; //私聊
  308. selSess = new webim.Session(selType, to_uid);
  309. }
  310. var isSend = true;//是否为自己发送
  311. var seq = -1;//消息序列,-1表示sdk自动生成,用于去重
  312. var random = Math.round(Math.random() * 4294967296);//消息随机数,用于去重
  313. var msgTime = Math.round(new Date().getTime() / 1000);//消息时间戳
  314. var subType = webim.C2C_MSG_SUB_TYPE.COMMON; //普通消息
  315. var from_uid = loginInfo.identifier;
  316. if(from_uid == '' || from_uid == to_uid){
  317. return;
  318. }
  319. var msg = new webim.Msg(
  320. selSess, isSend, seq, random,msgTime,from_uid,subType,'',loginInfo.identifierNick
  321. );
  322. if(type == 9){
  323. msg.addCustom(new webim.Msg.Elem.Custom(JSON.stringify({
  324. "type": type,
  325. "desc": text,
  326. "sender": {
  327. "user_id": loginInfo.identifier,
  328. "nick_name": loginInfo.identifierNick,
  329. "user_level": loginInfo.user_level,
  330. "head_image": loginInfo.head_image,
  331. },
  332. })));
  333. } else {
  334. msg.addText(new webim.Msg.Elem.Text(text));
  335. msg.addCustom(new webim.Msg.Elem.Custom(JSON.stringify({
  336. "type": type,
  337. "text": text,
  338. "sender": {
  339. "user_id": loginInfo.identifier,
  340. "nick_name": loginInfo.identifierNick,
  341. "user_level": loginInfo.user_level,
  342. "head_image": loginInfo.head_image,
  343. },
  344. })));
  345. }
  346. var _this = this;
  347. webim.sendMsg(msg, function (resp) {
  348. _this.listeners.sendMsgOk.call(_this.listeners, msg);
  349. }, function (err) {
  350. var error_str= err.SrcErrorInfo.replace(/secure check error! beat word/, "包含敏感词汇");;
  351. _this.listeners.sendMsgFail.call(_this.listeners,error_str);
  352. });
  353. },
  354. //主动收消息
  355. recieveMsg: function(to_uid, recieveMsg){
  356. var options = {
  357. 'Peer_Account': to_uid.toString(), //好友帐号
  358. 'MaxCnt': 15, //拉取消息条数
  359. 'LastMsgTime': 0, //最近的消息时间,即从这个时间点向前拉取历史消息
  360. 'MsgKey': '',
  361. };
  362. this.selToID = to_uid;
  363. webim.getC2CHistoryMsgs(options, function (resp) {
  364. if(recieveMsg){
  365. resp.MsgList.sort(function(a, b) {
  366. return a.getTime() < b.getTime() ? -1 : 1;
  367. });
  368. recieveMsg(resp.MsgList);
  369. }
  370. }, function(resp){
  371. console.log(resp);
  372. });
  373. },
  374. //主动接收会话
  375. recieveSession: function(recieveMsg){
  376. webim.syncMsgs(recieveMsg);
  377. },
  378. // 加入群聊天
  379. applyJoinBigGroup: function (groupId) {
  380. if(! groupId){
  381. return;
  382. }
  383. var options = {
  384. 'GroupId': groupId//群id
  385. };
  386. var _this = this;
  387. webim.applyJoinBigGroup(
  388. options,
  389. function (resp) {
  390. //JoinedSuccess:加入成功; WaitAdminApproval:等待管理员审批
  391. if (resp.JoinedStatus && resp.JoinedStatus == 'JoinedSuccess') {
  392. var selType = webim.SESSION_TYPE.GROUP;
  393. var maxLen = webim.MSG_MAX_LENGTH.GROUP;
  394. var selSessHeadUrl = 'img/2017.jpg';
  395. _this.selSess = new webim.Session(selType, groupId, groupId, selSessHeadUrl, Math.round(new Date().getTime() / 1000));
  396. if(typeof loginInfo.identifierNick === 'undefined')
  397. {
  398. return;
  399. }
  400. _this.sendTextMsg(groupId, '金光一闪,' + loginInfo.identifierNick + '加入了...', 9);
  401. webim.Log.info('进群成功');
  402. } else {
  403. webim.Log.info('进群失败');
  404. }
  405. },
  406. function (err) {
  407. $.showErr(err.ErrorInfo);
  408. }
  409. );
  410. },
  411. };