n8n-nodes-discord-dnd 0.1.76 → 0.1.77
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.
@@ -4,6 +4,14 @@ exports.DiscordAction = void 0;
|
|
4
4
|
const discord_js_1 = require("discord.js");
|
5
5
|
const voice_1 = require("@discordjs/voice");
|
6
6
|
const client_1 = require("./client");
|
7
|
+
let discordClient = null; // 🧠 Client được cache
|
8
|
+
async function getOrCreateDiscordClient(token, options) {
|
9
|
+
if (discordClient && discordClient.isReady()) {
|
10
|
+
return discordClient;
|
11
|
+
}
|
12
|
+
discordClient = await (0, client_1.initializeDiscordClient)(token, options);
|
13
|
+
return discordClient;
|
14
|
+
}
|
7
15
|
class DiscordAction {
|
8
16
|
constructor() {
|
9
17
|
this.description = {
|
@@ -33,12 +41,10 @@ class DiscordAction {
|
|
33
41
|
{
|
34
42
|
name: "Join Voice Channel",
|
35
43
|
value: "joinVoiceChannel",
|
36
|
-
description: "Join a voice channel",
|
37
44
|
},
|
38
45
|
{
|
39
46
|
name: "Leave Voice Channel",
|
40
47
|
value: "leaveVoiceChannel",
|
41
|
-
description: "Leave the current voice channel",
|
42
48
|
},
|
43
49
|
],
|
44
50
|
default: "joinVoiceChannel",
|
@@ -50,7 +56,6 @@ class DiscordAction {
|
|
50
56
|
type: "string",
|
51
57
|
default: "",
|
52
58
|
required: true,
|
53
|
-
description: "The ID of the Discord server (guild)",
|
54
59
|
},
|
55
60
|
{
|
56
61
|
displayName: "Channel ID",
|
@@ -63,7 +68,6 @@ class DiscordAction {
|
|
63
68
|
},
|
64
69
|
},
|
65
70
|
required: true,
|
66
|
-
description: "The ID of the voice channel to join",
|
67
71
|
},
|
68
72
|
],
|
69
73
|
};
|
@@ -73,75 +77,43 @@ class DiscordAction {
|
|
73
77
|
const operation = this.getNodeParameter("operation", 0);
|
74
78
|
const guildId = this.getNodeParameter("guildId", 0);
|
75
79
|
const channelId = this.getNodeParameter("channelId", 0);
|
76
|
-
// Initialize Discord client with voice intents
|
77
80
|
const clientOptions = {
|
78
|
-
intents: [
|
79
|
-
discord_js_1.GatewayIntentBits.Guilds,
|
80
|
-
discord_js_1.GatewayIntentBits.GuildMessages,
|
81
|
-
discord_js_1.GatewayIntentBits.MessageContent,
|
82
|
-
discord_js_1.GatewayIntentBits.DirectMessages,
|
83
|
-
discord_js_1.GatewayIntentBits.GuildVoiceStates,
|
84
|
-
],
|
81
|
+
intents: [discord_js_1.GatewayIntentBits.Guilds, discord_js_1.GatewayIntentBits.GuildVoiceStates],
|
85
82
|
partials: [discord_js_1.Partials.Channel],
|
86
83
|
};
|
87
|
-
const client = await (
|
84
|
+
const client = await getOrCreateDiscordClient(credentials.botToken, clientOptions);
|
88
85
|
try {
|
89
86
|
const guild = await client.guilds.fetch(guildId);
|
90
|
-
if (!guild)
|
91
|
-
throw new Error(`Could not find guild
|
92
|
-
}
|
93
|
-
const voiceChannel = (await guild.channels.fetch(channelId));
|
94
|
-
if (!voiceChannel || voiceChannel.type !== 2) {
|
95
|
-
// 2 = GUILD_VOICE
|
96
|
-
throw new Error("Channel is not a voice channel!");
|
97
|
-
}
|
87
|
+
if (!guild)
|
88
|
+
throw new Error(`Could not find guild ${guildId}`);
|
98
89
|
switch (operation) {
|
99
90
|
case "joinVoiceChannel": {
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
// const permissions = voiceChannel.permissionsFor(client.user!);
|
105
|
-
// if (!permissions?.has(PermissionsBitField.Flags.Connect)) {
|
106
|
-
// throw new Error(
|
107
|
-
// "Bot does not have permission to join this voice channel"
|
108
|
-
// );
|
109
|
-
// }
|
110
|
-
// if (!permissions?.has(PermissionsBitField.Flags.Speak)) {
|
111
|
-
// throw new Error(
|
112
|
-
// "Bot does not have permission to speak in this voice channel"
|
113
|
-
// );
|
114
|
-
// }
|
115
|
-
// Create connection
|
91
|
+
const voiceChannel = (await guild.channels.fetch(channelId));
|
92
|
+
if (!voiceChannel || voiceChannel.type !== 2) {
|
93
|
+
throw new Error(`Channel ${channelId} is not a valid voice channel`);
|
94
|
+
}
|
116
95
|
const connection = (0, voice_1.joinVoiceChannel)({
|
117
|
-
channelId,
|
118
|
-
guildId,
|
96
|
+
channelId: voiceChannel.id,
|
97
|
+
guildId: voiceChannel.guild.id,
|
119
98
|
adapterCreator: voiceChannel.guild
|
120
99
|
.voiceAdapterCreator,
|
121
100
|
selfDeaf: false,
|
122
101
|
selfMute: false,
|
123
102
|
});
|
124
|
-
// Create an audio player to keep the connection alive
|
125
103
|
const player = (0, voice_1.createAudioPlayer)();
|
126
104
|
connection.subscribe(player);
|
127
105
|
try {
|
128
|
-
// Wait for the connection to be ready with a timeout
|
129
106
|
await Promise.race([
|
130
107
|
(0, voice_1.entersState)(connection, voice_1.VoiceConnectionStatus.Ready, 30000),
|
131
108
|
new Promise((_, reject) => {
|
132
|
-
connection.on(voice_1.VoiceConnectionStatus.Disconnected, () =>
|
133
|
-
|
134
|
-
});
|
135
|
-
connection.on("error", (error) => {
|
136
|
-
reject(error);
|
137
|
-
});
|
109
|
+
connection.on(voice_1.VoiceConnectionStatus.Disconnected, () => reject(new Error("Voice connection disconnected")));
|
110
|
+
connection.on("error", (err) => reject(err));
|
138
111
|
}),
|
139
112
|
]);
|
140
113
|
}
|
141
|
-
catch (
|
142
|
-
// Clean up if connection fails
|
114
|
+
catch (err) {
|
143
115
|
connection.destroy();
|
144
|
-
throw new Error(`Failed to join voice channel: ${(
|
116
|
+
throw new Error(`Failed to join voice channel: ${(err === null || err === void 0 ? void 0 : err.message) || "Unknown error"}`);
|
145
117
|
}
|
146
118
|
break;
|
147
119
|
}
|
@@ -153,25 +125,18 @@ class DiscordAction {
|
|
153
125
|
break;
|
154
126
|
}
|
155
127
|
default:
|
156
|
-
throw new Error(`
|
128
|
+
throw new Error(`Unsupported operation "${operation}"`);
|
157
129
|
}
|
158
|
-
// Clean up: Destroy the client after operation is complete
|
159
|
-
client.destroy();
|
160
|
-
// Return success with additional details
|
161
130
|
return [
|
162
131
|
this.helpers.returnJsonArray({
|
163
132
|
success: true,
|
164
133
|
operation,
|
165
134
|
guildId,
|
166
|
-
channelId: operation === "joinVoiceChannel"
|
167
|
-
? this.getNodeParameter("channelId", 0)
|
168
|
-
: undefined,
|
135
|
+
channelId: operation === "joinVoiceChannel" ? channelId : undefined,
|
169
136
|
}),
|
170
137
|
];
|
171
138
|
}
|
172
139
|
catch (error) {
|
173
|
-
// Clean up on error
|
174
|
-
client.destroy();
|
175
140
|
throw error;
|
176
141
|
}
|
177
142
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DiscordAction.node.js","sourceRoot":"","sources":["../../src/nodes/DiscordAction.node.ts"],"names":[],"mappings":";;;AAMA,
|
1
|
+
{"version":3,"file":"DiscordAction.node.js","sourceRoot":"","sources":["../../src/nodes/DiscordAction.node.ts"],"names":[],"mappings":"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"}
|