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); }
public ListedUser ReadOneListedById(string id) { BaseUser baseUser = ReadOneBaseById(id); OnlineStatus status = ActiveUsers.IsLoggedIn(baseUser._id) ? OnlineStatus.Online : OnlineStatus.Offline; return(new ListedUser(baseUser, status)); }
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); } } }
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); } } }
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); }
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); } } }