Namespace.register("U.MD.F.N"); //好友消息命名空间 U.MD.F.N.news = []; //用户所有的消息数组 /** * 好友消息服务 * * @param {string} 用户id */ U.MD.F.N.messageService = function (userid) { if (US.friend.allclass && userid && userid.length == 36) { //获取好友未读消息 U.A.Request(US.USER, ["GetAllUnreadMessage", userid], U.MD.F.N.asynMessageService); } } /** * 这个是消息的异步处理 * * @param {object} 后台返回数据的ajax对象 * 0 好友未读消息 1 用户在服务器的状态 */ U.MD.F.N.asynMessageService = function (r) { r = r.value; if (r) { //如果后台有返回数据的处理 var i, _userinfo = US.userInfo, //登录用户的信息 _statenew = r[1]; //如果状态服务器里返回的数据在前端最终生成是字符串,那么就是用户的登录状态的变化 if (typeof _statenew == "string") { U.MD.F.N.inlineNotice(_statenew); } //否则就是用户获取到自己的好友和其他的信息 else { U.MD.F.N.friendOnlineAndOffline(_statenew); //用户上下线设置 U.MD.F.N.messageHandle(r); //聊天消息的处理 } } } /** * 好友的上下线处理 * * @param {object} 后台返回数据的ajax对象 * 0 好友未读消息 1 用户在服务器的状态 */ U.MD.F.N.friendOnlineAndOffline = function (statenew) { var i, j, k, _num, _el, _idarr, _friendform = $("#U_MD_F_H_ZLZ")[0], //好友窗体 _userid = US.userInfo.userid, //登录用户id _friendinfo = US.friend; //好友信息数组 //循环上下线通知 0是下线的用户,1是上线的用户 for (i = 0; i < statenew.length; i++) { //如果有上线或者下线的用户 if (statenew[i].length) { //获取所有上下线的数组 _idarr = statenew[i].join(","); //循环好友的数组 0 好友分组 1 所有的好友 2 好友群 3 群好友 4 在线用户 中的 1 、 3 、4 for (j = 0; j < 3; j++) { _num = j = 0 ? 1 : j + 2; //1、3、4的规律算法 for (k = 0; k < _friendinfo[_num].length; k++) { //如果用户在上下线操作里面 if (_idarr.indexOf(_friendinfo[_num][k].UserId) > -1) { _friendinfo[_num][k].IsLogin = i; //设置是否登录的处理 } } U.Json.sort(US.friend[_num], "IsLogin", 1); //上下线后重新排序 } //把上线的用户置顶,下线的用户放在下面 for (j = 0; j < statenew[i].length; j++) { _el = $("@TID='" + statenew[i][j] + "'", _friendform); //找到指定的元素 if (_el[0]) { $(_el[0].Parent()).append(_el, null, i ? _el[0].Parent().firstChild : null); } } } } } /** * 下线通知区域 * * @param {object} 后台返回数据的ajax对象 * 0 好友未读消息 1 用户在服务器的状态 */ U.MD.F.N.inlineNotice = function (userstate) { //其它地方登录 if (userstate == "upline") { return; //前期允许多点登录 //其他地方登录弹出提示框 U.UF.UI.confirm($$("div", { "style": { "textAlign": "center", "marginTop": "25px", "padding": "10px 0", "fontSize": "14px", "color": "red" }, "innerHTML": "您好, 您的账号在别处有登录!" })); U.MD.U.LO.logout(); //注销账号信息 } //超时重新连接 else { U.A.Request(US.FRIEND, ["UserStateLogin", US.userInfo.username, US.userInfo.UserPassword], function () { }); } } /** * 消息查看 * * @param {object} 0 好友和群消息 1 交互消息 */ U.MD.F.N.messageHandle = function (arr) { //好友消息和群消息的处理 if (arr[0]) { U.MD.F.N.friendMessageHandle(arr[0]); } if (arr[1]) { U.MD.F.N.otherNews(arr[1]); } } //点击查看消息 /** * 消息查看 * * @param {object} 0 好友和群消息 1 交互消息 */ U.MD.F.N.friendMessageHandle = function (newsarr) { U.MD.F.N.MarkUnreadMessage(newsarr); var i, j, k, _isnews, _obj, _form, _news, _isgroup, //是否是群消息 _verify, //消息类型 _allnews = U.MD.F.N.news, //还有消息数组 _friendel = $("#U_MD_D_MG_AFT")[0]; //循环消息数组 0 好友消息, 1群消息 for (j = 0; j < newsarr.length; j++) { _news = newsarr[j]; //得到好友或者群消息 //判断是否存在 if (_news) { //好友消息或者群消息循环处理 由于好友或者群消息有多种消息 如添加还有消息、好友聊天消息,进入群消息,群聊天消息等, for (i = 0; i < _news.length; i++) { _obj = null; //清空obj _isgroup = _news[i].UserId == null; //判断消息是什么消息 _verify = _news[i].MessageIsVerify || 0; //如果没有消息的类型,暂时只有群消息的时候才会触发 _allnews[_verify] = _allnews[_verify] || []; //设置功能 switch (_verify) { //好友或者群聊天消息 case 0: case 6: _news[i].MessageSendTime = U.UF.D.getYearMonthDay(_news[i].MessageSendTime) || U.UF.D.getYearMonthDay(_news[i].GroupMessageSendTime); //发送消息的时间 _form = U.MD.F.W.isCreateForm(_news[i].UserId || _news[i].GroupManageID); //判断好友消息窗口是否打开 //如果窗体存在的处理 if (_form && _form[1]) { //文件消息分享处理 if (_verify == 6) { U.MD.F.W.printFriendChatMessage($('.U_MD_F_CA')[0], newsarr[0]); //打印好友分享文件消息 } else { //获取消息打印 U.MD.F.H.getFriendOrGroupNews(_news[i].UserId || _news[i].GroupManageID, function (r) { //打印消息 console.log(r); U.MD.F.N.asynReceiveMessages(_isgroup, _form[1], r.value); }, _isgroup); } continue; } U.MD.F.H.recentContacts(_news[i]); //生成最近联系人 break; //1、对方添加我为好友的请求, 2、对方请求加入群, 3、用户给拉入群处理 这里不做处理下面统一处理, 4、请求对方进入群处理, 5、确认对方进入群处理 case 1: case 2: case 3: case 4: case 5: //_allnews[_verify].push(_news[i]); break; } //判断消息是否存在过 for (k = 0; k < _allnews[_verify].length; k++) { //判断两个用户之间或者用户和群之间是否存在消息 if ((_allnews[_verify][k].GroupManageID != null && _allnews[_verify][k].GroupManageID == _news[i].GroupManageID) || (_allnews[_verify][k].UserId != null && _allnews[_verify][k].UserId == _news[i].UserId)) { _obj = _allnews[_verify][k]; break; } } //如果是聊天消息,存在的情况下,那么就直接添加消息总数 if (_verify == 0 && _obj) { //由于群的信息获取的时候都是有总数,所以不需要用叠加的方法 if (_news[i].GroupManageID) { _obj.count = _news[i].count; } //消息的数量叠加 else { _obj.count += _news[i].count; } } //添加好友消息等直接添加 if (!_obj || _verify != 2) else { _allnews[_verify].push(_news[i]); } _isnews = true; //设置有消息提醒 } } } //如果有消息的处理 if (_isnews) { _friendel.innerText = ""; if (!$("#U_MD_F_N_Message")[0]) { //弹出消息的处理 new U.UF.UI.form("系统消息", _friendel, { "id": "U_MD_F_N_Message", "style": { "width": "300px", "height": "209px", "right": "50px", "bottom": "5px", "background": "#ffffff", "padding": "0", "border": "0", "maxWidth": "300px" } }, { "istop": true, "isdrag": false, "isstretching": false, "isenlarge": false, "isnarrow": false, "closecallback": function () { U.MD.F.N.clearAllNews(); } }); } else { $("#U_MD_F_N_Message")[0].style.display = "block"; } //上面处理好信息后,重新的打印显示消息 for (i = 0; i <= 6; i++) { //消息处理 if (_allnews[i] && _allnews[i].length) { //消息存在的处理 U.MD.F.N.displayFriendMessage(_allnews[i], i); //弹出消息框 } } } } /** * 消息提示打印处理 * * @param {array} 需要打印的消息数组 */ U.MD.F.N.displayFriendMessage = function (news, verify) { var i, _username, _descript, _newel, _newael, _cb, _frag = $$("frag"); //循环消息的处理 for (i = 0; i < news.length; i++) { //创建消息元素 _newel = $$("div", { "className": "U_MD_D_MG_OO", "title": "消息" }, _frag); _username = news[i].FriendsDescript || news[i].GroupManageName || news[i].UserNickName; //消息类型的处理,设置消息的内容显示 switch (verify) { //聊天消息处理 case 0: _descript = "您有" + news[i].count + "消息未读"; //添加好友点击的回调 _cb = U.UF.P.apply(function (news, newsinfo, el) { U.MD.F.N.chatMessage(newsinfo, news, el); //聊天消息设置 }, [news, news[i], _newel]); break; //添加好友消息的处理 case 1: _username = news[i].MessageDescript + "添加您为好友"; //消息名字 _descript = "添加您为好友"; //消息描述 //添加好友点击的回调 _cb = U.UF.P.apply(function (news, newsinfo, el) { U.MD.F.N.addFriendNewsHandle(newsinfo, news, el); }, [news, news[i], _newel]); break; //请求加入群消息处理 case 2: _username = news[i].MessageDescript + "请求加入该群"; //消息名字 _descript = "请求加入该群"; //消息描述 //添加好友点击的回调 _cb = U.UF.P.apply(function (news, newsinfo, el) { U.MD.F.N.entryGroup(newsinfo, news, el); }, [news, news[i], _newel]); break; //邀请加入群处理 case 3: _username = news[i].UserNickName + "邀请您加入讨论组"; //消息名字 _descript = "邀请您加入讨论组"; //消息描述 //添加好友点击的回调 _cb = U.UF.P.apply(function (news, newsinfo, el) { U.MD.F.N.pulledIntoGroups(newsinfo, news, el); }, [news, news[i], _newel]) break; //对方同意添加好友 case 4: _username = news[i].UserNickName + "同意添加你为好友"; //消息名字 _descript = "同意添加你为好友"; //消息描述 //添加好友点击的回调 _cb = U.UF.P.apply(function (news, newsinfo, el) { U.MD.F.N.confirmAddFriend(newsinfo, news, el); }, [news, news[i], _newel]); break; //对方确认我加入群的处理 case 5: _username = news[i].UserNickName + "同意您加入讨论组"; //消息名字 _descript = "加入讨论组"; //消息描述 //添加好友点击的回调 _cb = U.UF.P.apply(function (news, newsinfo, el) { U.MD.F.N.pulledIntoGroups(newsinfo, news, el); }, [news, news[i], _newel]); break; case 6: _descript = "你的文件到了!!!"; //发送文件描述 _cb = U.UF.P.apply(function (news, newsinfo, el) { U.MD.F.N.chatMessage(newsinfo, news, el); //聊天消息设置 }, [news, news[i], _newel]); break; } //点击处理 _newel.onclick = _cb; _newael = $$("div", { "className": "U_MD_D_MG_OOI" }, _newel); $$("img", { "onerror": U.MD.C.imgError, "onerror": U.MD.C.imgError, "alt": news[i].FriendsDescript || news[i].UserNickName || news[i].GroupManageName, "src": U.MD.C.getHeadImage(news[i].UserThumbnailImageHead || "/img/chatgroup.png") }, _newael); $$("div", { "className": "U_MD_D_MG_OON U_MD_D_Text_Abbreviation", "innerHTML": _username }, _newel); $$("div", { "className": "U_MD_D_MG_OONT U_MD_D_Text_Abbreviation", "innerHTML": _descript }, _newel); $$("div", { "className": "U_MD_D_MG_OOC", "style": { "cssText": "float:right" }, "innerHTML": "查看" }, _newel); //查看消息 } $("#U_MD_D_MG_AFT")[0].appendChild(_frag); } /** * 提供好友和群统一接口实现信息回调 * * * @param {object} 当前的消息 * @param {array} 所有的消息 * @param {element} 消息元素 */ U.MD.F.N.chatMessage = function (newsinfo, news, el) { var _chatinfo; //如果是群聊天的处理 if (newsinfo.GroupManageID) { _chatinfo = U.Json.select(US.friend.group, { "GroupManageID": newsinfo.GroupManageID })[0]; } //如果是好友聊天的处理 else { _chatinfo = U.Json.select(US.friend.friends, { "UserId": newsinfo.UserId })[0] } U.MD.F.W.viewFriend(_chatinfo); //查看消息 U.MD.F.N.clearNews(newsinfo, news, el); //清除 } /** * 提供好友和群统一接口实现信息回调 * * @param {bool} 接收的消息类型 * true 群消息 * false 好友消息 * @param {string} 好友或者群消息 * @param {object} 获取查看的好友消息 */ U.MD.F.N.asynReceiveMessages = function (isgroup, chatform, r) { //如果是群消息查看 if (isgroup) { U.MD.F.W.printGroupChatMessage($("div.U_MD_F_C", chatform)[0], r); //打印群消息 } //好友消息的查看 else { U.MD.F.W.printFriendChatMessage($("div.U_MD_F_C", chatform)[0], r); //打印好友消息 } } /** * 添加好友的处理 * * @param {object} 当前的消息 * @param {array} 所有的消息 * @param {element} 消息元素 */ U.MD.F.N.addFriendNewsHandle = function (newsinfo, news, el) { var _friendinfo = U.Json.select(US.friend.friends, { "UserId": newsinfo.UserId }, null, 1)[0]; //判断用户是否在好友分组里 //好友不存在自己的列表 if (!_friendinfo) { U.MD.F.M.addFriend(newsinfo, null, "0"); //添加他人进入群 } //用户已经是自己的好友,那么直接弹出聊天 else { U.MD.F.W.popupFriendsForm(_friendinfo); } U.MD.F.N.clearNews(newsinfo, news, el); //清除 } /** * 添加好友的处理 * * @param {object} 当前的消息 * @param {array} 所有的消息 * @param {element} 消息元素 */ U.MD.F.N.entryGroup = function (newsinfo, news, el) { var _groupuserid = Guid.newGuid(), //群用户id _friendinfo = U.Json.select(US.friend.groupusers, { "GroupManageID": news.MessageContent, "UserId": news.UserId }, null, 1)[0]; //查找群 //如果群已经加载处理的处理 if (_friendinfo) { U.alert("添加成功"); } //添加用户进入群主 else { U.A.Request(US.FRIEND, ["AddUsrsToGroup", US.userInfo.userid, news.MessageID, news.UserId, news.MessageContent.toUpperCase(), _groupuserid, news.MessageDescript], U.MD.F.N.asynEntryGroup, ["", news, _groupuserid]); } U.MD.F.N.clearNews(newsinfo, news, el); //清除 } /** * 添加群进入 * * @param {object} 服务器返回的信息 */ U.MD.F.N.asynEntryGroup = function (r) { var _groupuserinfo, _context = r.context, _news = _context[1], _groupuserid = _context[2]; //实例化用户 _groupuserinfo = U.MD.F.T.groupUserEntity(_news.UserId, _news.UserImageHead, _news.UserNickName, _news.UserNickName, _news.UserThumbnailImageHead, _news.MessageContent.toUpperCase(), _news.MessageID, 1) //添加用户进入群 US.friend.groupusers.push(_groupuserinfo); } /** * 被用户进入群处理 * * @param {object} 消息信息 */ U.MD.F.N.pulledIntoGroups = function (newsinfo, news, el) { var _groupinfo = U.Json.select(US.friend.group, { "GroupManageID": newsinfo.MessageContent.toLowerCase() })[0]; //判断群是否已经加载过,如果加载过那么就不重新加载 if (!_groupinfo) { U.A.Request(US.FRIEND, ["GetJoinGroupNews", US.userInfo.userid, newsinfo.MessageID, newsinfo.MessageContent], U.MD.F.N.asynPulledIntoGroups, ["", newsinfo]); //拉用户进入群组 } else { U.MD.F.W.viewFriend(_groupinfo); //查看消息 //如果是群的文件消息的处理 if (newsinfo.MessageContent.length == 36) { } } U.MD.F.N.clearNews(newsinfo, news, el); //清除用户消息 } /** * 拉用户进入群组异步 * * @param {object} 小新信息 */ U.MD.F.N.asynPulledIntoGroups = function (r) { //服务器返回成功 if (r.value) { var _groupfriend, _groupfriends, _groupdiskarr, _context = r.context, _newinfo = _context[1], _userid = US.userInfo.userid, //用户id _diskinfo = US.disk.Disks[_userid], //用户群信息 _groupinfo = new U.MD.F.T.groupEntity(_newinfo.MessageContent.toLocaleLowerCase(), _newinfo.MessageDescript, U.UF.D.toTimeStamp(new Date()), _newinfo.UserId, "", null) //群信息 ; r = r.value; //服务器响应后返回的值 _groupfriends = r[0]; US.friend.group.unshift(_groupinfo); //插入新群 //添加群友 for (i = 0; i < _groupfriends.length; i++) { //判断用户是否在群里,不重复添加 if (!U.Json.select(US.friend.groupusers, { "GroupManageID": _groupfriends[i].GroupManageID, "UserId": _groupfriends[i].UserId })[0]) { //初始化生成群用户 _groupfriend = new U.MD.F.T.groupUserEntity(_groupfriends[i].UserId, U.MD.C.getHeadImage(_groupfriends[i].UserImageHead), _groupfriends[i].UserNickName || _groupfriends[i].UserName, _groupfriends[i].UserName, U.MD.C.getHeadImage(_groupfriends[i].UserThumbnailImageHead), _groupfriends[i].GroupUsersDescript || _groupfriends[i].UserNickName, _groupfriends[i].GroupManageID, 1); //添加群用户到群里 US.friend.groupusers.push(_groupfriend); } } _groupdiskarr = [new U.MD.DK.M.entity(_groupinfo.GroupManageID, 0, US.EMPTYGUID, _groupinfo.GroupManageName, _groupinfo.GroupManageName, "folder", null, U.UF.D.toTimeStamp(new Date()), U.MD.DK.C.getIcon("folder")[1], 1, null, null, 0, "", _groupinfo.GroupManageID)]; _diskinfo && U.MD.DK.RE.addFileOrFolder(_groupdiskarr, _diskinfo, _diskinfo.directoryOrFiles[2]) //添加文件或者文件夹 // _diskinfo && U.MD.DK.RE.addFileOrFolder(r[1], _diskinfo, _groupinfo) //群里的文件或者文件夹 //直接显示到群里 U.MD.F.W.viewFriend(_groupinfo); //查看消息 //返回添加的群 return US.friend.group[0]; } } /** * 确认添加对方为好友 * * @param {object} 确定添加对方为好友 */ U.MD.F.N.confirmAddFriend = function (newsinfo, news, el) { var _friendid = Guid.newGuid(), //好友id _friendinfo = U.Json.select(US.friend.friends, { "UserId": news.UserId })[0] //用户是否已经在好友列表 ; //如果好友没有添加处理 if (!_friendinfo) { U.A.Request(US.FRIEND, ["AddFriend", US.userInfo.userid, news.UserId, _friendid, news.MessageContent, news.MessageDescript], U.MD.F.N.asynAddFriend, [null, news, news.MessageContent, _friendid]); //添加好友到默认分组 } //如果用户在好友列表,那么直接弹出 else { U.MD.F.W.popupFriendsForm(_friendinfo); } U.MD.F.N.clearNews(newsinfo, news, el); //清除消息 } /** * 异步处理确定添加好友 * * @param {object} 确定添加对方为好友 */ U.MD.F.N.asynAddFriend = function (r) { var _context = r.context, _new = _context[1], _groupid = _context[2], _friendid = _context[3]; r = r.value; U.MD.F.M.displayAddFriend(r[0][0], _friendid, _groupid, r); //确定添加好友到好友分组里 } /** * 清除所有的消息 * * @param {array} 所有的消息 */ U.MD.F.N.clearAllNews = function () { var i, j, _allids = "", _allnews = U.MD.F.N.news ; //循环获取消息的id for (i = 0; i < _allnews.length; i++) { if (_allnews[i]) { for (j = 0; j < _allnews[i].length; j++) { _allids += (_allnews[i][j].GroupManageID || _allnews[i][j].MessageID) + ","; } _allnews[i].splice(0); } } _allids = _allids.substring(0, _allids.length - 1); //去除最后一位的, //数据库删除消息处理 U.A.Request(US.CD, [US.DB, "UseStudio_Friends", "DeleteMessageById", _allids, US.userInfo.userid], function () { }, []); $("#U_MD_D_MG_AFT")[0].innerText = ""; } /** * 清除所有的的添加好友信息 * * @param {array} 所有的消息 * @param {object} 当前的消息 * @param {element} 消息元素 * @param {number} 消息类型 */ U.MD.F.N.clearNews = function (newsinfo, news, el) { var _messageid = newsinfo.MessageID, _parentel = $(el).Parent(); //元素的上级元素 //移除单挑消息 U.Json.del(news, { "MessageID": newsinfo.MessageID }); //移除元素 if (_parentel) { $(el).remove(); } //如果消息已经全部点击完毕的处理 if ($("#U_MD_D_MG_AFT").Child().length == 0) { $("#U_MD_F_N_Message")[0].close(); //关闭的处理 } //数据库删除消息处理 U.A.Request(US.CD, [US.DB, "UseStudio_Friends", "DeleteMessageById", _messageid, US.userInfo.userid], function () { }, []); } /** * 学习系统消息处理 * * @param {array} 除了好友聊天消息,其他消息的处理 */ U.MD.F.N.otherNews = function (news) { } /* 标记未读信息 @param {array} newsarr消息信息数组 */ U.MD.F.N.MarkUnreadMessage = function (newsarr) { if (newsarr[0].length == 0 && newsarr[1].length == 0) return; //如果两个数组都为空就退出 console.log(newsarr); var _arr; //申明群变量 和 完成数组 if (newsarr[0].length == 0 || newsarr[1].length == 0) { //如果两个数组有一个为空 if (newsarr[0].length == 0) { //拷贝不为空的数组 _arr = newsarr[1].deepCopy(); } else { _arr = newsarr[0].deepCopy(); } } else { /* for (var _friend = 0; _friend < newsarr[0].length; _friend++) { //遍历好友信息数组 for (var _group = 0; _group < newsarr[1].length; _group++) { if (U.UF.D.sizeComparison(newsarr[1][_group], newsarr[0][_friend])) {//比较两个时间,哪个时间早,就把哪个信息添加进 _arr.push() } else { } } }*/ } //处理好数组,现在进行标注 var _right, _name; if ($("#U_MD_F_H_M")[0]) { //判断右边div是否存在 _right = $("#U_MD_F_H_M")[0]; } else { _right = $$("div", { id: "U_MD_F_H_M", style: { top: "18px", left: "38px", position: "absolute" } }, $("#U_MD_F_H_R")[0]); } for (var i = 0; i < _arr.length; i++) { //循环消息数组 for (_name in _arr[i]) { //查看消息内容 if (_name.indexOf("Group") == -1) {//判断是否为个人消息 if ($("[tid='M" + _arr[i].UserId + "']", _right)[0]) { //判断红点是否存在 个人消息 $("[tid='M" + _arr[i].UserId + "']", _right)[0].innerHTML = parseInt($("[tid='M" + _arr[i].UserId + "']", _right)[0].innerHTML) + _arr[i].count; } else { var _mark = $$("div", { className: "U_Mark", innerHTML: _arr[i].count, tid: "M" + _arr[i].UserId }); //生成红点 _right.appendChild(_mark.cloneNode(true)); //生成右边 _mark.style.margin = 0; _mark.style.position = "absolute"; _mark.style.left = "48px"; $('#U_MD_F_H_ZLZ')[0].querySelectorAll("[tid='" + _arr[i].UserId + "']")[0].appendChild(_mark); //生成左边 } } else { //群消息 if ($("[tid='M" + _arr[i].GroupManageID + "']", _right)[0]) { //判断红点是否存在 个人消息 $("[tid='M" + _arr[i].GroupManageID + "']", _right)[0].innerHTML = parseInt($("[tid='M" + _arr[i].GroupManageID + "']", _right)[0].innerHTML) + _arr[i].count; } else { var _mark = $$("div", { className: "U_Mark", innerHTML: _arr[i].count, tid: "M" + _arr[i].GroupManageID }); //生成红点 _right.appendChild(_mark.cloneNode(true)); //生成右边 _mark.style.margin = 0; _mark.style.position = "absolute"; _mark.style.left = "48px"; } } return; } } } /* 消除标记信息 @param {String} Id 好友信息 */ U.MD.F.N.CanelMarkMessage = function (Id) { $("[tid='M" + Id + "']").remove(0); //删除左边标记 $("[tid='M" + Id + "']").remove(0); //删除右边标记 } //#endregion