-
Notifications
You must be signed in to change notification settings - Fork 3
/
server.js
126 lines (106 loc) · 3.79 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
'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'
}]
})
})
// 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}`)
})