ClassiCube/Launcher2/WebService/UpdateCheckTask.cs
2016-05-17 10:17:24 +10:00

89 lines
2.8 KiB
C#

// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT
using ClassicalSharp;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Net;
using System.Threading;
using JsonObject = System.Collections.Generic.Dictionary<string, object>;
namespace Launcher.Web {
public class Build {
public DateTime TimeBuilt;
public string DirectXPath, OpenGLPath;
public int DirectXSize, OpenGLSize;
public string Version;
}
public sealed class UpdateCheckTask : IWebTask {
public const string UpdatesUri = "http://cs.classicube.net/";
public const string BuildsUri = "http://cs.classicube.net/builds.json";
public Build LatestDev, LatestStable;
public void CheckForUpdatesAsync() {
Working = true;
Done = false;
Exception = null;
LatestDev = null;
LatestStable = null;
Thread thread = new Thread( UpdateWorker, 256 * 1024 );
thread.Name = "Launcher.UpdateCheck";
thread.Start();
}
void UpdateWorker() {
try {
CheckUpdates();
} catch( WebException ex ) {
Finish( false, ex, null ); return;
}
Finish( true, null, null );
}
void CheckUpdates() {
string response = GetHtmlAll( BuildsUri, UpdatesUri );
int index = 0; bool success = true;
JsonObject data = (JsonObject)Json.ParseValue( response, ref index, ref success );
JsonObject devBuild = (JsonObject)data["latest"];
JsonObject releaseBuilds = (JsonObject)data["releases"];
LatestDev = MakeBuild( devBuild, false );
Build[] stableBuilds = new Build[releaseBuilds.Count];
int i = 0;
foreach( KeyValuePair<string, object> pair in releaseBuilds )
stableBuilds[i++] = MakeBuild( (JsonObject)pair.Value, true );
Array.Sort<Build>( stableBuilds,
(a, b) => b.TimeBuilt.CompareTo( a.TimeBuilt ) );
LatestStable = stableBuilds[0];
}
static readonly DateTime epoch = new DateTime( 1970, 1, 1, 0, 0, 0, DateTimeKind.Utc );
Build MakeBuild( JsonObject obj, bool release ) {
Build build = new Build();
string timeKey = release ? "release_ts" : "ts";
double rawTime = Double.Parse( (string)obj[timeKey], CultureInfo.InvariantCulture );
build.TimeBuilt = epoch.AddSeconds( rawTime ).ToLocalTime();
build.DirectXSize = Int32.Parse( (string)obj["dx_size"] );
build.DirectXPath = (string)obj["dx_file"];
build.OpenGLSize = Int32.Parse( (string)obj["ogl_size"] );
build.OpenGLPath = (string)obj["ogl_file"];
if( obj.ContainsKey( "version" ) )
build.Version = (string)obj["version"];
return build;
}
public bool TaskTick( Action<UpdateCheckTask> taskSuccess ) {
if( Working ) return true;
if( Exception != null )
return false;
else
taskSuccess( this );
return true;
}
}
}