Skip to content
This repository was archived by the owner on Dec 2, 2022. It is now read-only.

Commit a7c8afc

Browse files
authored
Merge pull request #8 from PromoFaux/development
Better logging. Better Error trapping. Better.
2 parents a6b11e4 + a0fe832 commit a7c8afc

File tree

1 file changed

+108
-59
lines changed

1 file changed

+108
-59
lines changed

MattermostRSS/Program.cs

Lines changed: 108 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@ private static void Main(string[] args)
5656
}
5757
catch (Exception e)
5858
{
59+
//this is terrible error handling.
60+
Console.WriteLine("-------------------------------------------------------------");
5961
Console.WriteLine(e.Message);
62+
Console.WriteLine("-------------------------------------------------------------");
6063
}
6164
}
6265
}
@@ -81,23 +84,32 @@ private static void LoadConfig()
8184

8285
private static async Task ProcessRss(RssFeed rssFeed)
8386
{
84-
Console.WriteLine("");
85-
var feed = await GetRssFeed(rssFeed.Url);
86-
Console.WriteLine($"Feed Title: {feed.Title}");
87+
var stuffToLog = $"\n{DateTime.Now}\nFetching RSS URL: {rssFeed.Url}";
8788

89+
Feed feed;
90+
91+
try
92+
{
93+
feed = await FeedReader.ReadAsync(rssFeed.Url);
94+
}
95+
catch (Exception e)
96+
{
97+
stuffToLog += $"\n Unable to get feed. Exception: {e.Message}";
98+
Console.WriteLine(stuffToLog);
99+
return;
100+
}
101+
88102

89103
switch (feed.Type)
90104
{
91105
case FeedType.Atom:
92-
Console.WriteLine("FeedType: Atom");
93-
await ProcessAtomFeed((AtomFeed)feed.SpecificFeed, rssFeed);
106+
stuffToLog += await ProcessAtomFeed((AtomFeed)feed.SpecificFeed, rssFeed);
94107
break;
95108
case FeedType.Rss:
96109
Console.WriteLine("FeedType: RSS");
97110
break;
98111
case FeedType.Rss_2_0:
99-
Console.WriteLine("FeedType: RSS 2.0");
100-
await ProcessRss20Feed((Rss20Feed)feed.SpecificFeed, rssFeed);
112+
stuffToLog += await ProcessRss20Feed((Rss20Feed)feed.SpecificFeed, rssFeed);
101113
break;
102114
case FeedType.Rss_0_91:
103115
Console.WriteLine("FeedType: RSS 0.91");
@@ -115,24 +127,28 @@ private static async Task ProcessRss(RssFeed rssFeed)
115127
Console.WriteLine("FeedType: Unknown");
116128
break;
117129
}
130+
131+
Console.WriteLine(stuffToLog);
118132
}
119133

120-
private static async Task ProcessRss20Feed(Rss20Feed feed, RssFeed rssFeed)
134+
private static async Task<string> ProcessRss20Feed(Rss20Feed feed, RssFeed rssFeed)
121135
{
122-
Console.WriteLine($"Generator: {feed.Generator}");
136+
var retVal = $"\nFeed Type: Rss 2.0\nFeed Title: {feed.Title}\nGenerator: {feed.Generator}";
137+
138+
var itemCount = feed.Items.Count;
139+
var procCount = 0;
140+
var failedMmPostCount = 0;
123141

124142
while (feed.Items.Any())
125143
{
126144
var rss20FeedItem = (Rss20FeedItem)feed.Items.Last();
127145

128-
129146
if (rss20FeedItem.PublishingDate <= rssFeed.LastProcessedItem || rss20FeedItem.PublishingDate == null)
130147
{
131148
feed.Items.Remove(rss20FeedItem);
132149
}
133150
else
134151
{
135-
Console.WriteLine($"Posting: {rss20FeedItem.Title}");
136152
var converter = new Converter();
137153

138154
var message = new MattermostMessage
@@ -161,30 +177,46 @@ private static async Task ProcessRss20Feed(Rss20Feed feed, RssFeed rssFeed)
161177
}
162178
};
163179

180+
164181
var response = await PostToMattermost(message);
165182

166183
if (response == null || response.StatusCode != HttpStatusCode.OK)
167184
{
168-
Console.WriteLine(response != null
169-
? $"Unable to post to Mattermost {response.StatusCode}"
170-
: "Unable to post to Mattermost");
185+
//Try again up to three times, if it fails, give up.
186+
if (failedMmPostCount == 3)
187+
{
188+
retVal += response != null
189+
? $"\nUnable to post to Mattermost, abandoning feed.{response.StatusCode}"
190+
: $"\nUnable to post to Mattermost, abandoning feed.";
191+
return retVal;
192+
}
193+
194+
failedMmPostCount++;
195+
171196
}
172197
else
173198
{
174-
Console.WriteLine("Succesfully posted to Mattermost");
199+
//Console.WriteLine("Succesfully posted to Mattermost");
175200
rssFeed.LastProcessedItem = rss20FeedItem.PublishingDate;
176201
Config.Save(ConfigPath);
202+
procCount++;
203+
feed.Items.Remove(rss20FeedItem);
177204
}
178205

179-
feed.Items.Remove(rss20FeedItem);
180206
}
181207
}
208+
209+
retVal += $"\nProcessed {procCount}/{itemCount} items. ({itemCount - procCount} previously processed or do not include a publish date)";
210+
return retVal;
182211
}
183212

