public void Handle(WorldClient client, LogOutPacket packet) { _gameSession.StartLogOff(); }
public void ListenForUserAndBegin(IPEndPoint localEndPoint, Socket clientSocket) { //we have a connection System.Console.WriteLine("Connection established!"); while (Running) { // Data buffer byte[] bytes = new Byte[4096]; string data = null; // Get the data from the server while (true) { int numberOfBytes = clientSocket.Receive(bytes); data += Encoding.ASCII.GetString(bytes, 0, numberOfBytes); if (data.IndexOf("<EOF>", StringComparison.Ordinal) > -1) { break; } } //deserialize string serialisedJson = data.Substring(0, data.Length - 5); Console.WriteLine($"Received serialised packet: {serialisedJson}"); Packet packet = Serializer.Deserialize <Packet>(serialisedJson); Console.WriteLine($"Received packet {packet.PacketType}!"); User currUser; //we seem to need this do while (false) 'loop' as the program seems to think breaks in the switch statement //mean break out of the whole loop. do { //switch based on packet IDs and act accordingly switch (packet.PacketType) { case 1: //UserInfo //casting from base class to superclass doesn't work so we just deserialize again UserInfoPacket userInfoPacket = Serializer.Deserialize <UserInfoPacket>(serialisedJson); //(UserInfoPacket) packet; User user = userInfoPacket.User; //check if credentials valid if (this.Users.TryLogin(user) && !this.LogInManager.LoggedInUsers.Contains(user.Username)) { //log them in this.LogInManager.LoggedInUsers.Add(user.Username); this.UserToSockets.Add(user.Username, clientSocket); //send back packet to say it's successful //this is fine as we know clientsocket is the right socket this.SendPacket(new SuccessPacket().Construct("Successful login", 1), clientSocket); Console.WriteLine($"User {user.Username} logged in!"); } else { //tell user off. Console.WriteLine("Invalid login attempted."); this.SendPacket(new InvalidPacket().Construct("Invalid login!"), clientSocket); } break; case 4: //BookPlaneSeat BookPlaneSeatPacket bpsPacket = Serializer.Deserialize <BookPlaneSeatPacket>(serialisedJson); //(BookPlaneSeatPacket) packet; currUser = bpsPacket.User; //check to see if user is logged in if (this.LogInManager.UserLoggedIn(bpsPacket.User)) { //check to see if reasonable request if (this.Planes.GetPlanesLength() >= bpsPacket.PlaneID) { Plane desiredPlane = this.Planes.GetByID(bpsPacket.PlaneID); //check to see if seat available if (desiredPlane.SeatAvailable(bpsPacket.SeatID)) { desiredPlane.AddUserToSeat(currUser, bpsPacket.SeatID); this.SendPacket(new SuccessPacket().Construct("Successfully booked seat", 2), this.UserToSockets[currUser.Username]); } else { this.SendPacket(new InvalidPacket().Construct("Seat already booked"), this.UserToSockets[currUser.Username]); } } else { this.SendPacket(new InvalidPacket().Construct("Invalid seat ID"), this.UserToSockets[currUser.Username]); } } else { this.SendPacket(new InvalidPacket().Construct("Cannot request a plane seat as you are not logged in!"), clientSocket); } break; case 5: Console.WriteLine("About to send planes."); //RequestAvailablePlanes RequestAvailablePlanesPacket rapPacket = Serializer.Deserialize <RequestAvailablePlanesPacket>(serialisedJson); //(RequestAvailablePlanesPacket) packet; currUser = rapPacket.User; if (this.LogInManager.UserLoggedIn(rapPacket.User)) { PlaneInfo[] infos = this.Planes.GetPlaneInfos(); Console.WriteLine($"Sending {infos.Length} planes!"); this.SendPacket(new SendAvailablePlanesPacket().Construct(infos), this.UserToSockets[currUser.Username]); } else { this.SendPacket(new InvalidPacket().Construct("Cannot request planes as you are not logged in!"), clientSocket); } break; case 6: //Log out LogOutPacket logOutPacket = Serializer.Deserialize <LogOutPacket>(serialisedJson); if (this.LogInManager.LoggedInUsers.Contains(logOutPacket.User.Username)) { Console.WriteLine($"Logging out user {logOutPacket.User}!"); //remove from logged in users. this.LogInManager.LoggedInUsers.Remove(logOutPacket.User.Username); } break; } } while (false); } }
public LogOutEventArgs(PacketHeader header, LogOutPacket body) : base(header.UserId, header.SequenceNumber) { }