distube 3.3.1 → 4.0.0-dev.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.
Files changed (114) hide show
  1. package/README.md +6 -8
  2. package/dist/DisTube.d.ts +13 -557
  3. package/dist/DisTube.d.ts.map +1 -1
  4. package/dist/DisTube.js +38 -639
  5. package/dist/DisTube.js.map +1 -1
  6. package/dist/constant.d.ts +0 -101
  7. package/dist/constant.d.ts.map +1 -1
  8. package/dist/constant.js +0 -101
  9. package/dist/constant.js.map +1 -1
  10. package/dist/core/DisTubeBase.d.ts +0 -40
  11. package/dist/core/DisTubeBase.d.ts.map +1 -1
  12. package/dist/core/DisTubeBase.js +0 -44
  13. package/dist/core/DisTubeBase.js.map +1 -1
  14. package/dist/core/DisTubeHandler.d.ts +2 -89
  15. package/dist/core/DisTubeHandler.d.ts.map +1 -1
  16. package/dist/core/DisTubeHandler.js +14 -124
  17. package/dist/core/DisTubeHandler.js.map +1 -1
  18. package/dist/core/DisTubeOptions.d.ts +0 -2
  19. package/dist/core/DisTubeOptions.d.ts.map +1 -1
  20. package/dist/core/DisTubeOptions.js +0 -13
  21. package/dist/core/DisTubeOptions.js.map +1 -1
  22. package/dist/core/DisTubeStream.d.ts +0 -33
  23. package/dist/core/DisTubeStream.d.ts.map +1 -1
  24. package/dist/core/DisTubeStream.js +0 -36
  25. package/dist/core/DisTubeStream.js.map +1 -1
  26. package/dist/core/manager/BaseManager.d.ts +1 -16
  27. package/dist/core/manager/BaseManager.d.ts.map +1 -1
  28. package/dist/core/manager/BaseManager.js +2 -28
  29. package/dist/core/manager/BaseManager.js.map +1 -1
  30. package/dist/core/manager/FilterManager.d.ts +16 -0
  31. package/dist/core/manager/FilterManager.d.ts.map +1 -0
  32. package/dist/core/manager/FilterManager.js +88 -0
  33. package/dist/core/manager/FilterManager.js.map +1 -0
  34. package/dist/core/manager/GuildIdManager.d.ts +9 -0
  35. package/dist/core/manager/GuildIdManager.d.ts.map +1 -0
  36. package/dist/core/manager/GuildIdManager.js +25 -0
  37. package/dist/core/manager/GuildIdManager.js.map +1 -0
  38. package/dist/core/manager/QueueManager.d.ts +4 -26
  39. package/dist/core/manager/QueueManager.d.ts.map +1 -1
  40. package/dist/core/manager/QueueManager.js +27 -48
  41. package/dist/core/manager/QueueManager.js.map +1 -1
  42. package/dist/core/manager/index.d.ts +2 -0
  43. package/dist/core/manager/index.d.ts.map +1 -1
  44. package/dist/core/manager/index.js +2 -0
  45. package/dist/core/manager/index.js.map +1 -1
  46. package/dist/core/voice/DisTubeVoice.d.ts +0 -50
  47. package/dist/core/voice/DisTubeVoice.d.ts.map +1 -1
  48. package/dist/core/voice/DisTubeVoice.js +9 -71
  49. package/dist/core/voice/DisTubeVoice.js.map +1 -1
  50. package/dist/core/voice/DisTubeVoiceManager.d.ts +2 -33
  51. package/dist/core/voice/DisTubeVoiceManager.d.ts.map +1 -1
  52. package/dist/core/voice/DisTubeVoiceManager.js +1 -32
  53. package/dist/core/voice/DisTubeVoiceManager.js.map +1 -1
  54. package/dist/core/voice/index.d.ts +0 -1
  55. package/dist/core/voice/index.d.ts.map +1 -1
  56. package/dist/core/voice/index.js +0 -1
  57. package/dist/core/voice/index.js.map +1 -1
  58. package/dist/plugin/index.d.ts +0 -1
  59. package/dist/plugin/index.d.ts.map +1 -1
  60. package/dist/plugin/index.js +0 -1
  61. package/dist/plugin/index.js.map +1 -1
  62. package/dist/struct/CustomPlugin.d.ts +0 -41
  63. package/dist/struct/CustomPlugin.d.ts.map +1 -1
  64. package/dist/struct/CustomPlugin.js +0 -34
  65. package/dist/struct/CustomPlugin.js.map +1 -1
  66. package/dist/struct/DisTubeError.d.ts +0 -1
  67. package/dist/struct/DisTubeError.d.ts.map +1 -1
  68. package/dist/struct/DisTubeError.js +0 -2
  69. package/dist/struct/DisTubeError.js.map +1 -1
  70. package/dist/struct/ExtractorPlugin.d.ts +0 -32
  71. package/dist/struct/ExtractorPlugin.d.ts.map +1 -1
  72. package/dist/struct/ExtractorPlugin.js +0 -23
  73. package/dist/struct/ExtractorPlugin.js.map +1 -1
  74. package/dist/struct/Playlist.d.ts +0 -36
  75. package/dist/struct/Playlist.d.ts.map +1 -1
  76. package/dist/struct/Playlist.js +3 -54
  77. package/dist/struct/Playlist.js.map +1 -1
  78. package/dist/struct/Plugin.d.ts +0 -58
  79. package/dist/struct/Plugin.d.ts.map +1 -1
  80. package/dist/struct/Plugin.js +0 -62
  81. package/dist/struct/Plugin.js.map +1 -1
  82. package/dist/struct/Queue.d.ts +10 -177
  83. package/dist/struct/Queue.d.ts.map +1 -1
  84. package/dist/struct/Queue.js +49 -256
  85. package/dist/struct/Queue.js.map +1 -1
  86. package/dist/struct/SearchResult.d.ts +0 -8
  87. package/dist/struct/SearchResult.d.ts.map +1 -1
  88. package/dist/struct/SearchResult.js +0 -47
  89. package/dist/struct/SearchResult.js.map +1 -1
  90. package/dist/struct/Song.d.ts +0 -38
  91. package/dist/struct/Song.d.ts.map +1 -1
  92. package/dist/struct/Song.js +3 -122
  93. package/dist/struct/Song.js.map +1 -1
  94. package/dist/struct/TaskQueue.d.ts +0 -20
  95. package/dist/struct/TaskQueue.d.ts.map +1 -1
  96. package/dist/struct/TaskQueue.js +0 -25
  97. package/dist/struct/TaskQueue.js.map +1 -1
  98. package/dist/tsconfig.tsbuildinfo +1 -1
  99. package/dist/type.d.ts +6 -75
  100. package/dist/type.d.ts.map +1 -1
  101. package/dist/type.js.map +1 -1
  102. package/dist/util.d.ts +1 -30
  103. package/dist/util.d.ts.map +1 -1
  104. package/dist/util.js +16 -59
  105. package/dist/util.js.map +1 -1
  106. package/package.json +22 -14
  107. package/dist/core/voice/DJSAdapter.d.ts +0 -4
  108. package/dist/core/voice/DJSAdapter.d.ts.map +0 -1
  109. package/dist/core/voice/DJSAdapter.js +0 -58
  110. package/dist/core/voice/DJSAdapter.js.map +0 -1
  111. package/dist/plugin/youtube-dl.d.ts +0 -12
  112. package/dist/plugin/youtube-dl.d.ts.map +0 -1
  113. package/dist/plugin/youtube-dl.js +0 -70
  114. package/dist/plugin/youtube-dl.js.map +0 -1
