-
Notifications
You must be signed in to change notification settings - Fork 0
/
abilities.ts
99 lines (89 loc) 路 2.36 KB
/
abilities.ts
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
import { randomElement } from './helpers'
import { Ability } from 'wolf-core'
import { StorageLayerType } from '../../src';
interface Alarm {
alarmName: string,
alarmTime: string
}
export interface UserState {
alarms: Alarm[]
}
export const abilities = [
{
name: 'greeting',
traces: [],
onComplete: () => {
return 'Hello! Welcome to alarm bot.'
}
},
{
name: 'addAlarm',
traces: [
{
slotName: 'alarmName'
},
{
slotName: 'alarmTime'
}
],
onComplete: async (submittedData, {read, save}) => {
const value = submittedData
const convoState = await read()
const prevAlarms = convoState.alarms || []
const newState = {
alarms: [
...prevAlarms,
value
]
}
await save(newState)
return `Your ${value.alarmName} is added!`
}
},
{
name: 'removeAlarm',
traces: [
{
slotName: 'alarmName'
}
],
onComplete: async (submittedData, {read, save}) => {
const { alarmName } = submittedData
const convoState = await read()
const stateAlarms = convoState.alarms || []
// Check if alarm name exists
if (!stateAlarms.some((alarm: Alarm) => alarm.alarmName === alarmName)) {
return `There is no alarm with name ${alarmName}.`
}
// Remove alarm
const newAlarms = stateAlarms.filter((alarm: Alarm) => alarm.alarmName !== alarmName)
const newState = {
alarms: newAlarms
}
await save(newState)
return `The ${alarmName} has been removed.`
}
},
{
name: 'listAlarms',
traces: [],
onComplete: async (submittedData, {read}) => {
const convoState = await read()
const alarms = convoState.alarms || []
if (alarms.length === 0) {
return `You do not have any alarms!`
}
return alarms.map((alarms: Alarm) => alarms.alarmName + ' at ' + alarms.alarmTime).join(', ')
}
},
{
name: 'listAbility',
traces: [],
onComplete: (submittedData, convoStorageLayer, { getAbilityList }) => {
const abilityList = getAbilityList()
const abilities = abilityList.map((ability) => ability.name).join(', ')
const message = `Here are my abilities: ${abilities}`
return message
}
}
] as Ability<UserState, StorageLayerType<UserState>>[]