184-
private static async Task ProcessAtomFeed(AtomFeed feed, RssFeed rssFeed)
213+
private static async Task<string> ProcessAtomFeed(AtomFeed feed, RssFeed rssFeed)
185214
{
186-
Console.WriteLine("Generator: " + feed.Generator);
187-
Console.WriteLine("Logo: " + feed.Logo);
215+
var retval = $"\nFeed Type: Atom\nFeed Title: {feed.Title}\nGenerator: {feed.Generator}";
216+
217+
var itemCount = feed.Items.Count;
218+
var procCount = 0;
219+
var failedMmPostCount = 0;
188220
//feed
189221

190222
while (feed.Items.Any())
@@ -197,7 +229,7 @@ private static async Task ProcessAtomFeed(AtomFeed feed, RssFeed rssFeed)
197229
}
198230
else
199231
{
200-
Console.WriteLine($"Posting: {atomFeedItem.Title}");
232+
201233
var converter = new Converter();
202234

203235
var message = new MattermostMessage
@@ -219,62 +251,73 @@ private static async Task ProcessAtomFeed(AtomFeed feed, RssFeed rssFeed)
219251
Title = atomFeedItem.Title ?? "",
220252
TitleLink = atomFeedItem.Link == null ? null : new Uri(atomFeedItem.Link),
221253
Text = converter.Convert(rssFeed.IncludeContent
222-
? atomFeedItem.Content ?? atomFeedItem.Summary ?? "No Content or Description"
254+
? atomFeedItem.Content ?? atomFeedItem.Summary ?? ""
223255
: atomFeedItem.Summary ?? ""),
224256
AuthorName = atomFeedItem.Author.Name ?? "",
225257
AuthorLink = atomFeedItem.Author.Uri == null ? null : new Uri(atomFeedItem.Author.Uri)
226258
}
227259
}
228260
};
229-
230261
var response = await PostToMattermost(message);
231262

232263
if (response == null || response.StatusCode != HttpStatusCode.OK)
233264
{
234-
Console.WriteLine(response != null
235-
? $"Unable to post to Mattermost {response.StatusCode}"
236-
: "Unable to post to Mattermost");
265+
//Try again up to three times, if it fails, give up.
266+
if (failedMmPostCount == 3)
267+
{
268+
retval += response != null
269+
? $"\nUnable to post to Mattermost, abandoning feed.{response.StatusCode}"
270+
: "\nUnable to post to Mattermost, abandoning feed.";
271+
return retval;
272+
}
273+
274+
failedMmPostCount++;
275+
237276
}
238277
else
239278
{
240-
Console.WriteLine("Succesfully posted to Mattermost");
279+
//Console.WriteLine("Succesfully posted to Mattermost");
241280
rssFeed.LastProcessedItem = atomFeedItem.PublishedDate;
242281
Config.Save(ConfigPath);
282+
procCount++;
283+
feed.Items.Remove(atomFeedItem);
243284
}
244-
245-
feed.Items.Remove(atomFeedItem);
246285
}
247286
}
248-
}
249-
250287

