Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
V4NSH4J
GitHub Repository: V4NSH4J/discord-mass-DM-GO
Path: blob/main/discord/invite_joiner.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
"fmt"
11
"math/rand"
12
"os"
13
"strings"
14
"time"
15
16
"github.com/V4NSH4J/discord-mass-dm-GO/instance"
17
"github.com/V4NSH4J/discord-mass-dm-GO/utilities"
18
"github.com/zenthangplus/goccm"
19
)
20
21
func LaunchinviteJoiner() {
22
utilities.PrintMenu([]string{"Single Invite", "Multiple Invites from File"})
23
invitechoice := utilities.UserInputInteger("Enter your choice:")
24
if invitechoice != 1 && invitechoice != 2 {
25
utilities.LogErr("Invalid choice")
26
return
27
}
28
switch invitechoice {
29
case 1:
30
cfg, instances, err := instance.GetEverything()
31
if err != nil {
32
utilities.LogErr("Error while getting config or instances %s", err)
33
}
34
var tokenFile, jointFile, failedFile, reactedFile string
35
if cfg.OtherSettings.Logs {
36
path := fmt.Sprintf(`logs/invite_joiner/DMDGO-IJ-%s-%s`, time.Now().Format(`2006-01-02 15-04-05`), utilities.RandStringBytes(5))
37
err := os.MkdirAll(path, 0755)
38
if err != nil && !os.IsExist(err) {
39
utilities.LogErr("Error creating logs directory: %s", err)
40
utilities.ExitSafely()
41
}
42
tokenFileX, err := os.Create(fmt.Sprintf(`%s/token.txt`, path))
43
if err != nil {
44
utilities.LogErr("Error creating token file: %s", err)
45
utilities.ExitSafely()
46
}
47
tokenFileX.Close()
48
jointFileX, err := os.Create(fmt.Sprintf(`%s/joint.txt`, path))
49
if err != nil {
50
utilities.LogErr("Error creating joint file: %s", err)
51
utilities.ExitSafely()
52
}
53
jointFileX.Close()
54
failedFileX, err := os.Create(fmt.Sprintf(`%s/failed.txt`, path))
55
if err != nil {
56
utilities.LogErr("Error creating failed file: %s", err)
57
utilities.ExitSafely()
58
}
59
failedFileX.Close()
60
reactedFileX, err := os.Create(fmt.Sprintf(`%s/reacted.txt`, path))
61
if err != nil {
62
utilities.LogErr("Error creating reacted file: %s", err)
63
utilities.ExitSafely()
64
}
65
tokenFile, jointFile, failedFile, reactedFile = tokenFileX.Name(), jointFileX.Name(), failedFileX.Name(), reactedFileX.Name()
66
for i := 0; i < len(instances); i++ {
67
instances[i].WriteInstanceToFile(tokenFile)
68
}
69
}
70
71
invite := utilities.UserInput("Enter your Invite Code or Link:")
72
invite = processInvite(invite)
73
threads := utilities.UserInputInteger("Enter number of threads (0 for maximum):")
74
75
if threads > len(instances) {
76
threads = len(instances)
77
}
78
if threads == 0 {
79
threads = len(instances)
80
}
81
verif := utilities.UserInputInteger("Use additional adding reaction verification passing. 0) No 1) Yes")
82
var channelid string
83
var msgid string
84
var emoji string
85
86
if verif == 1 {
87
channelid = utilities.UserInput("ID of the channel with verification message")
88
89
msgid = utilities.UserInput("ID of the message with verification reaction")
90
emoji = utilities.UserInput("Enter emoji")
91
92
}
93
base := utilities.UserInputInteger("Enter base delay per thread for joining in seconds: ")
94
random := utilities.UserInputInteger("Enter random delay per thread for joining in seconds: ")
95
var delay int
96
if random > 0 {
97
delay = base + rand.Intn(random)
98
} else {
99
delay = base
100
}
101
c := goccm.New(threads)
102
for i := 0; i < len(instances); i++ {
103
c.Wait()
104
go func(i int) {
105
err := instances[i].Invite(invite)
106
if err != nil {
107
if cfg.OtherSettings.Logs {
108
utilities.WriteLinesPath(failedFile, instances[i].Token)
109
}
110
} else {
111
if cfg.OtherSettings.Logs {
112
utilities.WriteLinesPath(jointFile, instances[i].Token)
113
}
114
}
115
if verif == 1 {
116
err := instances[i].React(channelid, msgid, emoji)
117
if err != nil {
118
utilities.LogFailed("%v failed to react to %v", instances[i].CensorToken(), emoji)
119
} else {
120
utilities.LogSuccess("%v reacted to the emoji %v", instances[i].CensorToken(), emoji)
121
if cfg.OtherSettings.Logs {
122
utilities.WriteLinesPath(reactedFile, instances[i].Token)
123
}
124
}
125
126
}
127
time.Sleep(time.Duration(delay) * time.Second)
128
c.Done()
129
130
}(i)
131
}
132
c.WaitAllDone()
133
utilities.LogSuccess("All Threads Completed!")
134
135
case 2:
136
cfg, instances, err := instance.GetEverything()
137
if err != nil {
138
utilities.LogErr("Error while getting config or instances %s", err)
139
}
140
var tokenFile string
141
path := fmt.Sprintf(`logs/multi_joiner/DMDGO-MJ-%s-%s`, time.Now().Format(`2006-01-02 15-04-05`), utilities.RandStringBytes(5))
142
if cfg.OtherSettings.Logs {
143
err := os.MkdirAll(path, 0755)
144
if err != nil && !os.IsExist(err) {
145
utilities.LogErr("Error creating logs directory: %s", err)
146
utilities.ExitSafely()
147
}
148
tokenFileX, err := os.Create(fmt.Sprintf(`%s/token.txt`, path))
149
if err != nil {
150
utilities.LogErr("Error creating token file: %s", err)
151
utilities.ExitSafely()
152
}
153
tokenFileX.Close()
154
tokenFile = tokenFileX.Name()
155
for i := 0; i < len(instances); i++ {
156
instances[i].WriteInstanceToFile(tokenFile)
157
}
158
}
159
invites, err := utilities.ReadLines("invite.txt")
160
if err != nil {
161
utilities.LogErr("Error while opening invite.txt file %s", err)
162
return
163
}
164
var inviteFiles []string
165
if cfg.OtherSettings.Logs {
166
for i := 0; i < len(invites); i++ {
167
f, err := os.Create(fmt.Sprintf(`%s/%s.txt`, path, processInvite(invites[i])))
168
if err != nil {
169
utilities.LogErr("Error creating invite file %v: %s", invites[i], err)
170
}
171
inviteFiles = append(inviteFiles, f.Name())
172
}
173
}
174
175
if len(invites) == 0 {
176
utilities.LogErr("No invites found in invite.txt")
177
return
178
}
179
delay := utilities.UserInputInteger("Enter delay between 2 consecutive joins by 1 token in seconds: ")
180
threads := utilities.UserInputInteger("Enter number of threads (0 for maximum):")
181
if threads > len(instances) {
182
threads = len(instances)
183
}
184
if threads == 0 {
185
threads = len(instances)
186
}
187
c := goccm.New(threads)
188
for i := 0; i < len(instances); i++ {
189
time.Sleep(time.Duration(cfg.DirectMessage.Offset) * time.Millisecond)
190
c.Wait()
191
go func(i int) {
192
for j := 0; j < len(invites); j++ {
193
err := instances[i].Invite(processInvite(invites[j]))
194
if err == nil {
195
if cfg.OtherSettings.Logs {
196
utilities.WriteLinesPath(inviteFiles[j], instances[i].Token)
197
}
198
}
199
time.Sleep(time.Duration(delay) * time.Second)
200
}
201
c.Done()
202
}(i)
203
}
204
c.WaitAllDone()
205
utilities.LogSuccess("All Threads Completed!")
206
}
207
}
208
209
func processInvite(rawInvite string) string {
210
if !strings.Contains(rawInvite, "/") {
211
return rawInvite
212
} else {
213
return strings.Split(rawInvite, "/")[len(strings.Split(rawInvite, "/"))-1]
214
}
215
}
216
217