@@ -56,7 +56,10 @@ private static void Main(string[] args)
56
56
}
57
57
catch ( Exception e )
58
58
{
59
+ //this is terrible error handling.
60
+ Console . WriteLine ( "-------------------------------------------------------------" ) ;
59
61
Console . WriteLine ( e . Message ) ;
62
+ Console . WriteLine ( "-------------------------------------------------------------" ) ;
60
63
}
61
64
}
62
65
}
@@ -81,23 +84,32 @@ private static void LoadConfig()
81
84
82
85
private static async Task ProcessRss ( RssFeed rssFeed )
83
86
{
84
- Console . WriteLine ( "" ) ;
85
- var feed = await GetRssFeed ( rssFeed . Url ) ;
86
- Console . WriteLine ( $ "Feed Title: { feed . Title } ") ;
87
+ var stuffToLog = $ "\n { DateTime . Now } \n Fetching RSS URL: { rssFeed . Url } ";
87
88
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
+
88
102
89
103
switch ( feed . Type )
90
104
{
91
105
case FeedType . Atom :
92
- Console . WriteLine ( "FeedType: Atom" ) ;
93
- await ProcessAtomFeed ( ( AtomFeed ) feed . SpecificFeed , rssFeed ) ;
106
+ stuffToLog += await ProcessAtomFeed ( ( AtomFeed ) feed . SpecificFeed , rssFeed ) ;
94
107
break ;
95
108
case FeedType . Rss :
96
109
Console . WriteLine ( "FeedType: RSS" ) ;
97
110
break ;
98
111
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 ) ;
101
113
break ;
102
114
case FeedType . Rss_0_91 :
103
115
Console . WriteLine ( "FeedType: RSS 0.91" ) ;
@@ -115,24 +127,28 @@ private static async Task ProcessRss(RssFeed rssFeed)
115
127
Console . WriteLine ( "FeedType: Unknown" ) ;
116
128
break ;
117
129
}
130
+
131
+ Console . WriteLine ( stuffToLog ) ;
118
132
}
119
133
120
- private static async Task ProcessRss20Feed ( Rss20Feed feed , RssFeed rssFeed )
134
+ private static async Task < string > ProcessRss20Feed ( Rss20Feed feed , RssFeed rssFeed )
121
135
{
122
- Console . WriteLine ( $ "Generator: { feed . Generator } ") ;
136
+ var retVal = $ "\n Feed Type: Rss 2.0\n Feed Title: { feed . Title } \n Generator: { feed . Generator } ";
137
+
138
+ var itemCount = feed . Items . Count ;
139
+ var procCount = 0 ;
140
+ var failedMmPostCount = 0 ;
123
141
124
142
while ( feed . Items . Any ( ) )
125
143
{
126
144
var rss20FeedItem = ( Rss20FeedItem ) feed . Items . Last ( ) ;
127
145
128
-
129
146
if ( rss20FeedItem . PublishingDate <= rssFeed . LastProcessedItem || rss20FeedItem . PublishingDate == null )
130
147
{
131
148
feed . Items . Remove ( rss20FeedItem ) ;
132
149
}
133
150
else
134
151
{
135
- Console . WriteLine ( $ "Posting: { rss20FeedItem . Title } ") ;
136
152
var converter = new Converter ( ) ;
137
153
138
154
var message = new MattermostMessage
@@ -161,30 +177,46 @@ private static async Task ProcessRss20Feed(Rss20Feed feed, RssFeed rssFeed)
161
177
}
162
178
} ;
163
179
180
+
164
181
var response = await PostToMattermost ( message ) ;
165
182
166
183
if ( response == null || response . StatusCode != HttpStatusCode . OK )
167
184
{
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
+ ? $ "\n Unable to post to Mattermost, abandoning feed.{ response . StatusCode } "
190
+ : $ "\n Unable to post to Mattermost, abandoning feed.";
191
+ return retVal ;
192
+ }
193
+
194
+ failedMmPostCount ++ ;
195
+
171
196
}
172
197
else
173
198
{
174
- Console . WriteLine ( "Succesfully posted to Mattermost" ) ;
199
+ // Console.WriteLine("Succesfully posted to Mattermost");
175
200
rssFeed . LastProcessedItem = rss20FeedItem . PublishingDate ;
176
201
Config . Save ( ConfigPath ) ;
202
+ procCount ++ ;
203
+ feed . Items . Remove ( rss20FeedItem ) ;
177
204
}
178
205
179
- feed . Items . Remove ( rss20FeedItem ) ;
180
206
}
181
207
}
208
+
209
+ retVal += $ "\n Processed { procCount } /{ itemCount } items. ({ itemCount - procCount } previously processed or do not include a publish date)";
210
+ return retVal ;
182
211
}
183
212
184
- private static async Task ProcessAtomFeed ( AtomFeed feed , RssFeed rssFeed )
213
+ private static async Task < string > ProcessAtomFeed ( AtomFeed feed , RssFeed rssFeed )
185
214
{
186
- Console . WriteLine ( "Generator: " + feed . Generator ) ;
187
- Console . WriteLine ( "Logo: " + feed . Logo ) ;
215
+ var retval = $ "\n Feed Type: Atom\n Feed Title: { feed . Title } \n Generator: { feed . Generator } ";
216
+
217
+ var itemCount = feed . Items . Count ;
218
+ var procCount = 0 ;
219
+ var failedMmPostCount = 0 ;
188
220
//feed
189
221
190
222
while ( feed . Items . Any ( ) )
@@ -197,7 +229,7 @@ private static async Task ProcessAtomFeed(AtomFeed feed, RssFeed rssFeed)
197
229
}
198
230
else
199
231
{
200
- Console . WriteLine ( $ "Posting: { atomFeedItem . Title } " ) ;
232
+
201
233
var converter = new Converter ( ) ;
202
234
203
235
var message = new MattermostMessage
@@ -219,62 +251,73 @@ private static async Task ProcessAtomFeed(AtomFeed feed, RssFeed rssFeed)
219
251
Title = atomFeedItem . Title ?? "" ,
220
252
TitleLink = atomFeedItem . Link == null ? null : new Uri ( atomFeedItem . Link ) ,
221
253
Text = converter . Convert ( rssFeed . IncludeContent
222
- ? atomFeedItem . Content ?? atomFeedItem . Summary ?? "No Content or Description "
254
+ ? atomFeedItem . Content ?? atomFeedItem . Summary ?? ""
223
255
: atomFeedItem . Summary ?? "" ) ,
224
256
AuthorName = atomFeedItem . Author . Name ?? "" ,
225
257
AuthorLink = atomFeedItem . Author . Uri == null ? null : new Uri ( atomFeedItem . Author . Uri )
226
258
}
227
259
}
228
260
} ;
229
-
230
261
var response = await PostToMattermost ( message ) ;
231
262
232
263
if ( response == null || response . StatusCode != HttpStatusCode . OK )
233
264
{
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
+ ? $ "\n Unable to post to Mattermost, abandoning feed.{ response . StatusCode } "
270
+ : "\n Unable to post to Mattermost, abandoning feed." ;
271
+ return retval ;
272
+ }
273
+
274
+ failedMmPostCount ++ ;
275
+
237
276
}
238
277
else
239
278
{
240
- Console . WriteLine ( "Succesfully posted to Mattermost" ) ;
279
+ // Console.WriteLine("Succesfully posted to Mattermost");
241
280
rssFeed . LastProcessedItem = atomFeedItem . PublishedDate ;
242
281
Config . Save ( ConfigPath ) ;
282
+ procCount ++ ;
283
+ feed . Items . Remove ( atomFeedItem ) ;
243
284
}
244
-
245
- feed . Items . Remove ( atomFeedItem ) ;
246
285
}
247
286
}
248
- }
249
-
250
287
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 += $ "\n Processed { procCount } /{ itemCount } items. ({ itemCount - procCount } previously processed or do not include a publish date)";
289
+ return retval ;
263
290
}
264
291
265
- #endregion
292
+ #endregion
266
293
267
- #region RedditJSONFeeds
294
+ #region RedditJSONFeeds
268
295
269
296
private static async Task ProcessReddit ( RedditJsonFeed feed )
270
297
{
271
298
using ( var wc = new WebClient ( ) )
272
299
{
273
- var json = wc . DownloadString ( feed . Url ) ;
300
+ var stuffToLog = $ "\n { DateTime . Now } \n Fetching 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 += $ "\n Unable to get feed, exception: { e . Message } ";
310
+ Console . WriteLine ( stuffToLog ) ;
311
+ return ;
312
+ }
313
+
314
+ //only get items we have not already processed
274
315
var items = JsonConvert . DeserializeObject < RedditJson > ( json ) . RedditJsonData . RedditJsonChildren
275
316
. Where ( y => y . Data . Created > feed . LastProcessedItem ) . OrderBy ( x => x . Data . Created ) ;
276
317
277
- if ( ! items . Any ( ) ) return ;
318
+ var itemCount = items . Count ( ) ;
319
+ var procCount = 0 ;
320
+ var failedMmPostCount = 0 ;
278
321
279
322
foreach ( var item in items )
280
323
{
@@ -289,7 +332,7 @@ private static async Task ProcessReddit(RedditJsonFeed feed)
289
332
IconUrl = feed . BotImageOverride == ""
290
333
? new Uri ( Config . BotImageDefault )
291
334
: new Uri ( feed . BotImageOverride )
292
-
335
+
293
336
} ;
294
337
295
338
switch ( item . Kind )
@@ -298,7 +341,7 @@ private static async Task ProcessReddit(RedditJsonFeed feed)
298
341
string content ;
299
342
switch ( item . Data . PostHint )
300
343
{
301
- case "link" :
344
+ case "link" :
302
345
content = $ "Linked Content: { item . Data . Url } ";
303
346
break ;
304
347
default :
@@ -335,36 +378,42 @@ private static async Task ProcessReddit(RedditJsonFeed feed)
335
378
Pretext = feed . FeedPretext
336
379
}
337
380
} ;
338
-
339
- //message.Attachments = new List<MattermostAttachment> { GetInboxAttachment(item.Data) };
340
381
break ;
341
382
}
342
383
343
384
var response = await PostToMattermost ( message ) ;
344
385
345
386
if ( response == null || response . StatusCode != HttpStatusCode . OK )
346
387
{
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
+ ? $ "\n Unable to post to Mattermost, abandoning feed.{ response . StatusCode } "
393
+ : $ "\n Unable to post to Mattermost, abandoning feed.";
394
+ Console . WriteLine ( stuffToLog ) ;
395
+ return ;
396
+ }
397
+
398
+ failedMmPostCount ++ ;
399
+
350
400
}
351
401
else
352
402
{
353
- Console . WriteLine ( "Succesfully posted to Mattermost" ) ;
403
+ // "Succesfully posted to Mattermost");
354
404
feed . LastProcessedItem = item . Data . Created ;
355
405
Config . Save ( ConfigPath ) ;
406
+ procCount ++ ;
356
407
}
357
408
358
409
}
359
410
360
- Console . WriteLine ( "hello" ) ;
411
+ stuffToLog += $ "\n Processed { procCount } /{ itemCount } items.";
412
+ Console . WriteLine ( stuffToLog ) ;
361
413
}
362
414
}
363
415
364
-
365
-
366
-
367
- #endregion
416
+ #endregion
368
417
369
418
public static async Task < HttpResponseMessage > PostToMattermost ( MattermostMessage message )
370
419
{
0 commit comments