piixishstream 0.0.0-stage → 1.0.2
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/README.md +124 -2
- package/dist/client/GatewayEvents.d.ts +30 -0
- package/dist/client/GatewayEvents.js +2 -0
- package/dist/client/GatewayEvents.js.map +1 -0
- package/dist/client/GatewayOpCodes.d.ts +40 -0
- package/dist/client/GatewayOpCodes.js +42 -0
- package/dist/client/GatewayOpCodes.js.map +1 -0
- package/dist/client/Streamer.d.ts +30 -0
- package/dist/client/Streamer.js +188 -0
- package/dist/client/Streamer.js.map +1 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/processing/AnnexBBitstreamReaderWriter.d.ts +23 -0
- package/dist/client/processing/AnnexBBitstreamReaderWriter.js +149 -0
- package/dist/client/processing/AnnexBBitstreamReaderWriter.js.map +1 -0
- package/dist/client/processing/AnnexBHelper.d.ts +93 -0
- package/dist/client/processing/AnnexBHelper.js +127 -0
- package/dist/client/processing/AnnexBHelper.js.map +1 -0
- package/dist/client/processing/SPSVUIRewriter.d.ts +1 -0
- package/dist/client/processing/SPSVUIRewriter.js +297 -0
- package/dist/client/processing/SPSVUIRewriter.js.map +1 -0
- package/dist/client/voice/BaseMediaConnection.d.ts +80 -0
- package/dist/client/voice/BaseMediaConnection.js +552 -0
- package/dist/client/voice/BaseMediaConnection.js.map +1 -0
- package/dist/client/voice/CodecPayloadType.d.ts +59 -0
- package/dist/client/voice/CodecPayloadType.js +60 -0
- package/dist/client/voice/CodecPayloadType.js.map +1 -0
- package/dist/client/voice/StreamConnection.d.ts +11 -0
- package/dist/client/voice/StreamConnection.js +34 -0
- package/dist/client/voice/StreamConnection.js.map +1 -0
- package/dist/client/voice/VoiceConnection.d.ts +8 -0
- package/dist/client/voice/VoiceConnection.js +15 -0
- package/dist/client/voice/VoiceConnection.js.map +1 -0
- package/dist/client/voice/VoiceMessageTypes.d.ts +178 -0
- package/dist/client/voice/VoiceMessageTypes.js +2 -0
- package/dist/client/voice/VoiceMessageTypes.js.map +1 -0
- package/dist/client/voice/VoiceOpCodes.d.ts +35 -0
- package/dist/client/voice/VoiceOpCodes.js +38 -0
- package/dist/client/voice/VoiceOpCodes.js.map +1 -0
- package/dist/client/voice/WebRtcWrapper.d.ts +23 -0
- package/dist/client/voice/WebRtcWrapper.js +159 -0
- package/dist/client/voice/WebRtcWrapper.js.map +1 -0
- package/dist/client/voice/index.d.ts +4 -0
- package/dist/client/voice/index.js +6 -0
- package/dist/client/voice/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/media/AudioStream.d.ts +7 -0
- package/dist/media/AudioStream.js +12 -0
- package/dist/media/AudioStream.js.map +1 -0
- package/dist/media/BaseMediaStream.d.ts +31 -0
- package/dist/media/BaseMediaStream.js +164 -0
- package/dist/media/BaseMediaStream.js.map +1 -0
- package/dist/media/LibavCodecId.d.ts +541 -0
- package/dist/media/LibavCodecId.js +553 -0
- package/dist/media/LibavCodecId.js.map +1 -0
- package/dist/media/LibavDecoder.d.ts +5 -0
- package/dist/media/LibavDecoder.js +43 -0
- package/dist/media/LibavDecoder.js.map +1 -0
- package/dist/media/LibavDemuxer.d.ts +44 -0
- package/dist/media/LibavDemuxer.js +231 -0
- package/dist/media/LibavDemuxer.js.map +1 -0
- package/dist/media/VideoStream.d.ts +7 -0
- package/dist/media/VideoStream.js +12 -0
- package/dist/media/VideoStream.js.map +1 -0
- package/dist/media/encoders/index.d.ts +26 -0
- package/dist/media/encoders/index.js +12 -0
- package/dist/media/encoders/index.js.map +1 -0
- package/dist/media/encoders/merge.d.ts +3 -0
- package/dist/media/encoders/merge.js +10 -0
- package/dist/media/encoders/merge.js.map +1 -0
- package/dist/media/encoders/nvenc.d.ts +10 -0
- package/dist/media/encoders/nvenc.js +23 -0
- package/dist/media/encoders/nvenc.js.map +1 -0
- package/dist/media/encoders/software.d.ts +17 -0
- package/dist/media/encoders/software.js +31 -0
- package/dist/media/encoders/software.js.map +1 -0
- package/dist/media/encoders/vaapi.d.ts +6 -0
- package/dist/media/encoders/vaapi.js +22 -0
- package/dist/media/encoders/vaapi.js.map +1 -0
- package/dist/media/index.d.ts +4 -0
- package/dist/media/index.js +5 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/newApi.d.ts +130 -0
- package/dist/media/newApi.js +409 -0
- package/dist/media/newApi.js.map +1 -0
- package/dist/utils.d.ts +25 -0
- package/dist/utils.js +65 -0
- package/dist/utils.js.map +1 -0
- package/package.json +82 -5
- package/src/client/GatewayEvents.ts +48 -0
- package/src/client/GatewayOpCodes.ts +40 -0
- package/src/client/Streamer.ts +259 -0
- package/src/client/index.ts +3 -0
- package/src/client/processing/AnnexBBitstreamReaderWriter.ts +148 -0
- package/src/client/processing/AnnexBHelper.ts +134 -0
- package/src/client/processing/SPSVUIRewriter.ts +332 -0
- package/src/client/voice/BaseMediaConnection.ts +639 -0
- package/src/client/voice/CodecPayloadType.ts +59 -0
- package/src/client/voice/MediaUdp.ts.bak +171 -0
- package/src/client/voice/StreamConnection.ts +38 -0
- package/src/client/voice/VoiceConnection.ts +19 -0
- package/src/client/voice/VoiceMessageTypes.ts +263 -0
- package/src/client/voice/VoiceOpCodes.ts +36 -0
- package/src/client/voice/WebRtcWrapper.ts +218 -0
- package/src/client/voice/index.ts +5 -0
- package/src/index.ts +3 -0
- package/src/media/AudioStream.ts +18 -0
- package/src/media/BaseMediaStream.ts +198 -0
- package/src/media/LibavCodecId.ts +564 -0
- package/src/media/LibavDecoder.ts +47 -0
- package/src/media/LibavDemuxer.ts +293 -0
- package/src/media/VideoStream.ts +17 -0
- package/src/media/encoders/index.ts +27 -0
- package/src/media/encoders/merge.ts +14 -0
- package/src/media/encoders/nvenc.ts +38 -0
- package/src/media/encoders/software.ts +76 -0
- package/src/media/encoders/vaapi.ts +29 -0
- package/src/media/index.ts +4 -0
- package/src/media/newApi.ts +642 -0
- package/src/utils.ts +101 -0
package/README.md
CHANGED
|
@@ -1,3 +1,125 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Piixish Stream (v1.0.0)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[!CAUTION]
|
|
4
|
+
Using any kind of automation programs on your account can result in your account getting permanently banned by Discord. **Use at your own risk.**
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## ⚡ FIXES (Community Patch by Piixish)
|
|
9
|
+
|
|
10
|
+
This version introduces critical performance and stability patches to handle Discord's recent WebRTC DAVE (End-to-End Encryption) updates:
|
|
11
|
+
|
|
12
|
+
- **Unlocked FPS Locking:** Removed the hardcoded minimum of 60 FPS in `BaseMediaConnection`. The library now supports any requested framerate (30, 25, 24, etc.) without forcibly upscaling, which drastically reduces CPU usage and "Sync Lag".
|
|
13
|
+
- **DAVE Encryption Stability:** Disabled the `PacingHandler` synchronous thread-blocking which previously caused `700% frametime` spikes during AES-GCM encryption.
|
|
14
|
+
- **Network Flood Prevention:** Disabled aggressive `SyncStream` catch-up logic to prevent UDP socket overflows and sudden voice disconnects.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## About this Fork
|
|
19
|
+
|
|
20
|
+
This package is a community-driven, performance-focused fork of the fantastic `@dank074/discord-video-stream` module.
|
|
21
|
+
|
|
22
|
+
A massive thank you to `dank074` and all the original contributors for laying down the incredible foundation that makes self-bot video streaming possible on Discord! This fork was created purely for fun and to provide a highly stable alternative for the self-bot community, specifically tailored for extreme high-framerate environments.
|
|
23
|
+
|
|
24
|
+
### Why this fork?
|
|
25
|
+
With Discord's recent WebRTC DAVE (End-to-End Encryption) protocol updates, heavy computations (like native AES-GCM encryption) were introduced to the pipeline. While the original module is brilliant, a few of its native safety mechanisms inadvertently caused heavy event-loop execution limits in Node.js when processing high-bitrate (e.g. 1080p/60FPS) feeds, resulting in `700% frametime` lag and sudden voice disconnects.
|
|
26
|
+
|
|
27
|
+
We gently refactored a few structural limits to let your hardware breathe!
|
|
28
|
+
|
|
29
|
+
### What's been modified? (by Piixish)
|
|
30
|
+
1. **Disabled SyncStream Catchup Logic:** The video stream operates flawlessly on its native hardware-driven timestamp clock (`FRC / PTS`). It no longer drops frame-pacing boundaries to unnaturally chase audio loops. This completely solves the WebRTC socket network flood crashes (the infamous "5-second stream drop"). A/V sync remains pixel-perfect thanks to FFmpeg's `.nut` multiplexing.
|
|
31
|
+
2. **Removed Node.js Thread-lock Sleep Timers:** Disabled the `PacingHandler` network wrapper to prevent the host CPU from forcefully sleeping mid-tick. This eliminates the massive DAVE encryption lag spikes, enabling raw hardware-accelerated WebRTC routing directly into Discord.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Features
|
|
36
|
+
- Playing video & audio in a voice channel (**Go Live** or **Webcam** video)
|
|
37
|
+
- Support for **H.264** and **H.265** codecs
|
|
38
|
+
- RTP and **RTCP** support
|
|
39
|
+
- Full **End-to-End Encryption (DAVE)** compatibility
|
|
40
|
+
- Optimized for high-bitrate performance on self-bots
|
|
41
|
+
|
|
42
|
+
## Requirements
|
|
43
|
+
For full functionality, this library requires an **FFmpeg** build with `libzmq` enabled.
|
|
44
|
+
- **Windows & Linux:** [BtbN's FFmpeg Builds](https://github.com/BtbN/FFmpeg-Builds/releases)
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Installation
|
|
49
|
+
Install the package alongside its peer-dependency `discord.js-selfbot-v13`:
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
npm install piixishstream@latest
|
|
53
|
+
npm install discord.js-selfbot-v13@latest
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
> [!IMPORTANT]
|
|
57
|
+
> This library makes use of native dependencies (`node-av` and `node-datachannel`). If you use package managers that don't run install scripts by default (pnpm, bun, etc.), you'll need to manually allow them.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Usage Guide
|
|
62
|
+
|
|
63
|
+
### 1. Initialize Streamer
|
|
64
|
+
```javascript
|
|
65
|
+
import { Client } from "discord.js-selfbot-v13";
|
|
66
|
+
import { Streamer } from 'piixishstream';
|
|
67
|
+
|
|
68
|
+
const streamer = new Streamer(new Client());
|
|
69
|
+
await streamer.client.login('YOUR_TOKEN');
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 2. Join a Voice Channel
|
|
73
|
+
```javascript
|
|
74
|
+
await streamer.joinVoice("GUILD_ID", "CHANNEL_ID");
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 3. Start Sending Media
|
|
78
|
+
```javascript
|
|
79
|
+
import { prepareStream, playStream, Utils, Encoders } from "piixishstream"
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
// NVENC (Hardware Acceleration) is supported!
|
|
83
|
+
let encoder = Encoders.nvenc({
|
|
84
|
+
preset: "p1",
|
|
85
|
+
rc: "cbr"
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const { command, output } = prepareStream("VIDEO_URL_OR_FILE", {
|
|
89
|
+
encoder,
|
|
90
|
+
height: 1080,
|
|
91
|
+
frameRate: 30, // Now truly respects values below 60!
|
|
92
|
+
bitrateVideo: 5000,
|
|
93
|
+
videoCodec: Utils.normalizeVideoCodec("H264"),
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
await playStream(output, streamer, {
|
|
97
|
+
type: "go-live" // Use "camera" for webcam mode
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
} catch (e) {
|
|
101
|
+
console.error(e);
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Documentation & API
|
|
108
|
+
|
|
109
|
+
### `prepareStream` Options
|
|
110
|
+
| Option | Description |
|
|
111
|
+
| :--- | :--- |
|
|
112
|
+
| `width` / `height` | Output resolution |
|
|
113
|
+
| `frameRate` | Target FPS (Supports 1-60) |
|
|
114
|
+
| `bitrateVideo` | Average bitrate in kbps |
|
|
115
|
+
| `hardwareAcceleratedDecoding` | Enable GPU decoding |
|
|
116
|
+
| `videoCodec` | Supports H264, H265, VP8 |
|
|
117
|
+
|
|
118
|
+
### Performance Tips
|
|
119
|
+
- Use `NVENC` if you have an NVIDIA GPU to offload encryption.
|
|
120
|
+
- Keep `frameRate` at 30 for the best performance/quality ratio on Discord.
|
|
121
|
+
- Ensure your source resolution matches the output to avoid extra scaling.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
A massive thank you to **dank074** for the original foundation! This fork is maintained for fun and for the community. ❤️
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
type GatewayEventGeneric<Type extends string = string, Data = unknown> = {
|
|
2
|
+
t: Type;
|
|
3
|
+
d: Data;
|
|
4
|
+
};
|
|
5
|
+
export declare namespace GatewayEvent {
|
|
6
|
+
type VoiceStateUpdate = GatewayEventGeneric<"VOICE_STATE_UPDATE", {
|
|
7
|
+
user_id: string;
|
|
8
|
+
session_id: string;
|
|
9
|
+
}>;
|
|
10
|
+
type VoiceServerUpdate = GatewayEventGeneric<"VOICE_SERVER_UPDATE", {
|
|
11
|
+
guild_id: string;
|
|
12
|
+
channel_id?: string;
|
|
13
|
+
endpoint: string;
|
|
14
|
+
token: string;
|
|
15
|
+
}>;
|
|
16
|
+
type StreamCreate = GatewayEventGeneric<"STREAM_CREATE", {
|
|
17
|
+
stream_key: string;
|
|
18
|
+
rtc_server_id: string;
|
|
19
|
+
}>;
|
|
20
|
+
type StreamServerUpdate = GatewayEventGeneric<"STREAM_SERVER_UPDATE", {
|
|
21
|
+
stream_key: string;
|
|
22
|
+
endpoint: string;
|
|
23
|
+
token: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export type GatewayEvent = GatewayEvent.VoiceStateUpdate | GatewayEvent.VoiceServerUpdate | GatewayEvent.StreamCreate | GatewayEvent.StreamServerUpdate;
|
|
27
|
+
export type GatewayEventMap = {
|
|
28
|
+
[E in GatewayEvent as E["t"]]: [E["d"]];
|
|
29
|
+
};
|
|
30
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GatewayEvents.js","sourceRoot":"","sources":["../../src/client/GatewayEvents.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export declare enum GatewayOpCodes {
|
|
2
|
+
DISPATCH = 0,
|
|
3
|
+
HEARTBEAT = 1,
|
|
4
|
+
IDENTIFY = 2,
|
|
5
|
+
PRESENCE_UPDATE = 3,
|
|
6
|
+
VOICE_STATE_UPDATE = 4,
|
|
7
|
+
VOICE_SERVER_PING = 5,
|
|
8
|
+
RESUME = 6,
|
|
9
|
+
RECONNECT = 7,
|
|
10
|
+
REQUEST_GUILD_MEMBERS = 8,
|
|
11
|
+
INVALID_SESSION = 9,
|
|
12
|
+
HELLO = 10,
|
|
13
|
+
HEARTBEAT_ACK = 11,
|
|
14
|
+
CALL_CONNECT = 13,
|
|
15
|
+
GUILD_SUBSCRIPTIONS = 14,
|
|
16
|
+
LOBBY_CONNECT = 15,
|
|
17
|
+
LOBBY_DISCONNECT = 16,
|
|
18
|
+
LOBBY_VOICE_STATES_UPDATE = 17,
|
|
19
|
+
STREAM_CREATE = 18,
|
|
20
|
+
STREAM_DELETE = 19,
|
|
21
|
+
STREAM_WATCH = 20,
|
|
22
|
+
STREAM_PING = 21,
|
|
23
|
+
STREAM_SET_PAUSED = 22,
|
|
24
|
+
REQUEST_GUILD_APPLICATION_COMMANDS = 24,
|
|
25
|
+
EMBEDDED_ACTIVITY_LAUNCH = 25,
|
|
26
|
+
EMBEDDED_ACTIVITY_CLOSE = 26,
|
|
27
|
+
EMBEDDED_ACTIVITY_UPDATE = 27,
|
|
28
|
+
REQUEST_FORUM_UNREADS = 28,
|
|
29
|
+
REMOTE_COMMAND = 29,
|
|
30
|
+
GET_DELETED_ENTITY_IDS_NOT_MATCHING_HASH = 30,
|
|
31
|
+
REQUEST_SOUNDBOARD_SOUNDS = 31,
|
|
32
|
+
SPEED_TEST_CREATE = 32,
|
|
33
|
+
SPEED_TEST_DELETE = 33,
|
|
34
|
+
REQUEST_LAST_MESSAGES = 34,
|
|
35
|
+
SEARCH_RECENT_MEMBERS = 35,
|
|
36
|
+
REQUEST_CHANNEL_STATUSES = 36,
|
|
37
|
+
GUILD_SUBSCRIPTIONS_BULK = 37,
|
|
38
|
+
GUILD_CHANNELS_RESYNC = 38,
|
|
39
|
+
REQUEST_CHANNEL_MEMBER_COUNT = 39
|
|
40
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export var GatewayOpCodes;
|
|
2
|
+
(function (GatewayOpCodes) {
|
|
3
|
+
GatewayOpCodes[GatewayOpCodes["DISPATCH"] = 0] = "DISPATCH";
|
|
4
|
+
GatewayOpCodes[GatewayOpCodes["HEARTBEAT"] = 1] = "HEARTBEAT";
|
|
5
|
+
GatewayOpCodes[GatewayOpCodes["IDENTIFY"] = 2] = "IDENTIFY";
|
|
6
|
+
GatewayOpCodes[GatewayOpCodes["PRESENCE_UPDATE"] = 3] = "PRESENCE_UPDATE";
|
|
7
|
+
GatewayOpCodes[GatewayOpCodes["VOICE_STATE_UPDATE"] = 4] = "VOICE_STATE_UPDATE";
|
|
8
|
+
GatewayOpCodes[GatewayOpCodes["VOICE_SERVER_PING"] = 5] = "VOICE_SERVER_PING";
|
|
9
|
+
GatewayOpCodes[GatewayOpCodes["RESUME"] = 6] = "RESUME";
|
|
10
|
+
GatewayOpCodes[GatewayOpCodes["RECONNECT"] = 7] = "RECONNECT";
|
|
11
|
+
GatewayOpCodes[GatewayOpCodes["REQUEST_GUILD_MEMBERS"] = 8] = "REQUEST_GUILD_MEMBERS";
|
|
12
|
+
GatewayOpCodes[GatewayOpCodes["INVALID_SESSION"] = 9] = "INVALID_SESSION";
|
|
13
|
+
GatewayOpCodes[GatewayOpCodes["HELLO"] = 10] = "HELLO";
|
|
14
|
+
GatewayOpCodes[GatewayOpCodes["HEARTBEAT_ACK"] = 11] = "HEARTBEAT_ACK";
|
|
15
|
+
GatewayOpCodes[GatewayOpCodes["CALL_CONNECT"] = 13] = "CALL_CONNECT";
|
|
16
|
+
GatewayOpCodes[GatewayOpCodes["GUILD_SUBSCRIPTIONS"] = 14] = "GUILD_SUBSCRIPTIONS";
|
|
17
|
+
GatewayOpCodes[GatewayOpCodes["LOBBY_CONNECT"] = 15] = "LOBBY_CONNECT";
|
|
18
|
+
GatewayOpCodes[GatewayOpCodes["LOBBY_DISCONNECT"] = 16] = "LOBBY_DISCONNECT";
|
|
19
|
+
GatewayOpCodes[GatewayOpCodes["LOBBY_VOICE_STATES_UPDATE"] = 17] = "LOBBY_VOICE_STATES_UPDATE";
|
|
20
|
+
GatewayOpCodes[GatewayOpCodes["STREAM_CREATE"] = 18] = "STREAM_CREATE";
|
|
21
|
+
GatewayOpCodes[GatewayOpCodes["STREAM_DELETE"] = 19] = "STREAM_DELETE";
|
|
22
|
+
GatewayOpCodes[GatewayOpCodes["STREAM_WATCH"] = 20] = "STREAM_WATCH";
|
|
23
|
+
GatewayOpCodes[GatewayOpCodes["STREAM_PING"] = 21] = "STREAM_PING";
|
|
24
|
+
GatewayOpCodes[GatewayOpCodes["STREAM_SET_PAUSED"] = 22] = "STREAM_SET_PAUSED";
|
|
25
|
+
GatewayOpCodes[GatewayOpCodes["REQUEST_GUILD_APPLICATION_COMMANDS"] = 24] = "REQUEST_GUILD_APPLICATION_COMMANDS";
|
|
26
|
+
GatewayOpCodes[GatewayOpCodes["EMBEDDED_ACTIVITY_LAUNCH"] = 25] = "EMBEDDED_ACTIVITY_LAUNCH";
|
|
27
|
+
GatewayOpCodes[GatewayOpCodes["EMBEDDED_ACTIVITY_CLOSE"] = 26] = "EMBEDDED_ACTIVITY_CLOSE";
|
|
28
|
+
GatewayOpCodes[GatewayOpCodes["EMBEDDED_ACTIVITY_UPDATE"] = 27] = "EMBEDDED_ACTIVITY_UPDATE";
|
|
29
|
+
GatewayOpCodes[GatewayOpCodes["REQUEST_FORUM_UNREADS"] = 28] = "REQUEST_FORUM_UNREADS";
|
|
30
|
+
GatewayOpCodes[GatewayOpCodes["REMOTE_COMMAND"] = 29] = "REMOTE_COMMAND";
|
|
31
|
+
GatewayOpCodes[GatewayOpCodes["GET_DELETED_ENTITY_IDS_NOT_MATCHING_HASH"] = 30] = "GET_DELETED_ENTITY_IDS_NOT_MATCHING_HASH";
|
|
32
|
+
GatewayOpCodes[GatewayOpCodes["REQUEST_SOUNDBOARD_SOUNDS"] = 31] = "REQUEST_SOUNDBOARD_SOUNDS";
|
|
33
|
+
GatewayOpCodes[GatewayOpCodes["SPEED_TEST_CREATE"] = 32] = "SPEED_TEST_CREATE";
|
|
34
|
+
GatewayOpCodes[GatewayOpCodes["SPEED_TEST_DELETE"] = 33] = "SPEED_TEST_DELETE";
|
|
35
|
+
GatewayOpCodes[GatewayOpCodes["REQUEST_LAST_MESSAGES"] = 34] = "REQUEST_LAST_MESSAGES";
|
|
36
|
+
GatewayOpCodes[GatewayOpCodes["SEARCH_RECENT_MEMBERS"] = 35] = "SEARCH_RECENT_MEMBERS";
|
|
37
|
+
GatewayOpCodes[GatewayOpCodes["REQUEST_CHANNEL_STATUSES"] = 36] = "REQUEST_CHANNEL_STATUSES";
|
|
38
|
+
GatewayOpCodes[GatewayOpCodes["GUILD_SUBSCRIPTIONS_BULK"] = 37] = "GUILD_SUBSCRIPTIONS_BULK";
|
|
39
|
+
GatewayOpCodes[GatewayOpCodes["GUILD_CHANNELS_RESYNC"] = 38] = "GUILD_CHANNELS_RESYNC";
|
|
40
|
+
GatewayOpCodes[GatewayOpCodes["REQUEST_CHANNEL_MEMBER_COUNT"] = 39] = "REQUEST_CHANNEL_MEMBER_COUNT";
|
|
41
|
+
})(GatewayOpCodes || (GatewayOpCodes = {}));
|
|
42
|
+
//# sourceMappingURL=GatewayOpCodes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GatewayOpCodes.js","sourceRoot":"","sources":["../../src/client/GatewayOpCodes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,cAuCX;AAvCD,WAAY,cAAc;IACxB,2DAAY,CAAA;IACZ,6DAAa,CAAA;IACb,2DAAY,CAAA;IACZ,yEAAmB,CAAA;IACnB,+EAAsB,CAAA;IACtB,6EAAqB,CAAA;IACrB,uDAAU,CAAA;IACV,6DAAa,CAAA;IACb,qFAAyB,CAAA;IACzB,yEAAmB,CAAA;IACnB,sDAAU,CAAA;IACV,sEAAkB,CAAA;IAClB,oEAAiB,CAAA;IACjB,kFAAwB,CAAA;IACxB,sEAAkB,CAAA;IAClB,4EAAqB,CAAA;IACrB,8FAA8B,CAAA;IAC9B,sEAAkB,CAAA;IAClB,sEAAkB,CAAA;IAClB,oEAAiB,CAAA;IACjB,kEAAgB,CAAA;IAChB,8EAAsB,CAAA;IACtB,gHAAuC,CAAA;IACvC,4FAA6B,CAAA;IAC7B,0FAA4B,CAAA;IAC5B,4FAA6B,CAAA;IAC7B,sFAA0B,CAAA;IAC1B,wEAAmB,CAAA;IACnB,4HAA6C,CAAA;IAC7C,8FAA8B,CAAA;IAC9B,8EAAsB,CAAA;IACtB,8EAAsB,CAAA;IACtB,sFAA0B,CAAA;IAC1B,sFAA0B,CAAA;IAC1B,4FAA6B,CAAA;IAC7B,4FAA6B,CAAA;IAC7B,sFAA0B,CAAA;IAC1B,oGAAiC,CAAA;AACnC,CAAC,EAvCW,cAAc,KAAd,cAAc,QAuCzB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { VoiceConnection } from "./voice/VoiceConnection.js";
|
|
2
|
+
import type { Client, DMChannel, GroupDMChannel, VoiceBasedChannel } from "discord.js-selfbot-v13";
|
|
3
|
+
import type { WebRtcConnWrapper } from "./voice/WebRtcWrapper.js";
|
|
4
|
+
export declare class Streamer {
|
|
5
|
+
private _voiceConnection?;
|
|
6
|
+
private _client;
|
|
7
|
+
private _gatewayEmitter;
|
|
8
|
+
constructor(client: Client);
|
|
9
|
+
get client(): Client;
|
|
10
|
+
get opts(): {};
|
|
11
|
+
get voiceConnection(): VoiceConnection | undefined;
|
|
12
|
+
sendOpcode(code: number, data: unknown): void;
|
|
13
|
+
joinVoiceChannel(channel: DMChannel | GroupDMChannel | VoiceBasedChannel): Promise<WebRtcConnWrapper>;
|
|
14
|
+
/**
|
|
15
|
+
* Joins a voice channel and returns a WebRtcConnWrapper object.
|
|
16
|
+
* @param guild_id the guild id of the voice channel. If null, it will join a DM voice channel.
|
|
17
|
+
* @param channel_id the channel id of the voice channel
|
|
18
|
+
* @returns the WebRtcConnWrapper object
|
|
19
|
+
* @throws Error if the client is not logged in
|
|
20
|
+
*/
|
|
21
|
+
joinVoice(guild_id: string | null, channel_id: string): Promise<WebRtcConnWrapper>;
|
|
22
|
+
createStream(): Promise<WebRtcConnWrapper>;
|
|
23
|
+
setStreamPreview(image: Buffer): Promise<void>;
|
|
24
|
+
stopStream(): void;
|
|
25
|
+
leaveVoice(): void;
|
|
26
|
+
signalVideo(video_enabled: boolean): void;
|
|
27
|
+
signalStream(): void;
|
|
28
|
+
signalStopStream(): void;
|
|
29
|
+
signalLeaveVoice(): void;
|
|
30
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { VoiceConnection } from "./voice/VoiceConnection.js";
|
|
3
|
+
import { StreamConnection } from "./voice/StreamConnection.js";
|
|
4
|
+
import { GatewayOpCodes } from "./GatewayOpCodes.js";
|
|
5
|
+
import { generateStreamKey, parseStreamKey } from "../utils.js";
|
|
6
|
+
export class Streamer {
|
|
7
|
+
_voiceConnection;
|
|
8
|
+
_client;
|
|
9
|
+
_gatewayEmitter = new EventEmitter();
|
|
10
|
+
constructor(client) {
|
|
11
|
+
this._client = client;
|
|
12
|
+
//listen for messages
|
|
13
|
+
this.client.on("raw", (packet) => {
|
|
14
|
+
// @ts-expect-error I don't know how to make this work with TypeScript, so whatever
|
|
15
|
+
this._gatewayEmitter.emit(packet.t, packet.d);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
get client() {
|
|
19
|
+
return this._client;
|
|
20
|
+
}
|
|
21
|
+
get opts() {
|
|
22
|
+
return {};
|
|
23
|
+
}
|
|
24
|
+
get voiceConnection() {
|
|
25
|
+
return this._voiceConnection;
|
|
26
|
+
}
|
|
27
|
+
sendOpcode(code, data) {
|
|
28
|
+
this.client.ws.broadcast({
|
|
29
|
+
op: code,
|
|
30
|
+
d: data,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
joinVoiceChannel(channel) {
|
|
34
|
+
let guildId = null;
|
|
35
|
+
if (channel.type === "GUILD_STAGE_VOICE" ||
|
|
36
|
+
channel.type === "GUILD_VOICE") {
|
|
37
|
+
guildId = channel.guildId;
|
|
38
|
+
}
|
|
39
|
+
return this.joinVoice(guildId, channel.id);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Joins a voice channel and returns a WebRtcConnWrapper object.
|
|
43
|
+
* @param guild_id the guild id of the voice channel. If null, it will join a DM voice channel.
|
|
44
|
+
* @param channel_id the channel id of the voice channel
|
|
45
|
+
* @returns the WebRtcConnWrapper object
|
|
46
|
+
* @throws Error if the client is not logged in
|
|
47
|
+
*/
|
|
48
|
+
joinVoice(guild_id, channel_id) {
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
if (!this.client.user) {
|
|
51
|
+
reject("Client not logged in");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const user_id = this.client.user.id;
|
|
55
|
+
const voiceConn = new VoiceConnection(this, guild_id, user_id, channel_id, (conn) => {
|
|
56
|
+
resolve(conn);
|
|
57
|
+
});
|
|
58
|
+
this._voiceConnection = voiceConn;
|
|
59
|
+
this._gatewayEmitter.on("VOICE_STATE_UPDATE", (d) => {
|
|
60
|
+
if (user_id !== d.user_id)
|
|
61
|
+
return;
|
|
62
|
+
voiceConn.setSession(d.session_id);
|
|
63
|
+
});
|
|
64
|
+
this._gatewayEmitter.on("VOICE_SERVER_UPDATE", (d) => {
|
|
65
|
+
if (guild_id !== d.guild_id)
|
|
66
|
+
return;
|
|
67
|
+
// channel_id is not set for guild voice calls
|
|
68
|
+
if (d.channel_id && channel_id !== d.channel_id)
|
|
69
|
+
return;
|
|
70
|
+
voiceConn.setTokens(d.endpoint, d.token);
|
|
71
|
+
});
|
|
72
|
+
this.signalVideo(false);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
createStream() {
|
|
76
|
+
return new Promise((resolve, reject) => {
|
|
77
|
+
if (!this.client.user) {
|
|
78
|
+
reject("Client not logged in");
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (!this.voiceConnection) {
|
|
82
|
+
reject("cannot start stream without first joining voice channel");
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.signalStream();
|
|
86
|
+
const { guildId: clientGuildId, channelId: clientChannelId, session_id, } = this.voiceConnection;
|
|
87
|
+
const { id: clientUserId } = this.client.user;
|
|
88
|
+
if (!session_id)
|
|
89
|
+
throw new Error("Session doesn't exist yet");
|
|
90
|
+
const streamConn = new StreamConnection(this, clientGuildId, clientUserId, clientChannelId, (conn) => {
|
|
91
|
+
resolve(conn);
|
|
92
|
+
});
|
|
93
|
+
this.voiceConnection.streamConnection = streamConn;
|
|
94
|
+
this._gatewayEmitter.on("STREAM_CREATE", (d) => {
|
|
95
|
+
const { channelId, guildId, userId } = parseStreamKey(d.stream_key);
|
|
96
|
+
if (clientGuildId !== guildId ||
|
|
97
|
+
clientChannelId !== channelId ||
|
|
98
|
+
clientUserId !== userId)
|
|
99
|
+
return;
|
|
100
|
+
streamConn.serverId = d.rtc_server_id;
|
|
101
|
+
streamConn.streamKey = d.stream_key;
|
|
102
|
+
streamConn.setSession(session_id);
|
|
103
|
+
});
|
|
104
|
+
this._gatewayEmitter.on("STREAM_SERVER_UPDATE", (d) => {
|
|
105
|
+
const { channelId, guildId, userId } = parseStreamKey(d.stream_key);
|
|
106
|
+
if (clientGuildId !== guildId ||
|
|
107
|
+
clientChannelId !== channelId ||
|
|
108
|
+
clientUserId !== userId)
|
|
109
|
+
return;
|
|
110
|
+
streamConn.setTokens(d.endpoint, d.token);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
async setStreamPreview(image) {
|
|
115
|
+
if (!this.client.token)
|
|
116
|
+
throw new Error("Please login :)");
|
|
117
|
+
if (!this.voiceConnection?.streamConnection?.guildId)
|
|
118
|
+
return;
|
|
119
|
+
const data = `data:image/jpeg;base64,${image.toString("base64")}`;
|
|
120
|
+
const { guildId } = this.voiceConnection.streamConnection;
|
|
121
|
+
const server = await this.client.guilds.fetch(guildId);
|
|
122
|
+
await server.members.me?.voice.postPreview(data);
|
|
123
|
+
}
|
|
124
|
+
stopStream() {
|
|
125
|
+
const stream = this.voiceConnection?.streamConnection;
|
|
126
|
+
if (!stream)
|
|
127
|
+
return;
|
|
128
|
+
stream.stop();
|
|
129
|
+
this.signalStopStream();
|
|
130
|
+
this.voiceConnection.streamConnection = undefined;
|
|
131
|
+
this._gatewayEmitter.removeAllListeners("STREAM_CREATE");
|
|
132
|
+
this._gatewayEmitter.removeAllListeners("STREAM_SERVER_UPDATE");
|
|
133
|
+
}
|
|
134
|
+
leaveVoice() {
|
|
135
|
+
this.voiceConnection?.stop();
|
|
136
|
+
this.signalLeaveVoice();
|
|
137
|
+
this._voiceConnection = undefined;
|
|
138
|
+
this._gatewayEmitter.removeAllListeners("VOICE_STATE_UPDATE");
|
|
139
|
+
this._gatewayEmitter.removeAllListeners("VOICE_SERVER_UPDATE");
|
|
140
|
+
}
|
|
141
|
+
signalVideo(video_enabled) {
|
|
142
|
+
if (!this.voiceConnection)
|
|
143
|
+
return;
|
|
144
|
+
const { guildId: guild_id, channelId: channel_id } = this.voiceConnection;
|
|
145
|
+
this.sendOpcode(GatewayOpCodes.VOICE_STATE_UPDATE, {
|
|
146
|
+
guild_id: guild_id,
|
|
147
|
+
channel_id,
|
|
148
|
+
self_mute: false,
|
|
149
|
+
self_deaf: true,
|
|
150
|
+
self_video: video_enabled,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
signalStream() {
|
|
154
|
+
if (!this.voiceConnection)
|
|
155
|
+
return;
|
|
156
|
+
const { type, guildId: guild_id, channelId: channel_id, botId: user_id, } = this.voiceConnection;
|
|
157
|
+
const streamKey = generateStreamKey(type, guild_id, channel_id, user_id);
|
|
158
|
+
this.sendOpcode(GatewayOpCodes.STREAM_CREATE, {
|
|
159
|
+
type,
|
|
160
|
+
guild_id,
|
|
161
|
+
channel_id,
|
|
162
|
+
preferred_region: null,
|
|
163
|
+
});
|
|
164
|
+
this.sendOpcode(GatewayOpCodes.STREAM_SET_PAUSED, {
|
|
165
|
+
stream_key: streamKey,
|
|
166
|
+
paused: false,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
signalStopStream() {
|
|
170
|
+
if (!this.voiceConnection)
|
|
171
|
+
return;
|
|
172
|
+
const { type, guildId: guild_id, channelId: channel_id, botId: user_id, } = this.voiceConnection;
|
|
173
|
+
const streamKey = generateStreamKey(type, guild_id, channel_id, user_id);
|
|
174
|
+
this.sendOpcode(GatewayOpCodes.STREAM_DELETE, {
|
|
175
|
+
stream_key: streamKey,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
signalLeaveVoice() {
|
|
179
|
+
this.sendOpcode(GatewayOpCodes.VOICE_STATE_UPDATE, {
|
|
180
|
+
guild_id: null,
|
|
181
|
+
channel_id: null,
|
|
182
|
+
self_mute: true,
|
|
183
|
+
self_deaf: false,
|
|
184
|
+
self_video: false,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=Streamer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Streamer.js","sourceRoot":"","sources":["../../src/client/Streamer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare class AnnexBBitstreamReader {
|
|
2
|
+
private _buffer;
|
|
3
|
+
private _byteOffset;
|
|
4
|
+
private _bitOffset;
|
|
5
|
+
constructor(buffer: Buffer);
|
|
6
|
+
readBits(count: number): number;
|
|
7
|
+
readUnsigned(bits: number): number;
|
|
8
|
+
readSigned(bits: number): number;
|
|
9
|
+
readUnsignedExpGolomb(): number;
|
|
10
|
+
readSignedExpGolomb(): number;
|
|
11
|
+
}
|
|
12
|
+
export declare class AnnexBBitstreamWriter {
|
|
13
|
+
private _arr;
|
|
14
|
+
private _pendingByte;
|
|
15
|
+
private _bitOffset;
|
|
16
|
+
toBuffer(): Buffer<ArrayBuffer>;
|
|
17
|
+
flush(): void;
|
|
18
|
+
writeBits(bits: number, count: number): void;
|
|
19
|
+
writeUnsigned(num: number, count: number): void;
|
|
20
|
+
writeSigned(num: number, count: number): void;
|
|
21
|
+
writeUnsignedExpGolomb(num: number): void;
|
|
22
|
+
writeSignedExpGolomb(num: number): void;
|
|
23
|
+
}
|