예제 #1
0
        protected override void Handle(LoginAttemptPacket packet, Socket sender)
        {
            var data = packet.Data;

            if (data == null)
            {
                return;
            }

            // TODO: REMOVE, DEBUG LOGIN
            #region DEBUG
            if (data.identifier.StartsWith("test") && data.identifier.Length == 5)
            {
                int  num     = int.Parse(data.identifier[4].ToString());
                User dbgUser = userCrud.ReadMany().ToList()[num];
                data.identifier = dbgUser.identifier;
                data.password   = dbgUser.password;
            }
            #endregion

            if (ActiveUsers.IsLoggedIn(sender))
            {
                SendError(HttpStatusCode.Forbidden, sender);

                return;
            }
            // check whether the request is valid
            User user = userCrud.ReadOne(x => x.identifier == data.identifier);
            if (user == null || user.password != data.password)
            {
                SendError(HttpStatusCode.Unauthorized, sender);
                return;
            }

            // add user to list of logged in users
            bool addSuccess = ActiveUsers.AddActiveUser(new ActiveUser(user._id, sender));
            if (!addSuccess)
            {
                SendError(HttpStatusCode.Forbidden, sender);
                return;
            }

            // fetch the logging in user's session, or create new one if not exists
            Session session;
            if (Sessions.GetStateById(user._id) == SessionState.Invalid)
            {
                session = Sessions.CreateSession(user._id);
            }
            else
            {
                session = Sessions.GetSessionById(user._id);
            }

            // respond
            var successResponse = new LoginResponsePacket(new LoginResponsePacketData(
                                                              (int)HttpStatusCode.OK, user, session.accessToken
                                                              ));
            Zephy.serverSocket.SendPacket(successResponse, sender);
        }
예제 #2
0
        public ListedUser ReadOneListedById(string id)
        {
            BaseUser     baseUser = ReadOneBaseById(id);
            OnlineStatus status   = ActiveUsers.IsLoggedIn(baseUser._id) ?
                                    OnlineStatus.Online :
                                    OnlineStatus.Offline;

            return(new ListedUser(baseUser, status));
        }
예제 #3
0
        protected override void Handle(ModifyMembersRequestPacket packet, Socket sender)
        {
            var data = packet.Data;

            if (data == null)
            {
                return;
            }

            ListedUser user    = userCrud.ReadOneListedById(data.user);
            Channel    channel = channelCrud.ReadOneById(data.channel);

            if (user == null || channel == null)
            {
                SendError(HttpStatusCode.BadRequest, sender);
                return;
            }

            if (data.action == MemberAction.ADD_MEMBER)
            {
                if (channel.members.Contains(user._id))
                {
                    SendError(HttpStatusCode.Conflict, sender);
                    return;
                }
                channel.members.Add(user._id);
                channelCrud.UpdateOne(channel._id, channel);
            }
            else if (data.action == MemberAction.REMOVE_MEMBER)
            {
                if (!channel.members.Contains(user._id))
                {
                    SendError(HttpStatusCode.NotFound, sender);
                    return;
                }
                channel.members.Remove(user._id);
                channelCrud.UpdateOne(channel._id, channel);
            }


            var response = new ModifyMembersResponsePacket(new ModifyMembersResponsePacketData(
                                                               (int)HttpStatusCode.OK, user, channel._id, data.action
                                                               ));

            if (ActiveUsers.IsLoggedIn(data.user))
            {
                Zephy.serverSocket.SendPacket(response, ActiveUsers.GetUser(data.user).clientSocket);
            }

            foreach (string memberId in channel.members)
            {
                if (ActiveUsers.IsLoggedIn(memberId))
                {
                    Zephy.serverSocket.SendPacket(response, ActiveUsers.GetUser(memberId).clientSocket);
                }
            }
        }
예제 #4
0
        protected override void Handle(SendMessageRequestPacket packet, Socket sender)
        {
            var data = packet.Data;

            if (data == null)
            {
                return;
            }

            // check if request is valid
            Channel channel = channelCrud.ReadOneById(data.forChannel);

            if (
                string.IsNullOrWhiteSpace(data.forChannel) ||
                string.IsNullOrWhiteSpace(data.content) ||
                channel == null)
            {
                SendError(HttpStatusCode.BadRequest, sender);
                return;
            }

            ActiveUser senderUser = ActiveUsers.GetUser(sender);

            if (senderUser == null || !channel.members.Contains(senderUser.userId))
            {
                SendError(HttpStatusCode.Unauthorized, sender);
                return;
            }


            // add new message to database
            var newMessage = new Message
            {
                content = data.content,
                sentAt  = Util.ToUnixTimestamp(DateTime.Now),
                author  = senderUser.userId,
                channel = channel._id,
            };

            messageCrud.CreateOne(newMessage);

            channelCrud.UpdateOne(channel._id, channel);

            // send response to members of channel (only if success!)
            var responsePacket = new SendMessageResponsePacket(new SendMessageResponsePacketData(
                                                                   (int)HttpStatusCode.OK, messageCrud.ReadOnePopulated(newMessage._id), channel._id
                                                                   ));

            foreach (string memberId in channel.members)
            {
                if (ActiveUsers.IsLoggedIn(memberId))
                {
                    Zephy.serverSocket.SendPacket(responsePacket, ActiveUsers.GetUser(memberId).clientSocket);
                }
            }
        }
예제 #5
0
        public List <ListedUser> ToListed(List <BaseUser> users)
        {
            List <ListedUser> listed = new List <ListedUser>();

            foreach (BaseUser u in users)
            {
                OnlineStatus status = ActiveUsers.IsLoggedIn(u._id) ?
                                      OnlineStatus.Online :
                                      OnlineStatus.Offline;
                listed.Add(new ListedUser(u, status));
            }

            return(listed);
        }
예제 #6
0
        protected override void Handle(ModifyChannelRequestPacket packet, Socket sender)
        {
            var data = packet.Data;

            if (data == null)
            {
                return;
            }

            Channel channel = channelCrud.ReadOneById(data.channel);

            if (channel == null)
            {
                SendError(HttpStatusCode.NotFound, sender);
                return;
            }

            if (data.data.Length < 2 && data.data.Length > 32)
            {
                SendError(HttpStatusCode.BadRequest, sender);
                return;
            }

            channel.name = data.data;
            channelCrud.UpdateOne(channel._id, channel);

            var response = new ModifyChannelResponsePacket(new ModifyChannelResponsePacketData(
                                                               (int)HttpStatusCode.OK, channel._id, data.action, data.data
                                                               ));

            foreach (string memberId in channel.members)
            {
                if (ActiveUsers.IsLoggedIn(memberId))
                {
                    Zephy.serverSocket.SendPacket(response, ActiveUsers.GetUser(memberId).clientSocket);
                }
            }
        }