Skip to content

Commit d7e6f1a

Browse files
committed
Added error handling & clean source
1 parent 99a1be9 commit d7e6f1a

7 files changed

Lines changed: 125 additions & 45 deletions

File tree

DiscordModNotifiyer/Apis/SteamApi.cs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,28 @@ public async Task UpdateSteamMods()
6060
var parameters = new List<KeyValuePair<string, string>>();
6161
parameters.Add(new KeyValuePair<string, string>("collectioncount", "1"));
6262
parameters.Add(new KeyValuePair<string, string>("publishedfileids[0]", Program.Settings.SteamCollectionId.ToString()));
63-
63+
6464
var httpClient = new HttpClient();
6565

6666
using (var content = new FormUrlEncodedContent(parameters))
6767
{
6868
content.Headers.Clear();
6969
content.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
7070

71-
HttpResponseMessage response = await httpClient.PostAsync(Program.STEAM_API_COLLECTION_URL, content);
71+
try
72+
{
73+
HttpResponseMessage response = await httpClient.PostAsync(Program.STEAM_API_COLLECTION_URL, content);
7274

73-
var model = JsonConvert.DeserializeObject<SteamCollectionModel>(await response.Content.ReadAsStringAsync());
74-
var modIds = model.response.collectiondetails.FirstOrDefault()?.children.Select(x => x.publishedfileid);
75+
var model = JsonConvert.DeserializeObject<SteamCollectionModel>(await response.Content.ReadAsStringAsync());
76+
var modIds = model.response.collectiondetails.FirstOrDefault()?.children.Select(x => x.publishedfileid);
7577

76-
await CheckSteamMods(modIds.ToList());
78+
await CheckSteamMods(modIds.ToList());
79+
}
80+
catch (Exception e)
81+
{
82+
ConsoleExtensions.Error(e.Message);
83+
return;
84+
}
7785
}
7886
}
7987
else
@@ -93,11 +101,17 @@ private async Task CheckSteamMods(List<double> modIds)
93101
ConsoleExtensions.WriteColor(@$"[// ]Checking {modIds.Count} Steam mods...", ConsoleColor.DarkGreen);
94102

95103
var filename = "./SavedMods.json";
96-
var model = await SteamExtensions.GetPublishedFileDetails<SteamFileDetailJsonModel>(modIds);
104+
var model = await SteamExtensions.GetPublishedFileDetails(modIds);
97105
var needUpdateModels = new List<SteamFileDetailJsonDetailModel>();
98106
var savedMods = JsonConvert.DeserializeObject<List<LastEditModModel>>(File.ReadAllText(filename));
99107

100-
foreach(var mod in model.response.publishedfiledetails)
108+
// Http request failed. No check possible
109+
if (model == null)
110+
{
111+
return;
112+
}
113+
114+
foreach (var mod in model.response.publishedfiledetails)
101115
{
102116
var sMod = savedMods.FirstOrDefault(x => x.ModId.Equals(mod.publishedfileid.ToString()));
103117
if (sMod == null || !sMod.LastUpdate.ToString().Equals(mod.time_updated.ToString()))
@@ -120,7 +134,7 @@ private async Task CheckSteamMods(List<double> modIds)
120134

121135
File.WriteAllText(filename, JsonConvert.SerializeObject(savedMods));
122136

123-
if(OnUpdatedModsFound != null)
137+
if (OnUpdatedModsFound != null)
124138
{
125139
OnUpdatedModsFound(this, new UpdatedModsEventArgs
126140
{

DiscordModNotifiyer/Extensions/ConsoleExtensions.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,29 @@ public static void ClearConsole()
6262
}
6363
}
6464

65+
/// <summary>
66+
/// Set a critical error into the console and close the application
67+
/// </summary>
68+
/// <param name="text">Information text</param>
69+
/// <param name="exitCode"></param>
70+
public static void CriticalError(string text, int exitCode)
71+
{
72+
WriteColor(@"[//--Critical Error-----------------------------------------------]", ConsoleColor.DarkRed);
73+
WriteColor($"[//:] {text}", ConsoleColor.DarkRed);
74+
WriteColor(@"[//---------------------------------------------------------------]", ConsoleColor.DarkRed);
75+
Environment.Exit(exitCode);
76+
}
77+
78+
/// <summary>
79+
/// Set a error message into the console
80+
/// </summary>
81+
/// <param name="text">Information text</param>
82+
public static void Error(string text)
83+
{
84+
WriteColor(@"[// We got an Error...]", ConsoleColor.DarkRed);
85+
WriteColor($"[// ]{text}", ConsoleColor.DarkRed);
86+
WriteColor(@"[// Continue application...]", ConsoleColor.DarkRed);
87+
}
6588

6689
/// <summary>
6790
/// Write some coloring console messages for the user

DiscordModNotifiyer/Extensions/DiscordExtensions.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using JNogueira.Discord.Webhook.Client;
33
using System;
44
using System.Collections.Generic;
5-
using System.Text;
65
using System.Threading.Tasks;
76

87
namespace DiscordModNotifiyer.Extensions
@@ -41,8 +40,8 @@ public static async Task SendHook(List<SteamFileDetailJsonDetailModel> mods)
4140
var client = new DiscordWebhookClient(Program.Settings.DiscordWebHook);
4241
var message = new DiscordMessage(
4342
$"{gamename}{collectionString}\nMod: {mod.title} (Id: {mod.publishedfileid})",
44-
username: $"{players.Find(x => x.steamid.Equals(mod.creator))?.personaname ?? mod.creator}",
45-
avatarUrl: players.Find(x => x.steamid.Equals(mod.creator))?.avatar,
43+
username: $"{players?.Find(x => x.steamid.Equals(mod.creator))?.personaname ?? mod.creator}",
44+
avatarUrl: players?.Find(x => x.steamid.Equals(mod.creator))?.avatar,
4645
tts: false,
4746
embeds: new[]
4847
{
@@ -62,7 +61,15 @@ public static async Task SendHook(List<SteamFileDetailJsonDetailModel> mods)
6261
)
6362
}
6463
);
65-
await client.SendToDiscord(message);
64+
65+
try
66+
{
67+
await client.SendToDiscord(message);
68+
}
69+
catch (Exception e)
70+
{
71+
ConsoleExtensions.Error(e.Message);
72+
}
6673
}
6774