package/dist/util.js CHANGED
@@ -1,15 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isObject = exports.entersState = exports.checkInvalidKey = exports.isClientInstance = exports.resolveGuildID = exports.resolveGuildId = exports.isGuildInstance = exports.isSupportedVoiceChannel = exports.isMessageInstance = exports.isTextChannelInstance = exports.isMemberInstance = exports.isSnowflake = exports.isVoiceChannelEmpty = exports.checkIntents = exports.isURL = exports.parseNumber = exports.toSecond = exports.formatDuration = void 0;
3
+ exports.isRecord = exports.isObject = exports.entersState = exports.checkInvalidKey = exports.isClientInstance = exports.resolveGuildId = exports.isGuildInstance = exports.isSupportedVoiceChannel = exports.isMessageInstance = exports.isTextChannelInstance = exports.isMemberInstance = exports.isSnowflake = exports.isVoiceChannelEmpty = exports.checkIntents = exports.isURL = exports.parseNumber = exports.toSecond = exports.formatDuration = void 0;
4
4
  const url_1 = require("url");
5
5
  const _1 = require(".");
6
6
  const discord_js_1 = require("discord.js");
7
7
  const formatInt = (int) => (int < 10 ? `0${int}` : int);
8
- /**
9
- * Format duration to string
10
- * @param {number} sec Duration in seconds
11
- * @returns {string}
12
- */
13
8
  function formatDuration(sec) {
14
9
  if (!sec || !Number(sec))
15
10
  return "00:00";
@@ -23,11 +18,6 @@ function formatDuration(sec) {
23
18
  return `00:${formatInt(seconds)}`;
24
19
  }
25
20
  exports.formatDuration = formatDuration;
26
- /**
27
- * Convert formatted duration to seconds
28
- * @param {*} input Formatted duration string
29
- * @returns {number}
30
- */
31
21
  function toSecond(input) {
32
22
  if (!input)
33
23
  return 0;
@@ -48,22 +38,12 @@ function toSecond(input) {
48
38
  }
49
39
  }
50
40
  exports.toSecond = toSecond;
51
- /**
52
- * Parse number from input
53
- * @param {*} input Any
54
- * @returns {number}
55
- */
56
41
  function parseNumber(input) {
57
42
  if (typeof input === "string")
58
43
  return Number(input.replace(/[^\d.]+/g, "")) || 0;
59
44
  return Number(input) || 0;
60
45
  }
61
46
  exports.parseNumber = parseNumber;
62
- /**
63
- * Check if the string is an URL
64
- * @param {string} input input
65
- * @returns {boolean}
66
- */
67
47
  function isURL(input) {
68
48
  if (typeof input !== "string" || input.includes(" "))
69
49
  return false;
@@ -78,27 +58,12 @@ function isURL(input) {
78
58
  return true;
79
59
  }
80
60
  exports.isURL = isURL;
81
- /**
82
- * Check if the Client has enough intents to using DisTube
83
- * @param {ClientOptions} options options
84
- */
85
61
  function checkIntents(options) {
86
- const requiredIntents = ["GUILD_VOICE_STATES"];
87
- const bitfield = options.intents ?? options?.ws?.intents;
88
- if (typeof bitfield === "undefined")
89
- return;
90
- const intents = new discord_js_1.Intents(bitfield);
91
- for (const intent of requiredIntents) {
92
- if (!intents.has(intent))
93
- throw new _1.DisTubeError("MISSING_INTENTS", intent.toString());
94
- }
62
+ const intents = new discord_js_1.IntentsBitField(options.intents);
63
+ if (!intents.has(128))
64
+ throw new _1.DisTubeError("MISSING_INTENTS", "GuildVoiceStates");
95
65
  }
96
66
  exports.checkIntents = checkIntents;
97
- /**
98
- * Check if the voice channel is empty
99
- * @param {Discord.VoiceState} voiceState voiceState
100
- * @returns {boolean}
101
- */
102
67
  function isVoiceChannelEmpty(voiceState) {
103
68
  const voiceChannel = voiceState.guild?.me?.voice?.channel;
104
69
  if (!voiceChannel)
@@ -109,7 +74,7 @@ function isVoiceChannelEmpty(voiceState) {
109
74
  exports.isVoiceChannelEmpty = isVoiceChannelEmpty;
110
75
  function isSnowflake(id) {
111
76
  try {
112
- return discord_js_1.SnowflakeUtil.deconstruct(id).timestamp > discord_js_1.SnowflakeUtil.EPOCH;
77
+ return discord_js_1.SnowflakeUtil.deconstruct(id).timestamp > discord_js_1.SnowflakeUtil.epoch;
113
78
  }
114
79
  catch {
115
80
  return false;
@@ -127,19 +92,18 @@ exports.isMemberInstance = isMemberInstance;
127
92
  function isTextChannelInstance(channel) {
128
93
  return (!!channel &&
129
94
  isSnowflake(channel.id) &&
130
- isSnowflake(channel.guild?.id) &&
95
+ isSnowflake(channel.guildId) &&
131
96
  typeof channel.send === "function" &&
132
97
  typeof channel.awaitMessages === "function");
133
98
  }
134
99
  exports.isTextChannelInstance = isTextChannelInstance;
135
100
  function isMessageInstance(message) {
136
- // Simple check for using distube normally
137
101
  return (!!message &&
138
102
  isSnowflake(message.id) &&
139
- isSnowflake(message.guild?.id) &&
103
+ isSnowflake(message.guildId) &&
140
104
  isTextChannelInstance(message.channel) &&
141
105
  isMemberInstance(message.member) &&
142
- isSnowflake(message.author?.id) &&
106
+ isSnowflake(message.author.id) &&
143
107
  message.member.id === message.author.id &&
144
108
  message.guild.id === message.channel.guild.id);
145
109
  }
@@ -148,16 +112,9 @@ function isSupportedVoiceChannel(channel) {
148
112
  return (!!channel &&
149
113
  typeof channel.joinable === "boolean" &&
150
114
  isSnowflake(channel.id) &&
151
- isSnowflake(channel.guild?.id) &&
115
+ isSnowflake(channel.guildId) &&
152
116
  typeof channel.full === "boolean" &&
153
- [
154
- // Djs v12
155
- "voice",
156
- "stage",
157
- // Djs v13
158
- "GUILD_VOICE",
159
- "GUILD_STAGE_VOICE",
160
- ].includes(channel.type));
117
+ discord_js_1.Constants.VoiceBasedChannelTypes.includes(channel.type));
161
118
  }
162
119
  exports.isSupportedVoiceChannel = isSupportedVoiceChannel;
163
120
  function isGuildInstance(guild) {
@@ -182,11 +139,6 @@ function resolveGuildId(resolvable) {
182
139
  return guildId;
183
140
  }
184
141
  exports.resolveGuildId = resolveGuildId;
185
- function resolveGuildID(resolvable) {
186
- process.emitWarning("resolveGuildID() is deprecated, use resolveGuildId() instead.", "DeprecationWarning");
187
- return resolveGuildId(resolvable);
188
- }
189
- exports.resolveGuildID = resolveGuildID;
190
142
  function isClientInstance(client) {
191
143
  return !!client && typeof client.login === "function";
192
144
  }
@@ -201,7 +153,8 @@ function checkInvalidKey(target, source, sourceName) {
201
153
  }
202
154
  exports.checkInvalidKey = checkInvalidKey;
203
155
  async function waitEvent(target, status, maxTime) {
204
- let cleanup = () => undefined;
156
+ let cleanup = () => {
157
+ };
205
158
  try {
206
159
  await new Promise((resolve, reject) => {
207
160
  const timeout = setTimeout(() => reject(new Error(`Didn't trigger ${status} within ${maxTime}ms`)), maxTime);
@@ -229,4 +182,8 @@ function isObject(obj) {
229
182
  return typeof obj === "object" && obj !== null && !Array.isArray(obj);
230
183
  }
231
184
  exports.isObject = isObject;
185
+ function isRecord(obj) {
186
+ return isObject(obj);
187
+ }
188
+ exports.isRecord = isRecord;
232
189
  //# sourceMappingURL=util.js.map
package/dist/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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","sourcesContent":["import { URL } from \"url\";\nimport { DisTubeError, DisTubeVoice, Queue } from \".\";\nimport { Intents, SnowflakeUtil } from \"discord.js\";\nimport type { GuildIdResolvable } from \".\";\nimport type { EventEmitter } from \"node:events\";\nimport type { AudioPlayer, AudioPlayerStatus, VoiceConnection, VoiceConnectionStatus } from \"@discordjs/voice\";\nimport type {\n BitFieldResolvable,\n Client,\n ClientOptions,\n Guild,\n GuildMember,\n GuildTextBasedChannel,\n IntentsString,\n Message,\n Snowflake,\n VoiceBasedChannel,\n VoiceState,\n} from \"discord.js\";\n\nconst formatInt = (int: number) => (int < 10 ? `0${int}` : int);\n\n/**\n * Format duration to string\n * @param {number} sec Duration in seconds\n * @returns {string}\n */\nexport function formatDuration(sec: number): string {\n if (!sec || !Number(sec)) return \"00:00\";\n const seconds = Math.round(sec % 60);\n const minutes = Math.floor((sec % 3600) / 60);\n const hours = Math.floor(sec / 3600);\n if (hours > 0) return `${formatInt(hours)}:${formatInt(minutes)}:${formatInt(seconds)}`;\n if (minutes > 0) return `${formatInt(minutes)}:${formatInt(seconds)}`;\n return `00:${formatInt(seconds)}`;\n}\n/**\n * Convert formatted duration to seconds\n * @param {*} input Formatted duration string\n * @returns {number}\n */\nexport function toSecond(input: any): number {\n if (!input) return 0;\n if (typeof input !== \"string\") return Number(input) || 0;\n if (input.match(/:/g)) {\n const time = input.split(\":\").reverse();\n let s = 0;\n for (let i = 0; i < 3; i++) if (time[i]) s += Number(time[i].replace(/[^\\d.]+/g, \"\")) * Math.pow(60, i);\n if (time.length > 3) s += Number(time[3].replace(/[^\\d.]+/g, \"\")) * 24 * 60 * 60;\n return s;\n } else {\n return Number(input.replace(/[^\\d.]+/g, \"\")) || 0;\n }\n}\n/**\n * Parse number from input\n * @param {*} input Any\n * @returns {number}\n */\nexport function parseNumber(input: any): number {\n if (typeof input === \"string\") return Number(input.replace(/[^\\d.]+/g, \"\")) || 0;\n return Number(input) || 0;\n}\n/**\n * Check if the string is an URL\n * @param {string} input input\n * @returns {boolean}\n */\nexport function isURL(input: any): boolean {\n if (typeof input !== \"string\" || input.includes(\" \")) return false;\n try {\n const url = new URL(input);\n if (![\"https:\", \"http:\"].includes(url.protocol) || !url.host) return false;\n } catch {\n return false;\n }\n return true;\n}\n/**\n * Check if the Client has enough intents to using DisTube\n * @param {ClientOptions} options options\n */\nexport function checkIntents(options: ClientOptions): void {\n const requiredIntents: BitFieldResolvable<IntentsString, number>[] = [\"GUILD_VOICE_STATES\"];\n const bitfield: BitFieldResolvable<IntentsString, number> = options.intents ?? (options?.ws as any)?.intents;\n if (typeof bitfield === \"undefined\") return;\n const intents = new Intents(bitfield);\n for (const intent of requiredIntents) {\n if (!intents.has(intent)) throw new DisTubeError(\"MISSING_INTENTS\", intent.toString());\n }\n}\n\n/**\n * Check if the voice channel is empty\n * @param {Discord.VoiceState} voiceState voiceState\n * @returns {boolean}\n */\nexport function isVoiceChannelEmpty(voiceState: VoiceState): boolean {\n const voiceChannel = voiceState.guild?.me?.voice?.channel;\n if (!voiceChannel) return false;\n const members = voiceChannel.members.filter(m => !m.user.bot);\n return !members.size;\n}\n\nexport function isSnowflake(id: any): id is Snowflake {\n try {\n return SnowflakeUtil.deconstruct(id).timestamp > SnowflakeUtil.EPOCH;\n } catch {\n return false;\n }\n}\n\nexport function isMemberInstance(member: any): member is GuildMember {\n return (\n !!member &&\n isSnowflake(member.id) &&\n isSnowflake(member.guild?.id) &&\n isSnowflake(member.user?.id) &&\n member.id === member.user.id\n );\n}\n\nexport function isTextChannelInstance(channel: any): channel is GuildTextBasedChannel {\n return (\n !!channel &&\n isSnowflake(channel.id) &&\n isSnowflake(channel.guild?.id) &&\n typeof channel.send === \"function\" &&\n typeof channel.awaitMessages === \"function\"\n );\n}\n\nexport function isMessageInstance(message: any): message is Message<true> {\n // Simple check for using distube normally\n return (\n !!message &&\n isSnowflake(message.id) &&\n isSnowflake(message.guild?.id) &&\n isTextChannelInstance(message.channel) &&\n isMemberInstance(message.member) &&\n isSnowflake(message.author?.id) &&\n message.member.id === message.author.id &&\n message.guild.id === message.channel.guild.id\n );\n}\n\nexport function isSupportedVoiceChannel(channel: any): channel is VoiceBasedChannel {\n return (\n !!channel &&\n typeof channel.joinable === \"boolean\" &&\n isSnowflake(channel.id) &&\n isSnowflake(channel.guild?.id) &&\n typeof channel.full === \"boolean\" &&\n [\n // Djs v12\n \"voice\",\n \"stage\",\n // Djs v13\n \"GUILD_VOICE\",\n \"GUILD_STAGE_VOICE\",\n ].includes(channel.type)\n );\n}\n\nexport function isGuildInstance(guild: any): guild is Guild {\n return !!guild && isSnowflake(guild.id) && typeof guild.fetchAuditLogs === \"function\";\n}\n\nexport function resolveGuildId(resolvable: GuildIdResolvable): Snowflake {\n let guildId: string | undefined;\n if (typeof resolvable === \"string\") {\n guildId = resolvable;\n } else if (isObject(resolvable)) {\n if (resolvable instanceof Queue || resolvable instanceof DisTubeVoice) guildId = resolvable.id;\n else if (\"guild\" in resolvable && isGuildInstance(resolvable.guild)) guildId = resolvable.guild.id;\n else if (\"id\" in resolvable && isGuildInstance(resolvable)) guildId = resolvable.id;\n }\n if (!isSnowflake(guildId)) throw new DisTubeError(\"INVALID_TYPE\", \"GuildIdResolvable\", resolvable);\n return guildId;\n}\n\nexport function resolveGuildID(resolvable: GuildIdResolvable): Snowflake {\n process.emitWarning(\"resolveGuildID() is deprecated, use resolveGuildId() instead.\", \"DeprecationWarning\");\n return resolveGuildId(resolvable);\n}\n\nexport function isClientInstance(client: any): client is Client {\n return !!client && typeof client.login === \"function\";\n}\n\nexport function checkInvalidKey(\n target: Record<string, any>,\n source: Record<string, any> | string[],\n sourceName: string,\n) {\n if (!isObject(target)) throw new DisTubeError(\"INVALID_TYPE\", \"object\", target, sourceName);\n const sourceKeys = Array.isArray(source) ? source : Object.keys(source);\n const invalidKey = Object.keys(target).find(key => !sourceKeys.includes(key));\n if (invalidKey) throw new DisTubeError(\"INVALID_KEY\", sourceName, invalidKey);\n}\n\nasync function waitEvent(target: EventEmitter, status: string, maxTime: number) {\n let cleanup = () => undefined as any;\n try {\n await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => reject(new Error(`Didn't trigger ${status} within ${maxTime}ms`)), maxTime);\n target.once(status, resolve);\n target.once(\"error\", reject);\n cleanup = () => {\n clearTimeout(timeout);\n target.off(status, resolve);\n target.off(\"error\", reject);\n };\n });\n return target;\n } finally {\n cleanup();\n }\n}\n\nexport async function entersState<T extends VoiceConnection | AudioPlayer>(\n target: T,\n status: T extends VoiceConnection ? VoiceConnectionStatus : AudioPlayerStatus,\n maxTime: number,\n) {\n if (target.state.status === status) return target;\n return waitEvent(target, status, maxTime) as Promise<T>;\n}\n\nexport function isObject(obj: any): obj is object {\n return typeof obj === \"object\" && obj !== null && !Array.isArray(obj);\n}\n"]}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;;AAAA,6BAA0B;AAC1B,wBAAsD;AACtD,2CAA0F;AAgB1F,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAOhE,SAAgB,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IACrC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IACxF,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;IACtE,OAAO,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;AACpC,CAAC;AARD,wCAQC;AAMD,SAAgB,QAAQ,CAAC,KAAU;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,IAAI,IAAI,CAAC,CAAC,CAAC;gBAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACxG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QACjF,OAAO,CAAC,CAAC;KACV;SAAM;QACL,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;KACnD;AACH,CAAC;AAZD,4BAYC;AAMD,SAAgB,WAAW,CAAC,KAAU;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACjF,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAHD,kCAGC;AAMD,SAAgB,KAAK,CAAC,KAAU;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACnE,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,SAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;KAC5E;IAAC,MAAM;QACN,OAAO,KAAK,CAAC;KACd;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AATD,sBASC;AAKD,SAAgB,YAAY,CAAC,OAAsB;IAQjD,MAAM,OAAO,GAAG,IAAI,4BAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,CAAC,GAAG,KAAoC;QAAE,MAAM,IAAI,eAAY,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;AACtH,CAAC;AAVD,oCAUC;AAOD,SAAgB,mBAAmB,CAAC,UAAsB;IACxD,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC;IAC1D,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAChC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9D,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;AACvB,CAAC;AALD,kDAKC;AAED,SAAgB,WAAW,CAAC,EAAO;IACjC,IAAI;QACF,OAAO,0BAAa,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,SAAS,GAAG,0BAAa,CAAC,KAAK,CAAC;KACtE;IAAC,MAAM;QACN,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAND,kCAMC;AAED,SAAgB,gBAAgB,CAAC,MAAW;IAC1C,OAAO,CACL,CAAC,CAAC,MAAM;QACR,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QAC7B,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAC7B,CAAC;AACJ,CAAC;AARD,4CAQC;AAED,SAAgB,qBAAqB,CAAC,OAAY;IAChD,OAAO,CACL,CAAC,CAAC,OAAO;QACT,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;QAC5B,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU;QAClC,OAAO,OAAO,CAAC,aAAa,KAAK,UAAU,CAC5C,CAAC;AACJ,CAAC;AARD,sDAQC;AAED,SAAgB,iBAAiB,CAAC,OAAY;IAE5C,OAAO,CACL,CAAC,CAAC,OAAO;QACT,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;QAC5B,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC;QACtC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;QAChC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE;QACvC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAC9C,CAAC;AACJ,CAAC;AAZD,8CAYC;AAED,SAAgB,uBAAuB,CAAC,OAAY;IAClD,OAAO,CACL,CAAC,CAAC,OAAO;QACT,OAAO,OAAO,CAAC,QAAQ,KAAK,SAAS;QACrC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;QAC5B,OAAO,OAAO,CAAC,IAAI,KAAK,SAAS;QACjC,sBAAS,CAAC,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CACxD,CAAC;AACJ,CAAC;AATD,0DASC;AAED,SAAgB,eAAe,CAAC,KAAU;IACxC,OAAO,CAAC,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,OAAO,KAAK,CAAC,cAAc,KAAK,UAAU,CAAC;AACxF,CAAC;AAFD,0CAEC;AAED,SAAgB,cAAc,CAAC,UAA6B;IAC1D,IAAI,OAA2B,CAAC;IAChC,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;QAClC,OAAO,GAAG,UAAU,CAAC;KACtB;SAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,EAAE;QAC/B,IAAI,UAAU,YAAY,QAAK,IAAI,UAAU,YAAY,eAAY;YAAE,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC;aAC1F,IAAI,OAAO,IAAI,UAAU,IAAI,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;aAC9F,IAAI,IAAI,IAAI,UAAU,IAAI,eAAe,CAAC,UAAU,CAAC;YAAE,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC;KACrF;IACD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,eAAY,CAAC,cAAc,EAAE,mBAAmB,EAAE,UAAU,CAAC,CAAC;IACnG,OAAO,OAAO,CAAC;AACjB,CAAC;AAXD,wCAWC;AAED,SAAgB,gBAAgB,CAAC,MAAW;IAC1C,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,CAAC;AACxD,CAAC;AAFD,4CAEC;AAED,SAAgB,eAAe,CAC7B,MAA2B,EAC3B,MAAsC,EACtC,UAAkB;IAElB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,eAAY,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC5F,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9E,IAAI,UAAU;QAAE,MAAM,IAAI,eAAY,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAChF,CAAC;AATD,0CASC;AAED,KAAK,UAAU,SAAS,CAAC,MAAoB,EAAE,MAAc,EAAE,OAAe;IAC5E,IAAI,OAAO,GAAG,GAAG,EAAE;IAEnB,CAAC,CAAC;IACF,IAAI;QACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,MAAM,WAAW,OAAO,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7G,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7B,OAAO,GAAG,GAAG,EAAE;gBACb,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC5B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9B,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;KACf;YAAS;QACR,OAAO,EAAE,CAAC;KACX;AACH,CAAC;AAEM,KAAK,UAAU,WAAW,CAC/B,MAAS,EACT,MAA6E,EAC7E,OAAe;IAEf,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAClD,OAAO,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAe,CAAC;AAC1D,CAAC;AAPD,kCAOC;AAED,SAAgB,QAAQ,CAAC,GAAQ;IAC/B,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACxE,CAAC;AAFD,4BAEC;AAED,SAAgB,QAAQ,CAAC,GAAQ;IAC/B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC;AAFD,4BAEC","sourcesContent":["import { URL } from \"url\";\nimport { DisTubeError, DisTubeVoice, Queue } from \".\";\nimport { Constants, GatewayIntentBits, IntentsBitField, SnowflakeUtil } from \"discord.js\";\nimport type { GuildIdResolvable } from \".\";\nimport type { EventEmitter } from \"node:events\";\nimport type { AudioPlayer, AudioPlayerStatus, VoiceConnection, VoiceConnectionStatus } from \"@discordjs/voice\";\nimport type {\n Client,\n ClientOptions,\n Guild,\n GuildMember,\n GuildTextBasedChannel,\n Message,\n Snowflake,\n VoiceBasedChannel,\n VoiceState,\n} from \"discord.js\";\n\nconst formatInt = (int: number) => (int < 10 ? `0${int}` : int);\n\n/**\n * Format duration to string\n * @param {number} sec Duration in seconds\n * @returns {string}\n */\nexport function formatDuration(sec: number): string {\n if (!sec || !Number(sec)) return \"00:00\";\n const seconds = Math.round(sec % 60);\n const minutes = Math.floor((sec % 3600) / 60);\n const hours = Math.floor(sec / 3600);\n if (hours > 0) return `${formatInt(hours)}:${formatInt(minutes)}:${formatInt(seconds)}`;\n if (minutes > 0) return `${formatInt(minutes)}:${formatInt(seconds)}`;\n return `00:${formatInt(seconds)}`;\n}\n/**\n * Convert formatted duration to seconds\n * @param {*} input Formatted duration string\n * @returns {number}\n */\nexport function toSecond(input: any): number {\n if (!input) return 0;\n if (typeof input !== \"string\") return Number(input) || 0;\n if (input.match(/:/g)) {\n const time = input.split(\":\").reverse();\n let s = 0;\n for (let i = 0; i < 3; i++) if (time[i]) s += Number(time[i].replace(/[^\\d.]+/g, \"\")) * Math.pow(60, i);\n if (time.length > 3) s += Number(time[3].replace(/[^\\d.]+/g, \"\")) * 24 * 60 * 60;\n return s;\n } else {\n return Number(input.replace(/[^\\d.]+/g, \"\")) || 0;\n }\n}\n/**\n * Parse number from input\n * @param {*} input Any\n * @returns {number}\n */\nexport function parseNumber(input: any): number {\n if (typeof input === \"string\") return Number(input.replace(/[^\\d.]+/g, \"\")) || 0;\n return Number(input) || 0;\n}\n/**\n * Check if the string is an URL\n * @param {string} input input\n * @returns {boolean}\n */\nexport function isURL(input: any): boolean {\n if (typeof input !== \"string\" || input.includes(\" \")) return false;\n try {\n const url = new URL(input);\n if (![\"https:\", \"http:\"].includes(url.protocol) || !url.host) return false;\n } catch {\n return false;\n }\n return true;\n}\n/**\n * Check if the Client has enough intents to using DisTube\n * @param {ClientOptions} options options\n */\nexport function checkIntents(options: ClientOptions): void {\n // const requiredIntents = [GatewayIntentBits.GuildVoiceStates];\n // const intents = new IntentsBitField(options.intents);\n // for (const intent of requiredIntents) {\n // // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // // @ts-ignore\n // if (!intents.has(intent)) throw new DisTubeError(\"MISSING_INTENTS\", GatewayIntentBits[intent.toString()]);\n // }\n const intents = new IntentsBitField(options.intents);\n if (!intents.has(GatewayIntentBits.GuildVoiceStates)) throw new DisTubeError(\"MISSING_INTENTS\", \"GuildVoiceStates\");\n}\n\n/**\n * Check if the voice channel is empty\n * @param {Discord.VoiceState} voiceState voiceState\n * @returns {boolean}\n */\nexport function isVoiceChannelEmpty(voiceState: VoiceState): boolean {\n const voiceChannel = voiceState.guild?.me?.voice?.channel;\n if (!voiceChannel) return false;\n const members = voiceChannel.members.filter(m => !m.user.bot);\n return !members.size;\n}\n\nexport function isSnowflake(id: any): id is Snowflake {\n try {\n return SnowflakeUtil.deconstruct(id).timestamp > SnowflakeUtil.epoch;\n } catch {\n return false;\n }\n}\n\nexport function isMemberInstance(member: any): member is GuildMember {\n return (\n !!member &&\n isSnowflake(member.id) &&\n isSnowflake(member.guild?.id) &&\n isSnowflake(member.user?.id) &&\n member.id === member.user.id\n );\n}\n\nexport function isTextChannelInstance(channel: any): channel is GuildTextBasedChannel {\n return (\n !!channel &&\n isSnowflake(channel.id) &&\n isSnowflake(channel.guildId) &&\n typeof channel.send === \"function\" &&\n typeof channel.awaitMessages === \"function\"\n );\n}\n\nexport function isMessageInstance(message: any): message is Message<true> {\n // Simple check for using distube normally\n return (\n !!message &&\n isSnowflake(message.id) &&\n isSnowflake(message.guildId) &&\n isTextChannelInstance(message.channel) &&\n isMemberInstance(message.member) &&\n isSnowflake(message.author.id) &&\n message.member.id === message.author.id &&\n message.guild.id === message.channel.guild.id\n );\n}\n\nexport function isSupportedVoiceChannel(channel: any): channel is VoiceBasedChannel {\n return (\n !!channel &&\n typeof channel.joinable === \"boolean\" &&\n isSnowflake(channel.id) &&\n isSnowflake(channel.guildId) &&\n typeof channel.full === \"boolean\" &&\n Constants.VoiceBasedChannelTypes.includes(channel.type)\n );\n}\n\nexport function isGuildInstance(guild: any): guild is Guild {\n return !!guild && isSnowflake(guild.id) && typeof guild.fetchAuditLogs === \"function\";\n}\n\nexport function resolveGuildId(resolvable: GuildIdResolvable): Snowflake {\n let guildId: string | undefined;\n if (typeof resolvable === \"string\") {\n guildId = resolvable;\n } else if (isObject(resolvable)) {\n if (resolvable instanceof Queue || resolvable instanceof DisTubeVoice) guildId = resolvable.id;\n else if (\"guild\" in resolvable && isGuildInstance(resolvable.guild)) guildId = resolvable.guild.id;\n else if (\"id\" in resolvable && isGuildInstance(resolvable)) guildId = resolvable.id;\n }\n if (!isSnowflake(guildId)) throw new DisTubeError(\"INVALID_TYPE\", \"GuildIdResolvable\", resolvable);\n return guildId;\n}\n\nexport function isClientInstance(client: any): client is Client {\n return !!client && typeof client.login === \"function\";\n}\n\nexport function checkInvalidKey(\n target: Record<string, any>,\n source: Record<string, any> | string[],\n sourceName: string,\n) {\n if (!isObject(target)) throw new DisTubeError(\"INVALID_TYPE\", \"object\", target, sourceName);\n const sourceKeys = Array.isArray(source) ? source : Object.keys(source);\n const invalidKey = Object.keys(target).find(key => !sourceKeys.includes(key));\n if (invalidKey) throw new DisTubeError(\"INVALID_KEY\", sourceName, invalidKey);\n}\n\nasync function waitEvent(target: EventEmitter, status: string, maxTime: number) {\n let cleanup = () => {\n // void\n };\n try {\n await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => reject(new Error(`Didn't trigger ${status} within ${maxTime}ms`)), maxTime);\n target.once(status, resolve);\n target.once(\"error\", reject);\n cleanup = () => {\n clearTimeout(timeout);\n target.off(status, resolve);\n target.off(\"error\", reject);\n };\n });\n return target;\n } finally {\n cleanup();\n }\n}\n\nexport async function entersState<T extends VoiceConnection | AudioPlayer>(\n target: T,\n status: T extends VoiceConnection ? VoiceConnectionStatus : AudioPlayerStatus,\n maxTime: number,\n) {\n if (target.state.status === status) return target;\n return waitEvent(target, status, maxTime) as Promise<T>;\n}\n\nexport function isObject(obj: any): obj is object {\n return typeof obj === \"object\" && obj !== null && !Array.isArray(obj);\n}\n\nexport function isRecord(obj: any): obj is Record<string, unknown> {\n return isObject(obj);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "distube",
3
- "version": "3.3.1",
3
+ "version": "4.0.0-dev.2",
4
4
  "description": "A Discord.js module to simplify your music commands and play songs with audio filters on Discord without any API key. Support YouTube, SoundCloud, Bandcamp, Facebook, and 700+ more sites",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -9,10 +9,10 @@
9
9
  "docs": "docgen -s src/*.ts src/**/*.ts -o docs/docs.json -c pages/index.yml -g -j .jsconfig.json",
10
10
  "lint": "eslint .",
11
11
  "lint:fix": "eslint . --fix",
12
- "prettier": "prettier --write **/*.{js,ts,json,yml,yaml}",
12
+ "prettier": "prettier --write **/*.{ts,json,yml,yaml,md}",
13
13
  "build": "tsc",
14
14
  "build:check": "tsc --noEmit --incremental false",
15
- "publish:stable": "npm publish",
15
+ "publish:dev": "npm publish --tag dev",
16
16
  "ncu": "ncu -u --dep dev,prod",
17
17
  "_postinstall": "husky install",
18
18
  "prepublishOnly": "pinst -d",
@@ -45,7 +45,6 @@
45
45
  },
46
46
  "homepage": "https://distube.js.org/",
47
47
  "dependencies": {
48
- "@distube/youtube-dl": "^2.2.4",
49
48
  "@distube/ytdl-core": "^4.9.4",
50
49
  "@distube/ytpl": "^1.1.1",
51
50
  "@distube/ytsr": "^1.1.5",
@@ -53,7 +52,7 @@
53
52
  "tiny-typed-emitter": "^2.1.0"
54
53
  },
55
54
  "devDependencies": {
56
- "@babel/core": "^7.16.12",
55
+ "@babel/core": "^7.17.0",
57
56
  "@babel/plugin-proposal-class-properties": "^7.16.7",
58
57
  "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
59
58
  "@babel/preset-env": "^7.16.11",
@@ -63,16 +62,16 @@
63
62
  "@discordjs/voice": "^0.8.0",
64
63
  "@distube/docgen": "github:distubejs/docgen",
65
64
  "@types/jest": "^27.4.0",
66
- "@types/node": "^17.0.13",
67
- "@typescript-eslint/eslint-plugin": "^5.10.1",
68
- "babel-jest": "^27.4.6",
69
- "discord.js": "^13.6.0",
65
+ "@types/node": "^17.0.15",
66
+ "@typescript-eslint/eslint-plugin": "^5.10.2",
67
+ "babel-jest": "^27.5.0",
68
+ "discord.js": "^14.0.0-dev.1644006540.cd5c7fa",
70
69
  "eslint": "^8.8.0",
71
70
  "eslint-config-distube": "^1.6.3",
72
71
  "husky": "^7.0.4",
73
- "jest": "^27.4.7",
72
+ "jest": "^27.5.0",
74
73
  "jsdoc-babel": "^0.5.0",
75
- "lint-staged": "^12.3.2",
74
+ "nano-staged": "^0.5.0",
76
75
  "npm-check-updates": "^12.2.1",
77
76
  "pinst": "^2.1.6",
78
77
  "prettier": "^2.5.1",
@@ -80,15 +79,24 @@
80
79
  },
81
80
  "peerDependencies": {
82
81
  "@discordjs/opus": "*",
83
- "@discordjs/voice": ">=0.5.6",
84
- "discord.js": "^12.5.0||13.x"
82
+ "@discordjs/voice": "*",
83
+ "discord.js": "14||^14.0.0-dev"
85
84
  },
86
85
  "peerDependenciesMeta": {
87
86
  "@discordjs/opus": {
88
87
  "optional": true
89
88
  }
90
89
  },
90
+ "nano-staged": {
91
+ "*.ts": [
92
+ "prettier --write",
93
+ "eslint"
94
+ ],
95
+ "*.{json,yml,yaml,md}": [
96
+ "prettier --write"
97
+ ]
98
+ },
91
99
  "engines": {
92
- "node": ">=12.0.0"
100
+ "node": ">=16.6.0"
93
101
  }
94
102
  }
@@ -1,4 +0,0 @@
1
- import type { VoiceChannel } from "discord.js";
2
- import type { DiscordGatewayAdapterCreator } from "@discordjs/voice";
3
- export declare function createDiscordJSAdapter(channel: VoiceChannel): DiscordGatewayAdapterCreator;
4
- //# sourceMappingURL=DJSAdapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DJSAdapter.d.ts","sourceRoot":"","sources":["../../../src/core/voice/DJSAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,YAAY,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAuC,MAAM,kBAAkB,CAAC;AAuC1G,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,4BAA4B,CAkB1F"}
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createDiscordJSAdapter = void 0;
4
- const discord_js_1 = require("discord.js");
5
- const adapters = new Map();
6
- const trackedClients = new Set();
7
- function trackClient(client) {
8
- if (trackedClients.has(client))
9
- return;
10
- trackedClients.add(client);
11
- client.ws.on(discord_js_1.Constants.WSEvents.VOICE_SERVER_UPDATE, (payload) => {
12
- adapters.get(payload.guild_id)?.onVoiceServerUpdate(payload);
13
- });
14
- client.ws.on(discord_js_1.Constants.WSEvents.VOICE_STATE_UPDATE, (payload) => {
15
- if (payload.guild_id && payload.session_id && payload.user_id === client.user?.id) {
16
- adapters.get(payload.guild_id)?.onVoiceStateUpdate(payload);
17
- }
18
- });
19
- client.on(discord_js_1.Constants.Events.SHARD_DISCONNECT, (_, shardID) => {
20
- const guilds = trackedShards.get(shardID);
21
- if (guilds) {
22
- for (const guildID of guilds.values()) {
23
- adapters.get(guildID)?.destroy();
24
- }
25
- }
26
- trackedShards.delete(shardID);
27
- });
28
- }
29
- const trackedShards = new Map();
30
- function trackGuild(guild) {
31
- let guilds = trackedShards.get(guild.shardID);
32
- if (!guilds) {
33
- guilds = new Set();
34
- trackedShards.set(guild.shardID, guilds);
35
- }
36
- guilds.add(guild.id);
37
- }
38
- function createDiscordJSAdapter(channel) {
39
- return methods => {
40
- adapters.set(channel.guild.id, methods);
41
- trackClient(channel.client);
42
- trackGuild(channel.guild);
43
- return {
44
- sendPayload(data) {
45
- if (channel.guild.shard.status === discord_js_1.Constants.Status.READY) {
46
- channel.guild.shard.send(data);
47
- return true;
48
- }
49
- return false;
50
- },
51
- destroy() {
52
- return adapters.delete(channel.guild.id);
53
- },
54
- };
55
- };
56
- }
57
- exports.createDiscordJSAdapter = createDiscordJSAdapter;
58
- //# sourceMappingURL=DJSAdapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DJSAdapter.js","sourceRoot":"","sources":["../../../src/core/voice/DJSAdapter.ts"],"names":[],"mappings":";;;AAAA,2CAAuC;AAKvC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkD,CAAC;AAC3E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;AAEzC,SAAS,WAAW,CAAC,MAAc;IACjC,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO;IACvC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,sBAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC,OAA6C,EAAE,EAAE;QACrG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,sBAAS,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,OAA4C,EAAE,EAAE;QACnG,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE;YACjF,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;SAC7D;IACH,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,sBAAS,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;QAC1D,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,MAAM,EAAE;YACV,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE;gBACrC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;aAClC;SACF;QACD,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAA0B,CAAC;AAExD,SAAS,UAAU,CAAC,KAAU;IAC5B,IAAI,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACnB,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KAC1C;IACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACvB,CAAC;AAED,SAAgB,sBAAsB,CAAC,OAAqB;IAC1D,OAAO,OAAO,CAAC,EAAE;QACf,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACxC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5B,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO;YACL,WAAW,CAAC,IAAI;gBACd,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,sBAAS,CAAC,MAAM,CAAC,KAAK,EAAE;oBACzD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC/B,OAAO,IAAI,CAAC;iBACb;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO;gBACL,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3C,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAlBD,wDAkBC","sourcesContent":["import { Constants } from \"discord.js\";\nimport type { Client, Snowflake, VoiceChannel } from \"discord.js\";\nimport type { DiscordGatewayAdapterCreator, DiscordGatewayAdapterLibraryMethods } from \"@discordjs/voice\";\nimport type { GatewayVoiceServerUpdateDispatchData, GatewayVoiceStateUpdateDispatchData } from \"discord-api-types/v9\";\n\nconst adapters = new Map<Snowflake, DiscordGatewayAdapterLibraryMethods>();\nconst trackedClients = new Set<Client>();\n\nfunction trackClient(client: Client) {\n if (trackedClients.has(client)) return;\n trackedClients.add(client);\n client.ws.on(Constants.WSEvents.VOICE_SERVER_UPDATE, (payload: GatewayVoiceServerUpdateDispatchData) => {\n adapters.get(payload.guild_id)?.onVoiceServerUpdate(payload);\n });\n client.ws.on(Constants.WSEvents.VOICE_STATE_UPDATE, (payload: GatewayVoiceStateUpdateDispatchData) => {\n if (payload.guild_id && payload.session_id && payload.user_id === client.user?.id) {\n adapters.get(payload.guild_id)?.onVoiceStateUpdate(payload);\n }\n });\n client.on(Constants.Events.SHARD_DISCONNECT, (_, shardID) => {\n const guilds = trackedShards.get(shardID);\n if (guilds) {\n for (const guildID of guilds.values()) {\n adapters.get(guildID)?.destroy();\n }\n }\n trackedShards.delete(shardID);\n });\n}\n\nconst trackedShards = new Map<number, Set<Snowflake>>();\n\nfunction trackGuild(guild: any) {\n let guilds = trackedShards.get(guild.shardID);\n if (!guilds) {\n guilds = new Set();\n trackedShards.set(guild.shardID, guilds);\n }\n guilds.add(guild.id);\n}\n\nexport function createDiscordJSAdapter(channel: VoiceChannel): DiscordGatewayAdapterCreator {\n return methods => {\n adapters.set(channel.guild.id, methods);\n trackClient(channel.client);\n trackGuild(channel.guild);\n return {\n sendPayload(data) {\n if (channel.guild.shard.status === Constants.Status.READY) {\n channel.guild.shard.send(data);\n return true;\n }\n return false;\n },\n destroy() {\n return adapters.delete(channel.guild.id);\n },\n };\n };\n}\n"]}
@@ -1,12 +0,0 @@
1
- import { ExtractorPlugin, Playlist, Song } from "..";
2
- import type { GuildMember } from "discord.js";
3
- export declare class YouTubeDLPlugin extends ExtractorPlugin {
4
- constructor(updateYouTubeDL?: boolean);
5
- validate(): Promise<boolean>;
6
- resolve(url: string, { member, metadata }: {
7
- member?: GuildMember;
8
- metadata?: any;
9
- }): Promise<Playlist<any> | Song<any>>;
10
- getStreamURL(url: string): Promise<string>;
11
- }
12
- //# sourceMappingURL=youtube-dl.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"youtube-dl.d.ts","sourceRoot":"","sources":["../../src/plugin/youtube-dl.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,qBAAa,eAAgB,SAAQ,eAAe;gBACtC,eAAe,UAAO;IAY5B,QAAQ;IAIR,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;KAAE;IAkBnF,YAAY,CAAC,GAAG,EAAE,MAAM;CAW/B"}
@@ -1,70 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.YouTubeDLPlugin = void 0;
23
- const youtube_dl_1 = __importStar(require("@distube/youtube-dl"));
24
- const __1 = require("..");
25
- class YouTubeDLPlugin extends __1.ExtractorPlugin {
26
- constructor(updateYouTubeDL = true) {
27
- super();
28
- if (updateYouTubeDL) {
29
- /* eslint-disable no-console */
30
- (0, youtube_dl_1.download)()
31
- .then((version) => console.log(`[DisTube] Updated youtube-dl to ${version}!`))
32
- .catch(console.error)
33
- .catch(() => console.warn("[DisTube] Unable to update youtube-dl, using default version."));
34
- /* eslint-enable no-console */
35
- }
36
- }
37
- // eslint-disable-next-line @typescript-eslint/require-await
38
- async validate() {
39
- return true;
40
- }
41
- async resolve(url, { member, metadata }) {
42
- const info = await (0, youtube_dl_1.default)(url, {
43
- dumpSingleJson: true,
44
- noWarnings: true,
45
- noCallHome: true,
46
- preferFreeFormats: true,
47
- }).catch(e => {
48
- throw new Error(`[youtube-dl] ${e.stderr || e}`);
49
- });
50
- if (Array.isArray(info.entries) && info.entries.length > 0) {
51
- info.source = info.extractor.match(/\w+/)[0];
52
- info.songs = info.entries.map((i) => new __1.Song(i, { member, source: i.extractor, metadata }));
53
- return new __1.Playlist(info, { member, metadata, properties: { source: info.songs[0]?.source } });
54
- }
55
- return new __1.Song(info, { member, source: info.extractor, metadata });
56
- }
57
- async getStreamURL(url) {
58
- const info = await (0, youtube_dl_1.default)(url, {
59
- dumpSingleJson: true,
60
- noWarnings: true,
61
- noCallHome: true,
62
- preferFreeFormats: true,
63
- }).catch(e => {
64
- throw new Error(`[youtube-dl] ${e.stderr || e}`);
65
- });
66
- return info.url;
67
- }
68
- }
69
- exports.YouTubeDLPlugin = YouTubeDLPlugin;
70
- //# sourceMappingURL=youtube-dl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"youtube-dl.js","sourceRoot":"","sources":["../../src/plugin/youtube-dl.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,kEAA8D;AAC9D,0BAAqD;AAKrD,MAAa,eAAgB,SAAQ,mBAAe;IAClD,YAAY,eAAe,GAAG,IAAI;QAChC,KAAK,EAAE,CAAC;QACR,IAAI,eAAe,EAAE;YACnB,+BAA+B;YAC/B,IAAA,qBAAQ,GAAE;iBACP,IAAI,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,mCAAmC,OAAO,GAAG,CAAC,CAAC;iBAClF,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;iBACpB,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;YAC9F,8BAA8B;SAC/B;IACH,CAAC;IACD,4DAA4D;IAC5D,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAA4C;QACvF,MAAM,IAAI,GAAQ,MAAM,IAAA,oBAAa,EAAC,GAAG,EAAE;YACzC,cAAc,EAAE,IAAI;YACpB,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAC3B,CAAC,CAA6B,EAAE,EAAE,CAAC,IAAI,QAAI,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAC1F,CAAC;YACF,OAAO,IAAI,YAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;SAChG;QACD,OAAO,IAAI,QAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAA,oBAAa,EAAC,GAAG,EAAE;YACpC,cAAc,EAAE,IAAI;YACpB,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;CACF;AA9CD,0CA8CC","sourcesContent":["import youtubeDlExec, { download } from \"@distube/youtube-dl\";\nimport { ExtractorPlugin, Playlist, Song } from \"..\";\nimport type { OtherSongInfo } from \"..\";\nimport type { GuildMember } from \"discord.js\";\nimport type { YtResponse } from \"@distube/youtube-dl\";\n\nexport class YouTubeDLPlugin extends ExtractorPlugin {\n constructor(updateYouTubeDL = true) {\n super();\n if (updateYouTubeDL) {\n /* eslint-disable no-console */\n download()\n .then((version: any) => console.log(`[DisTube] Updated youtube-dl to ${version}!`))\n .catch(console.error)\n .catch(() => console.warn(\"[DisTube] Unable to update youtube-dl, using default version.\"));\n /* eslint-enable no-console */\n }\n }\n // eslint-disable-next-line @typescript-eslint/require-await\n async validate() {\n return true;\n }\n\n async resolve(url: string, { member, metadata }: { member?: GuildMember; metadata?: any }) {\n const info: any = await youtubeDlExec(url, {\n dumpSingleJson: true,\n noWarnings: true,\n noCallHome: true,\n preferFreeFormats: true,\n }).catch(e => {\n throw new Error(`[youtube-dl] ${e.stderr || e}`);\n });\n if (Array.isArray(info.entries) && info.entries.length > 0) {\n info.source = info.extractor.match(/\\w+/)[0];\n info.songs = info.entries.map(\n (i: OtherSongInfo & YtResponse) => new Song(i, { member, source: i.extractor, metadata }),\n );\n return new Playlist(info, { member, metadata, properties: { source: info.songs[0]?.source } });\n }\n return new Song(info, { member, source: info.extractor, metadata });\n }\n async getStreamURL(url: string) {\n const info = await youtubeDlExec(url, {\n dumpSingleJson: true,\n noWarnings: true,\n noCallHome: true,\n preferFreeFormats: true,\n }).catch(e => {\n throw new Error(`[youtube-dl] ${e.stderr || e}`);\n });\n return info.url;\n }\n}\n"]}