forked from Gettix/Dorito-bot-discord.js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.js
170 lines (144 loc) · 4.69 KB
/
utils.js
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
const client = require('./index');
const MessageEmbed = require('discord.js').MessageEmbed;
const got = require('got');
const url = require('url');
exports.randomSelection = (choices) => {
return choices[Math.floor(Math.random() * choices.length)];
};
exports.randomColor = () => {
return [Math.floor(Math.random() * 256), Math.floor(Math.random() * 256), Math.floor(Math.random() * 256)];
};
exports.formatNumber = (number) => {
if (isNaN(number)) return NaN;
let input = `${number}`;
if (number < 1e4) return input;
let out = [];
while (input.length > 3) {
out.push(input.substr(input.length - 3, input.length));
input = input.substr(0, input.length - 3);
}
return `${input},${out.reverse().join(',')}`;
};
const randomFooter = () => {
return exports.randomSelection([
'weed',
'owo nya desu desu',
'fun fact Aaron is autistic',
'type lol-help'
]);
};
exports.embed = (title, description = '', fields = [], options = {}) => {
let url = options.url || '';
let color = options.color || this.randomColor();
if (options.inline) {
if (fields.length % 3 === 2) {
fields.push({ name: '\u200b', value: '\u200b' });
}
fields.forEach(obj => {
obj.inline = true;
});
}
return new MessageEmbed({ fields, video: options.video || url })
.setTitle(title)
.setColor(color)
.setDescription(description)
.setURL(url)
.setImage(options.image)
.setTimestamp(options.timestamp ? timestampToDate(options.timestamp) : null)
// .setFooter(randomFooter())
.setAuthor(options.author === undefined ? '' : options.author)
.setThumbnail(options.thumbnail);
};
function timestampToDate(timestamp) {
if (timestamp === true) {
return new Date();
}
if (typeof timestamp === 'number') {
return new Date(timestamp);
}
return timestamp;
}
exports.parseArgs = (args, options) => {
if (!options)
return args;
if (typeof options === 'string')
options = [options];
let optionValues = {};
let i;
for (i = 0; i < args.length; i++) {
let arg = args[i];
if (!arg.startsWith('-')) {
break;
}
let label = arg.substr(1);
if (options.indexOf(label + ':') > -1) {
let leftover = args.slice(i + 1).join(' ');
let matches = leftover.match(/^"(.+?)"/);
if (matches) {
optionValues[label] = matches[1];
i += matches[0].split(' ').length;
} else {
i++;
optionValues[label] = args[i];
}
} else if (options.indexOf(label) > -1) {
optionValues[label] = true;
} else {
break;
}
}
return {
options: optionValues,
leftover: args.slice(i)
};
};
exports.multiSend = (channel, messages, delay) => {
delay = delay || 100;
messages.forEach((m, i) => {
setTimeout(() => {
channel.send(m);
}, delay * i);
});
};
exports.sendLarge = (channel, largeMessage, options = {}) => {
let message = largeMessage;
let messages = [];
let prefix = options.prefix || '';
let suffix = options.suffix || '';
let max = 2000 - prefix.length - suffix.length;
while (message.length >= max) {
let part = message.substr(0, max);
let cutTo = max;
if (options.cutOn) {
/*
Prevent infinite loop where lastIndexOf(cutOn) is the first char in `part`
Later, we will correct by +1 since we did lastIndexOf on all but the first char in `part`
We *dont* correct immediately, since if cutOn is not found, cutTo will be -1, and we dont want that
to become 0
*/
cutTo = part.slice(1).lastIndexOf(options.cutOn);
// Prevent infinite loop when cutOn isnt found in message
if (cutTo === -1) {
cutTo = max;
} else {
// Correction necessary from a few lines above
cutTo += 1;
if (options.cutAfter) {
cutTo += 1;
}
part = part.substr(0, cutTo);
}
}
messages.push(prefix + part + suffix);
message = message.substr(cutTo);
}
if (message.length > 1) {
messages.push(prefix + message + suffix);
}
this.multiSend(channel, messages, options.delay);
};
exports.now = () => {
let now = process.hrtime();
return now[0] * 1e3 + now[1] / 1e6;
};
exports.quoteRegex = (input) => `${input}`.replace(/[.?*+^$[\]\\(){}|-]/g, '\\$&');