6875
ConsoleExtensions.WriteColor(@"[//---------------------------------------------------------------]", ConsoleColor.DarkGreen);

DiscordModNotifiyer/Extensions/SteamExtensions.cs

Lines changed: 55 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,25 @@ public class SteamExtensions
1919
/// <returns>List of steam player informations</returns>
2020
public static async Task<List<SteamPlayerPlayerModel>> GetSteamPlayers(List<string> steamids)
2121
{
22-
var request = WebRequest.Create(Program.STEAM_API_PLAYER_URL + Program.Settings.SteamApiKey + "&steamids=" + String.Join(",", steamids));
23-
request.Method = "GET";
22+
try
23+
{
24+
var request = WebRequest.Create(Program.STEAM_API_PLAYER_URL + Program.Settings.SteamApiKey + "&steamids=" + String.Join(",", steamids));
25+
request.Method = "GET";
2426

25-
using var webResponse = request.GetResponse();
26-
using var webStream = webResponse.GetResponseStream();
27+
using var webResponse = request.GetResponse();
28+
using var webStream = webResponse.GetResponseStream();
2729

28-
using var reader = new StreamReader(webStream);
29-
var data = await reader.ReadToEndAsync();
30-
var model = JsonConvert.DeserializeObject<SteamPlayerModel>(data);
30+
using var reader = new StreamReader(webStream);
31+
var data = await reader.ReadToEndAsync();
32+
var model = JsonConvert.DeserializeObject<SteamPlayerModel>(data);
3133

32-
return model.response.players;
34+
return model.response.players;
35+
}
36+
catch (Exception e)
37+
{
38+
ConsoleExtensions.Error(e.Message);
39+
return null;
40+
}
3341
}
3442

3543
/// <summary>
@@ -44,24 +52,39 @@ public static async Task<string> GetGameInfo(double appId)
4452

4553
if (reloadList)
4654
{
47-
var request = WebRequest.Create(Program.STEAM_API_GAME_LIST_URL);
48-
request.Method = "GET";
55+
try
56+
{
57+
var request = WebRequest.Create(Program.STEAM_API_GAME_LIST_URL);
58+
request.Method = "GET";
4959

50-
using var webResponse = request.GetResponse();
51-
using var webStream = webResponse.GetResponseStream();
60+
using var webResponse = request.GetResponse();
61+
using var webStream = webResponse.GetResponseStream();
5262

53-
using var reader = new StreamReader(webStream);
54-
var data = await reader.ReadToEndAsync();
63+
using var reader = new StreamReader(webStream);
64+
var data = await reader.ReadToEndAsync();
5565

56-
using (StreamWriter sw = File.CreateText(filename))
66+
using (StreamWriter sw = File.CreateText(filename))
67+
{
68+
sw.WriteLine(data);
69+
}
70+
}
71+
catch (Exception e)
5772
{
58-
sw.WriteLine(data);
73+
ConsoleExtensions.Error(e.Message);
5974
}
6075
}
6176