251-
public static async Task<Feed> GetRssFeed(string url)
252-
{
253-
try
254-
{
255-
return await FeedReader.ReadAsync(url);
256-
}
257-
catch (Exception e)
258-
{
259-
//Problem getting the feed.
260-
Console.WriteLine($"Problem retrieving feed\n Exception Message: {e.Message}");
261-
return null;
262-
}
288+
retval += $"\nProcessed {procCount}/{itemCount} items. ({itemCount - procCount} previously processed or do not include a publish date)";
289+
return retval;
263290
}
264291

265-
#endregion
292+
#endregion
266293

267-
#region RedditJSONFeeds
294+
#region RedditJSONFeeds
268295

269296
private static async Task ProcessReddit(RedditJsonFeed feed)
270297
{
271298
using (var wc = new WebClient())
272299
{
273-
var json = wc.DownloadString(feed.Url);
300+
var stuffToLog = $"\n{DateTime.Now}\nFetching Reddit URL: {feed.Url}";
301+
302+
string json;
303+
try
304+
{
305+
json = wc.DownloadString(feed.Url);
306+
}
307+
catch (Exception e)
308+
{
309+
stuffToLog += $"\nUnable to get feed, exception: {e.Message}";
310+
Console.WriteLine(stuffToLog);
311+
return;
312+
}
313+
314+
//only get items we have not already processed
274315
var items = JsonConvert.DeserializeObject<RedditJson>(json).RedditJsonData.RedditJsonChildren
275316
.Where(y => y.Data.Created > feed.LastProcessedItem).OrderBy(x => x.Data.Created);
276317

277-
if (!items.Any()) return;
318+
var itemCount = items.Count();
319+
var procCount = 0;
320+
var failedMmPostCount = 0;
278321

279322
foreach (var item in items)
280323
{
@@ -289,7 +332,7 @@ private static async Task ProcessReddit(RedditJsonFeed feed)
289332
IconUrl = feed.BotImageOverride == ""
290333
? new Uri(Config.BotImageDefault)
291334
: new Uri(feed.BotImageOverride)
292-
335+
293336
};
294337

295338
switch (item.Kind)
@@ -298,7 +341,7 @@ private static async Task ProcessReddit(RedditJsonFeed feed)
298341
string content;
299342
switch (item.Data.PostHint)
300343
{
301-
case "link":
344+
case "link":
302345
content = $"Linked Content: {item.Data.Url}";
303346
break;
304347
default:
@@ -335,36 +378,42 @@ private static async Task ProcessReddit(RedditJsonFeed feed)
335378
Pretext = feed.FeedPretext
336379
}
337380
};
338-
339-
//message.Attachments = new List<MattermostAttachment> { GetInboxAttachment(item.Data) };
340381
break;
341382
}
342383

343384
var response = await PostToMattermost(message);
344385

345386
if (response == null || response.StatusCode != HttpStatusCode.OK)
346387
{
347-
Console.WriteLine(response != null
348-
? $"Unable to post to Mattermost {response.StatusCode}"
349-
: "Unable to post to Mattermost");
388+
//Try again up to three times, if it fails, give up.
389+
if (failedMmPostCount == 3)
390+
{
391+
stuffToLog += response != null
392+
? $"\nUnable to post to Mattermost, abandoning feed.{response.StatusCode}"
393+
: $"\nUnable to post to Mattermost, abandoning feed.";
394+
Console.WriteLine(stuffToLog);
395+
return;
396+
}
397+
398+
failedMmPostCount++;
399+
350400
}
351401
else
352402
{
353-
Console.WriteLine("Succesfully posted to Mattermost");
403+
//"Succesfully posted to Mattermost");
354404
feed.LastProcessedItem = item.Data.Created;
355405
Config.Save(ConfigPath);
406+
procCount++;
356407
}
357408

358409
}
359410

360-
Console.WriteLine("hello");
411+
stuffToLog += $"\nProcessed {procCount}/{itemCount} items.";
412+
Console.WriteLine(stuffToLog);
361413
}
362414
}
363415

364-
365-
366-
367-
#endregion
416+
#endregion
368417

369418
public static async Task<HttpResponseMessage> PostToMattermost(MattermostMessage message)
370419
{

0 commit comments

Comments
 (0)