-
Notifications
You must be signed in to change notification settings - Fork 2
/
bot.js
169 lines (127 loc) · 5.47 KB
/
bot.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
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
______ ______ ______ __ __ __ ______
/\ == \ /\ __ \ /\__ _\ /\ \/ / /\ \ /\__ _\
\ \ __< \ \ \/\ \ \/_/\ \/ \ \ _"-. \ \ \ \/_/\ \/
\ \_____\ \ \_____\ \ \_\ \ \_\ \_\ \ \_\ \ \_\
\/_____/ \/_____/ \/_/ \/_/\/_/ \/_/ \/_/
This is a sample Slack bot built with Botkit.
This bot demonstrates many of the core features of Botkit:
* Connect to Slack using the real time API
* Receive messages based on "spoken" patterns
* Reply to messages
* Use the conversation system to ask questions
* Use the built in storage system to store and retrieve information
for a user.
# RUN THE BOT:
Create a new app via the Slack Developer site:
-> http://api.slack.com
Get a Botkit Studio token from Botkit.ai:
-> https://studio.botkit.ai/
Run your bot from the command line:
clientId=<MY SLACK TOKEN> clientSecret=<my client secret> PORT=<3000> studio_token=<MY BOTKIT STUDIO TOKEN> node bot.js
# USE THE BOT:
Navigate to the built-in login page:
https://<myhost.com>/login
This will authenticate you with Slack.
If successful, your bot will come online and greet you.
# EXTEND THE BOT:
Botkit has many features for building cool and useful bots!
Read all about it here:
-> http://howdy.ai/botkit
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
var dotenv = require('dotenv');
//load environment variables,
//either from .env files (development),
//heroku environment in production, etc...
dotenv.load();
if (!process.env.clientId || !process.env.clientSecret || !process.env.PORT) {
usage_tip();
// process.exit(1);
}
var Botkit = require('botkit');
var debug = require('debug')('botkit:main');
var bot_options = {
clientId: process.env.clientId,
clientSecret: process.env.clientSecret,
debug: true,
scopes: ['bot'],
studio_token: process.env.studio_token,
studio_command_uri: process.env.studio_command_uri
};
// Use a mongo database if specified, otherwise store in a JSON file local to the app.
// Mongo is automatically configured when deploying to Heroku
if (process.env.MONGODB_URI) {
console.log('Mongo Storage')
var mongoStorage = require('botkit-storage-mongo')({mongoUri: process.env.MONGODB_URI});
bot_options.storage = mongoStorage;
} else {
console.log('JSON Storage')
bot_options.json_file_store = __dirname + '/.data/db/'; // store user data in a simple JSON format
}
// Create the Botkit controller, which controls all instances of the bot.
var controller = Botkit.slackbot(bot_options);
controller.startTicking();
// Set up an Express-powered webserver to expose oauth and webhook endpoints
var webserver = require(__dirname + '/components/express_webserver.js')(controller);
webserver.get('/', function(req, res){
res.render('index', {
domain: req.get('host'),
protocol: req.protocol,
glitch_domain: process.env.PROJECT_DOMAIN,
layout: 'layouts/default'
});
})
// Set up a simple storage backend for keeping a record of customers
// who sign up for the app via the oauth
require(__dirname + '/components/user_registration.js')(controller);
// Send an onboarding message when a new team joins
require(__dirname + '/components/onboarding.js')(controller);
// Load in some helpers that make running Botkit on Glitch.com better
require(__dirname + '/components/plugin_glitch.js')(controller);
// enable advanced botkit studio metrics
require('botkit-studio-metrics')(controller);
var normalizedPath = require("path").join(__dirname, "skills");
require("fs").readdirSync(normalizedPath).forEach(function(file) {
require("./skills/" + file)(controller);
});
const codeParser = require("./lib/code_parser.js");
const VMExec = require("./lib/vm_exec.js");
const vm = require('vm');
const dogescript = require('dogescript');
const dogescriptPJSON = require('./dogescript/package.json');
const dogescriptHASH = require("fs").readFileSync('./dogescript/hash', 'utf8').trim();
const dogeVersion = dogescriptPJSON.version + '@' + dogescriptHASH;
console.log('Doge Version:' + dogeVersion);
const webhookNotify = require('./lib/webhook_notify.js');
const currentTime = new Date().toTimeString();
webhookNotify.notify(`\`\`\`\nBot connected.\nIt is currently ${currentTime}.\nThe dogescript version is:\n${dogeVersion}\n\`\`\``);
controller.on('direct_message,direct_mention,mention', function(bot, message){
console.log('got:\n' + message.text);
console.time('msgHandle');
if(message.text === 'version')
{
bot.reply(message, `I\'m running on *${dogeVersion}*`);
}
else if(codeParser.isCode(message.text))
{
var parsed = codeParser.parseMessage(message.text);
console.time('dsParse');
var jsCode = dogescript(parsed);
console.timeEnd('dsParse');
var execVM = new VMExec(jsCode);
bot.reply(message, execVM.execute());
}
else {
bot.reply(message, 'plz provide code block!');
}
console.timeEnd('msgHandle');
});
function usage_tip() {
console.log('~~~~~~~~~~');
console.log('Botkit Starter Kit');
console.log('Execute your bot application like this:');
console.log('clientId=<MY SLACK CLIENT ID> clientSecret=<MY CLIENT SECRET> PORT=3000 studio_token=<MY BOTKIT STUDIO TOKEN> node bot.js');
console.log('Get Slack app credentials here: https://api.slack.com/apps')
console.log('Get a Botkit Studio token here: https://studio.botkit.ai/')
console.log('~~~~~~~~~~');
}