whisper-cli.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. // 客服的id
  2. var kf_id = 0;
  3. var kf_name = '';
  4. // 是否点击显示表情的标志
  5. var flag = 1;
  6. // 发送锁 标识
  7. var sendLock = 0;
  8. // 窗口大小标识
  9. var size = 1;
  10. // 是否显示默认的聊天记录
  11. var commChat = 1;
  12. // 连接服务器
  13. if(config != undefined && config.socket != undefined){
  14. // 创建一个Socket实例
  15. var socket = new WebSocket('ws://' + config.socket+'?apiToken=8444fb09eec653b322a4ad74b836aed0');
  16. // 加锁
  17. lockTextarea();
  18. //showSystem({content: '连接中...'});
  19. document.getElementById('title').innerText = '连接中...';
  20. // 打开Socket
  21. socket.onopen = function(res) {
  22. console.log('握手成功');
  23. // 登录
  24. /*var login_data = '{"type":"userInit", "uid": "' + config.uid + '", "name" : "' + config.name +
  25. '", "avatar" : "' + config.avatar + '", "group" : ' + config.group + '}';*/
  26. var login_data = '{"type":"userInit","data":{"uid":"' + config.uid + '","name":"anon_5d1ef6fe753a1","avatar":"","group":1}}';
  27. console.log(login_data)
  28. socket.send(login_data);
  29. // 解锁
  30. unlockTextarea();
  31. };
  32. // 监听消息
  33. socket.onmessage = function(res) {
  34. var data = eval("("+res.data+")");
  35. switch(data['message_type']){
  36. // 服务端ping客户端
  37. case 'ping':
  38. socket.send('{"type":"ping"}');
  39. break;
  40. // 已经被分配了客服
  41. case 'connect':
  42. kf_id = data.data.kf_id;
  43. kf_name = data.data.kf_name;
  44. showSystem({content: '客服 ' + data.data.kf_name + ' 为您服务'});
  45. document.getElementById('title').innerHTML = '与 ' + kf_name + ' 交流中';
  46. if(1 == commChat){
  47. showChatLog();
  48. }
  49. unlockTextarea();
  50. break;
  51. // 排队等待
  52. case 'wait':
  53. lockTextarea();
  54. if('暂时没有客服上班,请稍后再咨询。' == data.data.content){
  55. socket.close();
  56. }
  57. document.getElementById('title').innerHTML = '请稍后再来';
  58. showSystem(data.data);
  59. break;
  60. // 监测聊天数据
  61. case 'chatMessage':
  62. showMsg(data.data);
  63. break;
  64. // 问候语
  65. case 'helloMessage':
  66. showMsg(data.data, 1);
  67. break;
  68. // 转接
  69. case 'relinkMessage':
  70. commChat = 2;
  71. document.getElementById('title').innerHTML = '正在转接中...';
  72. break;
  73. // 评价
  74. case 'evaluate':
  75. if (data.data.status ==1) {
  76. alert('成功')
  77. } else {
  78. alert('失败')
  79. }
  80. showMsg(aa);
  81. break;
  82. }
  83. };
  84. // 监听错误
  85. socket.onerror = function(err){
  86. showSystem({content: '连接失败'});
  87. document.getElementById('title').innerText = '连接失败';
  88. };
  89. }
  90. // 点击表情
  91. document.getElementById('up-face').onclick = function(e){
  92. e.stopPropagation();
  93. if(1 == flag){
  94. showFaces();
  95. document.getElementById('face-box').style.display = 'block';
  96. flag = 2;
  97. }else{
  98. document.getElementById('face-box').style.display = 'none';
  99. flag = 1;
  100. }
  101. };
  102. // 监听点击旁边关闭表情
  103. document.addEventListener("click",function(){
  104. if(2 == flag){
  105. document.getElementById('face-box').style.display = 'none';
  106. flag = 1;
  107. }
  108. });
  109. // 点击发送消息
  110. document.getElementById('send').onclick = function(){
  111. sendMsg();
  112. document.getElementById('msg').value = '';
  113. // 滚动条自动定位到最底端
  114. wordBottom();
  115. };
  116. // 改变窗体事件
  117. window.onresize = function(){
  118. if(1 == size){
  119. size = 2;
  120. document.getElementById('face-box').style.top = '58%';
  121. document.getElementById('chat-content-box').style.height = '75%';
  122. }else if(2 == size){
  123. size = 1;
  124. document.getElementById('face-box').style.top = '190px';
  125. document.getElementById('chat-content-box').style.height = '60%';
  126. }
  127. };
  128. // 图片 文件上传
  129. layui.use(['upload', 'layer'], function () {
  130. var upload = layui.upload;
  131. var layer = layui.layer;
  132. // 执行实例
  133. var uploadInstImg = upload.render({
  134. elem: '#up-image' // 绑定元素
  135. , accept: 'images'
  136. , exts: 'jpg|jpeg|png|gif'
  137. , url: '/index/upload/uploadImg' // 上传接口
  138. , done: function (res) {
  139. sendMsg('img[' + res.data.src + ']');
  140. showBigPic();
  141. }
  142. , error: function () {
  143. // 请求异常回调
  144. }
  145. });
  146. });
  147. // 获取时间
  148. function getTime(){
  149. var myDate = new Date();
  150. var hour = myDate.getHours();
  151. var minute = myDate.getMinutes();
  152. if(hour < 10) hour = '0' + hour;
  153. if(minute < 10) minute = '0' + minute;
  154. return hour + ':' + minute;
  155. }
  156. // 展示系统消息
  157. function showSystem(msg){
  158. var _html = document.getElementById('chat-list').innerHTML;
  159. _html += '<div class="whisper-chat-system"><span>' + msg.content + '</span></div>';
  160. document.getElementById('chat-list').innerHTML = _html;
  161. }
  162. //机器人
  163. function aa() {
  164. socket.send(JSON.stringify({
  165. type: 'toRobot',
  166. data: {groups_id: 1, robot_name: '范德萨1', robotgroups_id: 1,
  167. from_id: config.uid}
  168. }));
  169. }
  170. //评价
  171. function bb() {
  172. socket.send(JSON.stringify({
  173. type: 'evaluate',
  174. data: {
  175. evaluate_id: 1, from_id: config.uid,
  176. }
  177. }));
  178. }
  179. // 发送信息
  180. function sendMsg(sendMsg){
  181. if(1 == sendLock){
  182. return false;
  183. }
  184. var msg = (typeof(sendMsg) == 'undefined') ? document.getElementById('msg').value : sendMsg;
  185. if('' == msg){
  186. return false;
  187. }
  188. var _html = document.getElementById('chat-list').innerHTML;
  189. var time = getTime();
  190. var content = replaceContent(msg);
  191. _html += '<div class="chat-mine">';
  192. _html += '<div class="author-name">我 ';
  193. _html += '<small class="chat-date">' + time + '</small>';
  194. _html += '</div><div class="chat-text">' + content + '</div></div>';
  195. // 发送消息
  196. socket.send(JSON.stringify({
  197. type: 'chatMessage',
  198. data: {to_id: kf_id, to_name: kf_name, content: msg, from_name: config.name,
  199. from_id: config.uid, from_avatar: config.avatar, conversationId: 1}
  200. }));
  201. // 储存我发出的信息
  202. var key = kf_id + '-' + config.uid;
  203. if(typeof(Storage) !== "undefined"){
  204. var localMsg = getCache(key);
  205. if(localMsg == null || localMsg.length == 0){
  206. localMsg = [];
  207. }
  208. localMsg.push({type: 'mine', name: '我', time: time, content: content});
  209. cacheChat({key: key, data: localMsg});
  210. }
  211. document.getElementById('chat-list').innerHTML = _html;
  212. // 滚动条自动定位到最底端
  213. wordBottom();
  214. showBigPic();
  215. }
  216. // 展示发送来的消息
  217. function showMsg(info, flag){
  218. // 清除系统消息
  219. document.getElementsByClassName('whisper-chat-system').innerHTML = '';
  220. console.log(info)
  221. var _html = document.getElementById('chat-list').innerHTML;
  222. var content = replaceContent(info.content);
  223. _html += '<div class="chat-other">';
  224. _html += '<div class="author-name">' + info.name + ' ';
  225. _html += '<small class="chat-date">' + info.time + '</small>';
  226. _html += '</div><div class="chat-text">' + content + '</div></div>';
  227. document.getElementById('chat-list').innerHTML = _html;
  228. showBigPic();
  229. // 滚动条自动定位到最底端
  230. wordBottom();
  231. // 储存我收到的信息
  232. var key = kf_id + '-' + config.uid;
  233. if(typeof(Storage) !== "undefined" && typeof(flag) == "undefined"){
  234. var localMsg = getCache(key);
  235. if(localMsg == null || localMsg.length == 0){
  236. localMsg = [];
  237. }
  238. localMsg.push({type: 'other', name: info.name, time: info.time, content: content});
  239. cacheChat({key: key, data: localMsg});
  240. }
  241. }
  242. // 展示表情数据
  243. function showFaces(){
  244. var alt = getFacesIcon();
  245. var _html = '<ul>';
  246. var len = alt.length;
  247. for(var index = 0; index < len; index++){
  248. _html += '<li title="' + alt[index] + '" onclick="checkFace(this)"><img src="/static/customer/images/face/'+ index + '.gif" /></li>';
  249. }
  250. _html += '</ul>';
  251. document.getElementById('face-box').innerHTML = _html;
  252. }
  253. // 选择表情
  254. function checkFace(obj){
  255. var msg = document.getElementById('msg').value;
  256. document.getElementById('msg').value = msg + ' face' + obj.title + ' ';
  257. document.getElementById('msg').focus();
  258. document.getElementById('face-box').style.display = 'none';
  259. flag = 1;
  260. }
  261. // 缓存聊天数据 [本地存储策略]
  262. function cacheChat(obj){
  263. if(typeof(Storage) !== "undefined"){
  264. localStorage.setItem(obj.key, JSON.stringify(obj.data));
  265. }
  266. }
  267. // 从本地缓存中,拿出数据
  268. function getCache(key){
  269. return JSON.parse(localStorage.getItem(key));
  270. }
  271. // 展示本地聊天缓存
  272. function showChatLog(){
  273. var chatLog = getCache(kf_id + '-' + config.uid);
  274. if(chatLog == null || chatLog.length == 0){
  275. return ;
  276. }
  277. var _html = '';
  278. var len = chatLog.length;
  279. for(var i = 0; i < len; i++){
  280. var item = chatLog[i];
  281. if('mine' == item.type){
  282. _html += '<div class="chat-mine">';
  283. _html += '<div class="author-name">' + item.name + ' ';
  284. _html += '<small class="chat-date">' + item.time + '</small>';
  285. _html += '</div><div class="chat-text">' + item.content + '</div></div>';
  286. }else if('other' == item.type){
  287. _html += '<div class="chat-other">';
  288. _html += '<div class="author-name">' + item.name + ' ';
  289. _html += '<small class="chat-date">' + item.time + '</small>';
  290. _html += '</div><div class="chat-text">' + item.content + '</div></div>';
  291. }
  292. }
  293. document.getElementById('chat-list').innerHTML = _html;
  294. showBigPic();
  295. // 滚动条自动定位到最底端
  296. wordBottom();
  297. }
  298. // 锁住输入框
  299. function lockTextarea(){
  300. sendLock = 1;
  301. document.getElementById('msg').setAttribute('readonly', 'readonly');
  302. }
  303. // 解锁输入框
  304. function unlockTextarea(){
  305. sendLock = 0;
  306. document.getElementById('msg').removeAttribute('readonly');
  307. }
  308. // 双击图片
  309. function showBigPic(){
  310. layui.use('jquery', function(){
  311. var $ = layui.jquery;
  312. $(".layui-whisper-photos").on('click', function () {
  313. var src = this.src;
  314. layer.photos({
  315. photos: {
  316. data: [{
  317. "alt": "大图模式",
  318. "src": src
  319. }]
  320. }
  321. , shade: 0.5
  322. , closeBtn: 2
  323. , anim: 0
  324. , resize: false
  325. , success: function (layero, index) {
  326. }
  327. });
  328. });
  329. });
  330. }
  331. // 对话框定位到最底端
  332. function wordBottom(){
  333. var ex = document.getElementById("chat-list");
  334. ex.scrollTop = ex.scrollHeight;
  335. }