Пример #1
0
        public override void Process(XFireClient context)
        {
            var friend = context.Server.Database.QueryUser(FriendUsername);

            context.Server.Database.InsertMutualFriend(context.User, friend);

            context.SendAndProcessMessage(new FriendsList(context.User));
            context.SendAndProcessMessage(new FriendsSessionAssign(context.User));

            // It's possible to accept a friend request where the inviter is not online
            var friendSession = context.Server.GetSession(friend);

            if (friendSession != null)
            {
                friendSession.SendAndProcessMessage(new FriendsList(friend));
                friendSession.SendAndProcessMessage(new FriendsSessionAssign(friend));
            }

            var pendingRequests = context.Server.Database.QueryPendingFriendRequests(context.User);
            var pq = pendingRequests.FirstOrDefault(a => a.FriendUserId == context.User.UserId);

            if (pq != null)
            {
                context.Server.Database.DeletePendingFriendRequest(pq.PendingFriendRequestId);
            }
        }
Пример #2
0
        public override void Process(XFireClient context)
        {
            var loginChallenge = new LoginChallenge();

            loginChallenge.Process(context);
            context.SendMessage(loginChallenge);
        }
Пример #3
0
        // TODO: Create test for this message so we can refactor and build this message the same way as the others to avoid the switch statement
        // TODO: How to tell the client we didn't receive the ACK?
        // TODO: P2P stuff???
        public override void Process(XFireClient context)
        {
            var otherSession = context.Server.GetSession(SessionId);

            if (otherSession == null)
            {
                return;
            }

            var messageType = (ChatMessageType)(byte)MessagePayload["msgtype"];

            switch (messageType)
            {
            case ChatMessageType.Content:
                var responseAck = BuildAckResponse(otherSession.SessionId);
                context.SendMessage(responseAck);

                var chatMsg = BuildChatMessageResponse(context.SessionId);
                otherSession.SendMessage(chatMsg);
                break;

            case ChatMessageType.TypingNotification:
                var typingMsg = BuildChatMessageResponse(context.SessionId);
                otherSession.SendMessage(typingMsg);
                break;

            default:
                Debug.WriteLine($"NOT BUILT: Got {messageType} for session: {context.SessionId}");
                break;
            }
        }
Пример #4
0
        private void OnDisconnection(XFireClient disconnectedClient)
        {
            // we have to remove the session first
            // because of the friends of this user processing
            RemoveSession(disconnectedClient);

            UpdateFriendsWithDisconnetedStatus(disconnectedClient);
        }
Пример #5
0
        public override void Process(XFireClient context)
        {
            var requesterUser   = context.Server.Database.QueryUser(RequesterUsername);
            var pendingRequests = context.Server.Database.QueryPendingFriendRequestsSelf(requesterUser);

            var requestsIds = pendingRequests.Where(a => a.UserId == requesterUser.UserId && a.FriendUserId == context.User.UserId)
                              .Select(a => a.PendingFriendRequestId).ToArray();

            context.Server.Database.DeletePendingFriendRequest(requestsIds);
        }
Пример #6
0
        public override void Process(XFireClient context)
        {
            var statusChange = new FriendStatusChange(context.SessionId, Message);
            var friends      = context.Server.Database.QueryFriends(context.User);

            friends.ForEach(friend =>
            {
                var friendSession = context.Server.GetSession(friend);
                friendSession?.SendAndProcessMessage(statusChange);
            });
        }
Пример #7
0
        public override void Process(XFireClient context)
        {
            var friends = context.Server.Database.QueryFriends(_ownerUser);

            friends.ForEach(f =>
            {
                UserIds.Add(f.UserId);
                Usernames.Add(f.Username);
                Nicks.Add(f.Nickname);
            });
        }
Пример #8
0
        private async Task Accept()
        {
            while (_running)
            {
                var tcpClient = await _listener.AcceptTcpClientAsync().ConfigureAwait(false);

                var newXFireClient = new XFireClient(tcpClient, _clientManager, _logger, OnReceive, OnDisconnection);

                OnConnection?.Invoke(newXFireClient);
            }
        }
Пример #9
0
        public override void Process(XFireClient client)
        {
            var friends = client.Server.Database.QueryFriends(_ownerUser);

            foreach (var friend in friends)
            {
                var friendSession = client.Server.GetSession(friend);

                UserIds.Add(friend.UserId);
                SessionIds.Add(friendSession != null ? friendSession.SessionId : FriendIsOffLineSessionId);
            }
        }
Пример #10
0
        public override void Process(XFireClient context)
        {
            var usernames = context.Server.Database.QueryUsers(_queryByUsername).Select(a => a.Username).ToList();

            Usernames.AddRange(usernames);

            // Don't really care about these but they're necessary to work properly
            var unknowns = usernames.Select(a => "Unknown").ToList();

            FirstNames.AddRange(unknowns);
            LastNames.AddRange(unknowns);
            Emails.AddRange(unknowns);
        }
Пример #11
0
        private void UpdateFriendsWithDisconnetedStatus(XFireClient disconnectedClient)
        {
            var friends = Database.QueryFriends(disconnectedClient.User);

            friends.ForEach(friend =>
            {
                var friendClient = GetSession(friend);
                if (friendClient != null)
                {
                    friendClient.SendAndProcessMessage(new FriendsSessionAssign(friend));
                }
            });
        }
