@imaentity/selfjs 3.1.0 β 3.3.0-b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.log +14 -6
- package/docs.md +11 -2
- package/package.json +2 -1
- package/self.js +119 -89
package/changelog.log
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
v2.9.11
|
|
2
2
|
Added:
|
|
3
3
|
changelog.log
|
|
4
4
|
|
|
5
5
|
Changed:
|
|
6
6
|
Client.setStatus now has default params
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
v2.10.11
|
|
9
9
|
Added:
|
|
10
|
-
|
|
10
|
+
A docs link to README.md
|
|
11
11
|
|
|
12
12
|
Changed:
|
|
13
13
|
Structure of docs.md
|
|
@@ -15,15 +15,23 @@ V2.10.11
|
|
|
15
15
|
Removed:
|
|
16
16
|
The default option in the status enum
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
v3.0.0
|
|
19
19
|
Changed:
|
|
20
20
|
Overhaul to the structure of self.js
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
v3.1.0
|
|
23
23
|
Added:
|
|
24
24
|
Webhooks can now send files
|
|
25
25
|
Client.getUserProfile to fetch user profiles
|
|
26
26
|
Client.createServer to create a server
|
|
27
27
|
|
|
28
28
|
Changed:
|
|
29
|
-
Client.getUser now gets the actual user instead of their profile
|
|
29
|
+
Client.getUser now gets the actual user instead of their profile
|
|
30
|
+
|
|
31
|
+
v3.2.0
|
|
32
|
+
Added:
|
|
33
|
+
Client.refreshURL to refresh expired urls
|
|
34
|
+
|
|
35
|
+
v3.3.0
|
|
36
|
+
Added:
|
|
37
|
+
Client websockets now auto-reconnect after a failed heartbeat
|
package/docs.md
CHANGED
|
@@ -174,11 +174,11 @@ Welcome To SelfJS Documentation
|
|
|
174
174
|
|
|
175
175
|
+ ### π€ getUserProfile
|
|
176
176
|
Gets the profile of a user.
|
|
177
|
-
>Paramaters: userID (String)
|
|
177
|
+
>Paramaters: userID (String), mutualGuilds (Boolean | false)
|
|
178
178
|
|
|
179
179
|
<br>Example:
|
|
180
180
|
```javascript
|
|
181
|
-
client.getUserProfile("01234567891011121314");
|
|
181
|
+
client.getUserProfile("01234567891011121314", true);
|
|
182
182
|
```
|
|
183
183
|
|
|
184
184
|
+ ### π€ getUserData
|
|
@@ -468,4 +468,13 @@ Welcome To SelfJS Documentation
|
|
|
468
468
|
<br>Example:
|
|
469
469
|
```javascript
|
|
470
470
|
client.transferOwnership("01234567891011121314", "41312111019876543210");
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
+ ### π refreshURL
|
|
474
|
+
Refreshes an expired attachment url.
|
|
475
|
+
>Paramaters: url (String)
|
|
476
|
+
|
|
477
|
+
<br>Example:
|
|
478
|
+
```javascript
|
|
479
|
+
client.refreshURL();
|
|
471
480
|
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@imaentity/selfjs",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0b",
|
|
4
4
|
"description": "Breaking Discord's TOS to bot user accounts.",
|
|
5
5
|
"main": "self.js",
|
|
6
6
|
"repository": {
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
},
|
|
20
20
|
"homepage": "https://github.com/ImaEntity/SelfJS#readme",
|
|
21
21
|
"dependencies": {
|
|
22
|
+
"publish": "^0.6.0",
|
|
22
23
|
"ws": "^7.5.4"
|
|
23
24
|
}
|
|
24
25
|
}
|
package/self.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @name SelfJS
|
|
3
3
|
* @description Breaking Discord's TOS to bot user accounts.
|
|
4
4
|
* @author ΠΠΌΠ±Π΅ΡΡ
|
|
5
|
-
* @version 3.
|
|
5
|
+
* @version 3.3.0b
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
const https = require("https");
|
|
@@ -129,6 +129,111 @@ module.exports = {
|
|
|
129
129
|
this.latency = null;
|
|
130
130
|
this.beforeHB = null;
|
|
131
131
|
this.hearbeatInterval = null;
|
|
132
|
+
this.receivedLastHB = true;
|
|
133
|
+
|
|
134
|
+
// Session, token, sequence
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async onSockMsg(payload) {
|
|
138
|
+
payload = JSON.parse(payload.toString());
|
|
139
|
+
|
|
140
|
+
if(payload.op == 10) {
|
|
141
|
+
if(logMsgs) console.log("[MainControlSocket] Hello ACK received");
|
|
142
|
+
|
|
143
|
+
if(logMsgs) console.log("[MainControlSocket] Sending heartbeat");
|
|
144
|
+
this.beforeHB = Date.now();
|
|
145
|
+
this.socket.send(module.exports.jsonEncode({op: 1, d: this.sequenceID}));
|
|
146
|
+
|
|
147
|
+
this.hearbeatInterval = setInterval(function() {
|
|
148
|
+
if(logMsgs) console.log("[MainControlSocket] Sending heartbeat");
|
|
149
|
+
this.beforeHB = Date.now();
|
|
150
|
+
this.socket.send(module.exports.jsonEncode({op: 1, d: this.sequenceID}));
|
|
151
|
+
|
|
152
|
+
if(!this.receivedLastHB) {
|
|
153
|
+
if(logMsgs) console.log("[MainControlSocket] Heartbeat ACK failed, reconnecting");
|
|
154
|
+
|
|
155
|
+
this.receivedLastHB = true;
|
|
156
|
+
this.reconnect(this.resumeURL, this.token, this.sessionID, this.sequenceID);
|
|
157
|
+
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
this.receivedLastHB = false;
|
|
162
|
+
}.bind(this), payload.d.heartbeat_interval);
|
|
163
|
+
} else if(payload.op == 11) {
|
|
164
|
+
if(logMsgs) console.log("[MainControlSocket] Heartbeat ACK received");
|
|
165
|
+
this.latency = Date.now() - this.beforeHB;
|
|
166
|
+
|
|
167
|
+
this.receivedLastHB = true;
|
|
168
|
+
} else if(payload.op == 0) {
|
|
169
|
+
this.sequenceID = payload.s;
|
|
170
|
+
|
|
171
|
+
if(payload.t == "READY") {
|
|
172
|
+
this.userID = payload.d.user.id;
|
|
173
|
+
this.sessionID = payload.d.session_id;
|
|
174
|
+
this.resumeURL = payload.d.resume_gateway_url;
|
|
175
|
+
|
|
176
|
+
if(logMsgs) console.log("[MainControlSocket] Ready message received");
|
|
177
|
+
resolve();
|
|
178
|
+
} else if(payload.t == "MESSAGE_CREATE") {
|
|
179
|
+
const ackData = module.exports.jsonEncode({token: null});
|
|
180
|
+
const options = {
|
|
181
|
+
...module.exports.APIBaseOpt,
|
|
182
|
+
method: "POST",
|
|
183
|
+
path: `/api/v10/channels/${payload.d.channel_id}/messages/${payload.d.id}/ack`,
|
|
184
|
+
headers: {
|
|
185
|
+
"Authorization": this.token,
|
|
186
|
+
"Content-Type": "application/json",
|
|
187
|
+
"Content-Length": ackData.length
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
const req = https.request(options);
|
|
192
|
+
|
|
193
|
+
req.write(ackData);
|
|
194
|
+
req.end();
|
|
195
|
+
|
|
196
|
+
try {payload.d.author.self = payload.d.author.id == this.userID;} catch(e) {}
|
|
197
|
+
|
|
198
|
+
if(typeof this.onMessageFunction == "function") this.onMessageFunction(payload.d);
|
|
199
|
+
} else if(payload.t == "MESSAGE_UPDATE") {
|
|
200
|
+
try {payload.d.author.self = payload.d.author.id == this.userID;} catch(e) {}
|
|
201
|
+
|
|
202
|
+
if(typeof this.onEditFunction == "function") this.onEditFunction(payload.d);
|
|
203
|
+
} else if(payload.t == "PRESENCE_UPDATE") {
|
|
204
|
+
try {payload.d.author.self = payload.d.author.id == this.userID;} catch(e) {}
|
|
205
|
+
|
|
206
|
+
if(typeof this.statusUpdateFunction == "function") this.statusUpdateFunction(payload.d);
|
|
207
|
+
} else if(payload.t == "MESSAGE_DELETE") {
|
|
208
|
+
if(typeof this.onDeleteFunction == "function") this.onDeleteFunction(payload.d);
|
|
209
|
+
}
|
|
210
|
+
} else if(payload.op == 7) {
|
|
211
|
+
if(logMsgs) console.log("[MainControlSocket] Reconnect message received");
|
|
212
|
+
|
|
213
|
+
this.receivedLastHB = true;
|
|
214
|
+
this.reconnect(this.resumeURL, this.token, this.sessionID, this.sequenceID);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
reconnect(resumeURL, token, sessionID, sequence) {
|
|
219
|
+
this.socket.terminate();
|
|
220
|
+
if(this.hearbeatInterval)
|
|
221
|
+
clearInterval(this.hearbeatInterval);
|
|
222
|
+
|
|
223
|
+
this.socket = new ws(resumeURL);
|
|
224
|
+
|
|
225
|
+
this.socket.on("open", function() {
|
|
226
|
+
this.socket.send(module.exports.jsonEncode({
|
|
227
|
+
op: 6,
|
|
228
|
+
d: {
|
|
229
|
+
token: token,
|
|
230
|
+
session_id: sessionID,
|
|
231
|
+
seq: sequence
|
|
232
|
+
}
|
|
233
|
+
}));
|
|
234
|
+
}.bind(this));
|
|
235
|
+
|
|
236
|
+
this.socket.on("message", onSockMsg);
|
|
132
237
|
}
|
|
133
238
|
|
|
134
239
|
login(token, isMobile = false, logMsgs = false) {
|
|
@@ -154,92 +259,7 @@ module.exports = {
|
|
|
154
259
|
}));
|
|
155
260
|
}.bind(this));
|
|
156
261
|
|
|
157
|
-
|
|
158
|
-
payload = JSON.parse(payload.toString());
|
|
159
|
-
|
|
160
|
-
if(payload.op == 10) {
|
|
161
|
-
if(logMsgs) console.log("[MainControlSocket] Hello ACK received");
|
|
162
|
-
|
|
163
|
-
if(logMsgs) console.log("[MainControlSocket] Sending heartbeat");
|
|
164
|
-
this.beforeHB = Date.now();
|
|
165
|
-
this.socket.send(module.exports.jsonEncode({op: 1, d: this.sequenceID}));
|
|
166
|
-
|
|
167
|
-
this.hearbeatInterval = setInterval(function() {
|
|
168
|
-
if(logMsgs) console.log("[MainControlSocket] Sending heartbeat");
|
|
169
|
-
this.beforeHB = Date.now();
|
|
170
|
-
this.socket.send(module.exports.jsonEncode({op: 1, d: this.sequenceID}));
|
|
171
|
-
}.bind(this), payload.d.heartbeat_interval);
|
|
172
|
-
} else if(payload.op == 11) {
|
|
173
|
-
if(logMsgs) console.log("[MainControlSocket] Heartbeat ACK received");
|
|
174
|
-
this.latency = Date.now() - this.beforeHB;
|
|
175
|
-
} else if(payload.op == 0) {
|
|
176
|
-
this.sequenceID = payload.s;
|
|
177
|
-
|
|
178
|
-
if(payload.t == "READY") {
|
|
179
|
-
this.userID = payload.d.user.id;
|
|
180
|
-
this.sessionID = payload.d.session_id;
|
|
181
|
-
this.resumeURL = payload.d.resume_gateway_url;
|
|
182
|
-
|
|
183
|
-
if(logMsgs) console.log("[MainControlSocket] Ready message received");
|
|
184
|
-
resolve();
|
|
185
|
-
} else if(payload.t == "MESSAGE_CREATE") {
|
|
186
|
-
const ackData = module.exports.jsonEncode({token: null});
|
|
187
|
-
const options = {
|
|
188
|
-
...module.exports.APIBaseOpt,
|
|
189
|
-
method: "POST",
|
|
190
|
-
path: `/api/v10/channels/${payload.d.channel_id}/messages/${payload.d.id}/ack`,
|
|
191
|
-
headers: {
|
|
192
|
-
"Authorization": this.token,
|
|
193
|
-
"Content-Type": "application/json",
|
|
194
|
-
"Content-Length": ackData.length
|
|
195
|
-
}
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
const req = https.request(options);
|
|
199
|
-
|
|
200
|
-
req.write(ackData);
|
|
201
|
-
req.end();
|
|
202
|
-
|
|
203
|
-
try {payload.d.author.self = payload.d.author.id == this.userID;} catch(e) {}
|
|
204
|
-
|
|
205
|
-
if(typeof this.onMessageFunction == "function") this.onMessageFunction(payload.d);
|
|
206
|
-
} else if(payload.t == "MESSAGE_UPDATE") {
|
|
207
|
-
try {payload.d.author.self = payload.d.author.id == this.userID;} catch(e) {}
|
|
208
|
-
|
|
209
|
-
if(typeof this.onEditFunction == "function") this.onEditFunction(payload.d);
|
|
210
|
-
} else if(payload.t == "PRESENCE_UPDATE") {
|
|
211
|
-
try {payload.d.author.self = payload.d.author.id == this.userID;} catch(e) {}
|
|
212
|
-
|
|
213
|
-
if(typeof this.statusUpdateFunction == "function") this.statusUpdateFunction(payload.d);
|
|
214
|
-
} else if(payload.t == "MESSAGE_DELETE") {
|
|
215
|
-
if(typeof this.onDeleteFunction == "function") this.onDeleteFunction(payload.d);
|
|
216
|
-
}
|
|
217
|
-
} else if(payload.op == 7) {
|
|
218
|
-
if(logMsgs) console.log("[MainControlSocket] Reconnect message received");
|
|
219
|
-
|
|
220
|
-
if(this.hearbeatInterval) clearInterval(this.hearbeatInterval);
|
|
221
|
-
this.socket.terminate();
|
|
222
|
-
|
|
223
|
-
this.socket = new ws("wss://gateway.discord.gg?v=10&encoding=json");
|
|
224
|
-
|
|
225
|
-
this.socket.on("open", function() {
|
|
226
|
-
if(logMsgs) console.log("[MainControlSocket] Resume message sent");
|
|
227
|
-
|
|
228
|
-
this.socket.send(module.exports.jsonEncode({
|
|
229
|
-
op: 6,
|
|
230
|
-
d: {
|
|
231
|
-
token: this.token,
|
|
232
|
-
session_id: this.sessionID,
|
|
233
|
-
seq: this.sequenceID
|
|
234
|
-
}
|
|
235
|
-
}));
|
|
236
|
-
}.bind(this));
|
|
237
|
-
|
|
238
|
-
this.socket.on("message", socketMessageFunction);
|
|
239
|
-
}
|
|
240
|
-
}.bind(this);
|
|
241
|
-
|
|
242
|
-
this.socket.on("message", socketMessageFunction);
|
|
262
|
+
this.socket.on("message", onSockMsg);
|
|
243
263
|
}.bind(this));
|
|
244
264
|
}
|
|
245
265
|
|
|
@@ -482,10 +502,10 @@ module.exports = {
|
|
|
482
502
|
});
|
|
483
503
|
}
|
|
484
504
|
|
|
485
|
-
async getUserProfile(userID) {
|
|
505
|
+
async getUserProfile(userID, mutualGuilds=false) {
|
|
486
506
|
return await this.makeRequest({
|
|
487
507
|
method: "GET",
|
|
488
|
-
path: `/api/v10/users/${userID}/profile?with_mutual_guilds
|
|
508
|
+
path: `/api/v10/users/${userID}/profile?with_mutual_guilds=${mutualGuilds}`
|
|
489
509
|
});
|
|
490
510
|
}
|
|
491
511
|
|
|
@@ -777,5 +797,15 @@ module.exports = {
|
|
|
777
797
|
}
|
|
778
798
|
});
|
|
779
799
|
}
|
|
800
|
+
|
|
801
|
+
async refreshURL(url) {
|
|
802
|
+
return await this.makeRequest({
|
|
803
|
+
method: "POST",
|
|
804
|
+
path: "/api/v10/attachments/refresh-urls",
|
|
805
|
+
body: {
|
|
806
|
+
attachment_urls: [url]
|
|
807
|
+
}
|
|
808
|
+
});
|
|
809
|
+
}
|
|
780
810
|
}
|
|
781
811
|
};
|