Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
 void msgServer_UserOffline(object sender, MsgServerEventArgs e)
 { 
     Presence presence = new Presence();
     presence.from = e.RequestUser.UserID;
     presence.ShowType = IMLibrary3.Enmu.ShowType.Offline;
     BroadcastingMessageToOnlineUser(presence);//告诉在线者用户已经离线
 }
Exemplo n.º 3
0
        /// <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 );
        }
Exemplo n.º 4
0
        /// <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);
            }
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
        /// <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);
        }
Exemplo n.º 7
0
 /// <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);//告诉在线者用户已经离线
         }
     }
 }