Пример #12
0
        public override void Process(XFireClient context)
        {
            var recipient = context.Server.Database.QueryUser(Username);
            var invite    = new FriendInvite(context.User.Username, context.User.Nickname, Message);

            invite.Process(context);

            context.Server.Database.InsertFriendRequest(context.User, Username, Message);

            var recipientSession = context.Server.GetSession(recipient);

            recipientSession?.SendMessage(invite);
        }
Пример #13
0
        public override void Process(XFireClient context)
        {
            var clientPrefs = new Unknown10();

            context.SendAndProcessMessage(clientPrefs);

            var groups = new Groups();

            context.SendAndProcessMessage(groups);

            var groupsFriends = new GroupsFriends();

            context.SendAndProcessMessage(groupsFriends);

            var serverList = new ServerList();

            context.SendAndProcessMessage(serverList);

            var chatRooms = new ChatRooms();

            context.SendAndProcessMessage(chatRooms);

            var friendsList = new FriendsList(context.User);

            context.SendAndProcessMessage(friendsList);

            var friendsStatus = new FriendsSessionAssign(context.User);

            context.SendAndProcessMessage(friendsStatus);

            // Tell friends this user came online
            //if (context.User.Username == "test") Debugger.Break();
            var friends = context.Server.Database.QueryFriends(context.User);

            friends.ForEach(friend =>
            {
                var otherSession = context.Server.GetSession(friend);
                otherSession?.SendAndProcessMessage(new FriendsSessionAssign(friend));
            });

            var pendingFriendRequests = context.Server.Database.QueryPendingFriendRequests(context.User);

            pendingFriendRequests.ForEach(request =>
            {
                var requester = context.Server.Database.QueryUser(request.UserId);
                context.SendAndProcessMessage(new FriendInvite(requester.Username, requester.Nickname, request.Message));
            });
        }
Пример #14
0
        public override void Process(XFireClient context)
        {
            UserId    = context.User.UserId;
            SessionId = context.SessionId;
            Status    = 0;
            Nickname  = string.IsNullOrEmpty(context.User.Nickname) ? context.User.Username : context.User.Nickname;
            MinRect   = 1;
            MaxRect   = 164867;
            var ipAddress = StripPortFromIPAddress(context.RemoteEndPoint.ToString());

            PublicIp = BitConverter.ToInt32(IPAddress.Parse(ipAddress).GetAddressBytes(), 0);
            Salt     = context.Salt;
            Reason   = "Mq_P8Ad3aMEUvFinw0ceu6FITnZTWXxg46XU8xHW";

            Debug.WriteLine("User {0}[{1}] logged in successfully with session id {2}", context.User.Username, context.User.UserId, context.SessionId);
            Console.WriteLine("User {0} logged in", context.User.Username);
        }
Пример #15
0
        public override void Process(XFireClient context)
        {
            if (Nickname.Length > MAX_LENGTH)
            {
                Nickname = Nickname.Substring(0, MAX_LENGTH);
            }

            context.Server.Database.UpdateNickname(context.User, Nickname);

            var updatedFriendsList = new FriendsList(context.User);

            context.Server.Database.QueryFriends(context.User).ForEach(friend =>
            {
                var friendSession = context.Server.GetSession(friend);
                friendSession?.SendAndProcessMessage(updatedFriendsList);
            });
        }
Пример #16
0
 public override void Process(XFireClient context)
 {
     preferences = new Dictionary <byte, string>
     {
         { 1, "0" },
         { 4, "0" },
         { 5, "0" },
         { 6, "1" },
         { 7, "0" },
         { 8, "0" },
         { 11, "0" },
         { 17, "0" },
         { 18, "0" },
         { 19, "0" },
         { 20, "0" },
         { 21, "0" }
     };
 }
Пример #17
0
        public override void Process(XFireClient context)
        {
            var user = context.Server.Database.QueryUser(Username);
            if (user != null)
            {
                if (user.Password != Password)
                {
                    context.SendAndProcessMessage(new LoginFailure());
                    return;
                }
            }
            else
            {
                user = context.Server.Database.InsertUser(Username, Password, context.Salt);
            }

            // Remove any older sessions from this user (duplicate logins)
            context.RemoveDuplicatedSessions(user);

            context.User = user;

            var success = new LoginSuccess();
            context.SendAndProcessMessage(success);
        }
Пример #18
0
 public override void Process(XFireClient context)
 {
     context.SendAndProcessMessage(new Did());
 }
Пример #19
0
 private void HandleNewConnection(XFireClient sessionContext)
 {
     AddSession(sessionContext);
 }
Пример #20
0
 public override void Process(XFireClient context)
 {
     GroupIds   = new List <int>();
     GroupNames = new List <string>();
 }
Пример #21
0
 public virtual void Process(XFireClient client)
 {
     // base implementation is to do nothing
     ConsoleLogger.Log($" *** Unimplemented processing for message type {MessageTypeId}", ConsoleColor.Magenta);
 }
Пример #22
0
 private void AddSession(XFireClient session)
 {
     _clientManager.AddSession(session);
 }
Пример #23
0
 private void HandleRequest(XFireClient context, IMessage message)
 {
     context.Server = this;
     message.Process(context);
 }
Пример #24
0
 public override void Process(XFireClient context)
 {
     Salt = context.Salt;
 }
Пример #25
0
        public override void Process(XFireClient context)
        {
            var result = new UserLookupResult(Username);

            context.SendAndProcessMessage(result);
        }
Пример #26
0
 public void RemoveSession(XFireClient session)
 {
     _clientManager.RemoveSession(session);
 }