newIM_init.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. var TIM = require('./tim-wx.js');
  2. var config = require('@/static/config.js');
  3. import requestConfig from '@/static/lib/requestConfig.js';
  4. var app, tim;
  5. var SDKConfig = {
  6. sdkappid: config.sdkAppID,
  7. accountType: config.accType,
  8. accountMode: 0 //帐号模式,0-表示独立模式,1-表示托管模式
  9. };
  10. var event = {
  11. onIMReady: function() {
  12. },
  13. onGetPusherList: function() {}, // 初始化成员列表
  14. onPusherJoin: function() {}, // 进房通知
  15. onPusherQuit: function() {}, // 退房通知
  16. onRoomClose: function() {}, // 群解散通知
  17. onRecvRoomTextMsg: function() {}, // 消息通知
  18. onMsgNotify: function() {}, // 监听新消息(私聊(包括普通消息和全员推送消息),普通群(非直播聊天室)消息)事件,必填
  19. onDestoryGroupNotify: function() {}, //群被解散(全员接收) 5
  20. onCustomGroupNotify: function() {}, //用户自定义通知(默认全员接收) 255
  21. onLoginSuccess: function() {}, //IM 登录成功的回调
  22. onBigGroupMsgNotify: function() {}, //监听新消息(大群)事件
  23. };
  24. function handleUnreadMsg(msg) {
  25. console.log('处理全局未读消息')
  26. if (msg.from === app.globalData.single.id + '_' + config.brandId + '_1') {
  27. return false
  28. }
  29. var adviserHouseId = msg.from.split("_")[1];
  30. if (!adviserHouseId) {
  31. return
  32. }
  33. var unReadMsgs = uni.getStorageSync('unReadMsgs') || {};
  34. var currentHouseUnReadMsgs = unReadMsgs[adviserHouseId] || {};//项目下消息数目
  35. unReadMsgs.total = unReadMsgs.total ? unReadMsgs.total : 0;
  36. currentHouseUnReadMsgs.total = currentHouseUnReadMsgs.total ? currentHouseUnReadMsgs.total : 0;
  37. unReadMsgs['total']++;
  38. currentHouseUnReadMsgs['total']++;
  39. let list = getCurrentPages();
  40. if (!currentHouseUnReadMsgs[msg.from]) {//项目未读消息下 对应 具体的顾问
  41. currentHouseUnReadMsgs[msg.from] = 1;
  42. } else {
  43. currentHouseUnReadMsgs[msg.from]++;
  44. console.log(unReadMsgs[msg.from], '今天你增加了吗')
  45. }
  46. console.log('未读计数增加', list)
  47. unReadMsgs[adviserHouseId] = currentHouseUnReadMsgs
  48. uni.setStorageSync('unReadMsgs', unReadMsgs)
  49. list.forEach((item, index) => {
  50. console.log(item, 'bpbpbpbpbp')
  51. if (item.$vm && item.$vm.refreshNumber && typeof item.$vm.refreshNumber === 'function') {
  52. console.log('户型图集增加', unReadMsgs)
  53. item.$vm.refreshNumber()
  54. }
  55. })
  56. console.log('全局未读消息处理完毕')
  57. }
  58. function msgReceived(msg) {
  59. // 实例化 对象
  60. var myMsg = JSON.parse(JSON.stringify(msg));
  61. console.log('接收到最新消息', myMsg)
  62. console.log('接收到最新消息', myMsg.data[0].payload)
  63. if (myMsg.data instanceof Array) {
  64. myMsg.data.forEach((item, index) => {
  65. console.log(item.conversationType)
  66. if (item.conversationType == 'GROUP') {
  67. console.log('收到群消息,进去处理',item)
  68. // event.onBigGroupMsgNotify(item)
  69. event.onBigGroupMsgNotify(myMsg.data)
  70. parseGroupSystemNotice(item.payload)
  71. } else if (item.payload && item.payload.data && item.payload.data.includes('InputStatus')) {
  72. console.log('对方键盘事件')
  73. } else if (item.conversationType == '@TIM#SYSTEM') {
  74. console.log('系统通知@_@')
  75. parseGroupSystemNotice(item.payload)
  76. } else {
  77. console.log('传出去了')
  78. handleUnreadMsg(item)
  79. console.log('开始传回当前页notify')
  80. event.onMsgNotify(item)
  81. }
  82. })
  83. }
  84. // 收到推送的单聊、群聊、群提示、群系统通知的新消息,可通过遍历 event.data 获取消息列表数据并渲染到页面
  85. // event.name - TIM.EVENT.MESSAGE_RECEIVED
  86. // event.data - 存储 Message 对象的数组 - [Message]
  87. }
  88. function parseGroupSystemNotice(payload) {
  89. const groupName =
  90. payload.groupProfile.groupName || payload.groupProfile.groupID
  91. console.log('审判群组消息类型', payload.operationType)
  92. switch (payload.operationType) {
  93. case 1:
  94. return `申请加入群组:${groupName}`
  95. case 2:
  96. event.onCustomGroupNotify(payload);
  97. case 3:
  98. return `申请加入群组:${groupName}被拒绝`
  99. case 4:
  100. return `被管理员${payload.operatorID}踢出群组:${groupName}`
  101. case 5:
  102. return `成功加入群组:${groupName}`
  103. case 6:
  104. return `${payload.operatorID}创建群:${groupName}`
  105. case 7:
  106. return `${payload.operatorID}邀请你加群:${groupName}`
  107. case 8:
  108. return `你退出群组:${groupName}`
  109. case 9:
  110. return `你被${payload.operatorID}设置为群:${groupName}的管理员`
  111. case 10:
  112. return `你被${payload.operatorID}撤销群:${groupName}的管理员身份`
  113. case 255:
  114. event.onCustomGroupNotify(payload);
  115. }
  116. }
  117. function loginIM(data) {
  118. app = getApp();
  119. if (app.globalData.globalWebimhandler) {
  120. event.onIMReady()
  121. event.onLoginSuccess()
  122. return
  123. }
  124. var loginInfo = {
  125. 'sdkAppID': SDKConfig.sdkappid, //用户所属应用id,必填
  126. 'appIDAt3rd': SDKConfig.sdkappid, //用户所属应用id,必填
  127. 'accountType': SDKConfig.accountType, //用户所属应用帐号类型,必填
  128. 'identifier': app.globalData.identifier, //当前用户ID,必须是否字符串类型,选填
  129. 'identifierNick': app.globalData.single.nickname || '小程序用户', //当前用户昵称,选填
  130. 'userSig': app.globalData.userSig, //当前用户身份凭证,必须是字符串类型,选填
  131. };
  132. console.log('开始创建im')
  133. tim = TIM.create({
  134. SDKAppID: config.sdkAppID
  135. })
  136. tim.setLogLevel(0);
  137. // 监听事件,例如:
  138. tim.on(TIM.EVENT.SDK_READY, function(msg) {
  139. console.log('imReady***')
  140. event.onIMReady()
  141. console.log('%%%%', event.onIMReady)
  142. event.onLoginSuccess && event.onLoginSuccess();
  143. app.globalData.globalWebimhandler = true
  144. });
  145. tim.on(TIM.EVENT.MESSAGE_RECEIVED, msgReceived);
  146. tim.on(TIM.EVENT.MESSAGE_REVOKED, function(event) {
  147. // 收到消息被撤回的通知
  148. // event.name - TIM.EVENT.MESSAGE_REVOKED
  149. // event.data - 存储 Message 对象的数组 - [Message] - 每个 Message 对象的 isRevoked 属性值为 true
  150. });
  151. tim.on(TIM.EVENT.MESSAGE_READ_BY_PEER, function(event) {
  152. // SDK 收到对端已读消息的通知,即已读回执。使用前需要将 SDK 版本升级至 v2.7.0 或以上。仅支持单聊会话。
  153. // event.name - TIM.EVENT.MESSAGE_READ_BY_PEER
  154. // event.data - event.data - 存储 Message 对象的数组 - [Message] - 每个 Message 对象的 isPeerRead 属性值为 true
  155. });
  156. tim.on(TIM.EVENT.CONVERSATION_LIST_UPDATED, function(event) {
  157. console.log('监听到会话列表更新', event.data)
  158. // 收到会话列表更新通知,可通过遍历 event.data 获取会话列表数据并渲染到页面
  159. // event.name - TIM.EVENT.CONVERSATION_LIST_UPDATED
  160. // event.data - 存储 Conversation 对象的数组 - [Conversation]
  161. });
  162. tim.on(TIM.EVENT.GROUP_LIST_UPDATED, function(event) {
  163. // 收到群组列表更新通知,可通过遍历 event.data 获取群组列表数据并渲染到页面
  164. // event.name - TIM.EVENT.GROUP_LIST_UPDATED
  165. // event.data - 存储 Group 对象的数组 - [Group]
  166. });
  167. tim.on(TIM.EVENT.PROFILE_UPDATED, function(event) {
  168. // 收到自己或好友的资料变更通知
  169. // event.name - TIM.EVENT.PROFILE_UPDATED
  170. // event.data - 存储 Profile 对象的数组 - [Profile]
  171. });
  172. tim.on(TIM.EVENT.BLACKLIST_UPDATED, function(event) {
  173. // 收到黑名单列表更新通知
  174. // event.name - TIM.EVENT.BLACKLIST_UPDATED
  175. // event.data - 存储 userID 的数组 - [userID]
  176. });
  177. tim.on(TIM.EVENT.ERROR, function(event) {
  178. console.log('SDKERROR!!', event)
  179. // 收到 SDK 发生错误通知,可以获取错误码和错误信息
  180. // event.name - TIM.EVENT.ERROR
  181. // event.data.code - 错误码
  182. // event.data.message - 错误信息
  183. });
  184. tim.on(TIM.EVENT.SDK_NOT_READY, function(event) {
  185. console.log('SDK_NOT_READY!!', event)
  186. app.globalData.globalWebimhandler = null;
  187. // 收到 SDK 进入 not ready 状态通知,此时 SDK 无法正常工作
  188. // event.name - TIM.EVENT.SDK_NOT_READY
  189. });
  190. tim.on(TIM.EVENT.KICKED_OUT, function(event) {
  191. // 收到被踢下线通知
  192. // event.name - TIM.EVENT.KICKED_OUT
  193. // event.data.type - 被踢下线的原因,例如:
  194. // - TIM.TYPES.KICKED_OUT_MULT_ACCOUNT 多实例登录被踢
  195. // - TIM.TYPES.KICKED_OUT_MULT_DEVICE 多终端登录被踢
  196. // - TIM.TYPES.KICKED_OUT_USERSIG_EXPIRED 签名过期被踢 (v2.4.0起支持)。
  197. });
  198. tim.on(TIM.EVENT.NET_STATE_CHANGE, function(event) {
  199. // 网络状态发生改变(v2.5.0 起支持)。
  200. // event.name - TIM.EVENT.NET_STATE_CHANGE
  201. // event.data.state 当前网络状态,枚举值及说明如下:
  202. // \- TIM.TYPES.NET_STATE_CONNECTED - 已接入网络
  203. // \- TIM.TYPES.NET_STATE_CONNECTING - 连接中。很可能遇到网络抖动,SDK 在重试。接入侧可根据此状态提示“当前网络不稳定”或“连接中”
  204. // \- TIM.TYPES.NET_STATE_DISCONNECTED - 未接入网络。接入侧可根据此状态提示“当前网络不可用”。SDK 仍会继续重试,若用户网络恢复,SDK 会自动同步消息
  205. });
  206. // 开始登录
  207. let afterLoginIM = tim.login({
  208. userID: loginInfo.identifier,
  209. userSig: loginInfo.userSig
  210. });
  211. afterLoginIM.then((imResponse) => {
  212. console.log(imResponse.data, 'niubi'); // 登录成功
  213. if (imResponse.data.repeatLogin === true) {
  214. data.callback && data.callback()
  215. // 标识账号已登录,本次登录操作为重复登录。v2.5.1 起支持
  216. console.log(imResponse.data.errorInfo);
  217. }
  218. }).catch((imError) => {
  219. console.warn('login error:', imError); // 登录失败的相关信息
  220. })
  221. }
  222. function logout(callback) {
  223. app = getApp();
  224. // 退出IM登录
  225. tim.logout();
  226. console.log('imRoom总im退出登录')
  227. app.globalData.globalWebimhandler = null;
  228. callback && callback()
  229. }
  230. function sendCustomMsg(data, type, nickname, callback) {
  231. let message = tim.createCustomMessage({
  232. to: type.myselToID,
  233. conversationType: type.TYPE == 'C2C' ? TIM.TYPES.CONV_C2C : TIM.TYPES.GROUP,
  234. // 消息优先级,用于群聊(v2.4.2起支持)。如果某个群的消息超过了频率限制,后台会优先下发高优先级的消息,详细请参考 消息优先级与频率控制
  235. // 支持的枚举值:TIM.TYPES.MSG_PRIORITY_HIGH, TIM.TYPES.MSG_PRIORITY_NORMAL(默认), TIM.TYPES.MSG_PRIORITY_LOW, TIM.TYPES.MSG_PRIORITY_LOWEST
  236. // priority: TIM.TYPES.MSG_PRIORITY_HIGH,
  237. payload: {
  238. data: '',
  239. description: '',
  240. extension: data.ext,
  241. }
  242. });
  243. let promise = tim.sendMessage(message, {
  244. // 如果接收方不在线,则消息将存入漫游,且进行离线推送(在接收方 App 退后台或者进程被 kill 的情况下)。接入侧可自定义离线推送的标题及内容
  245. offlinePushInfo: {
  246. disablePush: false,
  247. title: '收到一条新消息', // 离线推送标题
  248. description: '请进入APP内查看', // 离线推送内容
  249. androidOPPOChannelID: '' // 离线推送设置 OPPO 手机 8.0 系统及以上的渠道 ID
  250. }
  251. });
  252. promise.then((imResponse) => {
  253. callback && callback(data)
  254. })
  255. }
  256. function getC2CHistoryMsgs(options) {
  257. console.log(tim)
  258. let promise = tim.getMessageList({
  259. conversationID: 'C2C' + options.adviserId,
  260. count: 10,
  261. nextReqMessageID: options.nextReqMessageID
  262. })
  263. promise.then((res) => {
  264. console.log('拉取到顾问' + options.adviserId + '的历史消息当前第' + options.nextReqMessageID + '页')
  265. console.log(res)
  266. options.success && options.success(JSON.parse(JSON.stringify(res.data)))
  267. }).catch((err) => {
  268. options.fail && options.fail(err)
  269. })
  270. }
  271. function onSendMsg(message, type, nickname, callback, fail) {
  272. let Cmessage = tim.createTextMessage({
  273. to: type.myselToID,
  274. conversationType: type.TYPE == 'C2C' ? TIM.TYPES.CONV_C2C : TIM.TYPES.GROUP,
  275. // 消息优先级,用于群聊(v2.4.2起支持)。如果某个群的消息超过了频率限制,后台会优先下发高优先级的消息,详细请参考 消息优先级与频率控制
  276. // 支持的枚举值:TIM.TYPES.MSG_PRIORITY_HIGH, TIM.TYPES.MSG_PRIORITY_NORMAL(默认), TIM.TYPES.MSG_PRIORITY_LOW, TIM.TYPES.MSG_PRIORITY_LOWEST
  277. // priority: TIM.TYPES.MSG_PRIORITY_HIGH,
  278. payload: {
  279. text: message
  280. }
  281. });
  282. let promise = tim.sendMessage(Cmessage);
  283. promise.then((imResponse) => {
  284. console.log('发送完毕', imResponse)
  285. callback && callback({
  286. content: message
  287. })
  288. }).catch((err) => {})
  289. }
  290. function getRecentContactList(data, callback) {
  291. let promise = tim.getConversationList();
  292. promise.then(function(imResponse) {
  293. const conversationList = imResponse.data.conversationList; // 会话列表,用该列表覆盖原有的会话列表
  294. callback && callback(conversationList.filter((item) => {
  295. return item.type !== '@TIM#SYSTEM'
  296. }))
  297. }).catch(function(imError) {
  298. console.warn('getConversationList error:', imError); // 获取会话列表失败的相关信息
  299. });
  300. }
  301. function onBigGroupMsgNotify() {
  302. }
  303. function parseGroupTipContent(payload) {
  304. switch (payload.operationType) {
  305. case this.TIM.TYPES.GRP_TIP_MBR_JOIN:
  306. return `群成员:${payload.userIDList.join(',')},加入群组`
  307. case this.TIM.TYPES.GRP_TIP_MBR_QUIT:
  308. return `群成员:${payload.userIDList.join(',')},退出群组`
  309. case this.TIM.TYPES.GRP_TIP_MBR_KICKED_OUT:
  310. return `群成员:${payload.userIDList.join(',')},被${payload.operatorID}踢出群组`
  311. case this.TIM.TYPES.GRP_TIP_MBR_SET_ADMIN:
  312. return `群成员:${payload.userIDList.join(',')},成为管理员`
  313. case this.TIM.TYPES.GRP_TIP_MBR_CANCELED_ADMIN:
  314. return `群成员:${payload.userIDList.join(',')},被撤销管理员`
  315. default:
  316. return '[群提示消息]'
  317. }
  318. }
  319. function setListener(options) {
  320. if (!options) {
  321. console.log('setListener参数错误', options);
  322. return;
  323. }
  324. event.onGetPusherList = options.onGetPusherList || function() {};
  325. event.onIMReady = options.onIMReady || function() {};
  326. event.onPusherJoin = options.onPusherJoin || function() {};
  327. event.onPusherQuit = options.onPusherQuit || function() {};
  328. event.onRoomClose = options.onRoomClose || function() {};
  329. event.onRecvRoomTextMsg = options.onRecvRoomTextMsg || function() {};
  330. event.onMsgNotify = options.onMsgNotify || function() {}; // 监听新消息(私聊(包括普通消息和全员推送消息),普通群(非直播聊天室)消息)事件,必填
  331. event.onDestoryGroupNotify = options.onDestoryGroupNotify || function() {}; //群被解散(全员接收) 5
  332. event.onCustomGroupNotify = options.onCustomGroupNotify || function() {}; //用户自定义通知(默认全员接收) 255
  333. event.onLoginSuccess = options.onLoginSuccess || function() {}; //IM 登录成功的回调
  334. event.onBigGroupMsgNotify = options.onBigGroupMsgNotify || function() {}; //监听新消息(大群)事件,必填
  335. }
  336. function applyJoinBigGroup(roomID, callback, callbackOptions) {
  337. let res = tim.joinGroup({
  338. groupID: roomID,
  339. applyMessage: '视频通话申请加群',
  340. type: TIM.TYPES.GRP_AVCHATROOM
  341. })
  342. res.then((imResponse) => {
  343. console.log(imResponse, '群组资料')
  344. switch (imResponse.data.status) {
  345. case TIM.TYPES.JOIN_STATUS_WAIT_APPROVAL:
  346. break; // 等待管理员同意
  347. case TIM.TYPES.JOIN_STATUS_SUCCESS: // 加群成功
  348. console.log('关键步骤:加群成功!')
  349. callback && callback({
  350. errCode: 0,
  351. callback: callbackOptions
  352. });
  353. console.log(imResponse.data.group, '00000'); // 加入的群组资料
  354. break;
  355. case TIM.TYPES.JOIN_STATUS_ALREADY_IN_GROUP: // 已经在群中
  356. console.log('关键步骤:加群成功2!')
  357. callback && callback({
  358. errCode: 0,
  359. callback: callbackOptions
  360. });
  361. break;
  362. default:
  363. console.log('关键步骤:加群成功3!')
  364. break;
  365. }
  366. }).catch(function(imError) {
  367. console.warn('joinGroup error:', imError); // 申请加群失败的相关信息
  368. });
  369. }
  370. async function createBigGroup(options, cb) {
  371. console.log(options.roomID, '为什么要自动id?')
  372. // tim.createGroup({
  373. // groupID: options.roomID,
  374. // type: TIM.TYPES.GRP_AVCHATROOM,//直播群
  375. // maxMemberNum: 500,
  376. // name: options.roomName || '',
  377. // memberList: [],
  378. // }).then((imResponse) => {
  379. // cb(imResponse)
  380. // console.log(imResponse.data.group, '新版建群成功'); // 创建的群的资料
  381. // }).catch(function(imError) {
  382. // console.warn('createGroup error:', imError); // 创建群组失败的相关信息
  383. // })
  384. // 这里是管理员创建的群,已经不是当前用户创建群的逻辑了
  385. var res = await requestConfig('createGroup', {
  386. groupID: options.roomID,
  387. type: TIM.TYPES.GRP_AVCHATROOM,//直播群
  388. maxMemberNum: 500,
  389. name: options.roomName || '',
  390. memberList: []
  391. }, true);
  392. if (res && res.success) {
  393. cb()
  394. console.log(options, '新版建群成功'); // 创建的群的资料
  395. }
  396. else{
  397. console.warn('createGroup error:', res.message); // 创建群组失败的相关信息
  398. }
  399. }
  400. function quitBigGroup(groupID) {
  401. tim.quitGroup(groupID).then((res) => {
  402. console.log('退出群成功')
  403. });
  404. // var res = await requestConfig('deleteGroupMember', {
  405. // groupId: groupID,
  406. // }, true);
  407. }
  408. function destroyGroup(groupID) {
  409. // tim.dismissGroup(groupID).then((res) => {
  410. // console.log('解散群成功')
  411. // });
  412. // 管理员建群,必须是管理员销毁-此处就是调接口,让管理员销毁群
  413. requestConfig('destroyGroup', {
  414. groupId: groupID,
  415. }, true);
  416. }
  417. module.exports = {
  418. loginIM: loginIM, // 登陆IM
  419. setListener: setListener,
  420. logout: logout,
  421. sendCustomMsg: sendCustomMsg,
  422. onSendMsg: onSendMsg,
  423. applyJoinBigGroup: applyJoinBigGroup,
  424. quitBigGroup: quitBigGroup,
  425. destroyGroup: destroyGroup,
  426. getRecentContactList: getRecentContactList,
  427. onBigGroupMsgNotify: onBigGroupMsgNotify,
  428. getC2CHistoryMsgs: getC2CHistoryMsgs,
  429. createBigGroup: createBigGroup
  430. }