@@ -20,6 +20,8 @@ type TrollShieldBot interface {
20
20
GetChatMember (telegram.ChatConfigWithUser ) (telegram.ChatMember , error )
21
21
KickChatMember (telegram.KickChatMemberConfig ) (telegram.APIResponse , error )
22
22
Send (telegram.Chattable ) (telegram.Message , error )
23
+ LeaveChat (telegram.ChatConfig ) (telegram.APIResponse , error )
24
+ GetUpdatesChan (telegram.UpdateConfig ) (telegram.UpdatesChannel , error )
23
25
}
24
26
25
27
// blacklist groups, member from that groups will be kicked automatically
@@ -68,7 +70,7 @@ func getUserName(user telegram.User) string {
68
70
return username
69
71
}
70
72
71
- func getUpdates (bot * telegram. BotAPI ) telegram.UpdatesChannel {
73
+ func getUpdates (bot TrollShieldBot ) telegram.UpdatesChannel {
72
74
u := telegram .NewUpdate (0 )
73
75
u .Timeout = 60
74
76
updates , err := bot .GetUpdatesChan (u )
@@ -176,41 +178,92 @@ func setupLogging() {
176
178
}
177
179
}
178
180
179
- func setupBot () * telegram.BotAPI {
180
- token , exists := os .LookupEnv ("TELEGRAM_BOT_TOKEN" )
181
+ func setupBot (envVar string ) ( * telegram.BotAPI , error ) {
182
+ token , exists := os .LookupEnv (envVar )
181
183
if ! exists {
182
- log . Fatal ( "TELEGRAM_BOT_TOKEN env should be defined." )
184
+ return nil , fmt . Errorf ( "%s env should be defined" , envVar )
183
185
}
184
186
bot , err := telegram .NewBotAPI (token )
185
187
186
188
if err != nil {
187
- log . Panic ( err )
189
+ return nil , fmt . Errorf ( "Setup %v failed with: %v" , envVar , err )
188
190
}
189
191
190
192
bot .Debug = true
191
193
192
194
log .Printf ("Authorized on account @%s" , bot .Self .UserName )
193
195
194
- return bot
196
+ return bot , nil
197
+ }
198
+
199
+ func setupHiddenBot (bot * telegram.BotAPI ) * telegram.BotAPI {
200
+ log .Println ("Setup the hidden bot" )
201
+ botHidden , err := setupBot ("TELEGRAM_BOT_HIDDEN_TOKEN" )
202
+ if err != nil {
203
+ log .Printf ("Bot setup failed: %v. Fallback to main bot." , err )
204
+ botHidden = bot
205
+ }
206
+
207
+ return botHidden
208
+
209
+ }
210
+
211
+ func setupBots () (* telegram.BotAPI , * telegram.BotAPI , error ) {
212
+ log .Println ("Setup the main bot" )
213
+ bot , err := setupBot ("TELEGRAM_BOT_TOKEN" )
214
+ if err != nil {
215
+ return nil , nil , err
216
+ }
217
+
218
+ return bot , setupHiddenBot (bot ), nil
219
+ }
220
+
221
+ func leaveChat (bot TrollShieldBot , update * telegram.Update , trollGroup string ) {
222
+ reply (bot , update , "Nesse grupo há trolls. Dou-me a liberdade de ir embora. Adeus." )
223
+ r , err := bot .LeaveChat (telegram.ChatConfig {ChatID : update .Message .Chat .ID })
224
+ if ! r .Ok || err != nil {
225
+ log .Printf ("Bot tried to exit from %v, but failed with: %v" ,
226
+ trollGroup , err ,
227
+ )
228
+ }
195
229
}
196
230
197
231
func main () {
198
232
setupLogging ()
199
- bot := setupBot ()
233
+ bot , botHidden , err := setupBots ()
234
+ if err != nil {
235
+ log .Fatal (err .Error ())
236
+ }
237
+
200
238
for update := range getUpdates (bot ) {
201
239
if messageEvent (& update ) {
202
240
if update .Message .Text == "/lelerax" {
203
241
reply (bot , & update , "Estou vivo." )
204
242
}
243
+
244
+ // Exit automatically from group after the bot receive a message from it
245
+ for _ , trollGroup := range trollGroups {
246
+ if fromChatEvent (& update , strings .TrimLeft (trollGroup , "@" )) {
247
+ leaveChat (bot , & update , trollGroup )
248
+ }
249
+ }
205
250
}
206
251
207
252
if newChatMemberEvent (& update ) {
208
253
for _ , member := range * update .Message .NewChatMembers {
209
- if trollHouse := findTrollHouses (bot , member .ID ); trollHouse != "" {
254
+ if trollHouse := findTrollHouses (botHidden , member .ID ); trollHouse != "" {
210
255
kickTroll (bot , & update , member , trollHouse )
211
256
} else if fromChatEvent (& update , "commonlispbr" ) && ! member .IsBot {
212
257
welcomeMessage (bot , & update , member )
213
258
}
259
+
260
+ // Exit automatically from groups when I'm joining it
261
+ for _ , trollGroup := range trollGroups {
262
+ if fromChatEvent (& update , strings .TrimLeft (trollGroup , "@" )) && member .UserName == bot .Self .UserName {
263
+ leaveChat (bot , & update , trollGroup )
264
+ }
265
+ }
266
+
214
267
}
215
268
}
216
269
}
0 commit comments