aboutsummaryrefslogtreecommitdiff
path: root/common.js
blob: d06566d212406b3b34097f73eb33b9ac5b201b1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
const fs = require("fs")
const google_images = require("free-google-images")

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, info, onRequest, onAccept) => new Object({
	params: "<player>",
	help: "Request to " + help,
	func: (msg, [targetPing], {requests}) => {
		const target = getPing(msg, targetPing, false)

		if (target) {
			const err = onRequest(msg, target)

			if (err) {
				msg.reply(err)
			} else {
				msg.channel.send(`<@!${target}>: <@!${msg.author.id}> ${info}. Type !accept to accept or !deny to deny.`)

				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]
}

module.exports.listCommand = (title, list) => new Object({
	help: "Show list of " + title,
	func: (msg, _, fb) => msg.reply(`List of ${title}: ${Object.keys(fb[list]).map(entry => "<@!" + entry + ">").join(", ")}`)
})

module.exports.listChangeCommand = (action, list, status) => new Object({
	operator: true,
	func: (msg, [targetPing], fb) => {
		const target = getPing(msg, targetPing, true)

		if (target) {
			if (fb[list][target] == status) {
				msg.reply(`<@!${target}> ${status ? "already" : "not"} ${action}.`)
			} else {
				fb[list][target] = status
				module.exports.storageSave(list, fb[list])
				msg.reply(`Successfully ${action} <@!${target}>.`)
			}
		}
	}
})

module.exports.stripPings = str => str.replace(/@/g, "\@")