@@ -19,7 +19,6 @@ import (
19
19
)
20
20
21
21
func GetFeed (feed FeedConfig ,
22
- feedChanel chan <- * gofeed.Feed ,
23
22
client * girc.Client ,
24
23
pool * pgxpool.Pool ,
25
24
channel , groupName string ,
@@ -28,104 +27,104 @@ func GetFeed(feed FeedConfig,
28
27
29
28
parsedFeed , err := feed .FeedParser .ParseURL (feed .URL )
30
29
if err != nil {
31
- log . Print (err )
30
+ LogError (err )
32
31
} else {
33
- query := fmt .Sprintf ("select newest_unix_time from rss where name = '%s'" , rowName )
34
- ctx , cancel := context .WithTimeout (context .Background (), time .Duration (10 )* time .Second )
35
- defer cancel ()
32
+ if len (parsedFeed .Items ) > 0 {
33
+ query := fmt .Sprintf ("select newest_unix_time from rss where name = '%s'" , rowName )
34
+ ctx , cancel := context .WithTimeout (context .Background (), time .Duration (10 )* time .Second )
35
+ defer cancel ()
36
36
37
- newestFromDB := int64 (0 )
37
+ newestFromDB := int64 (0 )
38
38
39
- err := pool .QueryRow (ctx , query ).Scan (& newestFromDB )
40
- if err != nil {
41
- pool .Exec (ctx , fmt .Sprintf ("insert into rss (name, newest_unix_time) values ('%s',0)" , rowName ))
42
- }
39
+ err := pool .QueryRow (ctx , query ).Scan (& newestFromDB )
40
+ if err != nil {
41
+ pool .Exec (ctx , fmt .Sprintf ("insert into rss (name, newest_unix_time) values ('%s',0)" , rowName ))
42
+ }
43
43
44
- log .Print ("Newset from DB: " , newestFromDB )
44
+ log .Print ("Newset from DB: " , newestFromDB )
45
45
46
- sortFunc := func (a , b * gofeed.Item ) int {
47
- if a .PublishedParsed .Before (* b .PublishedParsed ) {
48
- return - 1
49
- } else if a .PublishedParsed .After (* b .PublishedParsed ) {
50
- return 1
51
- }
46
+ sortFunc := func (a , b * gofeed.Item ) int {
47
+ if a .PublishedParsed .Before (* b .PublishedParsed ) {
48
+ return - 1
49
+ } else if a .PublishedParsed .After (* b .PublishedParsed ) {
50
+ return 1
51
+ }
52
52
53
- return 0
54
- }
53
+ return 0
54
+ }
55
55
56
- slices .SortFunc (parsedFeed .Items , sortFunc )
56
+ slices .SortFunc (parsedFeed .Items , sortFunc )
57
57
58
- for _ , item := range parsedFeed .Items {
59
- if item .PublishedParsed .Unix () > newestFromDB {
60
- client .Cmd .Message (channel , parsedFeed .Title + ": " + item .Title )
58
+ for _ , item := range parsedFeed .Items {
59
+ if item .PublishedParsed .Unix () > newestFromDB {
60
+ client .Cmd .Message (channel , parsedFeed .Title + ": " + item .Title + ">>>" + item .Link )
61
+ }
61
62
}
62
- }
63
63
64
- log .Print (parsedFeed .Items [0 ].PublishedParsed .Unix ())
65
- log .Print (parsedFeed .Items [len (parsedFeed .Items )- 1 ].PublishedParsed .Unix ())
64
+ query = fmt .Sprintf ("update rss set newest_unix_time = %d where name = '%s'" , parsedFeed .Items [len (parsedFeed .Items )- 1 ].PublishedParsed .Unix (), rowName )
66
65
67
- query = fmt .Sprintf ("update rss set newest_unix_time = %d where name = '%s'" , parsedFeed .Items [len (parsedFeed .Items )- 1 ].PublishedParsed .Unix (), rowName )
66
+ ctx2 , cancel := context .WithTimeout (context .Background (), time .Duration (10 )* time .Second )
67
+ defer cancel ()
68
68
69
- ctx2 , cancel := context .WithTimeout (context .Background (), time .Duration (10 )* time .Second )
70
- defer cancel ()
69
+ _ , err = pool .Exec (ctx2 , query )
70
+ if err != nil {
71
+ LogError (err )
72
+ }
71
73
72
- _ , err = pool .Exec (ctx2 , query )
73
- if err != nil {
74
- log .Print (err )
75
74
}
76
75
}
77
-
78
- feedChanel <- parsedFeed
79
76
}
80
77
81
78
func feedDispatcher (
82
79
config RSSConfig ,
83
80
client * girc.Client ,
84
81
pool * pgxpool.Pool ,
85
82
channel , groupName string ,
83
+ period int ,
86
84
) {
87
- feedChanel := make (chan * gofeed.Feed )
85
+ for {
86
+ for i := range len (config .Feeds ) {
87
+ config .Feeds [i ].FeedParser = gofeed .NewParser ()
88
88
89
- for i := range len (config .Feeds ) {
90
- config .Feeds [i ].FeedParser = gofeed .NewParser ()
89
+ config .Feeds [i ].FeedParser .UserAgent = config .Feeds [i ].UserAgent
91
90
92
- config .Feeds [i ].FeedParser .UserAgent = config .Feeds [i ].UserAgent
91
+ if config .Feeds [i ].Proxy != "" {
92
+ proxyURL , err := url .Parse (config .Feeds [i ].Proxy )
93
+ if err != nil {
94
+ LogError (err )
93
95
94
- if config .Feeds [i ].Proxy != "" {
95
- proxyURL , err := url .Parse (config .Feeds [i ].Proxy )
96
- if err != nil {
97
- log .Print (err )
98
- continue
99
- }
96
+ continue
97
+ }
100
98
101
- dialer , err := proxy .FromURL (proxyURL , & net.Dialer {Timeout : time .Duration (config .Feeds [i ].Timeout ) * time .Second })
102
- if err != nil {
103
- log . Print (err )
99
+ dialer , err := proxy .FromURL (proxyURL , & net.Dialer {Timeout : time .Duration (config .Feeds [i ].Timeout ) * time .Second })
100
+ if err != nil {
101
+ LogError (err )
104
102
105
- continue
106
- }
103
+ continue
104
+ }
107
105
108
- httpClient := http.Client {
109
- Transport : & http.Transport {
110
- Dial : dialer .Dial ,
111
- },
106
+ httpClient := http.Client {
107
+ Transport : & http.Transport {
108
+ Dial : dialer .Dial ,
109
+ },
110
+ }
111
+
112
+ config .Feeds [i ].FeedParser .Client = & httpClient
112
113
}
114
+ }
113
115
114
- config .Feeds [i ].FeedParser .Client = & httpClient
116
+ for _ , feed := range config .Feeds {
117
+ go GetFeed (feed , client , pool , channel , groupName )
115
118
}
116
- }
117
119
118
- for _ , feed := range config .Feeds {
119
- go GetFeed (feed , feedChanel , client , pool , channel , groupName )
120
+ time .Sleep (time .Duration (period ) * time .Second )
120
121
}
121
-
122
- // <-feedChanel
123
122
}
124
123
125
124
func ParseRSSConfig (rssConfFilePath string ) * RSSConfig {
126
125
file , err := os .Open (rssConfFilePath )
127
126
if err != nil {
128
- log . Print (err )
127
+ LogError (err )
129
128
130
129
return nil
131
130
}
@@ -136,7 +135,7 @@ func ParseRSSConfig(rssConfFilePath string) *RSSConfig {
136
135
137
136
err = decoder .Decode (& config )
138
137
if err != nil {
139
- log . Print (err )
138
+ LogError (err )
140
139
141
140
return nil
142
141
}
@@ -145,35 +144,34 @@ func ParseRSSConfig(rssConfFilePath string) *RSSConfig {
145
144
}
146
145
147
146
func runRSS (appConfig * TomlConfig , client * girc.Client ) {
148
- for {
149
- query := fmt .Sprintf (
150
- `create table if not exists rss (
147
+ query := fmt .Sprintf (
148
+ `create table if not exists rss (
151
149
id serial primary key,
152
150
name text not null unique,
153
151
newest_unix_time bigint not null
154
152
)` )
155
153
156
- ctx , cancel := context .WithTimeout (context .Background (), time .Duration (appConfig .RequestTimeout )* time .Second )
154
+ for {
155
+ ctx , cancel := context .WithTimeout (context .Background (), time .Duration (10 )* time .Second )
157
156
defer cancel ()
158
157
159
158
_ , err := appConfig .pool .Exec (ctx , query )
160
159
if err != nil {
161
- log . Print (err )
162
- time .Sleep (time .Duration (appConfig . MillaReconnectDelay ) * time .Second )
160
+ LogError (err )
161
+ time .Sleep (time .Duration (60 ) * time .Second )
163
162
} else {
164
- for groupName , rss := range appConfig .Rss {
165
- log .Print ("RSS: joining " , rss .Channel )
166
- client .Cmd .Join (rss .Channel )
167
- rssConfig := ParseRSSConfig (rss .RssFile )
168
- if rssConfig == nil {
169
- log .Print ("Could not parse RSS config file " + rss .RssFile + ". Exiting." )
170
- } else {
171
- for {
172
- feedDispatcher (* rssConfig , client , appConfig .pool , rss .Channel , groupName )
173
- time .Sleep (time .Duration (rssConfig .Period ) * time .Second )
174
- }
175
- }
176
- }
163
+ break
164
+ }
165
+ }
166
+
167
+ for groupName , rss := range appConfig .Rss {
168
+ log .Print ("RSS: joining " , rss .Channel )
169
+ client .Cmd .Join (rss .Channel )
170
+ rssConfig := ParseRSSConfig (rss .RssFile )
171
+ if rssConfig == nil {
172
+ log .Print ("Could not parse RSS config file " + rss .RssFile + ". Exiting." )
173
+ } else {
174
+ go feedDispatcher (* rssConfig , client , appConfig .pool , rss .Channel , groupName , rssConfig .Period )
177
175
}
178
176
}
179
177
}
0 commit comments