mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-19 04:53:30 +01:00
feat(Message|TextChannel): Inline replies (#4874)
* feat(Message): remove reply functionality * feat(InlineReplies): add INLINE_REPLY constant/typing * feat(InlineReplies): add Message#replyReference property * feat(InlineReplies): add typings for sending inline replies * feat(InlineReplies): provide support for inline-replying to messages * feat(Message): add referencedMessage getter * fix: check that Message#reference is defined in referencedMessage * refactor(InlineReplies): rename property, rework Message resolution * docs: update jsdoc for inline replies * feat(Message): inline reply method * fix(ApiMessage): finish renaming replyTo * fix: jsdocs for Message#referencedMessage Co-authored-by: Tristan Guichaoua <33934311+tguichaoua@users.noreply.github.com> * fix: restore reply typings * fix: dont pass channel_id to API when replying * chore: update jsdocs * chore: more jsdoc updates * feat(AllowedMentions): add typings for replied_user * fix: naming conventions * fix(Message): referenced_message is null, not undefined * fix(MessageMentionOptions): repliedUser should be optional * chore: get this back to the right state * fix(ApiMessage): pass allowed_mentions when replying without content * fix(ApiMessage): prevent mutation of client options Co-authored-by: almostSouji <timoqueezle@gmail.com> Co-authored-by: Tristan Guichaoua <33934311+tguichaoua@users.noreply.github.com>
This commit is contained in:
@@ -76,7 +76,7 @@ client.on('ready', () => {
|
|||||||
|
|
||||||
client.on('message', msg => {
|
client.on('message', msg => {
|
||||||
if (msg.content === 'ping') {
|
if (msg.content === 'ping') {
|
||||||
msg.reply('pong');
|
msg.channel.send('pong');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ client.on('message', message => {
|
|||||||
// If the message is "what is my avatar"
|
// If the message is "what is my avatar"
|
||||||
if (message.content === 'what is my avatar') {
|
if (message.content === 'what is my avatar') {
|
||||||
// Send the user's avatar URL
|
// Send the user's avatar URL
|
||||||
message.reply(message.author.displayAvatarURL());
|
message.channel.send(message.author.displayAvatarURL());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -45,23 +45,23 @@ client.on('message', message => {
|
|||||||
.kick('Optional reason that will display in the audit logs')
|
.kick('Optional reason that will display in the audit logs')
|
||||||
.then(() => {
|
.then(() => {
|
||||||
// We let the message author know we were able to kick the person
|
// We let the message author know we were able to kick the person
|
||||||
message.reply(`Successfully kicked ${user.tag}`);
|
message.channel.send(`Successfully kicked ${user.tag}`);
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
// An error happened
|
// An error happened
|
||||||
// This is generally due to the bot not being able to kick the member,
|
// This is generally due to the bot not being able to kick the member,
|
||||||
// either due to missing permissions or role hierarchy
|
// either due to missing permissions or role hierarchy
|
||||||
message.reply('I was unable to kick the member');
|
message.channel.send('I was unable to kick the member');
|
||||||
// Log the error
|
// Log the error
|
||||||
console.error(err);
|
console.error(err);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// The mentioned user isn't in this guild
|
// The mentioned user isn't in this guild
|
||||||
message.reply("That user isn't in this guild!");
|
message.channel.send("That user isn't in this guild!");
|
||||||
}
|
}
|
||||||
// Otherwise, if no user was mentioned
|
// Otherwise, if no user was mentioned
|
||||||
} else {
|
} else {
|
||||||
message.reply("You didn't mention the user to kick!");
|
message.channel.send("You didn't mention the user to kick!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -121,23 +121,23 @@ client.on('message', message => {
|
|||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
// We let the message author know we were able to ban the person
|
// We let the message author know we were able to ban the person
|
||||||
message.reply(`Successfully banned ${user.tag}`);
|
message.channel.send(`Successfully banned ${user.tag}`);
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
// An error happened
|
// An error happened
|
||||||
// This is generally due to the bot not being able to ban the member,
|
// This is generally due to the bot not being able to ban the member,
|
||||||
// either due to missing permissions or role hierarchy
|
// either due to missing permissions or role hierarchy
|
||||||
message.reply('I was unable to ban the member');
|
message.channel.send('I was unable to ban the member');
|
||||||
// Log the error
|
// Log the error
|
||||||
console.error(err);
|
console.error(err);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// The mentioned user isn't in this guild
|
// The mentioned user isn't in this guild
|
||||||
message.reply("That user isn't in this guild!");
|
message.channel.send("That user isn't in this guild!");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, if no user was mentioned
|
// Otherwise, if no user was mentioned
|
||||||
message.reply("You didn't mention the user to ban!");
|
message.channel.send("You didn't mention the user to ban!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ client.on('ready', () => {
|
|||||||
|
|
||||||
client.on('message', msg => {
|
client.on('message', msg => {
|
||||||
if (msg.content === 'ping') {
|
if (msg.content === 'ping') {
|
||||||
msg.reply('pong');
|
msg.channel.send('pong');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ client.on('message', async message => {
|
|||||||
if (message.member.voice.channel) {
|
if (message.member.voice.channel) {
|
||||||
const connection = await message.member.voice.channel.join();
|
const connection = await message.member.voice.channel.join();
|
||||||
} else {
|
} else {
|
||||||
message.reply('You need to join a voice channel first!');
|
message.channel.send('You need to join a voice channel first!');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -79,8 +79,6 @@ class APIMessage {
|
|||||||
* @returns {?(string|string[])}
|
* @returns {?(string|string[])}
|
||||||
*/
|
*/
|
||||||
makeContent() {
|
makeContent() {
|
||||||
const GuildMember = require('./GuildMember');
|
|
||||||
|
|
||||||
let content;
|
let content;
|
||||||
if (this.options.content === null) {
|
if (this.options.content === null) {
|
||||||
content = '';
|
content = '';
|
||||||
@@ -110,25 +108,14 @@ class APIMessage {
|
|||||||
const isCode = typeof this.options.code !== 'undefined' && this.options.code !== false;
|
const isCode = typeof this.options.code !== 'undefined' && this.options.code !== false;
|
||||||
const splitOptions = isSplit ? { ...this.options.split } : undefined;
|
const splitOptions = isSplit ? { ...this.options.split } : undefined;
|
||||||
|
|
||||||
let mentionPart = '';
|
if (content) {
|
||||||
if (this.options.reply && !this.isUser && this.target.type !== 'dm') {
|
|
||||||
const id = this.target.client.users.resolveID(this.options.reply);
|
|
||||||
mentionPart = `<@${this.options.reply instanceof GuildMember && this.options.reply.nickname ? '!' : ''}${id}>, `;
|
|
||||||
if (isSplit) {
|
|
||||||
splitOptions.prepend = `${mentionPart}${splitOptions.prepend || ''}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (content || mentionPart) {
|
|
||||||
if (isCode) {
|
if (isCode) {
|
||||||
const codeName = typeof this.options.code === 'string' ? this.options.code : '';
|
const codeName = typeof this.options.code === 'string' ? this.options.code : '';
|
||||||
content = `${mentionPart}\`\`\`${codeName}\n${Util.cleanCodeBlockContent(content)}\n\`\`\``;
|
content = `\`\`\`${codeName}\n${Util.cleanCodeBlockContent(content)}\n\`\`\``;
|
||||||
if (isSplit) {
|
if (isSplit) {
|
||||||
splitOptions.prepend = `${splitOptions.prepend || ''}\`\`\`${codeName}\n`;
|
splitOptions.prepend = `${splitOptions.prepend || ''}\`\`\`${codeName}\n`;
|
||||||
splitOptions.append = `\n\`\`\`${splitOptions.append || ''}`;
|
splitOptions.append = `\n\`\`\`${splitOptions.append || ''}`;
|
||||||
}
|
}
|
||||||
} else if (mentionPart) {
|
|
||||||
content = `${mentionPart}${content}`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isSplit) {
|
if (isSplit) {
|
||||||
@@ -185,19 +172,20 @@ class APIMessage {
|
|||||||
typeof this.options.allowedMentions === 'undefined'
|
typeof this.options.allowedMentions === 'undefined'
|
||||||
? this.target.client.options.allowedMentions
|
? this.target.client.options.allowedMentions
|
||||||
: this.options.allowedMentions;
|
: this.options.allowedMentions;
|
||||||
if (this.options.reply) {
|
|
||||||
const id = this.target.client.users.resolveID(this.options.reply);
|
if (allowedMentions) {
|
||||||
if (allowedMentions) {
|
allowedMentions = Util.cloneObject(allowedMentions);
|
||||||
// Clone the object as not to alter the ClientOptions object
|
allowedMentions.replied_user = allowedMentions.repliedUser;
|
||||||
allowedMentions = Util.cloneObject(allowedMentions);
|
delete allowedMentions.repliedUser;
|
||||||
const parsed = allowedMentions.parse && allowedMentions.parse.includes('users');
|
}
|
||||||
// Check if the mention won't be parsed, and isn't supplied in `users`
|
|
||||||
if (!parsed && !(allowedMentions.users && allowedMentions.users.includes(id))) {
|
let message_reference;
|
||||||
if (!allowedMentions.users) allowedMentions.users = [];
|
if (typeof this.options.replyTo !== 'undefined') {
|
||||||
allowedMentions.users.push(id);
|
const message_id = this.isMessage
|
||||||
}
|
? this.target.channel.messages.resolveID(this.options.replyTo)
|
||||||
} else {
|
: this.target.messages.resolveID(this.options.replyTo);
|
||||||
allowedMentions = { users: [id] };
|
if (message_id) {
|
||||||
|
message_reference = { message_id };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,8 +197,10 @@ class APIMessage {
|
|||||||
embeds,
|
embeds,
|
||||||
username,
|
username,
|
||||||
avatar_url: avatarURL,
|
avatar_url: avatarURL,
|
||||||
allowed_mentions: typeof content === 'undefined' ? undefined : allowedMentions,
|
allowed_mentions:
|
||||||
|
typeof content === 'undefined' && typeof message_reference === 'undefined' ? undefined : allowedMentions,
|
||||||
flags,
|
flags,
|
||||||
|
message_reference,
|
||||||
};
|
};
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ class Emoji extends Base {
|
|||||||
* @example
|
* @example
|
||||||
* // Send a custom emoji from a guild:
|
* // Send a custom emoji from a guild:
|
||||||
* const emoji = guild.emojis.cache.first();
|
* const emoji = guild.emojis.cache.first();
|
||||||
* msg.reply(`Hello! ${emoji}`);
|
* msg.channel.send(`Hello! ${emoji}`);
|
||||||
* @example
|
* @example
|
||||||
* // Send the emoji used in a reaction to the channel the reaction is part of
|
* // Send the emoji used in a reaction to the channel the reaction is part of
|
||||||
* reaction.message.channel.send(`The emoji used was: ${reaction.emoji}`);
|
* reaction.message.channel.send(`The emoji used was: ${reaction.emoji}`);
|
||||||
|
|||||||
@@ -205,11 +205,11 @@ class Message extends Base {
|
|||||||
this.flags = new MessageFlags(data.flags).freeze();
|
this.flags = new MessageFlags(data.flags).freeze();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reference data sent in a crossposted message.
|
* Reference data sent in a crossposted message or inline reply.
|
||||||
* @typedef {Object} MessageReference
|
* @typedef {Object} MessageReference
|
||||||
* @property {string} channelID ID of the channel the message was crossposted from
|
* @property {string} channelID ID of the channel the message was referenced
|
||||||
* @property {?string} guildID ID of the guild the message was crossposted from
|
* @property {?string} guildID ID of the guild the message was referenced
|
||||||
* @property {?string} messageID ID of the message that was crossposted
|
* @property {?string} messageID ID of the message that was referenced
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -223,6 +223,10 @@ class Message extends Base {
|
|||||||
messageID: data.message_reference.message_id,
|
messageID: data.message_reference.message_id,
|
||||||
}
|
}
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
|
if (data.referenced_message) {
|
||||||
|
this.channel.messages.add(data.referenced_message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -425,6 +429,18 @@ class Message extends Base {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Message this crosspost/reply/pin-add references, if cached
|
||||||
|
* @type {?Message}
|
||||||
|
* @readonly
|
||||||
|
*/
|
||||||
|
get referencedMessage() {
|
||||||
|
if (!this.reference) return null;
|
||||||
|
const referenceChannel = this.client.channels.resolve(this.reference.channelID);
|
||||||
|
if (!referenceChannel) return null;
|
||||||
|
return referenceChannel.messages.resolve(this.reference.messageID);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the message is crosspostable by the client user
|
* Whether the message is crosspostable by the client user
|
||||||
* @type {boolean}
|
* @type {boolean}
|
||||||
@@ -588,21 +604,19 @@ class Message extends Base {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Replies to the message.
|
* Send an inline reply to this message.
|
||||||
* @param {StringResolvable|APIMessage} [content=''] The content for the message
|
* @param {StringResolvable|APIMessage} [content=''] The content for the message
|
||||||
* @param {MessageOptions|MessageAdditions} [options={}] The options to provide
|
* @param {MessageOptions|MessageAdditions} [options] The additional options to provide
|
||||||
|
* @param {MessageResolvable} [options.replyTo=this] The message to reply to
|
||||||
* @returns {Promise<Message|Message[]>}
|
* @returns {Promise<Message|Message[]>}
|
||||||
* @example
|
|
||||||
* // Reply to a message
|
|
||||||
* message.reply('Hey, I\'m a reply!')
|
|
||||||
* .then(() => console.log(`Sent a reply to ${message.author.username}`))
|
|
||||||
* .catch(console.error);
|
|
||||||
*/
|
*/
|
||||||
reply(content, options) {
|
reply(content, options) {
|
||||||
return this.channel.send(
|
return this.channel.send(
|
||||||
content instanceof APIMessage
|
content instanceof APIMessage
|
||||||
? content
|
? content
|
||||||
: APIMessage.transformOptions(content, options, { reply: this.member || this.author }),
|
: APIMessage.transformOptions(content, options, {
|
||||||
|
replyTo: this,
|
||||||
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ class TextBasedChannel {
|
|||||||
* @property {string|boolean} [code] Language for optional codeblock formatting to apply
|
* @property {string|boolean} [code] Language for optional codeblock formatting to apply
|
||||||
* @property {boolean|SplitOptions} [split=false] Whether or not the message should be split into multiple messages if
|
* @property {boolean|SplitOptions} [split=false] Whether or not the message should be split into multiple messages if
|
||||||
* it exceeds the character limit. If an object is provided, these are the options for splitting the message
|
* it exceeds the character limit. If an object is provided, these are the options for splitting the message
|
||||||
* @property {UserResolvable} [reply] User to reply to (prefixes the message with a mention, except in DMs)
|
* @property {MessageResolvable} [replyTo] The message to reply to (must be in the same channel)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -74,6 +74,7 @@ class TextBasedChannel {
|
|||||||
* @property {MessageMentionTypes[]} [parse] Types of mentions to be parsed
|
* @property {MessageMentionTypes[]} [parse] Types of mentions to be parsed
|
||||||
* @property {Snowflake[]} [users] Snowflakes of Users to be parsed as mentions
|
* @property {Snowflake[]} [users] Snowflakes of Users to be parsed as mentions
|
||||||
* @property {Snowflake[]} [roles] Snowflakes of Roles to be parsed as mentions
|
* @property {Snowflake[]} [roles] Snowflakes of Roles to be parsed as mentions
|
||||||
|
* @property {boolean} [repliedUser] Whether the author of the Message being replied to should be pinged
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -403,6 +403,7 @@ exports.WSEvents = keyMirror([
|
|||||||
* * CHANNEL_FOLLOW_ADD
|
* * CHANNEL_FOLLOW_ADD
|
||||||
* * GUILD_DISCOVERY_DISQUALIFIED
|
* * GUILD_DISCOVERY_DISQUALIFIED
|
||||||
* * GUILD_DISCOVERY_REQUALIFIED
|
* * GUILD_DISCOVERY_REQUALIFIED
|
||||||
|
* * REPLY
|
||||||
* @typedef {string} MessageType
|
* @typedef {string} MessageType
|
||||||
*/
|
*/
|
||||||
exports.MessageTypes = [
|
exports.MessageTypes = [
|
||||||
@@ -422,6 +423,10 @@ exports.MessageTypes = [
|
|||||||
null,
|
null,
|
||||||
'GUILD_DISCOVERY_DISQUALIFIED',
|
'GUILD_DISCOVERY_DISQUALIFIED',
|
||||||
'GUILD_DISCOVERY_REQUALIFIED',
|
'GUILD_DISCOVERY_REQUALIFIED',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'REPLY',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -36,9 +36,9 @@ client.on('message', message => {
|
|||||||
// Clean content and log each character
|
// Clean content and log each character
|
||||||
console.log(Util.cleanContent(args.join(' '), message).split(''));
|
console.log(Util.cleanContent(args.join(' '), message).split(''));
|
||||||
|
|
||||||
if (command === 'test1') message.reply(tests[0]);
|
if (command === 'test1') message.channel.send(tests[0]);
|
||||||
else if (command === 'test2') message.reply(tests[1]);
|
else if (command === 'test2') message.channel.send(tests[1]);
|
||||||
else if (command === 'test3') message.reply(tests[2]);
|
else if (command === 'test3') message.channel.send(tests[2]);
|
||||||
});
|
});
|
||||||
|
|
||||||
client.login(token).catch(console.error);
|
client.login(token).catch(console.error);
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ client.on('message', message => {
|
|||||||
}
|
}
|
||||||
message.channel.send('last one...').then(m => {
|
message.channel.send('last one...').then(m => {
|
||||||
const diff = Date.now() - start;
|
const diff = Date.now() - start;
|
||||||
m.reply(`Each message took ${diff / 21}ms to send`);
|
m.channel.send(`Each message took ${diff / 21}ms to send`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,7 +206,7 @@ client.on('message', msg => {
|
|||||||
.join()
|
.join()
|
||||||
.then(conn => {
|
.then(conn => {
|
||||||
con = conn;
|
con = conn;
|
||||||
msg.reply('done');
|
msg.channel.send('done');
|
||||||
const s = ytdl(song, { filter: 'audioonly' }, { passes: 3 });
|
const s = ytdl(song, { filter: 'audioonly' }, { passes: 3 });
|
||||||
s.on('error', e => console.log(`e w stream 2 ${e}`));
|
s.on('error', e => console.log(`e w stream 2 ${e}`));
|
||||||
disp = conn.playStream(s);
|
disp = conn.playStream(s);
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ const tests = [
|
|||||||
|
|
||||||
m => m.channel.send(fill('x'), { split: true }),
|
m => m.channel.send(fill('x'), { split: true }),
|
||||||
m => m.channel.send(fill('1'), { code: 'js', split: true }),
|
m => m.channel.send(fill('1'), { code: 'js', split: true }),
|
||||||
m => m.channel.send(fill('x'), { reply: m.author, code: 'js', split: true }),
|
|
||||||
m => m.channel.send(fill('xyz '), { split: { char: ' ' } }),
|
m => m.channel.send(fill('xyz '), { split: { char: ' ' } }),
|
||||||
|
|
||||||
m => m.channel.send('x', { embed: { description: 'a' } }),
|
m => m.channel.send('x', { embed: { description: 'a' } }),
|
||||||
@@ -99,7 +98,6 @@ const tests = [
|
|||||||
async m => m.channel.send({ files: [await read(fileA)] }),
|
async m => m.channel.send({ files: [await read(fileA)] }),
|
||||||
async m =>
|
async m =>
|
||||||
m.channel.send(fill('x'), {
|
m.channel.send(fill('x'), {
|
||||||
reply: m.author,
|
|
||||||
code: 'js',
|
code: 'js',
|
||||||
split: true,
|
split: true,
|
||||||
embed: embed().setImage('attachment://zero.png'),
|
embed: embed().setImage('attachment://zero.png'),
|
||||||
@@ -111,7 +109,6 @@ const tests = [
|
|||||||
m => m.channel.send({ files: [{ attachment: readStream(fileA) }] }),
|
m => m.channel.send({ files: [{ attachment: readStream(fileA) }] }),
|
||||||
async m =>
|
async m =>
|
||||||
m.channel.send(fill('xyz '), {
|
m.channel.send(fill('xyz '), {
|
||||||
reply: m.author,
|
|
||||||
code: 'js',
|
code: 'js',
|
||||||
split: { char: ' ', prepend: 'hello! ', append: '!!!' },
|
split: { char: ' ', prepend: 'hello! ', append: '!!!' },
|
||||||
embed: embed().setImage('attachment://zero.png'),
|
embed: embed().setImage('attachment://zero.png'),
|
||||||
|
|||||||
@@ -31,16 +31,13 @@ const commands = {
|
|||||||
}
|
}
|
||||||
message.channel.send(res, { code: 'js' });
|
message.channel.send(res, { code: 'js' });
|
||||||
},
|
},
|
||||||
ping: message => message.reply('pong'),
|
ping: message => message.channel.send('pong'),
|
||||||
};
|
};
|
||||||
|
|
||||||
client.on('message', message => {
|
client.on('message', message => {
|
||||||
if (!message.content.startsWith(prefix) || message.author.bot) return;
|
if (!message.content.startsWith(prefix) || message.author.bot) return;
|
||||||
|
|
||||||
message.content = message.content
|
message.content = message.content.replace(prefix, '').trim().split(' ');
|
||||||
.replace(prefix, '')
|
|
||||||
.trim()
|
|
||||||
.split(' ');
|
|
||||||
const command = message.content.shift();
|
const command = message.content.shift();
|
||||||
message.content = message.content.join(' ');
|
message.content = message.content.join(' ');
|
||||||
|
|
||||||
|
|||||||
@@ -43,20 +43,15 @@ client.on('message', m => {
|
|||||||
conn.receiver.createStream(m.author, true).on('data', b => console.log(b.toString()));
|
conn.receiver.createStream(m.author, true).on('data', b => console.log(b.toString()));
|
||||||
conn.player.on('error', (...e) => console.log('player', ...e));
|
conn.player.on('error', (...e) => console.log('player', ...e));
|
||||||
if (!connections.has(m.guild.id)) connections.set(m.guild.id, { conn, queue: [] });
|
if (!connections.has(m.guild.id)) connections.set(m.guild.id, { conn, queue: [] });
|
||||||
m.reply('ok!');
|
m.channel.send('ok!');
|
||||||
conn.play(ytdl('https://www.youtube.com/watch?v=_XXOSf0s2nk', { filter: 'audioonly' }, { passes: 3 }));
|
conn.play(ytdl('https://www.youtube.com/watch?v=_XXOSf0s2nk', { filter: 'audioonly' }, { passes: 3 }));
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
m.reply('Specify a voice channel!');
|
m.channel.send('Specify a voice channel!');
|
||||||
}
|
}
|
||||||
} else if (m.content.startsWith('#eval') && m.author.id === '66564597481480192') {
|
} else if (m.content.startsWith('#eval') && m.author.id === '66564597481480192') {
|
||||||
try {
|
try {
|
||||||
const com = eval(
|
const com = eval(m.content.split(' ').slice(1).join(' '));
|
||||||
m.content
|
|
||||||
.split(' ')
|
|
||||||
.slice(1)
|
|
||||||
.join(' '),
|
|
||||||
);
|
|
||||||
m.channel.send(com, { code: true });
|
m.channel.send(com, { code: true });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ const tests = [
|
|||||||
|
|
||||||
(m, hook) => hook.send(fill('x'), { split: true }),
|
(m, hook) => hook.send(fill('x'), { split: true }),
|
||||||
(m, hook) => hook.send(fill('1'), { code: 'js', split: true }),
|
(m, hook) => hook.send(fill('1'), { code: 'js', split: true }),
|
||||||
(m, hook) => hook.send(fill('x'), { reply: m.author, code: 'js', split: true }),
|
|
||||||
(m, hook) => hook.send(fill('xyz '), { split: { char: ' ' } }),
|
(m, hook) => hook.send(fill('xyz '), { split: { char: ' ' } }),
|
||||||
|
|
||||||
(m, hook) => hook.send({ embeds: [{ description: 'a' }] }),
|
(m, hook) => hook.send({ embeds: [{ description: 'a' }] }),
|
||||||
@@ -96,7 +95,6 @@ const tests = [
|
|||||||
async (m, hook) => hook.send({ files: [await read(fileA)] }),
|
async (m, hook) => hook.send({ files: [await read(fileA)] }),
|
||||||
async (m, hook) =>
|
async (m, hook) =>
|
||||||
hook.send(fill('x'), {
|
hook.send(fill('x'), {
|
||||||
reply: m.author,
|
|
||||||
code: 'js',
|
code: 'js',
|
||||||
split: true,
|
split: true,
|
||||||
embeds: [embed().setImage('attachment://zero.png')],
|
embeds: [embed().setImage('attachment://zero.png')],
|
||||||
@@ -108,7 +106,6 @@ const tests = [
|
|||||||
(m, hook) => hook.send({ files: [{ attachment: readStream(fileA) }] }),
|
(m, hook) => hook.send({ files: [{ attachment: readStream(fileA) }] }),
|
||||||
async (m, hook) =>
|
async (m, hook) =>
|
||||||
hook.send(fill('xyz '), {
|
hook.send(fill('xyz '), {
|
||||||
reply: m.author,
|
|
||||||
code: 'js',
|
code: 'js',
|
||||||
split: { char: ' ', prepend: 'hello! ', append: '!!!' },
|
split: { char: ' ', prepend: 'hello! ', append: '!!!' },
|
||||||
embeds: [embed().setImage('attachment://zero.png')],
|
embeds: [embed().setImage('attachment://zero.png')],
|
||||||
|
|||||||
7
typings/index.d.ts
vendored
7
typings/index.d.ts
vendored
@@ -987,6 +987,7 @@ declare module 'discord.js' {
|
|||||||
public webhookID: Snowflake | null;
|
public webhookID: Snowflake | null;
|
||||||
public flags: Readonly<MessageFlags>;
|
public flags: Readonly<MessageFlags>;
|
||||||
public reference: MessageReference | null;
|
public reference: MessageReference | null;
|
||||||
|
public readonly referencedMessage: Message | null;
|
||||||
public awaitReactions(
|
public awaitReactions(
|
||||||
filter: CollectorFilter,
|
filter: CollectorFilter,
|
||||||
options?: AwaitReactionsOptions,
|
options?: AwaitReactionsOptions,
|
||||||
@@ -2826,6 +2827,7 @@ declare module 'discord.js' {
|
|||||||
parse?: MessageMentionTypes[];
|
parse?: MessageMentionTypes[];
|
||||||
roles?: Snowflake[];
|
roles?: Snowflake[];
|
||||||
users?: Snowflake[];
|
users?: Snowflake[];
|
||||||
|
repliedUser?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
type MessageMentionTypes = 'roles' | 'users' | 'everyone';
|
type MessageMentionTypes = 'roles' | 'users' | 'everyone';
|
||||||
@@ -2840,7 +2842,7 @@ declare module 'discord.js' {
|
|||||||
files?: (FileOptions | BufferResolvable | Stream | MessageAttachment)[];
|
files?: (FileOptions | BufferResolvable | Stream | MessageAttachment)[];
|
||||||
code?: string | boolean;
|
code?: string | boolean;
|
||||||
split?: boolean | SplitOptions;
|
split?: boolean | SplitOptions;
|
||||||
reply?: UserResolvable;
|
replyTo?: MessageResolvable;
|
||||||
}
|
}
|
||||||
|
|
||||||
type MessageReactionResolvable = MessageReaction | Snowflake;
|
type MessageReactionResolvable = MessageReaction | Snowflake;
|
||||||
@@ -2870,7 +2872,8 @@ declare module 'discord.js' {
|
|||||||
| 'USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_3'
|
| 'USER_PREMIUM_GUILD_SUBSCRIPTION_TIER_3'
|
||||||
| 'CHANNEL_FOLLOW_ADD'
|
| 'CHANNEL_FOLLOW_ADD'
|
||||||
| 'GUILD_DISCOVERY_DISQUALIFIED'
|
| 'GUILD_DISCOVERY_DISQUALIFIED'
|
||||||
| 'GUILD_DISCOVERY_REQUALIFIED';
|
| 'GUILD_DISCOVERY_REQUALIFIED'
|
||||||
|
| 'REPLY';
|
||||||
|
|
||||||
interface OverwriteData {
|
interface OverwriteData {
|
||||||
allow?: PermissionResolvable;
|
allow?: PermissionResolvable;
|
||||||
|
|||||||
Reference in New Issue
Block a user