mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-24 05:10:42 -04:00
89 lines
2.8 KiB
C#
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;
|
|
}
|
|
}
|
|
} |