Ignore:
Timestamp:
Sep 9, 2014, 8:04:37 PM (10 years ago)
Author:
alloc
Message:

fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • binary-improvements/7dtd-server-fixes/src/NetConnections/Servers/Telnet/Telnet.cs

    r142 r182  
    99        public class Telnet : IServer
    1010        {
    11                 private static Thread telnetThread = null;
    12                 private static TcpListener listener = null;
    13                 private static bool closed = false;
    14                 private static bool authEnabled = false;
    15                 private static List<TelnetConnection> connections = new List<TelnetConnection> ();
     11                private Thread telnetThread = null;
     12                private TcpListener listener = null;
     13                private bool closed = false;
     14                private bool authEnabled = false;
     15                private List<TelnetConnection> connections = new List<TelnetConnection> ();
    1616
    17                 public Telnet (int port)
     17                public Telnet ()
    1818                {
    1919                        try {
     20                                if (!GamePrefs.GetBool (EnumGamePrefs.TelnetEnabled)) {
     21                                        return;
     22                                }
     23
     24                                int port = GamePrefs.GetInt (EnumGamePrefs.TelnetPort);
     25
    2026                                authEnabled = GamePrefs.GetString (EnumGamePrefs.TelnetPassword).Length != 0;
    2127                                if (authEnabled)
     
    2531                                telnetThread = ThreadMaster.Create ("thread TelnetListenThread", new ThreadStart (telnetListenThread));
    2632                                telnetThread.Start ();
    27                                 Log.Out ("Started Telnet thread on " + port);
     33
     34                                NetTelnetServer.RegisterServer (this);
     35
     36                                Log.Out ("Started Telnet on " + port);
    2837                        } catch (Exception e) {
    2938                                Log.Out ("Error in Telnet.ctor: " + e);
     
    3443                {
    3544                        try {
    36                                 Log.Out ("Started thread_TelnetListenThread()");
    3745                                listener.Start ();
    38                                 while (!closed) {
    39                                         Thread.Sleep (10);
    40                                         if (listener.Pending ()) {
     46                                try {
     47                                        while (!closed) {
    4148                                                TelnetConnection c = new TelnetConnection (listener.AcceptTcpClient (), authEnabled);
    4249                                                connections.Add (c);
    43                                                 Log.Out ("Telnet connection from: " + c.GetEndPoint ());
    44                                                 if (authEnabled) {
    45                                                         c.WriteLine ("Please enter password:");
    46                                                 } else {
    47                                                         LoginMessage (c);
    48                                                 }
    4950                                        }
    50 
    51                                         foreach (TelnetConnection c in connections) {
    52                                                 if (c.IsClosed ()) {
    53                                                         c.Close ();
    54                                                         connections.Remove (c);
    55                                                         break;
    56                                                 }
    57                                                 if (c.Read ()) {
    58                                                         string line = lineCorrecter (c.GetLine ());
    59                                                         if (!c.IsAuthenticated ()) {
    60                                                                 if (line.Equals (GamePrefs.GetString (EnumGamePrefs.TelnetPassword))) {
    61                                                                         c.SetAuthenticated ();
    62                                                                         c.WriteLine ("Logon successful.");
    63                                                                         c.WriteLine (string.Empty);
    64                                                                         c.WriteLine (string.Empty);
    65                                                                         c.WriteLine (string.Empty);
    66                                                                         LoginMessage (c);
    67                                                                 } else {
    68                                                                         c.WriteLine ("Password incorrect, please enter password:");
    69                                                                 }
    70                                                         } else {
    71                                                                 if (line.ToLower ().Equals ("exit")) {
    72                                                                         Log.Out ("Telnet connection closed by client: " + c.GetEndPoint ());
    73                                                                         c.Close ();
    74                                                                         connections.Remove (c);
    75                                                                         break;
    76                                                                 }
    77                                                                 Log.Out ("Telnet executed \"" + line + "\" from: " + c.GetEndPoint ());
    78                                                                 ConsoleOutputSeparator.QueueNetCommand (line, c);
    79                                                         }
    80                                                 }
    81                                         }
     51                                } catch (SocketException) {
     52                                } catch (ThreadInterruptedException) {
    8253                                }
    83                                 Log.Out ("Exited thread_TelnetListenThread()");
    8454                                ThreadMaster.Remove (Thread.CurrentThread.Name);
    8555                        } catch (Exception ex) {
    86                                 Log.Out ("Error in TelnetListenThread: " + ex.Message);
    87                                 Log.Out ("Stack Trace: " + ex.StackTrace);
     56                                Log.Out ("Error in TelnetListenThread: " + ex);
    8857                        }
    89                 }
    90 
    91                 private void LoginMessage (TelnetConnection c)
    92                 {
    93                         c.WriteLine ("*** Connected with 7DTD server.");
    94                         c.WriteLine ("*** Dedicated server only build");
    95                         c.WriteLine ("*** Allocs server fixes loaded");
    96                         c.WriteLine (string.Empty);
    97                         c.WriteLine ("Server IP:   " +
    98                                 ((GamePrefs.GetString (EnumGamePrefs.ServerIP) != null && GamePrefs.GetString (EnumGamePrefs.ServerIP).Length != 0) ? GamePrefs.GetString (EnumGamePrefs.ServerIP) : "Any")
    99                         );
    100                         c.WriteLine ("Server port: " + GamePrefs.GetInt (EnumGamePrefs.ServerPort));
    101                         c.WriteLine ("Max players: " + GamePrefs.GetInt (EnumGamePrefs.ServerMaxPlayerCount));
    102                         c.WriteLine ("Game mode:   " + GamePrefs.GetString (EnumGamePrefs.GameMode));
    103                         c.WriteLine ("World:       " + GamePrefs.GetString (EnumGamePrefs.GameWorld));
    104                         c.WriteLine ("Game name:   " + GamePrefs.GetString (EnumGamePrefs.GameName));
    105                         c.WriteLine ("Difficulty:  " + GamePrefs.GetInt (EnumGamePrefs.GameDifficulty));
    106                         c.WriteLine (string.Empty);
    107                         c.WriteLine ("Press 'help' to get a list of all commands. Press 'exit' to end session.");
    108                         c.WriteLine (string.Empty);
    109                 }
    110 
    111                 private string lineCorrecter (string line)
    112                 {
    113                         string res = "";
    114                         for (int i = 0; i < line.Length; i++) {
    115                                 if (line [i] >= ' ' && line [i] != '\'') {
    116                                         res += line [i];
    117                                 }
    118                         }
    119                         return res.Trim ();
    12058                }
    12159
     
    12664                                if (listener != null) {
    12765                                        listener.Stop ();
     66                                        listener = null;
    12867                                }
    12968                                foreach (TelnetConnection c in connections) {
     
    13170                                }
    13271                                Thread.Sleep (100);
     72                                if (telnetThread != null) {
     73                                        telnetThread.Interrupt ();
     74                                }
    13375                        } catch (Exception e) {
    13476                                Log.Out ("Error in Telnet.Disconnect: " + e);
     
    13981                {
    14082                        try {
     83                                List<TelnetConnection> toRemove = new List<TelnetConnection> ();
    14184                                foreach (TelnetConnection c in connections) {
    142                                         if (c.IsClosed ()) {
    143                                                 c.Close ();
    144                                         }
     85                                        if (c.IsClosed ())
     86                                                toRemove.Add (c);
     87                                }
     88                                foreach (TelnetConnection c in toRemove) {
     89                                        connections.Remove (c);
    14590                                }
    14691                        } catch (Exception e) {
Note: See TracChangeset for help on using the changeset viewer.