Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
V4NSH4J
GitHub Repository: V4NSH4J/discord-mass-DM-GO
Path: blob/main/discord/anti_anti_discord.go
310 views
1
package discord
2
3
import (
4
"encoding/json"
5
"fmt"
6
"math/rand"
7
"os/exec"
8
"strings"
9
"sync"
10
"time"
11
12
"github.com/V4NSH4J/discord-mass-dm-GO/instance"
13
"github.com/V4NSH4J/discord-mass-dm-GO/utilities"
14
)
15
16
// Have the number of threads be DMing or Waiting to be joint at all times.
17
func LaunchAntiAntiRaidMode() {
18
// Getting everything required
19
cfg, instances, err := instance.GetEverything()
20
if err != nil {
21
utilities.LogErr("Error while getting config or instances %s", err)
22
return
23
}
24
memberids, err := utilities.ReadLines("memberids.txt")
25
if err != nil {
26
utilities.LogErr("Error while reading memberids.txt %s", err)
27
return
28
}
29
if cfg.DirectMessage.Skip {
30
completed, err := utilities.ReadLines("completed.txt")
31
if err != nil {
32
utilities.LogErr("Error while opening completed.txt %s", err)
33
return
34
}
35
memberids = utilities.RemoveSubset(memberids, completed)
36
}
37
if cfg.DirectMessage.SkipFailed {
38
failedSkip, err := utilities.ReadLines("failed.txt")
39
if err != nil {
40
utilities.LogErr("Error while opening failed.txt %s", err)
41
return
42
}
43
memberids = utilities.RemoveSubset(memberids, failedSkip)
44
}
45
memberChan := make(chan string, len(memberids))
46
for i := 0; i < len(memberids); i++ {
47
go func(i int) {
48
memberChan <- memberids[i]
49
}(i)
50
}
51
threads := utilities.UserInputInteger("Enter number of threads: (Recommended: <10)")
52
serverid := utilities.UserInput("Enter server id:")
53
delayBetweenJoins := utilities.UserInputInteger("Enter delay between joins:")
54
randomDelayBetweenJoins := utilities.UserInputInteger("Enter random delay between joins:")
55
invite := utilities.UserInput("Enter invite:")
56
var msg instance.Message
57
messagechoice := utilities.UserInputInteger("Enter 1 to use message from file, 2 to use message from console: ")
58
if messagechoice != 1 && messagechoice != 2 {
59
utilities.LogErr("Invalid choice")
60
return
61
}
62
if messagechoice == 2 {
63
text := utilities.UserInput("Enter your message, use \\n for changing lines. You can also set a constant message in message.json")
64
msg.Content = text
65
msg.Content = strings.Replace(msg.Content, "\\n", "\n", -1)
66
var msgs []instance.Message
67
msgs = append(msgs, msg)
68
err := instance.SetMessages(instances, msgs)
69
if err != nil {
70
utilities.LogErr("Error while setting messages: %s", err)
71
return
72
}
73
} else {
74
var msgs []instance.Message
75
err := instance.SetMessages(instances, msgs)
76
if err != nil {
77
utilities.LogErr("Error while setting messages: %s", err)
78
return
79
}
80
}
81
ticker := make(chan bool)
82
go func() {
83
for {
84
if randomDelayBetweenJoins == 0 && delayBetweenJoins != 0 {
85
time.Sleep(time.Duration(delayBetweenJoins) * time.Second)
86
} else if randomDelayBetweenJoins != 0 && delayBetweenJoins == 0 {
87
time.Sleep(time.Duration(rand.Intn(randomDelayBetweenJoins)) * time.Second)
88
} else {
89
time.Sleep(time.Second * time.Duration(delayBetweenJoins+rand.Intn(randomDelayBetweenJoins)))
90
}
91
92
ticker <- true
93
}
94
}()
95
var completed []string
96
var failed []string
97
var tokenUsed []instance.Instance
98
dormantPool := make(chan Worker, len(instances))
99
timedOutPool := make(chan Worker, threads)
100
for i := 0; i < len(instances); i++ {
101
go func(i int) {
102
dormantPool <- Worker{
103
Instance: &instances[i],
104
TimedOutTill: time.Now(),
105
Valid: false,
106
}
107
}(i)
108
}
109
tickerTitle := make(chan bool)
110
go func() {
111
Out:
112
for {
113
select {
114
case <-tickerTitle:
115
break Out
116
default:
117
var avg int
118
if len(tokenUsed) == 0 {
119
avg = 0
120
} else {
121
avg = len(completed) / len(tokenUsed)
122
}
123
cmd := exec.Command("cmd", "/C", "title", fmt.Sprintf(`DMDGO [%d sent, %d failed, %d tokens unused, %d tokens timedout, %d tokens used, %d average successful DMs]`, len(completed), len(failed), len(dormantPool), len(timedOutPool), len(tokenUsed), avg))
124
_ = cmd.Run()
125
}
126
127
}
128
}()
129
var wg sync.WaitGroup
130
for i := 0; i < threads; i++ {
131
wg.Add(1)
132
go func(i int) {
133
defer wg.Done()
134
Token:
135
for {
136
if len(timedOutPool) == 0 && len(dormantPool) == 0 {
137
break Token
138
}
139
var w Worker
140
// Priority is given to timed out workers
141
w = AvailableWorker(timedOutPool)
142
if w == (Worker{}) {
143
// Try getting from Dormant pool if no timed out workers are available
144
if len(dormantPool) != 0 {
145
w = NewWorker(dormantPool)
146
if w == (Worker{}) {
147
continue Token
148
}
149
} else if len(timedOutPool) != 0 {
150
for {
151
if len(timedOutPool) == 0 {
152
break Token
153
}
154
w = AvailableWorker(timedOutPool)
155
if w != (Worker{}) {
156
break
157
} else {
158
continue
159
}
160
}
161
}
162
163
}
164
tokenUsed = append(tokenUsed, *w.Instance)
165
MassDM:
166
for {
167
if len(memberChan) == 0 {
168
break MassDM
169
}
170
uuid := <-memberChan
171
// Check if already in server, if no, join after delay
172
TokenCheck:
173
for x := 0; x < 3; x++ {
174
r := w.Instance.CheckToken()
175
if r == 200 || r == 204 {
176
w.Valid = true
177
break TokenCheck
178
} else if r == 403 || r == 401 {
179
utilities.LogLocked("Token is locked or invalid %s : %d", w.Instance.CensorToken(), r)
180
continue Token
181
} else {
182
continue TokenCheck
183
}
184
}
185
if !w.Valid {
186
continue Token
187
}
188
var inServer bool
189
ServerCheck:
190
for x := 0; x < 3; x++ {
191
r, err := w.Instance.ServerCheck(serverid)
192
if err != nil {
193
utilities.LogErr("Token %s error while checking if it's present in server %s : %s", w.Instance.CensorToken(), serverid, err)
194
continue ServerCheck
195
}
196
if r == 200 || r == 204 {
197
inServer = true
198
break ServerCheck
199
} else if r == 429 || r >= 500 {
200
time.Sleep(time.Second * 5)
201
continue ServerCheck
202
} else {
203
// Token not in server
204
TimeCheck:
205
for {
206
select {
207
case <-ticker:
208
err := w.Instance.Invite(invite)
209
if err != nil {
210
utilities.LogErr("Token %s error while joining server %s : %s", w.Instance.CensorToken(), serverid, err)
211
continue Token
212
} else {
213
inServer = true
214
break ServerCheck
215
}
216
default:
217
continue TimeCheck
218
219
}
220
}
221
}
222
}
223
if !inServer {
224
continue Token
225
}
226
snowflake, err := w.Instance.OpenChannel(uuid)
227
if err != nil {
228
utilities.LogErr("Token %s error while opening channel %s : %s", w.Instance.CensorToken(), uuid, err)
229
if w.Instance.Quarantined {
230
continue Token
231
}
232
continue MassDM
233
}
234
r, bytes, err := w.Instance.SendMessage(snowflake, uuid)
235
if err != nil {
236
utilities.LogErr("Token %s error while sending message %s : %s", len(completed), w.Instance.CensorToken(), uuid, err)
237
continue MassDM
238
}
239
var resp jsonResponse
240
err = json.Unmarshal(bytes, &resp)
241
if err != nil {
242
utilities.LogErr("Token %s error while unmarshalling message %s : %s", w.Instance.CensorToken(), uuid, err)
243
continue MassDM
244
}
245
if r == 200 {
246
utilities.LogSuccess("[%d] Token %s sent message to %s", len(completed), w.Instance.CensorToken(), uuid)
247
err := utilities.WriteLine("input/completed.txt", uuid)
248
if err != nil {
249
utilities.LogErr("Error writing to completed.txt : %s", err)
250
}
251
completed = append(completed, uuid)
252
} else if resp.Code == 20026 {
253
utilities.LogFailed("Token %s is quarantined", w.Instance.CensorToken())
254
memberChan <- uuid
255
} else if r == 403 && resp.Code == 40003 {
256
utilities.LogInfo("Token %s is ratelimited & being put into timeout", w.Instance.CensorToken())
257
w.TimedOutTill = time.Now().Add(time.Second * time.Duration(cfg.DirectMessage.LongDelay+rand.Intn(cfg.SuspicionAvoidance.RandomRateLimitDelay)))
258
timedOutPool <- w
259
memberChan <- uuid
260
continue Token
261
} else if r == 403 && resp.Code == 50007 {
262
utilities.LogFailed("Token %s failed to DM %s as DMs closed or no mutual servers", w.Instance.CensorToken(), uuid)
263
err := utilities.WriteLine("input/failed.txt", uuid)
264
if err != nil {
265
utilities.LogErr("Error writing to failed.txt : %s", err)
266
}
267
failed = append(failed, uuid)
268
} else if (r == 403 && resp.Code == 40002) || r == 401 || r == 405 {
269
utilities.LogLocked("Token %s is locked", w.Instance.CensorToken())
270
memberChan <- uuid
271
continue Token
272
} else if r == 403 && resp.Code == 50009 {
273
utilities.LogFailed("Token %s failed to DM %s, low verification level", w.Instance.CensorToken(), uuid)
274
err := utilities.WriteLine("input/failed.txt", uuid)
275
if err != nil {
276
utilities.LogErr("Error writing to failed.txt : %s", err)
277
}
278
failed = append(failed, uuid)
279
} else if r == 429 {
280
utilities.LogFailed("Token %s is ratelimited", w.Instance.CensorToken())
281
memberChan <- uuid
282
time.Sleep(60 * time.Second)
283
} else if r == 400 && strings.Contains(string(bytes), "captcha") {
284
utilities.LogFailed("Token %s failed to DM %s, captcha was solved incorrectly", w.Instance.CensorToken(), uuid)
285
memberChan <- uuid
286
continue Token
287
} else {
288
utilities.LogFailed("Token %s failed to DM %s Unknown Status Code %s %s", w.Instance.CensorToken(), uuid, r, string(bytes))
289
err := utilities.WriteLine("input/failed.txt", uuid)
290
if err != nil {
291
utilities.LogErr("Error writing to failed.txt : %s", err)
292
}
293
failed = append(failed, uuid)
294
continue Token
295
}
296
if cfg.SuspicionAvoidance.RandomIndividualDelay != 0 {
297
time.Sleep(time.Duration(cfg.DirectMessage.Delay+rand.Intn(cfg.SuspicionAvoidance.RandomIndividualDelay)) * time.Second)
298
} else {
299
time.Sleep(time.Duration(cfg.DirectMessage.Delay) * time.Second)
300
}
301
302
continue MassDM
303
}
304
}
305
}(i)
306
}
307
wg.Wait()
308
tickerTitle <- true
309
utilities.LogSuccess("Finished sending messages")
310
311
}
312
313
type Worker struct {
314
Instance *instance.Instance
315
TimedOutTill time.Time
316
Valid bool
317
}
318
319
func (w *Worker) isTimedOut() bool {
320
if time.Since(w.TimedOutTill) > 0 {
321
return false
322
} else {
323
return true
324
}
325
}
326
327
func AvailableWorker(timedOutPool chan Worker) Worker {
328
if len(timedOutPool) == 0 {
329
return Worker{}
330
}
331
for w := range timedOutPool {
332
if !w.isTimedOut() {
333
utilities.LogInfo("Re-starting timed-out token %s", w.Instance.CensorToken())
334
return w
335
}
336
}
337
return Worker{}
338
}
339
340
func NewWorker(dormantPool chan Worker) Worker {
341
if len(dormantPool) == 0 {
342
return Worker{}
343
}
344
for w := range dormantPool {
345
return w
346
}
347
return Worker{}
348
}
349
350