void msgServer_RequestUsersPresence(object sender, MsgServerEventArgs e) { int i = 0; Element element =new Element(); ///将在线用户的ShowType发送给登录用户 foreach (TCPServerSession se in msgServer.GetTcpServerSession()) { if (se.IsAuthenticated)//如果是已认证的TCP客户端 { UserVcard userTemp = se.Tag as UserVcard;//获得TCP客户端绑定的用户 Presence pretemp = new Presence(); pretemp.from = userTemp.UserID; pretemp.ShowType = userTemp.ShowType; pretemp.Status = pretemp.Status; element.Data.Add(pretemp); } i++; if (i == 80)//一次发送80个用户 { SendMessageToUser(e.RequestUser, element); i = 0; element = new Element(); } } if (i>0)//最一次发送在线用户状态 SendMessageToUser(e.RequestUser, element); ///广播登录用户上线消息 Presence pre = new Presence(); pre.from = e.RequestUser.UserID; pre.ShowType = e.RequestUser.ShowType; BroadcastingMessageToOnlineUser(pre); //发送离线消息 List<string> offlineMsg = DBHelper.GetOfflineMessage(e.RequestUser.UserID, 50);//获取最后50条离线消息 foreach (string msgXML in offlineMsg) SendMessageToUser(e.RequestUser, msgXML); }
void msgServer_UserOffline(object sender, MsgServerEventArgs e) { Presence presence = new Presence(); presence.from = e.RequestUser.UserID; presence.ShowType = IMLibrary3.Enmu.ShowType.Offline; BroadcastingMessageToOnlineUser(presence);//告诉在线者用户已经离线 }
/// <summary> /// 设置登录用户在线状态 /// </summary> /// <param name="showType"></param> public void setMyPresence(IMLibrary3.Enmu.ShowType showType) { if (showType == MyAuth.ShowType)//如果状态未做改变,则无需发送到服务器 return; if (showType == IMLibrary3.Enmu.ShowType.Offline && (tcpClient != null && !tcpClient.IsDisposed && tcpClient.IsConnected)) //如果要下线 { this.tcpClient.Disconnect(); this.tcpClient.Dispose(); this.tcpClient = null; return; } if (showType != IMLibrary3.Enmu.ShowType.Offline && (tcpClient == null || tcpClient.IsDisposed || !tcpClient.IsConnected))//如果已经下线,则上线 { MyAuth.ShowType = showType; Login(MyAuth, true);//登录。。。 return; } Presence pre = new Presence(); pre.from = MyAuth.UserID; pre.ShowType = showType; pre.type = type.set;//必须设置 set,以表示是设置,如果为get,则是获取所有联系人的状态 SendMessageToServer(pre ); }
/// <summary> /// 获得组织机构版本信息 /// </summary> /// <param name="org"></param> private void onOrgVersion(OrgVersion org) { try { #region 判断登录的用户本地数据库文件夹是否存在 System.IO.DirectoryInfo dInfo = new System.IO.DirectoryInfo(MyAuth.UserID); if (!dInfo.Exists) dInfo.Create(); string FileNamePath =Application.StartupPath +"\\"+ MyAuth.UserID + "\\Record.mdb"; if (!System.IO.File.Exists(FileNamePath)) System.IO.File.Copy(Application.StartupPath + "\\Record.db", FileNamePath); ////初始化本地数据库连接字符串 IMLibrary3.Data.SQLiteDBHelper.connectionString = "data source=" + FileNamePath; #endregion OrgVersion localOrg = OpeRecordDB.GetOrgVersion(MyAuth.UserID); #region 如果版本已经改变下载组织机构组信息 if (org.GroupsVersion != localOrg.GroupsVersion)//true { Groups.Clear(); treeView_Organization.Nodes.Clear(); OpeRecordDB.DeleteAllGroup();//删除本地数据库中分组信息 frmOrg = new FormDownOrganization(); frmOrg.Shown += delegate(object sender, EventArgs e) { DownloadGroups dGroups = new DownloadGroups(); dGroups.from = MyAuth.UserID; dGroups.type = type.get; SendMessageToServer(dGroups);//请求下载分组信息 }; frmOrg.MaxValue = org.GroupsCount; frmOrg.ShowText = "正在下载分组信息..."; frmOrg.ShowDialog(); OpeRecordDB.AddGroups(this.Groups);//将下载的分组信息保存于数据库中 } #endregion #region 下载组织机构用户信息 if (org.UsersVersion != localOrg.UsersVersion)//(true) { Users.Clear(); treeView_Organization.Nodes.Clear(); OpeRecordDB.DeleteAllUser();//删除本地数据库中用户信息 frmOrg = new FormDownOrganization(); frmOrg.Shown += delegate(object sender, EventArgs e) { DownloadUsers dUsers = new DownloadUsers(); dUsers.from = MyAuth.UserID; dUsers.type = type.get; SendMessageToServer(dUsers);//请求下载联系人信息 }; frmOrg.MaxValue = org.UsersCount; frmOrg.ShowText = "正在下载用户信息..."; frmOrg.ShowDialog(); OpeRecordDB.AddUsers(this.Users); } #endregion #region 下载群信息 if (org.RoomsCount !=0)//如果群数大于0 { Rooms.Clear(); treeView_Rooms.Nodes.Clear(); //OpeRecordDB.DeleteAllRoom();//删除本地数据库中群信息 frmOrg = new FormDownOrganization(); frmOrg.Shown += delegate(object sender, EventArgs e) { DownloadRooms dRooms = new DownloadRooms(); dRooms.from = MyAuth.UserID; dRooms.type = type.get; SendMessageToServer(dRooms);//请求下载群信息 }; frmOrg.MaxValue = org.RoomsCount; frmOrg.ShowText = "正在下载群资料..."; frmOrg.ShowDialog(); //OpeRecordDB.AddRooms(this.Rooms); } #endregion //如果组织机构已经更改或组织机构未加载到树图 if (this.treeView_Organization.Nodes.Count == 0) { //则更新到本地数据库 OpeRecordDB.UpdateOrgVersion(org); this.Groups = OpeRecordDB.GetGroups(); this.Users = OpeRecordDB.GetUsers(); treeViewAddOrg();//加载树 } if (this.treeView_Rooms.Nodes.Count == 0) { //this.Rooms = OpeRecordDB.GetRooms(); foreach (Room room in this.Rooms) { foreach (string userID in room.UserIDs.Split(';')) { User user = findUser(userID); if (user != null) room.Users.Add(user.UserID, user); } } treeViewAddRooms(this.Rooms); } //请求联系人在线状态信息 Presence pre = new Presence(); pre.from = MyAuth.UserID; pre.type = type.get;//必须设置 set,以表示是设置,如果为get,则是获取所有联系人的状态 SendMessageToServer(pre); } catch (Exception ex) { IMLibrary3.Global.MsgShow(ex.Source + ex.Message); } }
/// <summary> /// 处理用户请求更改在线状态 /// </summary> /// <param name="presence"></param> /// <param name="session"></param> private void onPresence(Presence presence, TCPServerSession session) { if (presence.ShowType == IMLibrary3.Enmu.ShowType.Invisible)//如果用户隐身,则将用户状态设置为离线发送给其他用户 presence.ShowType = IMLibrary3.Enmu.ShowType.Offline; BroadcastingMessageToOnlineUser(presence); }
/// <summary> /// 处理用户请求获得所有在线联系人的在线状态 /// </summary> /// <param name="pre"></param> /// <param name="session"></param> private void onGetUsersPresence(Presence pre, TCPServerSession session) { ///将在线用户的Presence发送给登录用户 Element e = new Element(); foreach (TCPServerSession se in tcpMessageServer.Sessions.ToArray()) if (se.IsAuthenticated)//如果是已认证的TCP客户端 { UserVcard userTemp = se.Tag as UserVcard;//获得TCP客户端绑定的用户 Presence pretemp = new Presence(); pretemp.from = userTemp.UserID; pretemp.ShowType = userTemp.ShowType; pretemp.Status = pretemp.Status; e.Data.Add(pretemp); } tcpMessageServer.SendMessageToSession(session, e); ///广播登录用户上线消息 UserVcard user = session.Tag as UserVcard; pre = new Presence(); pre.from = user.UserID; pre.ShowType = user.ShowType; BroadcastingMessageToOnlineUser(pre); //发送离线消息 List<string> offlineMsg = DBHelper.GetOfflineMessage(user.UserID, 50);//获取最后50条离线消息 foreach (string msgXML in offlineMsg) SendMessageToUser(user, msgXML); }
/// <summary> /// TCP连接断开事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Session_Disonnected(object sender, EventArgs e) { TCPServerSession session = sender as TCPServerSession; if (session != null && session.IsAuthenticated)//如果该用户已经成功验证登录 { UserVcard user = session.Tag as UserVcard; if (user != null) { Presence presence = new Presence(); presence.from = user.UserID; presence.ShowType = IMLibrary3.Enmu.ShowType.Offline; BroadcastingMessageToOnlineUser(presence);//告诉在线者用户已经离线 } } }