Adding Multi User Tipping and Role Tipping

This is actually not too substantial an addition. it adds 2 additional command exports for tipbot, namely !multitip and !roletip.

!multitip [private] <user>+ <amount>
The more complex new feature, this command will take a list of users, seperated by spaces, and passes through to doTip() if you only list a single user. It tests each word past the ! command and private tag, checking for a user mention using the regex.test() function of the Discord.js USERS_PATTERN, using that to count the number of users mentioned in a row, then takes the first word that is not a match to be the amount. Error checking then returns the appropriate errors to the user, if any. Otherwise it proceeds to send tips to each user individually. this results in messages for every user that receives a tip, which can be messy. It will also message the author once for every user a tip is sent to, if using private mode, this isn't ideal, but would require rewriting the sendLbc() function, which is outside the scope of this commit.

!roletip <role> <amount>
This is a relatively simpler feature, the command taking a single role and an amount, then extracting the userIDs from the role via the Roles.members and GuildMember.user values. It will return seperate errors for a lack of a role in the message and the lack of any users in a role. Like the !multitip command, it will send tips individually to each user, with the same spam of messages either in the channel or the author's private channel.
This commit is contained in:
ProfessorDey 2018-02-06 06:18:05 +00:00 committed by GitHub
parent 564a5d3135
commit 623250e1b4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -6,7 +6,9 @@ config = config.get('lbrycrd');
const lbry = new bitcoin.Client(config);
exports.commands = [
"tip"
"tip",
"multitip",
"roletip"
]
exports.tip = {
usage: "<subcommand>",
@ -32,6 +34,46 @@ exports.tip = {
}
}
exports.multitip = {
usage: "<subcommand>",
description: '\t[help]\n\t\tGet this message\n\t<user>+ <amount>\n\t\tMention one or more users in a row, seperated by spaces, then an amount that each mentioned user will receive\n\tprivate <user>+ <amount>\n\t\tPut private before the user list to have each user tipped privately, without revealing other users tipped\nKey: [] : Optionally include contained keyword, <> : Replace with the appropriate value, + : Value can be repeated for multiple entries',
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',
helpmsgparts = [['[help]', 'Get this message'],
['<user>+ <amount>', 'Mention one or more users in a row, seperated by spaces, then an amount that each mentioned user will receive.'],
['private <user>+ <amount>','Put private before the user list to have each user tipped privately, without revealing other users tipped.']],
helpmsg = '```**!multitip**\n' + formatDescriptions(helpmsgparts) + 'Key: [] : Optionally include contained keyword, <> : Replace with the appropriate value, + : Value can be repeated for multiple entries.```',
channelwarning = 'Please use <#369896313082478594> or DMs to talk to bots.';
switch(subcommand) {
case 'help': privateOrSandboxOnly(msg, channelwarning, doHelp, [helpmsg]); break;
default: doMultiTip(msg, tipper, words, helpmsg); break;
}
}
}
exports.roletip = {
usage: "<subcommand>",
description: '\t[help]\n\t\tGet this message\n\t<role> <amount>\n\t\tMention a single role, then an amount that each user in that role will receive\n\tprivate <role> <amount>\n\t\tPut private before the role to have each user tipped privately, without revealing other users tipped\nKey: [] : Optionally include contained keyword, <> : Replace with the 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',
helpmsgparts = [['[help]', 'Get this message'],
['<role> <amount>', 'Mention a single role, then an amount that each user in that role will receive.'],
['private <role> <amount>','Put private before the role to have each user tipped privately, without revealing other users tipped.']],
helpmsg = '```**!roletip**\n' + formatDescriptions(helpmsgparts) + 'Key: [] : Optionally include contained keyword, <> : Replace with the appropriate value.```',
channelwarning = 'Please use <#369896313082478594> or DMs to talk to bots.';
switch(subcommand) {
case 'help': privateOrSandboxOnly(msg, channelwarning, doHelp, [helpmsg]); break;
default: doRoleTip(msg, tipper, words, helpmsg); break;
}
}
}
function privateOrSandboxOnly(message, wrongchannelmsg, fn, args) {
if (!inPrivateOrBotSandbox(message)) {
message.reply(wrongchannelmsg);
@ -101,8 +143,8 @@ function doTip(message, tipper, words, helpmsg) {
return;
}
let prv = 0;
let amountOffset = 2;
var prv = 0;
var amountOffset = 2;
if (words.length >= 4 && words[1] === 'private') {
prv = 1;
amountOffset = 3;
@ -124,6 +166,89 @@ function doTip(message, tipper, words, helpmsg) {
}
function doMultiTip(message, tipper, words, helpmsg) {
if (!words) {
doHelp(message, helpmsg);
return;
}
if (words.length < 4) {
doTip(message, tipper, words, helpmsg);
return;
}
var prv = 0;
if (words.length >= 5 && words[1] === 'private') {
prv = 1;
}
let [userIDs, amount] = findUserIDsAndAmount(message, words, prv + 1);
if (amount == null) {
message.reply('I dont know how to tip that many credits');
return;
}
if (!userIDs) {
message.reply('Sorry, I could not find a user in your tip...');
return;
}
for (var i = 0; i < userIDs.length; i++) {
sendLbc(message, tipper, userIDs[i], amount, prv);
}
}
function doRoleTip(message, tipper, words, helpmsg) {
if (!words || words.length < 3) {
doHelp(message, helpmsg);
return;
}
var prv = 0;
var amountOffset = 2;
if (words.length >= 4 && words[1] === 'private') {
prv = 1;
amountOffset = 3;
}
let amount = getValidatedAmount(words[amountOffset]);
if (amount == null) {
message.reply('I dont know how to tip that many credits');
return;
}
if (message.mentions.roles.first().id) {
if (message.mentions.roles.first().members.first().id) {
let userIDs = message.mentions.roles.first().members.map(member => member.user.id.replace('!', ''));
for (var i = 0; i < userIDs; i++) {
sendLbc(message, tipper, userIDs[i], amount, prv);
}
return;
}
else {
message.reply('Sorry, I could not find any users to tip in that role...');
return;
}
}
else {
message.reply('Sorry, I could not find any roles in your tip...');
return;
}
}
function findUserIDsAndAmount(message, words, startOffset) {
var idList = [];
var amount = null;
var count = 0;
for (var i = startOffset; i < words.length; i++) {
if (message.mentions.USERS_PATTERN.test(words[i])) {
count++;
}
else {
amount = getValidatedAmount(words[i]);
if (amount == null) break;
}
}
if (count > 0) idList = message.mentions.users.first(count).forEach(function(user) { return user.id.replace('!', ''); });
return [idList, amount];
}
function sendLbc(message, tipper, recipient, amount, privacyFlag) {
getAddress(recipient, function (err, address) {
if (err) {