chat.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. // 若使用 IM 能力则引入
  2. import NIM from 'nim-web-sdk-ng';
  3. import http from './http';
  4. import store from '../store';
  5. var data = {};
  6. const images = [
  7. 'https://cdn.raex.vip/nft/2022-12-15-15-53-11SalztwsE.jpg',
  8. 'https://cdn.raex.vip/nft/2022-12-14-16-26-04uDhOZUZG.jpg',
  9. 'https://cdn.raex.vip/nft/2022-11-30-14-05-53IvdKPUqD.jpg',
  10. 'https://cdn.raex.vip/nft/僵尸/U/bj01_zt01_bq01_yf06_ts02_ls02_ss10_hk01.png',
  11. 'https://cdn.raex.vip/thumb_image/2022-06-17-22-27-50ABPKthLW.jpg',
  12. 'https://cdn.raex.vip/thumb_image/2022-12-06-14-21-19xesksFXt.jpg',
  13. 'https://cdn.raex.vip/nft/PFA1/bj51_t26_yf71_ts46_es13_ys9_qt7_z4.png',
  14. 'https://cdn.raex.vip/user/undefined/2022-11-09-15-40-15Cocfjrgz.png',
  15. 'https://cdn.raex.vip/image/2022-10-12-14-52-19IDjxOfox.jpg',
  16. 'https://cdn.raex.vip/image/2022-10-12-14-53-04eGNedNUK.jpg'
  17. ];
  18. //msg
  19. // scene: 消息场景
  20. // from: 消息发送方, 帐号或群id
  21. // fromNick: 消息发送方的昵称
  22. // fromClientType: 发送方的设备类型
  23. // fromDeviceId: 发送端设备id
  24. // to: 消息接收方, 帐号或群id
  25. // time: 时间戳
  26. // type: 消息类型
  27. // sessionId: 消息所属的会话对象的ID
  28. // target: 聊天对象, 账号或者群id
  29. // flow: 消息的流向
  30. // 'in'表示此消息是收到的消息
  31. // 'out'表示此消息是发出的消息
  32. // status: 消息发送状态
  33. // 'sending' 发送中
  34. // 'success' 发送成功
  35. // 'fail' 发送失败
  36. // text: 文本消息的文本内容, 请参考发送文本消息
  37. // file: 文件消息的文件对象, 具体字段请参考图片对象、音频对象、视频对象、文件对象, 请参考发送文件消息
  38. // geo: 地理位置消息的地理位置对象, 请参考发送地理位置消息
  39. // tip: 提醒消息的内容, 请参考发送提醒消息
  40. // content: 自定义消息的消息内容, 开发者可以自行扩展, 建议封装成JSON格式字符串, 请参考发送自定义消息
  41. // attach: 群通知消息的附加信息, 参考群通知消息来查看不同类型的群通知消息对应的附加信息
  42. // idClient: SDK生成的消息id, 在发送消息之后会返回给开发者, 开发者可以在发送消息的回调里面根据这个ID来判断相应消息的发送状态, 到底是发送成功了还是发送失败了, 然后根据此状态来更新页面的UI。如果发送失败, 那么可以重发消息
  43. // idServer: 服务器用于区分消息用的ID, 主要用于获取云端历史记录
  44. // isMuted: 该消息在接收方是否应该被静音
  45. // isInBlackList: 发送此条消息时,发送方'from'是否在接收方'to'的黑名单列表中
  46. // resend: 是否是重发的消息
  47. // custom: 扩展字段
  48. // 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
  49. // nosScene nos存储场景, 适用于发送文件消息, 默认初始化配置
  50. // nosSurvivalTime nos存储场景有效时间, 适用于发送文件消息,默认初始化配置
  51. // pushContent: 自定义推送文案
  52. // pushPayload: 自定义的推送属性
  53. // 推荐使用JSON格式构建, 非JSON格式的话, Web端会正常接收, 但是会被其它端丢弃
  54. // needPushNick: 是否需要推送昵称
  55. // apns: 特殊推送选项, 只在群会话中使用
  56. // apns.accounts: 需要特殊推送的账号列表, 此字段不存在的话表示推送给当前会话内的所有用户
  57. // apns.content: 需要特殊推送的文案
  58. // apns.forcePush: 是否强制推送, true 表示即使推送列表中的用户屏蔽了当前会话(如静音), 仍能够推送当前这条内容给相应用户
  59. // localCustom: 本地自定义扩展字段
  60. // 在支持数据库时可以调用更新本地消息来更新此字段, 此字段只会被更新到本地数据库, 不会被更新到服务器上
  61. // needMsgReceipt: 是否需要业务已读(包含该字段即表示需要),只有设置了业务已读,才可以调用getTeamMsgReads,getTeamMsgReadAccounts等相关方法
  62. // isHistoryable: 是否存储云端历史
  63. // isRoamingable: 是否支持漫游
  64. // isSyncable: 是否支持发送者多端同步
  65. // cc: 是否支持抄送
  66. // isPushable: 是否需要推送
  67. // isOfflinable: 是否要存离线
  68. // isUnreadable: 是否计入消息未读数
  69. // isLocal: 是否是本地消息, 请查阅发送本地消息
  70. // yidunAntiSpamRes: 易盾反垃圾返回的结果。当开启易盾反垃圾服务,并且匹配消息体命中到易盾的反垃圾规则,会返回此结果。
  71. var nim = null;
  72. var avatars = {};
  73. // teamId='7748093008'
  74. function initChat() {
  75. console.log('34664');
  76. http.http
  77. .get('/neteaseUser/get/' + store.state.userInfo.id)
  78. .then(res => {
  79. return Promise.resolve(res);
  80. })
  81. .catch(() => {
  82. return http.http.post('/neteaseUser/create?userId=' + store.state.userInfo.id);
  83. })
  84. .then(res => {
  85. store.commit('setNeteaseUser', res);
  86. nim = new NIM({
  87. debugLevel: 'debug', // 是否开启日志,将其打印到console。集成开发阶段建议打开。
  88. appkey: '872dd9d0a0f8eda25b579654745db459',
  89. account: store.state.userInfo.id, //账号
  90. token: res.token,
  91. db: true //若不要开启数据库请设置false。SDK默认为true。
  92. });
  93. avatars[store.state.userInfo.id] = store.state.userInfo.avatar;
  94. nim.connect().then(() => {
  95. getTeams();
  96. getSession();
  97. });
  98. nim.on('msg', onMsg);
  99. });
  100. }
  101. async function getTeams() {
  102. const teams = await nim.team.getTeams();
  103. console.log(teams);
  104. }
  105. //获取群消息
  106. async function getTeam(teamId) {
  107. const teamInfo = await nim.team.getTeamInfo({
  108. teamId: teamId
  109. });
  110. return teamInfo;
  111. }
  112. async function getHistroy(teamId) {
  113. return await nim.msgLog.getHistoryMsgs({
  114. scene: 'team',
  115. to: teamId,
  116. reverse: false,
  117. asc: true
  118. });
  119. }
  120. async function getSession() {
  121. const sessions = await nim.session.getSessions({
  122. limit: 10,
  123. desc: true
  124. });
  125. console.log(sessions);
  126. }
  127. async function onMsg(msg) {
  128. console.log('Receive msg: ', msg);
  129. await nim.msg.sendMsgReceipt({
  130. msg: msg
  131. });
  132. }
  133. async function sendMsg(msg = '', toTeamId, onSendBefore, type = 'Text', scene = 'team') {
  134. if (type === 'Text') {
  135. await nim.msg.sendTextMsg({
  136. scene: scene,
  137. to: toTeamId,
  138. body: msg,
  139. onSendBefore: msg => {
  140. onSendBefore(msg);
  141. }
  142. });
  143. } else {
  144. await nim.msg.sendImageMsg({
  145. scene: scene,
  146. to: toTeamId,
  147. file: msg,
  148. onUploadStart: function (task) {
  149. console.log('Upload start!', task);
  150. },
  151. onUploadProgress: function (progress) {
  152. console.log('Uploading!', progress);
  153. },
  154. onUploadDone: function (file) {
  155. console.log('Upload done!', file);
  156. },
  157. onSendBefore: function (msg) {
  158. onSendBefore(msg);
  159. }
  160. });
  161. }
  162. }
  163. function getPushMsg(msgs, oldMsgs = []) {
  164. if (!Array.isArray(msgs)) {
  165. msgs = [msgs];
  166. }
  167. if (!msgs) {
  168. return oldMsgs;
  169. }
  170. if (!msgs.length) {
  171. return oldMsgs;
  172. }
  173. let _back = [...msgs, ...oldMsgs].sort((a, b) => {
  174. return a.time - b.time;
  175. });
  176. _back = _back.map(item => {
  177. return {
  178. ...item,
  179. fromIcon: getAvatar(item.from)
  180. };
  181. });
  182. console.log(_back);
  183. return _back;
  184. }
  185. function getAvatar(account) {
  186. if (!avatars[account]) {
  187. avatars[account] = images[Math.floor(Math.random() * 10)];
  188. }
  189. return avatars[account];
  190. }
  191. export { nim, initChat, getTeam, getHistroy, sendMsg, getPushMsg };