Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
V4NSH4J
GitHub Repository: V4NSH4J/discord-mass-DM-GO
Path: blob/main/discord/dm_react.go
310 views
1
// Copyright (C) 2021 github.com/V4NSH4J
2
//
3
// This source code has been released under the GNU Affero General Public
4
// License v3.0. A copy of this license is available at
5
// https://www.gnu.org/licenses/agpl-3.0.en.html
6
7
package discord
8
9
import (
10
"encoding/json"
11
"fmt"
12
"math/rand"
13
"os"
14
"os/exec"
15
"path"
16
"path/filepath"
17
"strings"
18
"time"
19
20
http "github.com/Danny-Dasilva/fhttp"
21
22
goclient "github.com/V4NSH4J/discord-mass-dm-GO/client"
23
"github.com/V4NSH4J/discord-mass-dm-GO/instance"
24
"github.com/V4NSH4J/discord-mass-dm-GO/utilities"
25
)
26
27
func LaunchDMReact() {
28
cfg, instances, err := instance.GetEverything()
29
if err != nil {
30
utilities.LogErr("Error while getting config or instances %s", err)
31
return
32
}
33
// Setting the titlebar on windows
34
var ReactCount, ApproveCount, SuccessCount, LockedCount int
35
var LastDM time.Time
36
title := make(chan bool)
37
go func() {
38
Out:
39
for {
40
select {
41
case <-title:
42
break Out
43
default:
44
cmd := exec.Command("cmd", "/C", "title", fmt.Sprintf(`DMDGO [%v Reacts, %v Approved, %v Success, %v Failed, %v Locked, Last DM %v ago]`, ReactCount, ApproveCount, SuccessCount, ApproveCount-SuccessCount, LockedCount, time.Since(LastDM).Round(time.Second)))
45
_ = cmd.Run()
46
}
47
48
}
49
}()
50
var tokenFile, completedUsersFile, failedUsersFile, lockedFile, quarantinedFile, eventsFile, logsFile string
51
if cfg.OtherSettings.Logs {
52
path := fmt.Sprintf(`logs/dm_react/DMDGO-DMR-%s-%s`, time.Now().Format(`2006-01-02 15-04-05`), utilities.RandStringBytes(5))
53
err := os.MkdirAll(path, 0755)
54
if err != nil && !os.IsExist(err) {
55
utilities.LogErr("Error creating logs directory: %s", err)
56
utilities.ExitSafely()
57
}
58
tokenFileX, err := os.Create(fmt.Sprintf(`%s/token.txt`, path))
59
if err != nil {
60
utilities.LogErr("Error creating token file: %s", err)
61
utilities.ExitSafely()
62
}
63
tokenFileX.Close()
64
completedUsersFileX, err := os.Create(fmt.Sprintf(`%s/success.txt`, path))
65
if err != nil {
66
utilities.LogErr("Error creating success file: %s", err)
67
utilities.ExitSafely()
68
}
69
completedUsersFileX.Close()
70
failedUsersFileX, err := os.Create(fmt.Sprintf(`%s/failed.txt`, path))
71
if err != nil {
72
utilities.LogErr("Error creating failed file: %s", err)
73
utilities.ExitSafely()
74
}
75
failedUsersFileX.Close()
76
lockedFileX, err := os.Create(fmt.Sprintf(`%s/locked.txt`, path))
77
if err != nil {
78
utilities.LogErr("Error creating failed file: %s", err)
79
utilities.ExitSafely()
80
}
81
lockedFileX.Close()
82
quarantinedFileX, err := os.Create(fmt.Sprintf(`%s/quarantined.txt`, path))
83
if err != nil {
84
utilities.LogErr("Error creating failed file: %s", err)
85
utilities.ExitSafely()
86
}
87
quarantinedFileX.Close()
88
eventsFileX, err := os.Create(fmt.Sprintf(`%s/events.txt`, path))
89
if err != nil {
90
utilities.LogErr("Error creating failed file: %s", err)
91
utilities.ExitSafely()
92
}
93
eventsFileX.Close()
94
LogsX, err := os.Create(fmt.Sprintf(`%s/logs.txt`, path))
95
if err != nil {
96
utilities.LogErr("Error creating failed file: %s", err)
97
utilities.ExitSafely()
98
}
99
LogsX.Close()
100
tokenFile, completedUsersFile, failedUsersFile, lockedFile, quarantinedFile, eventsFile, logsFile = tokenFileX.Name(), completedUsersFileX.Name(), failedUsersFileX.Name(), lockedFileX.Name(), quarantinedFileX.Name(), eventsFileX.Name(), LogsX.Name()
101
for i := 0; i < len(instances); i++ {
102
instances[i].WriteInstanceToFile(tokenFile)
103
}
104
}
105
// Checking config for observer token
106
if cfg.DMonReact.Observer == "" {
107
utilities.LogErr("Observer token not set in config")
108
return
109
}
110
if cfg.DMonReact.ServerID == "" {
111
utilities.LogErr("Set a Server ID to use DM on react")
112
return
113
}
114
if cfg.DMonReact.Invite == "" {
115
utilities.LogErr("Set an Invite to use DM on react")
116
return
117
}
118
var msg instance.Message
119
messagechoice := utilities.UserInputInteger("Enter 1 to use message from file, 2 to use message from console: ")
120
if messagechoice != 1 && messagechoice != 2 {
121
utilities.LogErr("Invalid choice")
122
return
123
}
124
if messagechoice == 2 {
125
text := utilities.UserInput("Enter your message, use \\n for changing lines. You can also set a constant message in message.json")
126
msg.Content = text
127
msg.Content = strings.Replace(msg.Content, "\\n", "\n", -1)
128
var msgs []instance.Message
129
msgs = append(msgs, msg)
130
err := instance.SetMessages(instances, msgs)
131
if err != nil {
132
utilities.LogErr("Error while setting messages: %s", err)
133
return
134
}
135
} else {
136
var msgs []instance.Message
137
err := instance.SetMessages(instances, msgs)
138
if err != nil {
139
utilities.LogErr("Error while setting messages: %s", err)
140
return
141
}
142
}
143
// Initializing Files & Variables
144
var completed []string
145
var failed []string
146
var names []string
147
var avatars []string
148
var proxies []string
149
if cfg.DMonReact.SkipCompleted {
150
completed, err = utilities.ReadLines("completed.txt")
151
if err != nil {
152
utilities.LogErr("Error while reading completed.txt: %s", err)
153
return
154
}
155
}
156
if cfg.DMonReact.SkipFailed {
157
failed, err = utilities.ReadLines("failed.txt")
158
if err != nil {
159
utilities.LogErr("Error while reading failed.txt: %s", err)
160
return
161
}
162
}
163
if cfg.DMonReact.ChangeAvatar {
164
utilities.LogInfo("Loading Avatars..")
165
ex, err := os.Executable()
166
if err != nil {
167
utilities.LogErr("Error while getting executable path: %s", err)
168
return
169
}
170
ex = filepath.ToSlash(ex)
171
path := path.Join(path.Dir(ex) + "/input/pfps")
172
173
images, err := instance.GetFiles(path)
174
if err != nil {
175
utilities.LogErr("Couldn't find Images in pfps folder %s", err)
176
return
177
}
178
utilities.LogInfo("Found %d images", len(images))
179
if len(images) == 0 {
180
cfg.DMonReact.ChangeAvatar = false
181
utilities.LogWarn("No images found in pfps folder, disabling avatar change")
182
} else {
183
for i := 0; i < len(images); i++ {
184
av, err := instance.EncodeImg(images[i])
185
if err != nil {
186
utilities.LogErr("Error while encoding image: %s", err)
187
continue
188
}
189
avatars = append(avatars, av)
190
}
191
utilities.LogInfo("%v avatars loaded", len(avatars))
192
}
193
}
194
if cfg.DMonReact.ChangeName {
195
names, err = utilities.ReadLines("names.txt")
196
if err != nil {
197
utilities.LogErr("Error while reading names.txt: %s", err)
198
return
199
}
200
if len(names) == 0 {
201
cfg.DMonReact.ChangeName = false
202
utilities.LogWarn("No names found in names.txt, disabling name change")
203
}
204
}
205
if cfg.DMonReact.ChangeName {
206
for i := 0; i < len(instances); i++ {
207
if instances[i].Password == "" {
208
cfg.DMonReact.ChangeName = false
209
utilities.LogWarn("Token %s has no password, require tokens in format email:password:token to use the name changer", instances[i].CensorToken())
210
break
211
}
212
}
213
}
214
if cfg.ProxySettings.ProxyFromFile {
215
proxies, err = utilities.ReadLines("proxies.txt")
216
if err != nil {
217
utilities.LogErr("Error while reading proxies.txt: %s", err)
218
return
219
}
220
if len(proxies) == 0 {
221
cfg.ProxySettings.ProxyFromFile = false
222
utilities.LogWarn("No proxies found in proxies.txt, disabling proxy change")
223
}
224
}
225
if cfg.CaptchaSettings.ClientKey == "" {
226
utilities.LogWarn("You're not using a captcha key, if you're met with a captcha the token will be cycled.")
227
}
228
tokenPool := make(chan instance.Instance, len(instances))
229
for i := 0; i < len(instances); i++ {
230
go func(i int) {
231
if instances[i].Token != cfg.DMonReact.Observer {
232
tokenPool <- instances[i]
233
} else {
234
utilities.LogInfo("Skipping observer token %s", instances[i].CensorToken())
235
}
236
}(i)
237
}
238
239
// All files and variables loaded and errors handled.
240
utilities.LogInfo("Initializing Observer Token from config")
241
var observerInstance instance.Instance
242
observerInstance.Token = cfg.DMonReact.Observer
243
var proxy string
244
if cfg.ProxySettings.ProxyFromFile {
245
proxy = proxies[rand.Intn(len(proxies))]
246
observerInstance.Proxy = proxy
247
if !cfg.ProxySettings.GatewayProxy {
248
proxy = ""
249
}
250
observerInstance.GatewayProxy = proxy
251
}
252
253
httpclient, err := goclient.NewClient(goclient.Browser{JA3: "771,4865-4867-4866-49195-49199-52393-52392-49196-49200-49162-49161-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-51-43-13-45-28-21,29-23-24-25-256-257,0", UserAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:103.0) Gecko/20100101 Firefox/103.0", Cookies: nil}, cfg.ProxySettings.Timeout, false, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:103.0) Gecko/20100101 Firefox/103.0", "")
254
if err != nil {
255
utilities.LogWarn("Error while initializing client: %s using default client for observer", err)
256
httpclient = http.DefaultClient
257
}
258
observerInstance.Client = httpclient
259
observerInstance.Config = cfg
260
if cfg.DMonReact.ServerID != "" {
261
r, err := observerInstance.ServerCheck(cfg.DMonReact.ServerID)
262
if err != nil {
263
utilities.LogErr("Error while checking if observer token is present in server: %s", err)
264
} else {
265
if r != 200 && r != 204 {
266
// Token not in server or some other issue like rate limit
267
err := observerInstance.Invite(cfg.DMonReact.Invite)
268
if err != nil {
269
utilities.LogErr("Error while inviting observer token: %s", err)
270
} else {
271
utilities.LogSuccess("Observer token invited to server")
272
}
273
274
}
275
}
276
r, err = observerInstance.ServerCheck(cfg.DMonReact.ServerID)
277
if err != nil {
278
utilities.LogErr("Error while checking if observer token is present in server: %s", err)
279
return
280
} else {
281
if r != 200 && r != 204 {
282
utilities.LogErr("Invalid response code %s while checking if observer token is present in server", r)
283
return
284
}
285
}
286
287
}
288
utilities.LogSuccess("Observer Token initialized")
289
// Start Listening for reactions.
290
ticker := make(chan bool)
291
kill := make(chan bool)
292
filteredReacts := make(chan string, 10000)
293
294
go func() {
295
for {
296
time.Sleep(5 * time.Minute)
297
ticker <- true
298
}
299
}()
300
go func() {
301
Listener:
302
for {
303
if observerInstance.Ws != nil {
304
if observerInstance.Ws.Conn != nil {
305
select {
306
case <-ticker:
307
// Closing websocket and re-opening it.
308
if observerInstance.Ws.Conn != nil {
309
observerInstance.Ws.Close()
310
}
311
if observerInstance.Ws != nil {
312
observerInstance.Ws = nil
313
}
314
utilities.LogInfo("Disconnected observer token to reconnect")
315
case x := <-observerInstance.Ws.Reactions:
316
var event instance.Event
317
err := json.Unmarshal(x, &event)
318
if err != nil {
319
utilities.LogErr("Error while unmarshalling event: %s", err)
320
continue Listener
321
}
322
utilities.LogInfo("Event received: %v reacted [%v|%v|%v|%v]", event.Data.UserID, event.Data.GuildId, event.Data.MessageID, event.Data.ChannelID, event.Data.Emoji.Name)
323
if cfg.OtherSettings.Logs {
324
utilities.WriteLinesPath(eventsFile, fmt.Sprintf(`[%v] User ID: %s | Guild ID: %s | Message ID: %s | Channel ID: %s | Emoji: %s (%s)`, time.Now().Format("2006-01-02 15:04:05"), event.Data.UserID, event.Data.GuildId, event.Data.MessageID, event.Data.ChannelID, event.Data.Emoji.Name, event.Data.Emoji.ID))
325
}
326
ReactCount++
327
if cfg.DMonReact.MaxAntiRaidQueue > 0 {
328
if len(filteredReacts) >= cfg.DMonReact.MaxAntiRaidQueue {
329
utilities.LogErr("Anti-Raid queue is full, dropping reaction. Queue length: %s", len(filteredReacts))
330
continue Listener
331
}
332
}
333
if cfg.DMonReact.SkipCompleted {
334
if utilities.Contains(completed, event.Data.UserID) {
335
utilities.LogInfo("Skipping completed user %s", event.Data.UserID)
336
continue Listener
337
}
338
}
339
if cfg.DMonReact.SkipFailed {
340
if utilities.Contains(failed, event.Data.UserID) {
341
utilities.LogInfo("Skipping failed user %s", event.Data.UserID)
342
continue Listener
343
}
344
}
345
if cfg.DMonReact.ServerID != "" {
346
if event.Data.GuildId != cfg.DMonReact.ServerID {
347
utilities.LogInfo("Skipping reaction from other server %s", event.Data.GuildId)
348
continue Listener
349
}
350
}
351
if cfg.DMonReact.ChannelID != "" {
352
if event.Data.ChannelID != cfg.DMonReact.ChannelID {
353
utilities.LogInfo("Skipping reaction from other channel %s", event.Data.ChannelID)
354
continue Listener
355
}
356
}
357
if cfg.DMonReact.MessageID != "" {
358
if event.Data.MessageID != cfg.DMonReact.MessageID {
359
utilities.LogInfo("Skipping reaction from other message %s", event.Data.MessageID)
360
continue Listener
361
}
362
}
363
if cfg.DMonReact.Emoji != "" {
364
if event.Data.Emoji.Name != cfg.DMonReact.Emoji && fmt.Sprintf(`%v:%v`, event.Data.Emoji.Name, event.Data.Emoji.ID) != cfg.DMonReact.Emoji {
365
utilities.LogInfo("Skipping reaction from other emoji %s", event.Data.Emoji.Name)
366
continue Listener
367
}
368
}
369
// React is approved
370
ApproveCount++
371
go func() {
372
filteredReacts <- event.Data.UserID
373
}()
374
continue Listener
375
case <-kill:
376
break Listener
377
}
378
379
} else {
380
err := observerInstance.StartWS()
381
if err != nil {
382
utilities.LogErr("Error while starting observer websocket: %s", err)
383
time.Sleep(10 * time.Second)
384
continue Listener
385
}
386
if cfg.DMonReact.ServerID != "" && observerInstance.Ws != nil {
387
err := instance.Subscribe(observerInstance.Ws, cfg.DMonReact.ServerID, cfg.DMonReact.ChannelID)
388
if err != nil {
389
utilities.LogErr("Error while subscribing to server: %s", err)
390
time.Sleep(10 * time.Second)
391
continue Listener
392
}
393
394
}
395
utilities.LogInfo("Reconnected observer websocket")
396
continue Listener
397
}
398
} else {
399
// Opening Websocket
400
err := observerInstance.StartWS()
401
if err != nil {
402
utilities.LogErr("Error while starting observer websocket: %s", err)
403
time.Sleep(10 * time.Second)
404
continue Listener
405
}
406
if cfg.DMonReact.ServerID != "" && observerInstance.Ws != nil {
407
err := instance.Subscribe(observerInstance.Ws, cfg.DMonReact.ServerID, cfg.DMonReact.ChannelID)
408
if err != nil {
409
utilities.LogErr("Error while subscribing to server: %s", err)
410
time.Sleep(10 * time.Second)
411
continue Listener
412
}
413
414
}
415
utilities.LogInfo("Reconnected observer websocket")
416
continue Listener
417
}
418
}
419
utilities.LogInfo("Observer stopped permanently")
420
title <- true
421
}()
422
// Starting token
423
Token:
424
for {
425
if len(tokenPool) == 0 {
426
utilities.LogWarn("No more tokens left, Exiting")
427
kill <- true
428
break Token
429
}
430
instance := <-tokenPool
431
utilities.LogInfo("Initializing token %s", instance.CensorToken())
432
React:
433
for {
434
status := instance.CheckToken()
435
if status != 200 {
436
utilities.LogFailed("Token %v may be invalid [%v], skipping!", instance.CensorToken(), status)
437
if cfg.OtherSettings.Logs {
438
instance.WriteInstanceToFile(lockedFile)
439
}
440
if cfg.OtherSettings.Logs {
441
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v] Token %v may be invalid. Response code %v`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), status))
442
}
443
LockedCount++
444
continue Token
445
}
446
if cfg.DMonReact.Invite != "" && !instance.Invited {
447
err := instance.Invite(cfg.DMonReact.Invite)
448
if err != nil {
449
utilities.LogFailed("Error while inviting Token %v: %v Switching!", instance.CensorToken(), err)
450
continue Token
451
}
452
instance.Invited = true
453
}
454
if instance.Cookie == "" {
455
cookie, err := instance.GetCookieString()
456
if err != nil {
457
utilities.LogErr("Error while getting cookie for Token %v: %v Switching!", instance.CensorToken(), err)
458
if cfg.DMonReact.RotateTokens {
459
go func() {
460
tokenPool <- instance
461
}()
462
}
463
continue Token
464
}
465
instance.Cookie = cookie
466
}
467
if (cfg.DMonReact.ChangeAvatar && !instance.ChangedAvatar) || (cfg.DMonReact.ChangeName && !instance.ChangedName) {
468
// Opening Websocket to change name/avatar
469
err := instance.StartWS()
470
if err != nil {
471
utilities.LogErr("Error while opening websocket %v: %v", instance.CensorToken(), err)
472
if cfg.DMonReact.RotateTokens {
473
go func() {
474
tokenPool <- instance
475
}()
476
}
477
continue Token
478
} else {
479
utilities.LogSuccess("Websocket opened %v", instance.CensorToken())
480
}
481
if cfg.DMonReact.ChangeAvatar && !instance.ChangedAvatar {
482
p := avatars[rand.Intn(len(avatars))]
483
r, err := instance.AvatarChanger(p)
484
if err != nil {
485
utilities.LogErr("%v Error while changing avatar: %v", instance.CensorToken(), err)
486
if cfg.DMonReact.RotateTokens {
487
go func() {
488
tokenPool <- instance
489
}()
490
}
491
if cfg.OtherSettings.Logs {
492
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v] Token %v failed to change avatar. Error %v`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), err))
493
}
494
continue Token
495
} else {
496
if r.StatusCode == 204 || r.StatusCode == 200 {
497
utilities.LogSuccess("%v Avatar changed successfully", instance.CensorToken())
498
if cfg.OtherSettings.Logs {
499
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v] Token %v changed Avatar to %v`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), p))
500
}
501
instance.ChangedAvatar = true
502
} else {
503
utilities.LogErr("%v Error while changing avatar: %v", instance.CensorToken(), r.StatusCode)
504
if cfg.DMonReact.RotateTokens {
505
go func() {
506
tokenPool <- instance
507
}()
508
}
509
if cfg.OtherSettings.Logs {
510
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v] Token %v failed to change avatar. %v`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), r.StatusCode))
511
}
512
continue Token
513
}
514
}
515
516
}
517
if cfg.DMonReact.ChangeName && !instance.ChangedName {
518
p := names[rand.Intn(len(names))]
519
r, err := instance.NameChanger(p)
520
if err != nil {
521
utilities.LogErr("%v Error while changing name: %v", instance.CensorToken(), err)
522
if cfg.DMonReact.RotateTokens {
523
go func() {
524
tokenPool <- instance
525
}()
526
}
527
if cfg.OtherSettings.Logs {
528
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v] Token %v failed to change name. Error %v`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), err))
529
}
530
continue Token
531
}
532
body, err := utilities.ReadBody(r)
533
if err != nil {
534
utilities.LogErr("%v Error while reading body: %v", instance.CensorToken(), err)
535
if cfg.DMonReact.RotateTokens {
536
go func() {
537
tokenPool <- instance
538
}()
539
}
540
if cfg.OtherSettings.Logs {
541
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v] Token %v failed to change name. Error %v`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), err))
542
}
543
continue Token
544
}
545
if r.StatusCode == 200 || r.StatusCode == 204 {
546
utilities.LogSuccess("%v Changed name successfully", instance.CensorToken())
547
if cfg.OtherSettings.Logs {
548
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v] Token %v name changed to %v`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), p))
549
}
550
instance.ChangedName = true
551
} else {
552
utilities.LogErr("%v Error while changing name: %v %v", instance.CensorToken(), r.StatusCode, string(body))
553
if cfg.DMonReact.RotateTokens {
554
go func() {
555
tokenPool <- instance
556
}()
557
}
558
if cfg.OtherSettings.Logs {
559
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v] Token %v failed to change name. %v %v`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), r.StatusCode, string(body)))
560
}
561
continue Token
562
}
563
}
564
// Closing websocket
565
if instance.Ws != nil {
566
err = instance.Ws.Close()
567
if err != nil {
568
utilities.LogErr("Error while closing websocket: %v", err)
569
} else {
570
utilities.LogSuccess("Websocket closed %v", instance.CensorToken())
571
}
572
}
573
}
574
if cfg.DMonReact.ServerID != "" && (instance.TimeServerCheck.Second() >= 120 || instance.TimeServerCheck.IsZero()) {
575
r, err := instance.ServerCheck(cfg.DMonReact.ServerID)
576
if err != nil {
577
utilities.LogErr("Error while checking if token %v is present in server %v: %v Switching!", instance.CensorToken(), cfg.DMonReact.ServerID, err)
578
if cfg.OtherSettings.Logs {
579
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v]Error while checking if token %v is present in server %v: %v Switching!`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), cfg.DMonReact.ServerID, err))
580
}
581
continue Token
582
} else {
583
if r != 200 && r != 204 {
584
utilities.LogFailed("Token %v is not present in server %v: Response %v Switching!", instance.CensorToken(), cfg.DMonReact.ServerID, r)
585
if cfg.OtherSettings.Logs {
586
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v]Token %v is not present in server %v: Response %v Switching!`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), cfg.DMonReact.ServerID, r))
587
}
588
continue Token
589
}
590
}
591
instance.TimeServerCheck = time.Now()
592
}
593
ticker := make(chan bool)
594
go func() {
595
for {
596
time.Sleep(180 * time.Second)
597
ticker <- true
598
}
599
}()
600
select {
601
case uuid := <-filteredReacts:
602
instance.Count++
603
if cfg.DMonReact.MaxDMsPerToken != 0 && instance.Count >= cfg.DMonReact.MaxDMsPerToken {
604
utilities.LogInfo("%v Max DMs per token reached, switching", instance.CensorToken())
605
if cfg.OtherSettings.Logs {
606
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v]Token %v Max DMs reached %v`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), cfg.DMonReact.MaxDMsPerToken))
607
}
608
continue Token
609
}
610
t := time.Now()
611
snowflake, err := instance.OpenChannel(uuid)
612
if err != nil {
613
utilities.LogErr("Error while opening channel: %v", err)
614
if cfg.OtherSettings.Logs {
615
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v]Token %v Error %v while opening channel`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), err))
616
}
617
err = utilities.WriteLine("input/failed.txt", uuid)
618
if err != nil {
619
utilities.LogErr("Error while writing to failed file %v: %v", uuid, err)
620
}
621
if cfg.OtherSettings.Logs {
622
utilities.WriteLinesPath(failedUsersFile, uuid)
623
}
624
failed = append(failed, uuid)
625
continue React
626
}
627
respCode, body, err := instance.SendMessage(snowflake, uuid)
628
if err != nil {
629
utilities.LogErr("Error while sending message: %v", err)
630
if cfg.OtherSettings.Logs {
631
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v]Token %v Error %v while sending message`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), err))
632
}
633
err = utilities.WriteLine("input/failed.txt", uuid)
634
if err != nil {
635
utilities.LogErr("Error while writing to failed file %v: %v", uuid, err)
636
}
637
if cfg.OtherSettings.Logs {
638
utilities.WriteLinesPath(failedUsersFile, uuid)
639
}
640
failed = append(failed, uuid)
641
continue React
642
}
643
var response jsonResponse
644
err = json.Unmarshal(body, &response)
645
if err != nil {
646
utilities.LogErr("Error while unmarshalling body: %v", err)
647
err = utilities.WriteLine("input/failed.txt", uuid)
648
if err != nil {
649
utilities.LogErr("Error while writing to failed file %v: %v", uuid, err)
650
}
651
if cfg.OtherSettings.Logs {
652
utilities.WriteLinesPath(failedUsersFile, uuid)
653
}
654
failed = append(failed, uuid)
655
continue React
656
}
657
if respCode == 200 {
658
utilities.LogSuccess("Token %v messaged %v [%v milliseconds]", instance.CensorToken(), uuid, time.Since(t).Milliseconds())
659
SuccessCount++
660
LastDM = time.Now()
661
completed = append(completed, uuid)
662
err = utilities.WriteLine("input/completed.txt", uuid)
663
if err != nil {
664
utilities.LogErr("Error while writing to completed file %v: %v", uuid, err)
665
}
666
if cfg.OtherSettings.Logs {
667
utilities.WriteLinesPath(completedUsersFile, uuid)
668
}
669
if cfg.OtherSettings.Logs {
670
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v]Token %v messaged %v [%v milliseconds]`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), uuid, time.Since(t).Milliseconds()))
671
}
672
continue React
673
} else if response.Code == 20026 {
674
utilities.LogLocked("Token %s is Quarantined. It is being stopped.", instance.CensorToken())
675
if cfg.OtherSettings.Logs {
676
instance.WriteInstanceToFile(quarantinedFile)
677
}
678
if cfg.OtherSettings.Logs {
679
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v] Token %v is Quarantined`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken()))
680
}
681
LockedCount++
682
continue Token
683
} else if respCode == 403 && response.Code == 40003 {
684
// Token is rate limited
685
go func() {
686
filteredReacts <- uuid
687
}()
688
if cfg.DMonReact.LeaveTokenOnRateLimit && cfg.DMonReact.ServerID != "" {
689
re := instance.Leave(cfg.DMonReact.ServerID)
690
if re == 200 || re == 204 {
691
utilities.LogSuccess("Token %v left server %v", instance.CensorToken(), cfg.DMonReact.ServerID)
692
if cfg.OtherSettings.Logs {
693
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v]Token %v left server %v`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), cfg.DMonReact.ServerID))
694
}
695
} else {
696
utilities.LogErr("Error while leaving server %v: %v", cfg.DMonReact.ServerID, re)
697
if cfg.OtherSettings.Logs {
698
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v]Error while leaving server %v: %v`, time.Now().Format("2006-01-02 15:04:05"), cfg.DMonReact.ServerID, re))
699
}
700
701
}
702
}
703
if cfg.DMonReact.RotateTokens {
704
go func() {
705
tokenPool <- instance
706
}()
707
}
708
continue Token
709
} else if respCode == 403 && response.Code == 50007 {
710
failed = append(failed, uuid)
711
err = utilities.WriteLine("input/failed.txt", uuid)
712
if err != nil {
713
utilities.LogErr("Error while writing to failed file %v: %v", uuid, err)
714
}
715
if cfg.OtherSettings.Logs {
716
utilities.WriteLinesPath(failedUsersFile, uuid)
717
}
718
utilities.LogFailed("Token %v failed to message %v [DMs closed or no Mutual servers] [%v milliseconds]", instance.CensorToken(), uuid, time.Since(t).Milliseconds())
719
if cfg.OtherSettings.Logs {
720
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v]Token %v failed to messaged %v [%v milliseconds] [DMs closed or No Mutuals]`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), uuid, time.Since(t).Milliseconds()))
721
}
722
continue React
723
} else if respCode == 403 && response.Code == 40002 || respCode == 401 || respCode == 405 {
724
failed = append(failed, uuid)
725
err = utilities.WriteLine("input/failed.txt", uuid)
726
if err != nil {
727
utilities.LogErr("Error while writing to failed file %v: %v", uuid, err)
728
}
729
if cfg.OtherSettings.Logs {
730
utilities.WriteLinesPath(failedUsersFile, uuid)
731
}
732
utilities.LogFailed("Token %v failed to message %v [Locked/Disabled]", instance.CensorToken(), uuid)
733
if cfg.OtherSettings.Logs {
734
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v]Token %v failed to messaged %v [%v milliseconds] [Locked or Disabled]`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), uuid, time.Since(t).Milliseconds()))
735
}
736
continue React
737
} else if respCode == 429 {
738
failed = append(failed, uuid)
739
err = utilities.WriteLine("input/failed.txt", uuid)
740
if err != nil {
741
utilities.LogErr("Error while writing to failed file %v: %v", uuid, err)
742
}
743
if cfg.OtherSettings.Logs {
744
utilities.WriteLinesPath(failedUsersFile, uuid)
745
}
746
utilities.LogFailed("Token %v failed to DM %v [Rate Limited][%vms]", instance.CensorToken(), uuid, time.Since(t).Milliseconds())
747
if cfg.OtherSettings.Logs {
748
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v]Token %v failed to messaged %v [%v milliseconds] [Rate Limited]`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), uuid, time.Since(t).Milliseconds()))
749
}
750
time.Sleep(5 * time.Second)
751
continue React
752
} else if respCode == 400 && strings.Contains(string(body), "captcha") {
753
utilities.LogFailed("Token %v Captcha was solved incorrectly", instance.CensorToken())
754
if instance.Config.CaptchaSettings.CaptchaAPI == "anti-captcha.com" {
755
err := instance.ReportIncorrectRecaptcha()
756
if err != nil {
757
utilities.LogErr("Error while reporting incorrect hcaptcha: %v", err)
758
} else {
759
utilities.LogSuccess("Reported incorrect hcaptcha %v", instance.LastID)
760
}
761
}
762
763
} else {
764
failed = append(failed, uuid)
765
err = utilities.WriteLine("input/failed.txt", uuid)
766
if err != nil {
767
utilities.LogErr("Error while writing to failed file %v: %v", uuid, err)
768
}
769
if cfg.OtherSettings.Logs {
770
utilities.WriteLinesPath(failedUsersFile, uuid)
771
}
772
utilities.LogFailed("Token %v failed to DM %v [%v][%vms]", instance.CensorToken(), uuid, string(body), time.Since(t).Milliseconds())
773
if cfg.OtherSettings.Logs {
774
utilities.WriteLinesPath(logsFile, fmt.Sprintf(`[%v]Token %v failed to messaged %v [%v milliseconds] [%v]`, time.Now().Format("2006-01-02 15:04:05"), instance.CensorToken(), uuid, time.Since(t).Milliseconds(), string(body)))
775
}
776
continue React
777
}
778
case <-ticker:
779
utilities.LogInfo("Token %v is being re-checked", instance.CensorToken())
780
continue React
781
}
782
}
783
}
784
}
785
786