-
Notifications
You must be signed in to change notification settings - Fork 3
/
_commands.js
90 lines (89 loc) · 3.28 KB
/
_commands.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
/**
* Main logic for the other commands live here.
*/
const colors = require('irc').colors
const processOutput = (bot, msg, cmd, output, customFormatter) => {
const outputFormatter = customFormatter || ((str) => msg.nick + ': ' + str)
if (!output) return null
if (typeof output === 'string') {
const say = outputFormatter(output)
if (cmd.fireMessageEvent) {
bot.fireEvents('message', bot.nick, msg.to, say, null)
}
return bot.say(msg.to, say)
} else if (output.constructor === Array) {
output.forEach(line => processOutput(bot, msg, line, customFormatter))
} else {
if (output.message) return processOutput(bot, msg, cmd, output.message, customFormatter)
bot.log('warn', 'output is strange type: ' + output)
}
}
module.exports = {
events: {
message: function (bot, nick, to, text, message) {
const controlChar = bot.config.get('irc.controlChar')
if (text.substr(0, 1) === controlChar) {
const msg = {
body: text.substr(text.indexOf(' ') + 1),
args: text.substr(1).split(' '),
nick: nick,
to: to,
text: text,
message: message
}
msg._cmd = controlChar + msg.args[0]
if (Object.prototype.hasOwnProperty.call(bot.commands, msg.args[0])) {
try {
const cmd = bot.commands[msg.args[0]]
if (cmd.command) {
// stats hook
if (bot.commandcount) {
bot.commandcount++
} else {
bot.commandcount = 1
}
if (cmd.disabled) {
return
}
if (cmd.privileged) {
if (bot.config.get('irc.control') !== msg.to) {
if (bot.config.get('irc.insecure') === true) {
// pass
} else {
// http://www.imdb.com/title/tt0062622/quotes?item=qt0396921
return processOutput(bot, msg, cmd, 'I\'m sorry, ' + msg.nick + '. I\'m afraid I can\'t do that.')
}
}
}
if (Array.isArray(cmd.usage)) {
if (msg.args.length !== cmd.usage.length + 1) {
return processOutput(bot, msg, cmd, 'Usage: ' + msg._cmd + ' <' + cmd.usage.join('> <') + '>')
}
msg.args = msg.args.reduce(function (o, p, k) {
o[k] = p
return o
}, {})
for (let i = 0; i < cmd.usage.length; i++) {
msg.args[cmd.usage[i]] = msg.args[i + 1]
}
}
}
return Promise.resolve(cmd.command(bot, msg))
.then(output => processOutput(bot, msg, cmd, output))
.catch(e => {
bot.log('error', e.message)
bot.log('error', e.stack)
return processOutput(bot, msg, cmd, e, (str) => colors.wrap('dark_red', 'Error: ') + str)
})
} catch (e) {
bot.say(bot.config.get('irc.control'), 'Error processing `' + msg._cmd + '` in ' + msg.to + ': ' + e)
bot.log('error', e.message)
bot.log('error', e.stack)
}
} else {
bot.log('info', 'Unknown command: ' + text)
}
}
}
}
}