diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs
index ff74e903..6c9aeb38 100755
--- a/TShockAPI/Commands.cs
+++ b/TShockAPI/Commands.cs
@@ -1541,7 +1541,15 @@ namespace TShockAPI
private static void CheckUpdates(CommandArgs args)
{
args.Player.SendInfoMessage("An update check has been queued.");
- ThreadPool.QueueUserWorkItem(UpdateManager.CheckUpdate);
+ try
+ {
+ TShock.UpdateManager.UpdateCheck(null);
+ }
+ catch (Exception)
+ {
+ //swallow the exception
+ return;
+ }
}
private static void UpdatePlugins(CommandArgs args)
@@ -3363,7 +3371,7 @@ namespace TShockAPI
int maxSpawns = -1;
if (!int.TryParse(args.Parameters[0], out maxSpawns) || maxSpawns < 0 || maxSpawns > Main.maxNPCs)
{
- args.Player.SendWarningMessage("Invalid maximum spawns!");
+ args.Player.SendWarningMessage("Invalid maximum spawns! Acceptable range is {0} to {1}", 0, Main.maxNPCs);
return;
}
diff --git a/TShockAPI/PacketBufferer.cs b/TShockAPI/PacketBufferer.cs
index ad3b6d03..1722bfe4 100644
--- a/TShockAPI/PacketBufferer.cs
+++ b/TShockAPI/PacketBufferer.cs
@@ -197,10 +197,10 @@ namespace TShockAPI
{
if (socket.tcpClient.Client != null && socket.tcpClient.Client.Poll(0, SelectMode.SelectWrite))
{
- if (ServerApi.RunningMono)
+ if (ServerApi.RunningMono && !ServerApi.UseAsyncSocketsInMono)
socket.networkStream.Write(buffer, offset, count);
else
- socket.tcpClient.Client.Send(buffer, offset, count, SocketFlags.None);
+ socket.networkStream.BeginWrite(buffer, offset, count, socket.ServerWriteCallBack, socket.networkStream);
return true;
}
}
diff --git a/TShockAPI/Properties/AssemblyInfo.cs b/TShockAPI/Properties/AssemblyInfo.cs
index b6820aaf..ba209b94 100644
--- a/TShockAPI/Properties/AssemblyInfo.cs
+++ b/TShockAPI/Properties/AssemblyInfo.cs
@@ -49,5 +49,5 @@ using System.Runtime.InteropServices;
// Build Number
// MMdd of the build
-[assembly: AssemblyVersion("4.2.3.0720")]
-[assembly: AssemblyFileVersion("4.2.3.0720")]
+[assembly: AssemblyVersion("4.2.3.0909")]
+[assembly: AssemblyFileVersion("4.2.3.0909")]
diff --git a/TShockAPI/StatTracker.cs b/TShockAPI/StatTracker.cs
index ccda72f9..d8f422c5 100644
--- a/TShockAPI/StatTracker.cs
+++ b/TShockAPI/StatTracker.cs
@@ -28,21 +28,6 @@ namespace TShockAPI
}
}
- private HttpWebResponse GetResponseNoException(HttpWebRequest req)
- {
- try
- {
- return (HttpWebResponse)req.GetResponse();
- }
- catch (WebException we)
- {
- var resp = we.Response as HttpWebResponse;
- if (resp == null)
- throw;
- return resp;
- }
- }
-
private void SendUpdate(object info)
{
Thread.Sleep(1000*60*15);
@@ -65,7 +50,7 @@ namespace TShockAPI
client.Timeout = 5000;
try
{
- using (var resp = GetResponseNoException(client))
+ using (var resp = TShock.Utils.GetResponseNoException(client))
{
if (resp.StatusCode != HttpStatusCode.OK)
{
diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs
index 3e7e66e5..206ead01 100755
--- a/TShockAPI/TShock.cs
+++ b/TShockAPI/TShock.cs
@@ -77,6 +77,7 @@ namespace TShockAPI
public static RestManager RestManager;
public static Utils Utils = Utils.Instance;
public static StatTracker StatTracker = new StatTracker();
+ public static UpdateManager UpdateManager;
///
/// Used for implementing REST Tokens prior to the REST system starting up.
///
@@ -613,6 +614,7 @@ namespace TShockAPI
FixChestStacks();
StatTracker.Initialize();
+ UpdateManager = new UpdateManager();
}
private void ComputeMaxStyles()
@@ -656,7 +658,6 @@ namespace TShockAPI
private void OnUpdate(EventArgs args)
{
- UpdateManager.UpdateProcedureCheck();
if (Backups.IsBackupTime)
Backups.Backup();
//call these every second, not every update
diff --git a/TShockAPI/UpdateManager.cs b/TShockAPI/UpdateManager.cs
index a3eff893..4f8305f6 100644
--- a/TShockAPI/UpdateManager.cs
+++ b/TShockAPI/UpdateManager.cs
@@ -18,32 +18,44 @@ along with this program. If not, see .
using System;
using System.Collections.Generic;
+using System.IO;
using System.Net;
using System.Threading;
using Newtonsoft.Json;
namespace TShockAPI
{
- internal class UpdateManager
+ public class UpdateManager
{
- private static string updateUrl = "https://github.com/NyxStudios/TShock/blob/general-devel/tshock_update.json?raw=true";
- public static DateTime lastcheck = DateTime.MinValue;
+ private string updateUrl = "https://github.com/NyxStudios/TShock/blob/general-devel/tshock_update.json?raw=true";
///
/// Check once every X minutes.
///
- private static readonly int CheckXMinutes = 30;
+ private readonly int CheckXMinutes = 30;
- public static void UpdateProcedureCheck()
+ public UpdateManager()
{
- if ((DateTime.Now - lastcheck).TotalMinutes >= CheckXMinutes)
- {
- ThreadPool.QueueUserWorkItem(CheckUpdate);
- lastcheck = DateTime.Now;
- }
+ ThreadPool.QueueUserWorkItem(CheckForUpdates);
}
- public static void CheckUpdate(object o)
+ private void CheckForUpdates(object state)
+ {
+ try
+ {
+ UpdateCheck(state);
+ }
+ catch (Exception)
+ {
+ //swallow the exception
+ return;
+ }
+
+ Thread.Sleep(CheckXMinutes * 60 * 1000);
+ ThreadPool.QueueUserWorkItem(CheckForUpdates);
+ }
+
+ public void UpdateCheck(object o)
{
var updates = ServerIsOutOfDate();
if (updates != null)
@@ -56,29 +68,39 @@ namespace TShockAPI
/// Checks to see if the server is out of date.
///
///
- private static Dictionary ServerIsOutOfDate()
+ private Dictionary ServerIsOutOfDate()
{
- using (var client = new WebClient())
+ var client = (HttpWebRequest)WebRequest.Create(updateUrl);
+ client.Timeout = 5000;
+ try
{
- client.Headers.Add("user-agent",
- "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)");
- try
+ using (var resp = TShock.Utils.GetResponseNoException(client))
{
- string updatejson = client.DownloadString(updateUrl);
- var update = JsonConvert.DeserializeObject>(updatejson);
- var version = new Version(update["version"]);
- if (TShock.VersionNum.CompareTo(version) < 0)
- return update;
+ if (resp.StatusCode != HttpStatusCode.OK)
+ {
+ throw new IOException("Server did not respond with an OK.");
+ }
+
+ using(var reader = new StreamReader(resp.GetResponseStream()))
+ {
+ string updatejson = reader.ReadToEnd();
+ var update = JsonConvert.DeserializeObject>(updatejson);
+ var version = new Version(update["version"]);
+ if (TShock.VersionNum.CompareTo(version) < 0)
+ return update;
+ }
}
- catch (Exception e)
- {
- Log.Error(e.ToString());
- }
- return null;
}
+ catch (Exception e)
+ {
+ Log.ConsoleError("UpdateManager Exception: {0}", e);
+ throw e;
+ }
+
+ return null;
}
- private static void NotifyAdministrators(Dictionary update)
+ private void NotifyAdministrators(Dictionary update)
{
var changes = update["changes"].Split(new[] {'\n'}, StringSplitOptions.RemoveEmptyEntries);
NotifyAdministrator(TSPlayer.Server, changes);
@@ -91,7 +113,7 @@ namespace TShockAPI
}
}
- private static void NotifyAdministrator(TSPlayer player, string[] changes)
+ private void NotifyAdministrator(TSPlayer player, string[] changes)
{
player.SendMessage("The server is out of date.", Color.Red);
for (int j = 0; j < changes.Length; j++)
diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs
index bfe6c0c6..4b6c6208 100644
--- a/TShockAPI/Utils.cs
+++ b/TShockAPI/Utils.cs
@@ -1014,5 +1014,20 @@ namespace TShockAPI
return result;
}
+
+ public HttpWebResponse GetResponseNoException(HttpWebRequest req)
+ {
+ try
+ {
+ return (HttpWebResponse)req.GetResponse();
+ }
+ catch (WebException we)
+ {
+ var resp = we.Response as HttpWebResponse;
+ if (resp == null)
+ throw;
+ return resp;
+ }
+ }
}
}
diff --git a/TerrariaServerAPI b/TerrariaServerAPI
index d446a828..2fc5b098 160000
--- a/TerrariaServerAPI
+++ b/TerrariaServerAPI
@@ -1 +1 @@
-Subproject commit d446a8288a5d7984f4298a507a64249865259472
+Subproject commit 2fc5b098323ce7062df5ed91b1c532066fb8cb65