show_one_msg.js
16.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
//聊天页面增加一条消息
function addMsg(msg, prepend) {
var isSelfSend, fromAccount, fromAccountNick, fromAccountImage, sessType, subType;
//获取会话类型,目前只支持群聊
//webim.SESSION_TYPE.GROUP-群聊,
//webim.SESSION_TYPE.C2C-私聊,
sessType = msg.getSession().type();
isSelfSend = msg.getIsSend(); //消息是否为自己发的
fromAccount = msg.getFromAccount();
if (!fromAccount) {
return;
}
if (isSelfSend) { //如果是自己发的消息
if (loginInfo.identifierNick) {
fromAccountNick = loginInfo.identifierNick;
} else {
fromAccountNick = fromAccount;
}
//获取头像
if (loginInfo.headurl) {
fromAccountImage = loginInfo.headurl;
} else {
fromAccountImage = friendHeadUrl;
}
} else { //如果别人发的消息
var key = webim.SESSION_TYPE.C2C + "_" + fromAccount;
var info = infoMap[key];
if (info && info.name) {
fromAccountNick = info.name;
} else if (msg.getFromAccountNick()) {
fromAccountNick = msg.getFromAccountNick();
} else {
fromAccountNick = fromAccount;
}
//获取头像
if (info && info.image) {
fromAccountImage = info.image;
} else if (msg.fromAccountHeadurl) {
fromAccountImage = msg.fromAccountHeadurl;
} else {
fromAccountImage = friendHeadUrl;
}
}
var onemsg = document.createElement("div");
if (msg.sending) {
onemsg.id = "id_" + msg.random;
//发送中
var spinner = document.createElement("div");
spinner.className = "spinner";
spinner.innerHTML = '<div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div>';
onemsg.appendChild(spinner);
} else {
$("#id_" + msg.random).remove();
}
onemsg.className = "onemsg";
var msghead = document.createElement("p");
var msgbody = document.createElement("p");
var msgPre = document.createElement("pre");
msghead.className = "msghead";
msgbody.className = "msgbody";
//如果是发给自己的消息
if (!isSelfSend)
msghead.style.color = "blue";
//昵称 消息时间
msghead.innerHTML = "<img class='headurlClass' src='" + fromAccountImage + "'>" + " " + webim.Tool.formatText2Html(fromAccountNick + " " + webim.Tool.formatTimeStamp(msg.getTime()));
//解析消息
//获取消息子类型
//会话类型为群聊时,子类型为:webim.GROUP_MSG_SUB_TYPE
//会话类型为私聊时,子类型为:webim.C2C_MSG_SUB_TYPE
subType = msg.getSubType();
switch (subType) {
case webim.GROUP_MSG_SUB_TYPE.COMMON: //群普通消息
msgPre.innerHTML = convertMsgtoHtml(msg);
break;
case webim.GROUP_MSG_SUB_TYPE.REDPACKET: //群红包消息
msgPre.innerHTML = "[群红包消息]" + convertMsgtoHtml(msg);
break;
case webim.GROUP_MSG_SUB_TYPE.LOVEMSG: //群点赞消息
//业务自己可以增加逻辑,比如展示点赞动画效果
msgPre.innerHTML = "[群点赞消息]" + convertMsgtoHtml(msg);
//展示点赞动画
//showLoveMsgAnimation();
break;
case webim.GROUP_MSG_SUB_TYPE.TIP: //群提示消息
msgPre.innerHTML = "[群提示消息]" + convertMsgtoHtml(msg);
break;
}
msgbody.appendChild(msgPre);
onemsg.appendChild(msghead);
onemsg.appendChild(msgbody);
//消息列表
var msgflow = document.getElementsByClassName("msgflow")[0];
if (prepend) {
//300ms后,等待图片加载完,滚动条自动滚动到底部
msgflow.insertBefore(onemsg, msgflow.firstChild);
if (msgflow.scrollTop == 0) {
setTimeout(function() {
msgflow.scrollTop = 0;
}, 300);
}
} else {
msgflow.appendChild(onemsg);
//300ms后,等待图片加载完,滚动条自动滚动到底部
setTimeout(function() {
msgflow.scrollTop = msgflow.scrollHeight;
}, 300);
}
}
//把消息转换成Html
function convertMsgtoHtml(msg) {
var html = "",
elems, elem, type, content;
elems = msg.getElems(); //获取消息包含的元素数组
var count = elems.length;
for (var i = 0; i < count; i++) {
elem = elems[i];
type = elem.getType(); //获取元素类型
content = elem.getContent(); //获取元素对象
switch (type) {
case webim.MSG_ELEMENT_TYPE.TEXT:
var eleHtml = convertTextMsgToHtml(content);
//转义,防XSS
html += webim.Tool.formatText2Html(eleHtml);
break;
case webim.MSG_ELEMENT_TYPE.FACE:
html += convertFaceMsgToHtml(content);
break;
case webim.MSG_ELEMENT_TYPE.IMAGE:
if (i <= count - 2) {
var customMsgElem = elems[i + 1]; //获取保存图片名称的自定义消息elem
var imgName = customMsgElem.getContent().getData(); //业务可以自定义保存字段,demo中采用data字段保存图片文件名
html += convertImageMsgToHtml(content, imgName);
i++; //下标向后移一位
} else {
html += convertImageMsgToHtml(content);
}
break;
case webim.MSG_ELEMENT_TYPE.SOUND:
// html += convertSoundMsgToHtml(content);
html += convertSoundMsgToAMRPlayer(content);
break;
case webim.MSG_ELEMENT_TYPE.FILE:
html += convertFileMsgToHtml(content);
break;
case webim.MSG_ELEMENT_TYPE.LOCATION:
html += convertLocationMsgToHtml(content);
break;
case webim.MSG_ELEMENT_TYPE.CUSTOM:
var eleHtml = convertCustomMsgToHtml(content);
//转义,防XSS
html += webim.Tool.formatText2Html(eleHtml);
break;
case webim.MSG_ELEMENT_TYPE.GROUP_TIP:
var eleHtml = convertGroupTipMsgToHtml(content);
//转义,防XSS
html += webim.Tool.formatText2Html(eleHtml);
break;
default:
webim.Log.error('未知消息元素类型: elemType=' + type);
break;
}
}
return html;
}
//解析文本消息元素
function convertTextMsgToHtml(content) {
return content.getText();
}
//解析表情消息元素
function convertFaceMsgToHtml(content) {
var faceUrl = null;
var data = content.getData();
var index = webim.EmotionDataIndexs[data];
var emotion = webim.Emotions[index];
if (emotion && emotion[1]) {
faceUrl = emotion[1];
}
if (faceUrl) {
return "<img src='" + faceUrl + "'/>";
} else {
return data;
}
}
//解析图片消息元素
function convertImageMsgToHtml(content, imageName) {
var smallImage = content.getImage(webim.IMAGE_TYPE.SMALL); //小图
var bigImage = content.getImage(webim.IMAGE_TYPE.LARGE); //大图
var oriImage = content.getImage(webim.IMAGE_TYPE.ORIGIN); //原图
if (!bigImage) {
bigImage = smallImage;
}
if (!oriImage) {
oriImage = smallImage;
}
return "<img name='" + imageName + "' src='" + smallImage.getUrl() + "#" + bigImage.getUrl() + "#" + oriImage.getUrl() + "' style='CURSOR: hand' id='" + content.getImageId() + "' bigImgUrl='" + bigImage.getUrl() + "' onclick='imageClick(this)' />";
}
//解析语音消息元素
function convertSoundMsgToHtml(content) {
var second = content.getSecond(); //获取语音时长
var downUrl = content.getDownUrl();
if (webim.BROWSER_INFO.type == 'ie' && parseInt(webim.BROWSER_INFO.ver) <= 8) {
return '[这是一条语音消息]demo暂不支持ie8(含)以下浏览器播放语音,语音URL:' + downUrl;
}
return '<audio id="uuid_' + content.uuid + '" src="' + downUrl + '" controls="controls" onplay="onChangePlayAudio(this)" preload="none"></audio>';
}
/**
* @uses amr音频信息转使用amr.js播放
* @param {object.<{uuid:string,downUrl:string}>} content - 消息内容对象
* @param {string} content.uuid - 文件的UUID
* @param {string} content.downUrl - 文件的下载地址
* @returns {string||null} aElmentString - AMR播放控件的HTML代码
*/
function convertSoundMsgToAMRPlayer(content) {
var iconStartChar= ' ► ';
var btnid= ['amrplay_btn_',content.uuid,'-', Math.round(Math.random()*1000000)].join('');
var aElmentString= ['<button id="',btnid,'" style="font-size:1.5em;" data-url="',content.downUrl,'">',iconStartChar,'</button>'].join('');
setTimeout(function(){
var btelm= document.getElementById(btnid);
btelm.onclick= function(event){
var amr = new BenzAMRRecorder();
var seed= null;
amr.onPlay(function(){
let arr= ['☐','☐','☐','☐','☐'];
var count = 0;
seed= setInterval(function(){
arr= ['☐','☐','☐','☐','☐'];
arr[count%arr.length]= '▣';
event.target.innerHTML= arr.join('');
count++;
},90)
});
amr.onStop(function(){
clearInterval(seed);
event.target.innerHTML= iconStartChar;
});
amr.initWithUrl(content.downUrl).then(function(){
amr.play();
});
}
},0);
return aElmentString;
}
//解析文件消息元素
function convertFileMsgToHtml(content) {
var fileSize, unitStr;
fileSize = content.getSize();
unitStr = "Byte";
if (fileSize >= 1024) {
fileSize = Math.round(fileSize / 1024);
unitStr = "KB";
}
// return '<a href="' + content.getDownUrl() + '" title="点击下载文件" ><i class="glyphicon glyphicon-file"> ' + content.getName() + '(' + fileSize + unitStr + ')</i></a>';
// return '<a href="javascript:;" onclick=\'webim.onDownFile("' + content.uuid + '")\' title="点击下载文件" ><i class="glyphicon glyphicon-file"> ' + content.name + '(' + fileSize + unitStr + ')</i></a>';
return '<a href="'+content.downUrl+'" target="'+content.name+'" title="点击下载文件" ><i class="glyphicon glyphicon-file"> ' + content.name + '(' + fileSize + unitStr + ')</i></a>';
}
//解析位置消息元素
function convertLocationMsgToHtml(content) {
return '经度=' + content.getLongitude() + ',纬度=' + content.getLatitude() + ',描述=' + content.getDesc();
}
//解析自定义消息元素
function convertCustomMsgToHtml(content) {
var data = content.getData(); //自定义数据
var desc = content.getDesc(); //描述信息
var ext = content.getExt(); //扩展信息
return "data=" + data + ", desc=" + desc + ", ext=" + ext;
}
//解析群提示消息元素
function convertGroupTipMsgToHtml(content) {
var WEB_IM_GROUP_TIP_MAX_USER_COUNT = 10;
var text = "";
var maxIndex = WEB_IM_GROUP_TIP_MAX_USER_COUNT - 1;
var opType, opUserId, userIdList;
var groupMemberNum;
opType = content.getOpType(); //群提示消息类型(操作类型)
opUserId = content.getOpUserId(); //操作人id
switch (opType) {
case webim.GROUP_TIP_TYPE.JOIN: //加入群
userIdList = content.getUserIdList();
//text += opUserId + "邀请了";
for (var m in userIdList) {
text += userIdList[m] + ",";
if (userIdList.length > WEB_IM_GROUP_TIP_MAX_USER_COUNT && m == maxIndex) {
text += "等" + userIdList.length + "人";
break;
}
}
text = text.substring(0, text.length - 1);
text += "加入该群,当前群成员数:" + content.getGroupMemberNum();
break;
case webim.GROUP_TIP_TYPE.QUIT: //退出群
text += opUserId + "离开该群,当前群成员数:" + content.getGroupMemberNum();
break;
case webim.GROUP_TIP_TYPE.KICK: //踢出群
text += opUserId + "将";
userIdList = content.getUserIdList();
for (var m in userIdList) {
text += userIdList[m] + ",";
if (userIdList.length > WEB_IM_GROUP_TIP_MAX_USER_COUNT && m == maxIndex) {
text += "等" + userIdList.length + "人";
break;
}
}
text += "踢出该群";
break;
case webim.GROUP_TIP_TYPE.SET_ADMIN: //设置管理员
text += opUserId + "将";
userIdList = content.getUserIdList();
for (var m in userIdList) {
text += userIdList[m] + ",";
if (userIdList.length > WEB_IM_GROUP_TIP_MAX_USER_COUNT && m == maxIndex) {
text += "等" + userIdList.length + "人";
break;
}
}
text += "设为管理员";
break;
case webim.GROUP_TIP_TYPE.CANCEL_ADMIN: //取消管理员
text += opUserId + "取消";
userIdList = content.getUserIdList();
for (var m in userIdList) {
text += userIdList[m] + ",";
if (userIdList.length > WEB_IM_GROUP_TIP_MAX_USER_COUNT && m == maxIndex) {
text += "等" + userIdList.length + "人";
break;
}
}
text += "的管理员资格";
break;
case webim.GROUP_TIP_TYPE.MODIFY_GROUP_INFO: //群资料变更
text += opUserId + "修改了群资料:";
var groupInfoList = content.getGroupInfoList();
var type, value;
for (var m in groupInfoList) {
type = groupInfoList[m].getType();
value = groupInfoList[m].getValue();
switch (type) {
case webim.GROUP_TIP_MODIFY_GROUP_INFO_TYPE.FACE_URL:
text += "群头像为" + value + "; ";
break;
case webim.GROUP_TIP_MODIFY_GROUP_INFO_TYPE.NAME:
text += "群名称为" + value + "; ";
break;
case webim.GROUP_TIP_MODIFY_GROUP_INFO_TYPE.OWNER:
text += "群主为" + value + "; ";
break;
case webim.GROUP_TIP_MODIFY_GROUP_INFO_TYPE.NOTIFICATION:
text += "群公告为" + value + "; ";
break;
case webim.GROUP_TIP_MODIFY_GROUP_INFO_TYPE.INTRODUCTION:
text += "群简介为" + value + "; ";
break;
default:
text += "未知信息为:type=" + type + ",value=" + value + "; ";
break;
}
}
break;
case webim.GROUP_TIP_TYPE.MODIFY_MEMBER_INFO: //群成员资料变更(禁言时间)
text += opUserId + "修改了群成员资料:";
var memberInfoList = content.getMemberInfoList();
var userId, shutupTime;
for (var m in memberInfoList) {
userId = memberInfoList[m].getUserId();
shutupTime = memberInfoList[m].getShutupTime();
text += userId + ": ";
if (shutupTime != null && shutupTime !== undefined) {
if (shutupTime == 0) {
text += "取消禁言; ";
} else {
text += "禁言" + shutupTime + "秒; ";
}
} else {
text += " shutupTime为空";
}
if (memberInfoList.length > WEB_IM_GROUP_TIP_MAX_USER_COUNT && m == maxIndex) {
text += "等" + memberInfoList.length + "人";
break;
}
}
break;
default:
text += "未知群提示消息类型:type=" + opType;
break;
}
return text;
}