11const got = require ( '../utils/got' ) ;
2+ const feedUtil = require ( '../utils/feed' ) ;
23const Parser = require ( 'rss-parser' ) ;
34const RSS = require ( '../proxies/rssFeed' ) ;
5+ const i18n = require ( '../i18n' ) ;
46
7+ // eslint-disable-next-line max-lines-per-function
58module . exports = async ( ctx , next ) => {
69 const url = encodeURI ( ctx . state . feedUrl ) ;
7- const feed = await RSS . getFeedByUrl ( url ) ;
10+ let feed = await RSS . getFeedByUrl ( url ) ;
811 if ( feed ) {
912 ctx . state . feed = feed ;
1013 ctx . state . feed . title = feed . feed_title ;
1114 await next ( ) ;
1215 } else {
1316 try {
1417 const res = await got . get ( url ) ;
15- // handle redirect
16- ctx . state . feedUrl = decodeURI ( res . url ) ;
17- const parser = new Parser ( ) ;
18- let feed = await parser . parseString ( res . body ) ;
19- delete feed . items ;
20- ctx . state . feed = feed ;
18+ ctx . state . feedUrl = decodeURI ( res . url ) ; // handle redirect
19+ feed = await feedUtil . isFeedValid ( res . body ) ;
20+ if ( ! feed ) {
21+ // check feedUrl
22+ ctx . state . feedUrl = await feedUtil . findFeed ( res . body , res . url ) ;
23+ ctx . state . feedUrl = ctx . state . feedUrl . map ( decodeURI ) ;
24+ const parser = new Parser ( ) ;
25+ switch ( ctx . state . feedUrl . length ) {
26+ case 0 :
27+ throw new Error ( 'FETCH_ERROR' ) ;
28+ case 1 :
29+ // eslint-disable-next-line no-case-declarations
30+ const res = await got ( encodeURI ( ctx . state . feedUrl [ 0 ] ) ) ;
31+ feed = await parser . parseString ( res . body ) ;
32+ delete feed . items ;
33+ ctx . state . feed = feed ;
34+ await next ( ) ; // next
35+ break ;
36+ default :
37+ // eslint-disable-next-line no-case-declarations
38+ const builder = [ ] ;
39+ builder . push (
40+ `**${ i18n [ 'FOUND_FEED_MORE_THAN_ONE' ] } :**`
41+ ) ;
42+ builder . push ( ...ctx . state . feedUrl ) ;
43+ ctx . replyWithMarkdown ( builder . join ( '\n' ) ) ;
44+ break ;
45+ }
46+ } else {
47+ delete feed . items ;
48+ ctx . state . feed = feed ;
49+ await next ( ) ;
50+ }
2151 } catch ( e ) {
52+ if ( e instanceof Error ) throw e ;
2253 if ( e . response ) {
2354 switch ( e . response . status ) {
2455 case 404 :
@@ -31,6 +62,5 @@ module.exports = async (ctx, next) => {
3162 throw new Error ( 'FETCH_ERROR' ) ;
3263 }
3364 }
34- await next ( ) ;
3565 }
3666} ;
0 commit comments