diff options
Diffstat (limited to 'common.js')
-rw-r--r-- | common.js | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/common.js b/common.js new file mode 100644 index 0000000..a098c32 --- /dev/null +++ b/common.js @@ -0,0 +1,142 @@ +const fs = require("fs") +const google_images = require("free-google-images") + +/* +const furrybot.list_change_command(cmd, list_name, title, status) + furrybot.commands[cmd] = { + operator = true, + func = function(name, target) + if target then + if furrybot[list_name][target] == status then + furrybot.error_message(name, "Player " .. (status and "already" or "not") .. " " .. title .. ": ", target) + else + furrybot[list_name][target] = status + storage:set_string(list_name, minetest.serialize(furrybot[list_name])) + furrybot.ping_message(name, "Successfully " .. cmd .. (cmd:sub(#cmd, #cmd) == "e" and "" or "e") .. "d " .. target, furrybot.colors.system) + end + else + furrybot.error_message(name, "You need to specify a player") + end + end, + } +end + +function furrybot.list_command(cmd, list_name, title) + furrybot.commands[cmd] = { + func = function() + local names = {} + + for name in pairs(furrybot[list_name]) do + table.insert(names, name) + end + + furrybot.send("List of " .. title .. ": " .. table.concat(names, ", "), furrybot.colors.system) + end, + } +end + +function furrybot.choose(list, color) + return furrybot.colors.random .. list[math.random(#list)] .. color +end + +function furrybot.random(min, max, color) + return furrybot.colors.random .. math.random(min, max) .. color +end + +function furrybot.strrandom(str, seed, ...) + local v = 0 + local pr = PseudoRandom(seed) + for i = 1, #str do + v = v + str:byte(i) * pr:next() + end + return PseudoRandom(v):next(...) +end + +function furrybot.repeat_string(str, times) + local msg = "" + for i = 1, times do + msg = msg .. str + end + return msg +end + +*/ + +const getPing = module.exports.getPing = (msg, ping, allowSelf) => { + if (ping && ping.startsWith("<@!") && ping.endsWith(">")) { + const id = ping.slice("<@!".length, -">".length) + + if (!allowSelf && id == msg.author.id) { + msg.reply("Please mention a user other than yourself") + return + } + + if (msg.guild.members.cache.get(id)) + return id + } + + msg.reply("Please mention a user") +} + +module.exports.uppercase = str => str.slice(0, 1).toUpperCase() + str.slice(1) + +module.exports.requestCommand = (help, onRequest, onAccept) => new Object({ + params: "<player>", + help: "Request to " + help + " another user", + func: (msg, [targetPing], {requests}) => { + const target = getPing(msg, targetPing, false) + + if (target) { + const err = onRequest(msg, target) + + if (err) + msg.reply(err) + else + requests[target] = { + origin: msg.author.id, + func: onAccept, + } + } + + } +}) + +module.exports.soloRoleplayCommand = (help, action) => new Object({ + help: help, + func: msg => google_images.searchRandom(help) + .then(result => msg.channel.send(`<@!${msg.author.id}> ${action}.\n${result.image.url}`)) +}) + +module.exports.interactiveRoleplayCommand = (help, action) => new Object({ + params: "<user>", + help: help + " another user", + func: (msg, [targetPing]) => { + const target = getPing(msg, targetPing, false) + + if (target) + google_images.searchRandom(help) + .then(result => msg.channel.send(`<@!${msg.author.id}> ${action} <@!${target}>.\n${result.image.url}`)) + } +}) + +module.exports.storageLoad = name => { + try { + return require(`storage/${name}.json`) + } catch {} +} + +module.exports.storageSave = (name, data) => fs.writeFileSync(`storage/${name}.json`, JSON.stringify(data)) + +module.exports.choose = (arr, rng = Math) => arr[Math.floor(rng.random() * arr.length)] + +module.exports.chooseWeighted = (arr, rng = Math) => { + let accum = 0 + let edges = [] + + arr.forEach((v, k) => { + edges[k] = (accum += v[1]) + }) + + const r = Math.floor(rng.random() * accum) + return arr.find((_, k) => r < edges[k])[0] +} |