Exemple #1
0
 static void RemoteUserLoggedIn(object sender, RemoteLoginEventArgs e)
 {
     Console.ForegroundColor = ConsoleColor.Yellow;
     Console.WriteLine("Session {0} user identified as {1}", e.RemoteEndPoint, e.Username);
     Console.ResetColor();
 }
        public void Start(TcpClient RClient, Server server)
        {
            //Test
            rTcpClient = RClient;

            reader = new BinaryReader(rTcpClient.GetStream());
            writer = new BinaryWriter(rTcpClient.GetStream());
            int failedTries = 0;

            byte[] OpCodePacket = new byte[1];
            int    bytesRead;

            while (true)
            {
                bytesRead = 0;

                try
                {
                    //blocks until a client sends a message
                    bytesRead = rTcpClient.Client.Receive(OpCodePacket, 1, SocketFlags.None);
                    switch ((RemoteProtocol)OpCodePacket[0])
                    {
                    case RemoteProtocol.Username:                                     //Username
                    {
                        Username = reader.ReadString();
                        writer.Write((byte)RemoteProtocol.ServerMessage);
                        writer.Write((byte)3);
                        writer.Write("Hello " + Username + ". Please enter the password sent to you by the bot owner to use the bot.");
                        break;
                    }

                    case RemoteProtocol.Password:
                    {
                        if (Username == null)
                        {
                            throw new SocketException(-1);
                        }
                        if (failedTries > 3)
                        {
                            writer.Write((byte)RemoteProtocol.ServerMessage);
                            writer.Write((byte)2);
                            writer.Write("You have incorrectly guessed the password more than three times. The session has been closed.");
                            throw new SocketException(-1);
                        }

                        string Password = reader.ReadString();
                        if (server._password != Password)
                        {
                            writer.Write((byte)RemoteProtocol.ServerMessage);
                            writer.Write((byte)4);
                            writer.Write("Incorrect password. You have " + (3 - failedTries).ToString() + " more tries.");
                            failedTries++;
                        }

                        else
                        {
                            Authorised = true;
                            writer.Write((byte)RemoteProtocol.ClientAuthorised);
                            writer.Write("You have now been authenticated");
                            RemoteLoginEventArgs e = new RemoteLoginEventArgs(Username, (IPEndPoint)rTcpClient.Client.RemoteEndPoint, rTcpClient);
                            server.MinecraftBot.Events.RaiseUserLoggedIn(e);
                        }
                        break;
                    }

                    case RemoteProtocol.IncomingMessage:
                    {
                        string chat = reader.ReadString();
                        if (chat.StartsWith("&"))
                        {
                            string commandname = chat.TrimStart('&').Split(' ')[0];
                            string args        = String.Empty;
                            try { args = chat.Substring(commandname.Length + 2); } catch { }                                                     //Account for first white variable.
                            args.TrimStart(' ');
                            writer.Write((byte)RemoteProtocol.ServerResponse);

                            switch (commandname)
                            {
                            case "commands":
                            {
                                writer.Write((byte)0);
                                writer.Write("Commands: " + Environment.NewLine +
                                             "&commands - Returns a list of commands." + Environment.NewLine +
                                             "&players - Returns a list of players on the same map as the bot." + Environment.NewLine +
                                             "&listlogs - Returns a list of all log files in the bot directory." + Environment.NewLine +
                                             "&getlog - Gets the log file from the specified name.");
                                break;
                            }

                            case "players":
                            {
                                writer.Write((byte)0);
                                Dictionary <byte, Player> players = server.MinecraftBot.Players;
                                List <string>             Output  = new List <string>();
                                foreach (Player player in players.Values)
                                {
                                    Output.Add(player.Name);
                                }
                                string[] output = Output.ToArray();
                                writer.Write("Players in the current map: " + Environment.NewLine +
                                             string.Join(",", output));
                            }
                            break;

                            case "listlogs":
                            {
                                writer.Write((byte)0);
                                string[]                  rawFiles = Directory.GetFiles(Directory.GetCurrentDirectory());
                                List <String>             Files    = new List <string>(rawFiles);
                                System.Text.StringBuilder sb       = new System.Text.StringBuilder();
                                foreach (string file in Files)
                                {
                                    string fileRelative = Path.GetFileName(file);
                                    if (fileRelative.StartsWith("log-"))
                                    {
                                        sb.Append(fileRelative + Environment.NewLine);
                                    }
                                }
                                writer.Write("Log files: " + Environment.NewLine + sb);
                                break;
                            }

                            case "getlog":
                            {
                                string        reqFile  = Path.Combine(Directory.GetCurrentDirectory(), args);
                                string[]      rawFiles = Directory.GetFiles(Directory.GetCurrentDirectory());
                                List <string> Files    = new List <string>(rawFiles);
                                if (!Files.Contains(reqFile))
                                {
                                    writer.Write((byte)0);
                                    writer.Write("No file matching " + args + " found. You must include the extension as well.");
                                }
                                else
                                {
                                    writer.Write((byte)1);
                                    writer.Write(Path.GetFileName(reqFile));
                                    writer.Write(File.ReadAllText(reqFile));
                                }
                                //writer.Write("Test.");

                                break;
                            }

                            default:
                            {
                                writer.Write((byte)0);
                                writer.Write("Unknown command: " + chat.TrimStart('&').Split(' ')[0] + ". To see a list of commands, type &commands");
                                break;
                            }
                            }
                            break;
                        }                                                 //If the user wishes to do a server command.
                        if (Authorised)                                   //Only send if authorised, still read the message otherwise we become out of sync with the client.
                        {
                            Extensions.StripColors(chat);
                            server.MinecraftBot.SendLongChat(chat);
                        }
                        break;
                    }

                    default:
                        throw new SocketException(-1);
                    }
                }
                catch
                {
                    //A socket error has occured, don't log why.
                    break;
                }

                if (bytesRead == 0)
                {
                    //The client has disconnected.
                    break;
                }
            }
            SessionEndedEventArgs endede = new SessionEndedEventArgs(Username);

            server.MinecraftBot.Events.RaiseSessionEnded(endede);
            if (rTcpClient != null)
            {
                rTcpClient.Client.Disconnect(true);
                rTcpClient.Close();
            }
        }