62-
var content = File.ReadAllText(filename);
63-
var apps = JsonConvert.DeserializeObject<GameInfo>(content).applist.apps;
64-
return apps.FirstOrDefault(x => x.appid.Equals(appId)).name ?? "Unknown Gamename";
77+
try
78+
{
79+
var content = File.ReadAllText(filename);
80+
var apps = JsonConvert.DeserializeObject<GameInfo>(content).applist.apps;
81+
return apps.FirstOrDefault(x => x.appid.Equals(appId)).name ?? "Unknown Gamename";
82+
}
83+
catch (Exception e)
84+
{
85+
ConsoleExtensions.Error(e.Message);
86+
return "Unknown Gamename";
87+
}
6588
}
6689

6790
/// <summary>
@@ -71,8 +94,8 @@ public static async Task<string> GetGameInfo(double appId)
7194
/// <returns>Details of the collection by given collection id</returns>
7295
public static async Task<SteamFileDetailJsonDetailModel> GetCollectionInfo(double steamCollectionId)
7396
{
74-
var model = await GetPublishedFileDetails<SteamFileDetailJsonModel>(new List<double> { steamCollectionId });
75-
return model.response.publishedfiledetails.FirstOrDefault();
97+
var model = await GetPublishedFileDetails(new List<double> { steamCollectionId });
98+
return model?.response?.publishedfiledetails?.FirstOrDefault();
7699
}
77100

78101
/// <summary>
@@ -81,7 +104,7 @@ public static async Task<SteamFileDetailJsonDetailModel> GetCollectionInfo(doubl
81104
/// <typeparam name="T">Type of the json deserilize object that is needed</typeparam>
82105
/// <param name="files">List of file ids</param>
83106
/// <returns>Specific information above the given file ids</returns>
84-
public static async Task<T> GetPublishedFileDetails<T>(List<double> files)
107+
public static async Task<SteamFileDetailJsonModel> GetPublishedFileDetails(List<double> files)
85108
{
86109
var parameters = new List<KeyValuePair<string, string>>();
87110
int i = 0;
@@ -98,9 +121,16 @@ public static async Task<T> GetPublishedFileDetails<T>(List<double> files)
98121
content.Headers.Clear();
99122
content.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
100123

101-
HttpResponseMessage response = await httpClient.PostAsync(Program.STEAM_API_FILE_DETAILS_URL, content);
102-
103-
return JsonConvert.DeserializeObject<T>(await response.Content.ReadAsStringAsync());
124+
try
125+
{
126+
HttpResponseMessage response = await httpClient.PostAsync(Program.STEAM_API_FILE_DETAILS_URL, content);
127+
return JsonConvert.DeserializeObject<SteamFileDetailJsonModel>(await response.Content.ReadAsStringAsync());
128+
}
129+
catch (Exception e)
130+
{
131+
ConsoleExtensions.Error(e.Message);
132+
return null;
133+
}
104134
}
105135
}
106136
}

DiscordModNotifiyer/Models/LastEditModModel.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System;
2-
3-
namespace DiscordModNotifiyer.Models
1+
namespace DiscordModNotifiyer.Models
42
{
53
public class LastEditModModel
64
{

DiscordModNotifiyer/Program.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,12 @@ class Program
4545
/// <param name="args"></param>
4646
static void Main(string[] args)
4747
{
48-
Settings = JsonConvert.DeserializeObject<Settings>(File.ReadAllText(SETTINGS_FILENAME));
48+
ReloadSettings();
4949

5050
var steamApi = new SteamApi();
51-
5251
steamApi.OnUpdatedModsFound += (sender, e) => _ = DiscordExtensions.SendHook(e.Mods);
5352

5453
ConsoleExtensions.ClearConsole();
55-
5654
ConsoleKeyInfo cki;
5755
do
5856
{
@@ -77,6 +75,16 @@ static void Main(string[] args)
7775
/// <summary>
7876
/// Reload Settings.json file and save them into the Settings object
7977
/// </summary>
80-
public static void ReloadSettings() => Settings = JsonConvert.DeserializeObject<Settings>(File.ReadAllText(SETTINGS_FILENAME));
78+
public static void ReloadSettings()
79+
{
80+
try
81+
{
82+
Settings = JsonConvert.DeserializeObject<Settings>(File.ReadAllText(SETTINGS_FILENAME));
83+
}
84+
catch (Exception e)
85+
{
86+
ConsoleExtensions.CriticalError(e.Message, 1);
87+
}
88+
}
8189
}
8290
}

DiscordModNotifiyer/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"__General": "General settings",
33
"SteamApiKey": "B23067EC4C7E972A901F43C617CB8DE4",
44
"AutomaticRefresh": true,
5-
"AutomaticRefreshMin": 10,
5+
"AutomaticRefreshMin": 1,
66

77
"__Discord": "This Area is for discord settings",
88
"DiscordWebHook": "https://discord.com/api/webhooks/885964726260097104/SiDsbrtTwUx54g8WI3QPQbHHJfQD3-6vwwgUDVQxPSk8BGWP9mQPdbOBQrS2jtrM6BGM",

0 commit comments

Comments
 (0)