Add support for attachments when relaying messages

master
Miikka Virtanen 2016-12-08 01:46:03 +02:00
parent a08234b9fa
commit f4c7a6a06a
1 changed files with 37 additions and 16 deletions

View File

@ -27,6 +27,8 @@ let blocked = [];
const logDir = `${__dirname}/logs`; const logDir = `${__dirname}/logs`;
const logFileFormatRegex = /^([0-9\-]+?)__([0-9]+?)__([0-9a-f]+?)\.txt$/; const logFileFormatRegex = /^([0-9\-]+?)__([0-9]+?)__([0-9a-f]+?)\.txt$/;
const userMentionRegex = /^<@\!?([0-9]+?)>$/;
try { try {
const blockedJSON = fs.readFileSync(blockFile, {encoding: 'utf8'}); const blockedJSON = fs.readFileSync(blockFile, {encoding: 'utf8'});
blocked = JSON.parse(blockedJSON); blocked = JSON.parse(blockedJSON);
@ -96,8 +98,6 @@ function findLogFilesByUserId(userId) {
fs.readdir(logDir, (err, files) => { fs.readdir(logDir, (err, files) => {
const logfiles = files.filter(file => { const logfiles = files.filter(file => {
const info = getLogFileInfo(file); const info = getLogFileInfo(file);
console.log('info:', info);
console.log('userId:', userId, typeof userId);
if (! info) return false; if (! info) return false;
return info.userId === userId; return info.userId === userId;
@ -174,6 +174,13 @@ function getModmailChannel(user) {
} }
} }
function formatAttachment(attachment) {
let filesize = attachment.size || 0;
filesize /= 1024;
return `**Attachment:** ${attachment.filename} (${filesize.toFixed(1)}KB)\n${attachment.url}`
}
bot.on('messageCreate', (msg) => { bot.on('messageCreate', (msg) => {
if (! (msg.channel instanceof Eris.PrivateChannel)) return; if (! (msg.channel instanceof Eris.PrivateChannel)) return;
if (msg.author.id === bot.user.id) return; if (msg.author.id === bot.user.id) return;
@ -183,11 +190,19 @@ bot.on('messageCreate', (msg) => {
// This needs to be queued as otherwise, if a user sent a bunch of messages initially and the createChannel endpoint is delayed, we might get duplicate channels // This needs to be queued as otherwise, if a user sent a bunch of messages initially and the createChannel endpoint is delayed, we might get duplicate channels
messageQueue.add(() => { messageQueue.add(() => {
return getModmailChannel(msg.author).then(channel => { return getModmailChannel(msg.author).then(channel => {
channel.createMessage(`« **${msg.author.username}#${msg.author.discriminator}:** ${msg.content}`); let content = msg.content;
msg.attachments.forEach(attachment => {
content += `\n\n${formatAttachment(attachment)}`;
});
channel.createMessage(`« **${msg.author.username}#${msg.author.discriminator}:** ${content}`);
if (channel._wasCreated) { if (channel._wasCreated) {
let creationNotificationMessage = `New modmail thread: ${channel.mention}`;
if (config.pingCreationNotification) creationNotificationMessage = `@here ${config.pingCreationNotification}`;
bot.createMessage(modMailGuild.id, { bot.createMessage(modMailGuild.id, {
content: `@here New modmail thread: ${channel.mention}`, content: creationNotificationMessage,
disableEveryone: false, disableEveryone: false,
}); });
@ -205,11 +220,20 @@ bot.registerCommand('reply', (msg, args) => {
if (! channelInfo) return; if (! channelInfo) return;
bot.getDMChannel(channelInfo.userId).then(channel => { bot.getDMChannel(channelInfo.userId).then(channel => {
const message = `**${msg.author.username}:** ${args.join(' ')}`; let argMsg = args.join(' ').trim();
let content = `**${msg.author.username}:** ${argMsg}`;
channel.createMessage(message); if (msg.attachments.length > 0 && argMsg !== '') content += '\n\n';
msg.channel.createMessage(`» ${message}`); content += msg.attachments.map(attachment => {
msg.delete(); return `${attachment.url}`;
}).join('\n');
channel.createMessage(content);
msg.channel.createMessage(`» ${content}`);
// Delete the !r message if there are no attachments
// When there are attachments, we need to keep the original message or the attachments get deleted as well
if (msg.attachments.length === 0) msg.delete();
}); });
}); });
@ -251,13 +275,13 @@ bot.registerCommand('block', (msg, args) => {
if (args[0].match(/^[0-9]+$/)) { if (args[0].match(/^[0-9]+$/)) {
userId = args[0]; userId = args[0];
} else { } else {
let mentionMatch = args[0].match(/^<@([0-9]+?)>$/); let mentionMatch = args[0].match(userMentionRegex);
if (mentionMatch) userId = mentionMatch[1]; if (mentionMatch) userId = mentionMatch[1];
} }
if (! userId) return; if (! userId) return;
blocked.push(args[0]); blocked.push(userId);
saveBlocked(); saveBlocked();
msg.channel.createMessage(`Blocked <@${userId}> (id ${userId}) from modmail`); msg.channel.createMessage(`Blocked <@${userId}> (id ${userId}) from modmail`);
}); });
@ -271,13 +295,13 @@ bot.registerCommand('unblock', (msg, args) => {
if (args[0].match(/^[0-9]+$/)) { if (args[0].match(/^[0-9]+$/)) {
userId = args[0]; userId = args[0];
} else { } else {
let mentionMatch = args[0].match(/^<@([0-9]+?)>$/); let mentionMatch = args[0].match(userMentionRegex);
if (mentionMatch) userId = mentionMatch[1]; if (mentionMatch) userId = mentionMatch[1];
} }
if (! userId) return; if (! userId) return;
blocked.splice(blocked.indexOf(args[0]), 1); blocked.splice(blocked.indexOf(userId), 1);
saveBlocked(); saveBlocked();
msg.channel.createMessage(`Unblocked <@${userId}> (id ${userId}) from modmail`); msg.channel.createMessage(`Unblocked <@${userId}> (id ${userId}) from modmail`);
}); });
@ -291,7 +315,7 @@ bot.registerCommand('logs', (msg, args) => {
if (args[0].match(/^[0-9]+$/)) { if (args[0].match(/^[0-9]+$/)) {
userId = args[0]; userId = args[0];
} else { } else {
let mentionMatch = args[0].match(/^<@([0-9]+?)>$/); let mentionMatch = args[0].match(userMentionRegex);
if (mentionMatch) userId = mentionMatch[1]; if (mentionMatch) userId = mentionMatch[1];
} }
@ -339,12 +363,9 @@ const server = http.createServer((req, res) => {
const pathParts = parsedUrl.path.split('/').filter(v => v !== ''); const pathParts = parsedUrl.path.split('/').filter(v => v !== '');
const token = pathParts[pathParts.length - 1]; const token = pathParts[pathParts.length - 1];
console.log('token:', token);
if (token.match(/^[0-9a-f]+$/) === null) return res.end(); if (token.match(/^[0-9a-f]+$/) === null) return res.end();
findLogFile(token).then(logfile => { findLogFile(token).then(logfile => {
console.log('logfile:', logfile);
if (logfile === null) return res.end(); if (logfile === null) return res.end();
fs.readFile(getLogFilePath(logfile), {encoding: 'utf8'}, (err, data) => { fs.readFile(getLogFilePath(logfile), {encoding: 'utf8'}, (err, data) => {