/
server.js
150 lines (127 loc) · 4.39 KB
/
server.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
'use strict'
const express = require('express')
const Slapp = require('slapp')
const ConvoStore = require('slapp-convo-beepboop')
const Context = require('slapp-context-beepboop')
// use `PORT` env var on Beep Boop - default to 3000 locally
var port = process.env.PORT || 3000
var slapp = Slapp({
// Beep Boop sets the SLACK_VERIFY_TOKEN env var
verify_token: process.env.SLACK_VERIFY_TOKEN,
convo_store: ConvoStore(),
context: Context()
})
var HELP_TEXT = `
I will respond to the following messages:
\`help\` - to see this message.
\`hi\` - to demonstrate a conversation that tracks state.
\`thanks\` - to demonstrate a simple response.
\`<type-any-other-text>\` - to demonstrate a random emoticon response, some of the time :wink:.
\`attachment\` - to see a Slack attachment message.
`
//*********************************************
// Setup different handlers for messages
//*********************************************
// response to the user typing "help"
slapp.message('help', ['mention', 'direct_message'], (msg) => {
msg.say(HELP_TEXT)
})
// "Conversation" flow that tracks state - kicks off when user says hi, hello or hey
slapp
.message('^(hi|hello|hey)$', ['direct_mention', 'direct_message'], (msg, text) => {
msg
.say(`${text}, how are you?`)
// sends next event from user to this route, passing along state
.route('how-are-you', { greeting: text })
})
.route('how-are-you', (msg, state) => {
var text = (msg.body.event && msg.body.event.text) || ''
// user may not have typed text as their next action, ask again and re-route
if (!text) {
return msg
.say("Whoops, I'm still waiting to hear how you're doing.")
.say('How are you?')
.route('how-are-you', state)
}
// add their response to state
state.status = text
msg
.say(`Ok then. What's your favorite color?`)
.route('color', state)
})
.route('color', (msg, state) => {
var text = (msg.body.event && msg.body.event.text) || ''
// user may not have typed text as their next action, ask again and re-route
if (!text) {
return msg
.say("I'm eagerly awaiting to hear your favorite color.")
.route('color', state)
}
// add their response to state
state.color = text
msg
.say('Thanks for sharing.')
.say(`Here's what you've told me so far: \`\`\`${JSON.stringify(state)}\`\`\``)
// At this point, since we don't route anywhere, the "conversation" is over
})
// Can use a regex as well
slapp.message(/^(thanks|thank you)/i, ['mention', 'direct_message'], (msg) => {
// You can provide a list of responses, and a random one will be chosen
// You can also include slack emoji in your responses
msg.say([
"You're welcome :smile:",
'You bet',
':+1: Of course',
'Anytime :sun_with_face: :full_moon_with_face:'
])
})
// demonstrate returning an attachment...
slapp.message('attachment', ['mention', 'direct_message'], (msg) => {
msg.say({
text: 'Check out this amazing attachment! :confetti_ball: ',
attachments: [{
text: 'Slapp is a robust open source library that sits on top of the Slack APIs',
title: 'Slapp Library - Open Source',
image_url: 'https://storage.googleapis.com/beepboophq/_assets/bot-1.22f6fb.png',
title_link: 'https://beepboophq.com/',
color: '#7CD197'
}]
})
})
slapp.match((msg) => {
if (!msg.isMessage() || msg.body.event.subtype !== 'channel_join') {
return false
}
isChannel('general', msg, (err, yes) => {
if (err) return console.log('Error looking for general channel', err)
if (yes) {
slapp.message('direct_message',(msg)=>{
slapp.client.im.open({
token: msg.meta.bot_token,
user:msg.body.event.user},(err,data)=>{
if(err){
return console.log(err);
}else {
msg.say({ text: 'Welcome to slack' })
}
})
})
})
return true
})
// Catch-all for any other responses not handled above
slapp.message('.*', ['direct_mention', 'direct_message'], (msg) => {
// respond only 40% of the time
if (Math.random() < 0.4) {
msg.say([':wave:', ':pray:', ':raised_hands:'])
}
})
// attach Slapp to express server
var server = slapp.attachToExpress(express())
// start http server
server.listen(port, (err) => {
if (err) {
return console.error(err)
}
console.log(`Listening on port ${port}`)
})