[73] | 1 | using System;
|
---|
| 2 | using System.Collections.Generic;
|
---|
| 3 | using System.IO;
|
---|
| 4 | using System.Net;
|
---|
| 5 | using System.Net.Sockets;
|
---|
| 6 | using System.Threading;
|
---|
| 7 |
|
---|
| 8 | public class AllocsNetTelnetServer
|
---|
| 9 | {
|
---|
| 10 | private static ឦ console;
|
---|
| 11 | private static Thread telnetThread;
|
---|
| 12 | private static Dictionary<EndPoint, bool> endpointsAuthed;
|
---|
| 13 | private static TcpListener listener;
|
---|
| 14 | private static NetworkStream stream;
|
---|
| 15 | private static bool closed;
|
---|
| 16 | private static string lineRead = string.Empty;
|
---|
| 17 |
|
---|
| 18 | public static void init (int port)
|
---|
| 19 | {
|
---|
| 20 | listener = new TcpListener (IPAddress.Any, port);
|
---|
| 21 | telnetThread = ThreadMaster.Create ("thread Allocs TelnetListenThread", new ThreadStart (telnetListenThread));
|
---|
| 22 | telnetThread.Start ();
|
---|
| 23 | endpointsAuthed = new Dictionary<EndPoint, bool> ();
|
---|
| 24 | Console.Out.WriteLine ("Started Allocs NetTelnetServer thread on " + port);
|
---|
| 25 | // Log.Out ("Started Allocs NetTelnetServer thread on " + port);
|
---|
| 26 | }
|
---|
| 27 |
|
---|
| 28 | private static void telnetListenThread ()
|
---|
| 29 | {
|
---|
| 30 | Console.Out.WriteLine ("Started thread_Allocs_TelnetListenThread()");
|
---|
| 31 | //Log.Out ("Started thread_Allocs_TelnetListenThread()");
|
---|
| 32 | listener.Start ();
|
---|
| 33 | while (!closed) {
|
---|
| 34 | Thread.Sleep (10);
|
---|
| 35 | TcpClient tcpClient = listener.AcceptTcpClient ();
|
---|
| 36 | if (tcpClient != null) {
|
---|
| 37 | try {
|
---|
| 38 | Console.Out.WriteLine ("Someone connected to telnet!");
|
---|
| 39 | endpointsAuthed.Add (tcpClient.Client.RemoteEndPoint, false);
|
---|
| 40 | stream = tcpClient.GetStream ();
|
---|
| 41 | StreamReader streamReader = new StreamReader (stream);
|
---|
| 42 | WriteToClient ("Please enter password:");
|
---|
| 43 | while (!closed && !endpointsAuthed[tcpClient.Client.RemoteEndPoint]) {
|
---|
| 44 | lineRead = streamReader.ReadLine ();
|
---|
| 45 | string text = string.Empty;
|
---|
| 46 | lineCorrecter (ref text);
|
---|
| 47 | text = text.Trim ();
|
---|
| 48 | if (text.Equals (GamePrefs.GetString (EnumGamePrefs.TelnetPassword))) {
|
---|
| 49 | endpointsAuthed [tcpClient.Client.RemoteEndPoint] = true;
|
---|
| 50 | WriteToClient ("Logon successful.");
|
---|
| 51 | WriteToClient (string.Empty);
|
---|
| 52 | WriteToClient (string.Empty);
|
---|
| 53 | WriteToClient (string.Empty);
|
---|
| 54 | } else {
|
---|
| 55 | WriteToClient ("Password incorrect, please enter password:");
|
---|
| 56 | }
|
---|
| 57 | }
|
---|
| 58 | WriteToClient ("*** Connected with 7DTD server.");
|
---|
| 59 | WriteToClient ("*** Server version: Alpha 8.7 (b29) Compatibility Version: Alpha 8.7");
|
---|
| 60 | WriteToClient (string.Empty);
|
---|
| 61 | WriteToClient ("Server IP: " +
|
---|
| 62 | ((GamePrefs.GetString (EnumGamePrefs.ServerIP) != null && GamePrefs.GetString (EnumGamePrefs.ServerIP).Length != 0) ? GamePrefs.GetString (EnumGamePrefs.ServerIP) : "Any")
|
---|
| 63 | );
|
---|
| 64 | WriteToClient ("Server port: " + GamePrefs.GetInt (EnumGamePrefs.ServerPort));
|
---|
| 65 | WriteToClient ("Max players: " + GamePrefs.GetInt (EnumGamePrefs.ServerMaxPlayerCount));
|
---|
| 66 | WriteToClient ("Game mode: " + GamePrefs.GetString (EnumGamePrefs.GameMode));
|
---|
| 67 | WriteToClient ("World: " + GamePrefs.GetString (EnumGamePrefs.GameWorld));
|
---|
| 68 | WriteToClient ("Game name: " + GamePrefs.GetString (EnumGamePrefs.GameName));
|
---|
| 69 | WriteToClient ("Difficulty: " + GamePrefs.GetInt (EnumGamePrefs.GameDifficulty));
|
---|
| 70 | WriteToClient (string.Empty);
|
---|
| 71 | WriteToClient ("Press 'help' to get a list of all commands. Press 'exit' to end session.");
|
---|
| 72 | WriteToClient (string.Empty);
|
---|
| 73 | while (!closed) {
|
---|
| 74 | lineRead = streamReader.ReadLine ();
|
---|
| 75 | string text2 = string.Empty;
|
---|
| 76 | lineCorrecter (ref text2);
|
---|
| 77 | text2 = text2.Trim ();
|
---|
| 78 | if (text2.Equals ("exit")) {
|
---|
| 79 | endpointsAuthed [tcpClient.Client.RemoteEndPoint] = false;
|
---|
| 80 | break;
|
---|
| 81 | }
|
---|
| 82 |
|
---|
| 83 | if (text2.Length != 0) {
|
---|
| 84 | Console.WriteLine ("Telnet executed \"" + text2 + "\" by " + tcpClient.Client.RemoteEndPoint);
|
---|
| 85 | // console.ᙂ (text2);
|
---|
| 86 | lineRead = string.Empty;
|
---|
| 87 | }
|
---|
| 88 | Thread.Sleep (50);
|
---|
| 89 | }
|
---|
| 90 | if (stream != null) {
|
---|
| 91 | endpointsAuthed [tcpClient.Client.RemoteEndPoint] = false;
|
---|
| 92 | stream.Close ();
|
---|
| 93 | stream = null;
|
---|
| 94 | }
|
---|
| 95 | } catch (Exception ex) {
|
---|
| 96 | Console.Out.WriteLine ("Error in Allocs telnetListenThread: " + ex.Message);
|
---|
| 97 | //Log.Out ("Error in Allocs telnetListenThread: " + ex.Message);
|
---|
| 98 | Console.Out.WriteLine ("Stack Trace: " + ex.StackTrace);
|
---|
| 99 | //Log.Out ("Stack Trace: " + ex.StackTrace);
|
---|
| 100 | }
|
---|
| 101 | if (stream != null) {
|
---|
| 102 | endpointsAuthed [tcpClient.Client.RemoteEndPoint] = false;
|
---|
| 103 | stream.Close ();
|
---|
| 104 | stream = null;
|
---|
| 105 | }
|
---|
| 106 | }
|
---|
| 107 | }
|
---|
| 108 | Console.Out.WriteLine ("Exited thread_Allocs_TelnetListenThread()");
|
---|
| 109 | //Log.Out ("Exited thread_Allocs_TelnetListenThread()");
|
---|
| 110 | ThreadMaster.Remove (Thread.CurrentThread.Name);
|
---|
| 111 | }
|
---|
| 112 |
|
---|
| 113 | private static void lineCorrecter (ref string line)
|
---|
| 114 | {
|
---|
| 115 | if (lineRead == null) {
|
---|
| 116 | return;
|
---|
| 117 | }
|
---|
| 118 | for (int i = 0; i < lineRead.Length; i++) {
|
---|
| 119 | if ((lineRead [i] == '\b' || lineRead [i] == '~') && line.Length > 0) {
|
---|
| 120 | line = line.Substring (0, line.Length);
|
---|
| 121 | }
|
---|
| 122 | if (lineRead [i] >= ' ' && lineRead [i] != '\'' && lineRead [i] <= '~') {
|
---|
| 123 | line += lineRead [i];
|
---|
| 124 | }
|
---|
| 125 | }
|
---|
| 126 | }
|
---|
| 127 |
|
---|
| 128 | public static void Disconnect ()
|
---|
| 129 | {
|
---|
| 130 | closed = true;
|
---|
| 131 | if (listener != null) {
|
---|
| 132 | listener.Stop ();
|
---|
| 133 | }
|
---|
| 134 | if (stream != null) {
|
---|
| 135 | stream.Close ();
|
---|
| 136 | }
|
---|
| 137 | Thread.Sleep (100);
|
---|
| 138 | }
|
---|
| 139 |
|
---|
| 140 | public static void SetConsole (ឦ console)
|
---|
| 141 | {
|
---|
| 142 | AllocsNetTelnetServer.console = console;
|
---|
| 143 | }
|
---|
| 144 |
|
---|
| 145 | public static void WriteToClient (string line)
|
---|
| 146 | {
|
---|
| 147 | if (line == null) {
|
---|
| 148 | return;
|
---|
| 149 | }
|
---|
| 150 | if (stream != null) {
|
---|
| 151 | for (int i = 0; i < line.Length; i++) {
|
---|
| 152 | stream.WriteByte ((byte)line [i]);
|
---|
| 153 | }
|
---|
| 154 | stream.WriteByte (13);
|
---|
| 155 | stream.WriteByte (10);
|
---|
| 156 | }
|
---|
| 157 | }
|
---|
| 158 | }
|
---|