lbry-tipbot/bot/modules/tipbot.js

192 lines
5.3 KiB
JavaScript
Raw Normal View History

2017-10-25 21:12:38 +02:00
'use strict';
const bitcoin = require('bitcoin');
let config = require('config');
config = config.get('lbrycrd');
const lbry = new bitcoin.Client(config);
exports.commands = [
"tip"
2017-10-25 21:12:38 +02:00
]
exports.tip = {
usage: "<subcommand>",
description: 'balance: get your balance\n deposit: get address for your deposits\n withdraw ADDRESS AMOUNT: withdraw AMOUNT credits to ADDRESS\n [private] <user> <amount>: mention a user with @ and then the amount to tip them, or put private before the user to tip them privately.\n Key: [] : Optionally include contained keyword, <> : Replace with appropriate value.',
process: async function (bot, msg, suffix) {
let tipper = msg.author.id.replace('!', ''),
words = msg.content.trim().split(' ').filter(function (n) { return n !== ""; }),
subcommand = words.length >= 2 ? words[1] : 'help';
switch (subcommand) {
case 'help': doHelp(msg); break;
case 'balance': doBalance(msg, tipper); break;
case 'deposit': doDeposit(msg, tipper); break;
case 'withdraw': doWithdraw(msg, tipper, words); break;
default: doTip(msg, tipper, words);
}
}
}
2017-10-25 21:12:38 +02:00
function doBalance(message, tipper) {
lbry.getBalance(tipper, 1, function (err, balance) {
2017-10-25 21:12:38 +02:00
if (err) {
message.reply('Error getting balance');
}
else {
message.reply('You have *' + balance + '* LBC');
}
});
}
function doDeposit(message, tipper) {
if (!inPrivateOrBotSandbox(message)) {
2017-10-25 21:12:38 +02:00
message.reply('Please use <#369896313082478594> or DMs to talk to bots.');
return;
}
getAddress(tipper, function (err, address) {
2017-10-25 21:12:38 +02:00
if (err) {
message.reply('Error getting deposit address');
}
else {
message.reply('Your address is ' + address);
}
});
}
function doWithdraw(message, tipper, words) {
if (!inPrivateOrBotSandbox(message)) {
2017-10-25 21:12:38 +02:00
message.reply('Please use <#369896313082478594> or DMs to talk to bots.');
return;
}
if (words.length < 4) {
doHelp(message);
return;
}
var address = words[2],
amount = getValidatedAmount(words[3]);
2017-10-25 21:12:38 +02:00
if (amount === null) {
message.reply('I dont know how to withdraw that many credits');
return;
}
lbry.sendFrom(tipper, address, amount, function (err, txId) {
2017-10-25 21:12:38 +02:00
if (err) {
message.reply(err.message);
}
else {
message.reply('You withdrew ' + amount + ' to ' + address + ' (' + txLink(txId) + ')');
}
});
}
function doTip(message, tipper, words) {
if (words.length < 3 || !words) {
doHelp(message);
return;
}
Added Tipbot Privacy Mode Allow for Tipbot to be used privately while still notifying the user that has received the tip, via private message. Updates the Help message for new usage instructions, fixes misspelling of 'address' and adds a Key for the [ ] and < > syntax, as some users may not understand their usage. Reworks the subcommand parsing by using a more compact Switch Function. Necessitates the use of 'break;' but is far more compact and legible, presumed the old if else block is from early development with fewer features available. Switch statement should allow for easier expansion. Modifies doTip() to avoid requiring code duplication, includes two new variables used to indicate that the tip should be done in privacy mode and where the tip value is located in the 'words' array. Significant change to sendLbc and it's function call, requirement for private message for recipient required User object, thus the function now requires the actual GuildMember object, not only the ID. While this marginally increases overhead, it should also allow access to the send() function for that Guild Member, allowing for private message to be sent. Further the addition of a privacy flag (0 for non-private, 1 for private) was added so that the function can determine whether to send a public or private response. this required updating references to the Guild Member's id to 'member.id', but otherwise operation remains the same until the transaction is completed, following which it will check the privacy flag and if it is set, will privately send the successful tip message to both author and recipient, otherwise it will simply reply via the normal '.reply()' function.
2017-11-14 18:33:17 +01:00
let prv = 0;
let amountOffset = 2;
if (words.length >= 4 && words[1] === 'private') {
prv = 1;
amountOffset = 3;
Added Tipbot Privacy Mode Allow for Tipbot to be used privately while still notifying the user that has received the tip, via private message. Updates the Help message for new usage instructions, fixes misspelling of 'address' and adds a Key for the [ ] and < > syntax, as some users may not understand their usage. Reworks the subcommand parsing by using a more compact Switch Function. Necessitates the use of 'break;' but is far more compact and legible, presumed the old if else block is from early development with fewer features available. Switch statement should allow for easier expansion. Modifies doTip() to avoid requiring code duplication, includes two new variables used to indicate that the tip should be done in privacy mode and where the tip value is located in the 'words' array. Significant change to sendLbc and it's function call, requirement for private message for recipient required User object, thus the function now requires the actual GuildMember object, not only the ID. While this marginally increases overhead, it should also allow access to the send() function for that Guild Member, allowing for private message to be sent. Further the addition of a privacy flag (0 for non-private, 1 for private) was added so that the function can determine whether to send a public or private response. this required updating references to the Guild Member's id to 'member.id', but otherwise operation remains the same until the transaction is completed, following which it will check the privacy flag and if it is set, will privately send the successful tip message to both author and recipient, otherwise it will simply reply via the normal '.reply()' function.
2017-11-14 18:33:17 +01:00
}
Added Tipbot Privacy Mode Allow for Tipbot to be used privately while still notifying the user that has received the tip, via private message. Updates the Help message for new usage instructions, fixes misspelling of 'address' and adds a Key for the [ ] and < > syntax, as some users may not understand their usage. Reworks the subcommand parsing by using a more compact Switch Function. Necessitates the use of 'break;' but is far more compact and legible, presumed the old if else block is from early development with fewer features available. Switch statement should allow for easier expansion. Modifies doTip() to avoid requiring code duplication, includes two new variables used to indicate that the tip should be done in privacy mode and where the tip value is located in the 'words' array. Significant change to sendLbc and it's function call, requirement for private message for recipient required User object, thus the function now requires the actual GuildMember object, not only the ID. While this marginally increases overhead, it should also allow access to the send() function for that Guild Member, allowing for private message to be sent. Further the addition of a privacy flag (0 for non-private, 1 for private) was added so that the function can determine whether to send a public or private response. this required updating references to the Guild Member's id to 'member.id', but otherwise operation remains the same until the transaction is completed, following which it will check the privacy flag and if it is set, will privately send the successful tip message to both author and recipient, otherwise it will simply reply via the normal '.reply()' function.
2017-11-14 18:33:17 +01:00
let amount = getValidatedAmount(words[amountOffset]);
2017-10-25 21:12:38 +02:00
if (amount === null) {
message.reply('I dont know how to tip that many credits');
return;
}
2018-01-03 22:57:03 +01:00
if (message.mentions.users.first().id) {
sendLbc(message, tipper, message.mentions.users.first().id.replace('!', ''), amount, prv);
2017-10-25 21:12:38 +02:00
}
else {
message.reply('Sorry, I could not find a user in your tip...');
}
2017-10-25 21:12:38 +02:00
}
2017-10-25 22:14:37 +02:00
function doHelp(message) {
if (!inPrivateOrBotSandbox(message)) {
message.reply('Sent you help via DM! Please use <#369896313082478594> or DMs to talk to bots.');
2017-10-25 21:12:38 +02:00
}
message.author.send('**!tip**\n balance: get your balance\n deposit: get address for your deposits\n withdraw ADDRESS AMOUNT: withdraw AMOUNT credits to ADDRESS\n [private] <user> <amount>: mention a user with @ and then the amount to tip them, or put private before the user to tip them privately.\n Key: [] : Optionally include contained keyword, <> : Replace with appropriate value.');
2017-10-25 21:12:38 +02:00
}
2018-01-03 22:57:03 +01:00
function sendLbc(message, tipper, recipient, amount, privacyFlag) {
getAddress(recipient, function (err, address) {
2017-10-25 21:12:38 +02:00
if (err) {
message.reply(err.message);
}
else {
lbry.sendFrom(tipper, address, amount, 1, null, null, function (err, txId) {
2017-10-25 21:12:38 +02:00
if (err) {
message.reply(err.message);
}
else {
var imessage =
2018-01-03 22:57:03 +01:00
'Wubba lubba dub dub! <@' + tipper + '> tipped <@' + recipient + '> ' + amount + ' LBC (' + txLink(txId) + '). ' +
2017-10-25 21:44:38 +02:00
'DM me `!tip` for tipbot instructions.'
if (privacyFlag) {
message.author.send(imessage);
2018-01-03 22:57:03 +01:00
if (message.author.id != message.mentions.users.first().id) {
message.mentions.users.first().send(imessage);
}
} else {
message.reply(imessage);
}
2017-10-25 21:12:38 +02:00
}
});
}
});
};
function getAddress(userId, cb) {
lbry.getAddressesByAccount(userId, function (err, addresses) {
2017-10-25 21:12:38 +02:00
if (err) {
cb(err);
}
else if (addresses.length > 0) {
2017-10-25 21:12:38 +02:00
cb(null, addresses[0]);
}
else {
lbry.getNewAddress(userId, function (err, address) {
2017-10-25 21:12:38 +02:00
if (err) {
cb(err);
}
else {
cb(null, address);
}
});
}
});
}
function inPrivateOrBotSandbox(msg) {
if ((msg.channel.type == 'dm') || (msg.channel.id === '369896313082478594')) {
2017-10-25 21:12:38 +02:00
return true;
} else {
2017-10-25 21:12:38 +02:00
return false;
}
}
function getValidatedAmount(amount) {
amount = amount.trim();
if (amount.toLowerCase().endsWith('lbc')) {
amount = amount.substring(0, amount.length - 3);
2017-10-25 21:12:38 +02:00
}
return amount.match(/^[0-9]+(\.[0-9]+)?$/) ? amount : null;
}
function txLink(txId) {
return "<https://explorer.lbry.io/tx/" + txId + ">";
2017-10-25 21:44:38 +02:00
}