Ignore:
Timestamp:
Oct 23, 2014, 3:09:29 PM (10 years ago)
Author:
alloc
Message:

Server fixes

Location:
binary-improvements/7dtd-server-fixes
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • binary-improvements/7dtd-server-fixes/7dtd-server-fixes.csproj

    r199 r202  
    1010    <AssemblyName>7dtd-server-fixes</AssemblyName>
    1111    <RootNamespace>AllocsFixes</RootNamespace>
    12     <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
     12    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
    1313  </PropertyGroup>
    1414  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     
    129129    <Compile Include="src\FileCache\SimpleCache.cs" />
    130130    <Compile Include="src\FileCache\MapTileCache.cs" />
     131    <Compile Include="src\CustomCommands\webstat.cs" />
    131132  </ItemGroup>
    132133  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  • binary-improvements/7dtd-server-fixes/src/CustomCommands/ListLandProtection.cs

    r146 r202  
    2020                }
    2121
     22                public override void ExecuteRemote (string _sender, string[] _params)
     23                {
     24                        try {
     25                                if (_params.Length >= 1 && _params [0].ToLower ().Equals ("nearby")) {
     26                                        string[] params2 = new string[_params.Length + 1];
     27                                        for (int i = 0; i < _params.Length; i++)
     28                                                params2 [i] = _params [i];
     29                                        params2 [_params.Length] = _sender;
     30                                        _params = params2;
     31                                }
     32                                Run (_params);
     33                        } catch (Exception e) {
     34                                Log.Out ("Error in ListLandProtection.ExecuteRemote: " + e);
     35                        }
     36                }
     37
    2238                public override void Run (string[] _params)
    2339                {
     
    2844                                bool summaryOnly = false;
    2945                                string steamIdFilter = string.Empty;
     46                                Vector3i closeTo = default(Vector3i);
     47                                bool onlyCloseToPlayer = false;
     48                                int closeToDistance = 32;
    3049
    3150                                if (_params.Length == 1) {
     
    4564                                                }
    4665                                        }
     66                                } else if (_params.Length >= 2) {
     67                                        if (_params [0].ToLower ().Equals ("nearby")) {
     68                                                try {
     69                                                        if (_params.Length == 3) {
     70                                                                if (!int.TryParse (_params[1], out closeToDistance)) {
     71                                                                        m_Console.SendResult ("Given radius is not an integer!");
     72                                                                }
     73                                                        }
     74                                                        ClientInfo ci = CommonMappingFunctions.GetClientInfoFromSteamID (_params [_params.Length - 1]);
     75                                                        EntityPlayer ep = CommonMappingFunctions.GetEntityPlayer (ci);
     76                                                        closeTo = new Vector3i (ep.GetPosition ());
     77                                                        onlyCloseToPlayer = true;
     78                                                } catch (Exception e) {
     79                                                        m_Console.SendResult ("Error getting current player's position");
     80                                                        Log.Out ("Error in ListLandProtection.Run: " + e);
     81                                                }
     82                                        } else {
     83                                                m_Console.SendResult ("Illegal parameter list");
     84                                                return;
     85                                        }
    4786                                }
    4887
     
    5190                                        Dictionary<PersistentPlayerData, List<Vector3i>> owners = new Dictionary<PersistentPlayerData, List<Vector3i>> ();
    5291                                        foreach (KeyValuePair<Vector3i, PersistentPlayerData> kvp in d) {
    53                                                 if (!owners.ContainsKey (kvp.Value)) {
    54                                                         owners.Add (kvp.Value, new List<Vector3i> ());
     92                                                if (!onlyCloseToPlayer || (Math.Abs (kvp.Key.x - closeTo.x) <= closeToDistance && Math.Abs (kvp.Key.z - closeTo.z) <= closeToDistance)) {
     93                                                        if (!owners.ContainsKey (kvp.Value)) {
     94                                                                owners.Add (kvp.Value, new List<Vector3i> ());
     95                                                        }
     96                                                        owners [kvp.Value].Add (kvp.Key);
    5597                                                }
    56                                                 owners [kvp.Value].Add (kvp.Key);
    5798                                        }
    5899
    59100                                        foreach (KeyValuePair<PersistentPlayerData, List<Vector3i>> kvp in owners) {
    60101                                                if (steamIdFilter.Length == 0 || kvp.Key.PlayerId.Equals (steamIdFilter)) {
    61                                                         string name = PersistentData.PersistentContainer.Instance.Players[kvp.Key.PlayerId].Name;
     102                                                        string name = PersistentData.PersistentContainer.Instance.Players [kvp.Key.PlayerId].Name;
    62103                                                        name += " (" + kvp.Key.PlayerId + ")";
    63104
  • binary-improvements/7dtd-server-fixes/src/CustomCommands/RemoveLandProtection.cs

    r130 r202  
    4141                                CommonMappingFunctions.GetGameManager ().SetBlocksRPC (changes);
    4242
    43                                 m_Console.SendResult ("#" + changes.Count + " Land protection blocks for player \"" + _id + "\" removed");
     43                                m_Console.SendResult ("Tried to remove #" + changes.Count + " land protection blocks for player \"" + _id + "\". Note "+
     44                                                      "that only blocks in chunks that are currently loaded (close to any player) could be removed. "+
     45                                                      "Please check for remaining blocks by running:");
     46                                m_Console.SendResult("  listlandprotection " + _id);
    4447                        } catch (Exception e) {
    4548                                Log.Out ("Error in RemoveLandProtection.removeById: " + e);
  • binary-improvements/7dtd-server-fixes/src/NetConnections/Servers/Telnet/TelnetConnection.cs

    r190 r202  
    5959                {
    6060                        toClientQueue.Enqueue ("*** Connected with 7DTD server.");
     61                        toClientQueue.Enqueue ("*** Server version: " + GamePrefs.GetString(EnumGamePrefs.GameVersion));
    6162                        toClientQueue.Enqueue ("*** Dedicated server only build");
    6263                        toClientQueue.Enqueue ("*** Allocs server fixes loaded");
  • binary-improvements/7dtd-server-fixes/src/NetConnections/Servers/Web/StaticHandler.cs

    r199 r202  
    2424                public override void HandleRequest (HttpListenerRequest req, HttpListenerResponse resp, HttpListenerBasicIdentity user)
    2525                {
    26                         try {
    27                                 string fn = req.Url.AbsolutePath.Remove (0, staticPart.Length);
     26                        string fn = req.Url.AbsolutePath.Remove (0, staticPart.Length);
    2827
    29                                 byte[] content = cache.GetFileContent (datapath + "/" + fn);
    30                                 if (content != null) {
    31                                         resp.ContentType = MimeType.GetMimeType (Path.GetExtension (fn));
    32                                         resp.ContentLength64 = content.Length;
    33                                         resp.OutputStream.Write (content, 0, content.Length);
    34                                 } else {
    35                                         resp.StatusCode = (int)HttpStatusCode.NotFound;
    36                                         if (logMissingFiles)
    37                                                 Log.Out ("Web:Static:FileNotFound: \"" + req.Url.AbsolutePath + "\" @ \"" + datapath + "/" + req.Url.AbsolutePath.Remove (0, staticPart.Length) + "\"");
    38                                         return;
    39                                 }
    40                         } catch (Exception e) {
    41                                 Log.Out ("Error in StaticHandler.HandleRequest: " + e);
     28                        byte[] content = cache.GetFileContent (datapath + "/" + fn);
     29                        if (content != null) {
     30                                resp.ContentType = MimeType.GetMimeType (Path.GetExtension (fn));
     31                                resp.ContentLength64 = content.Length;
     32                                resp.OutputStream.Write (content, 0, content.Length);
     33                        } else {
     34                                resp.StatusCode = (int)HttpStatusCode.NotFound;
     35                                if (logMissingFiles)
     36                                        Log.Out ("Web:Static:FileNotFound: \"" + req.Url.AbsolutePath + "\" @ \"" + datapath + "/" + req.Url.AbsolutePath.Remove (0, staticPart.Length) + "\"");
     37                                return;
    4238                        }
    4339                }
  • binary-improvements/7dtd-server-fixes/src/NetConnections/Servers/Web/Web.cs

    r199 r202  
    33using System.IO;
    44using System.Net;
     5using System.Net.Sockets;
    56using System.Text;
    67using System.Threading;
     
    1516                private bool authEnabled = false;
    1617                private string realm = "7dtd Admin Panel";
     18                public static int handlingCount = 0;
     19                public static int currentHandlers = 0;
    1720
    1821                public Web ()
     
    6265                                _listener.Realm = realm;
    6366
    64                                 ThreadPool.QueueUserWorkItem ((o) =>
    65                                 {
    66                                         try {
    67                                                 while (_listener.IsListening) {
    68                                                         ThreadPool.QueueUserWorkItem ((c) =>
    69                                                         {
    70                                                                 HttpListenerContext ctx = c as HttpListenerContext;
    71                                                                 HandleRequest (ctx);
    72                                                         }, _listener.GetContext ());
    73                                                 }
    74                                         } catch {
    75                                         }
    76                                 }
    77                                 );
    78 
    7967                                NetTelnetServer.RegisterServer (this);
    8068
     69                                _listener.BeginGetContext (new AsyncCallback (HandleRequest), _listener);
    8170
    8271                                Log.Out ("Started Webserver on " + (webPort + 2) + " (authentication " + (authEnabled ? "enabled" : "disabled") + ")");
     
    8675                }
    8776
    88                 private void HandleRequest (HttpListenerContext ctx)
     77                private void HandleRequest (IAsyncResult result)
    8978                {
    90                         try {
    91                                 ctx.Response.ProtocolVersion = new Version ("1.1");
     79                        if (_listener.IsListening) {
     80                                Interlocked.Increment(ref handlingCount);
     81                                Interlocked.Increment(ref currentHandlers);
     82                                HttpListenerContext ctx = _listener.EndGetContext (result);
     83                                _listener.BeginGetContext (new AsyncCallback (HandleRequest), _listener);
     84                                try {
     85                                        ctx.Response.ProtocolVersion = new Version ("1.1");
    9286
    93                                 HttpListenerBasicIdentity user = Authorize (ctx);
     87                                        HttpListenerBasicIdentity user = Authorize (ctx);
    9488
    95                                 if (!authEnabled || (user.Name.ToLower ().Equals ("admin") && user.Password.Equals (GamePrefs.GetString (EnumGamePrefs.ControlPanelPassword)))) {
    96                                         if (ctx.Request.Url.AbsolutePath.Length < 2) {
    97                                                 handlers ["/index.htm"].HandleRequest (ctx.Request, ctx.Response, user);
    98                                                 return;
    99                                         } else {
    100                                                 foreach (KeyValuePair<string, PathHandler> kvp in handlers) {
    101                                                         if (ctx.Request.Url.AbsolutePath.StartsWith (kvp.Key)) {
    102                                                                 kvp.Value.HandleRequest (ctx.Request, ctx.Response, user);
    103                                                                 return;
     89                                        if (!authEnabled || (user.Name.ToLower ().Equals ("admin") && user.Password.Equals (GamePrefs.GetString (EnumGamePrefs.ControlPanelPassword)))) {
     90                                                if (ctx.Request.Url.AbsolutePath.Length < 2) {
     91                                                        handlers ["/index.htm"].HandleRequest (ctx.Request, ctx.Response, user);
     92                                                        return;
     93                                                } else {
     94                                                        foreach (KeyValuePair<string, PathHandler> kvp in handlers) {
     95                                                                if (ctx.Request.Url.AbsolutePath.StartsWith (kvp.Key)) {
     96                                                                        kvp.Value.HandleRequest (ctx.Request, ctx.Response, user);
     97                                                                        return;
     98                                                                }
    10499                                                        }
    105100                                                }
     101
     102                                                Log.Out ("Error in Web.HandleRequest(): No handler found for path \"" + ctx.Request.Url.AbsolutePath + "\"");
     103                                                ctx.Response.StatusCode = (int)HttpStatusCode.NotFound;
     104                                        } else {
     105                                                ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
     106                                                ctx.Response.Headers ["WWW-Authenticate"] = "Basic realm=\"" + realm + "\"";
    106107                                        }
    107 
    108                                         Log.Out ("Error in Web.HandleRequest(): No handler found for path \"" + ctx.Request.Url.AbsolutePath + "\"");
    109                                         ctx.Response.StatusCode = (int)HttpStatusCode.NotFound;
    110                                 } else {
    111                                         ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
    112                                         ctx.Response.Headers ["WWW-Authenticate"] = "Basic realm=\"" + realm + "\"";
     108                                } catch (IOException e) {
     109                                        if (e.InnerException is SocketException) {
     110                                                if (e.InnerException.Message.Contains ("forcibly closed") || e.InnerException.Message.Contains ("socket has been shut down"))
     111                                                        Log.Out ("Error in Web.HandleRequest(): Remote host closed connection");
     112                                                else
     113                                                        Log.Out ("Error (IO->Socket) in Web.HandleRequest(): " + e);
     114                                        } else {
     115                                                Log.Out ("Error (IO) in Web.HandleRequest(): " + e);
     116                                        }
     117                                } catch (Exception e) {
     118                                        Log.Out ("Error in Web.HandleRequest(): " + e);
     119                                } finally {
     120                                        if (ctx != null)
     121                                                ctx.Response.OutputStream.Close ();
     122                                        Interlocked.Decrement(ref currentHandlers);
    113123                                }
    114 
    115 //                              byte[] buf = Encoding.UTF8.GetBytes ("Hello World");
    116 //                              resp.ContentLength64 = buf.Length;
    117 //                              resp.ContentType = "text/html";
    118 //                              resp.ContentEncoding = Encoding.UTF8;
    119 //                              resp.OutputStream.Write (buf, 0, buf.Length);
    120                         } catch (Exception e) {
    121                                 Log.Out ("Error in Web.HandleRequest(): " + e);
    122                         } finally {
    123                                 ctx.Response.Close ();
    124124                        }
    125125                }
  • binary-improvements/7dtd-server-fixes/src/PersistentData/Players.cs

    r189 r202  
    4747                public Player GetPlayerByNameOrId (string _nameOrId, bool _ignoreColorCodes)
    4848                {
    49                         string sid = GetSteamID(_nameOrId, _ignoreColorCodes);
     49                        string sid = GetSteamID (_nameOrId, _ignoreColorCodes);
    5050                        if (sid != null)
    51                                 return this[sid];
     51                                return this [sid];
    5252                        else
    5353                                return null;
Note: See TracChangeset for help on using the changeset viewer.