-
Notifications
You must be signed in to change notification settings - Fork 1
/
ROI.Dev.cs
140 lines (118 loc) · 4.99 KB
/
ROI.Dev.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
using Newtonsoft.Json.Linq;
using ROI.Content.Configs;
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.NetworkInformation;
using Terraria;
using Terraria.ModLoader;
namespace ROI
{
partial class ROIMod
{
public DebugConfig DebugConfig;
private void LoadDebug()
{
DebugConfig = ModContent.GetInstance<DebugConfig>();
if (DebugConfig.Nightly)
CheckForNightly();
if (!DebugConfig.DebugMode)
return;
}
// TODO: document how this works
private void CheckForNightly()
{
if (!NetworkAvailable())
return;
string path = Path.Combine(Main.SavePath, "ROI-beta-timestamp.txt");
DateTime data;
if (File.Exists(path))
{
File.Delete(path);
if (!DateTime.TryParse(File.ReadAllText(path), out data))
{
Logger.Warn("Unable to read nightly-release version timestamp");
return;
}
}
else
{
data = DateTime.MinValue;
}
string json = ReleasesJson();
JArray releases = JArray.Parse(json);
foreach (JObject release in releases)
{
DateTime availableVersion = DateTime.Parse(release["created_at"].ToString());
if (availableVersion <= data)
continue;
JToken asset = JArray.Parse(release["assets"].ToString()).First;
if (asset["name"].ToString().Equals("beta-release.zip"))
{
Process.Start(asset["browser_download_url"].ToString());
File.WriteAllText(path, release["created_at"].ToString());
}
}
}
private string ReleasesJson()
{
// some stupid legacy stuff, somehow necessary
var oldProtocol = ServicePointManager.SecurityProtocol;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback += SCVC;
string json = string.Empty;
try
{
// TODO: figure out how to do this without HttpClient
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
client.DefaultRequestHeaders.Add("User-Agent", "RealmsOfInfinityNightly");
var response = client.GetAsync("https://API.github.com/repos/TUA-Team/ROI/releases").GetAwaiter().GetResult();
json = response.Content.ReadAsStringAsync().Result;
}
}
catch (HttpRequestException)
{
Logger.Error("Could not download nightly");
}
ServicePointManager.SecurityProtocol = oldProtocol;
ServicePointManager.ServerCertificateValidationCallback -= SCVC;
return json;
}
private static bool SCVC(object sender,
System.Security.Cryptography.X509Certificates.X509Certificate c,
System.Security.Cryptography.X509Certificates.X509Chain ch,
System.Net.Security.SslPolicyErrors ss) => true;
//https://stackoverflow.com/questions/520347/how-do-i-check-for-a-network-connection
private static bool NetworkAvailable()
{
if (!NetworkInterface.GetIsNetworkAvailable())
return false;
NetworkInterface[] array = NetworkInterface.GetAllNetworkInterfaces();
for (int i = 0; i < array.Length; i++)
{
NetworkInterface net = array[i];
// discard because of standard reasons
if (net.OperationalStatus != OperationalStatus.Up ||
net.NetworkInterfaceType == NetworkInterfaceType.Loopback ||
net.NetworkInterfaceType == NetworkInterfaceType.Tunnel)
continue;
// this allows to filter modems, serial, etc.
if (net.Speed < 10000000)
continue;
// discard virtual cards (virtual box, virtual pc, etc.)
if (net.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0 ||
net.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0)
continue;
// discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card.
if (net.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase))
continue;
return true;
}
return false;
}
}
}