-
Notifications
You must be signed in to change notification settings - Fork 2
/
path.ts
152 lines (135 loc) · 4.56 KB
/
path.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
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
import * as bot from '..'
/** Collection interface for path containing sets of branches. */
export interface IPath {
scope?: string
listen?: { [id: string]: bot.TextBranch | bot.CustomBranch }
understand?: { [id: string]: bot.NaturalLanguageBranch | bot.CustomBranch }
act?: { [id: string]: bot.CatchAllBranch }
}
/** Path contains collections of branches and methods to create each type. */
export class Path implements IPath {
scope: string
listen: { [id: string]: bot.TextBranch | bot.CustomBranch }
understand: { [id: string]: bot.NaturalLanguageBranch | bot.CustomBranch }
act: { [id: string]: bot.CatchAllBranch }
constructor (init: Path | IPath = {}) {
this.scope = (init.scope) ? init.scope : 'global'
this.listen = (init.listen) ? init.listen : {}
this.understand = (init.understand) ? init.understand : {}
this.act = (init.act) ? init.act : {}
}
/** Remove all but forced branches from collection, return remaining size. */
forced (collection: 'listen' | 'understand' | 'act') {
for (let id in this[collection]) {
if (!this[collection][id].force) delete this[collection][id]
}
return Object.keys(this[collection]).length
}
/** Add branch to collection, for separation based on thought processes. */
add (branch: bot.Branch, collection: 'listen' | 'understand' | 'act') {
this[collection][branch.id] = branch
return branch.id
}
/** Reset path to initial empty branch collections */
reset () {
this.listen = {}
this.understand = {}
this.act = {}
}
/** Create text branch with provided regex, action and options */
text (
condition: string | RegExp | bot.Condition | bot.Condition[] | bot.ConditionCollection | bot.Conditions,
action: bot.IBranchCallback | string,
options?: bot.IBranch
) {
return this.add(
new bot.TextBranch(condition, action, options),
'listen'
)
}
/** Create text branch pre-matched on the bot name as prefix. */
direct (
condition: string | RegExp | bot.Condition | bot.Condition[] | bot.ConditionCollection | bot.Conditions,
action: bot.IBranchCallback | string,
options?: bot.IBranch
) {
return this.add(
new bot.TextDirectBranch(condition, action, options),
'listen'
)
}
/** Create custom branch with provided matcher, action and optional meta. */
custom (
matcher: bot.IMatcher,
action: bot.IBranchCallback | string,
options?: bot.IBranch
) {
return this.add(
new bot.CustomBranch(matcher, action, options),
'listen'
)
}
/** Create a branch that triggers when no other branch matches. */
catchAll (
action: bot.IBranchCallback | string,
options?: bot.IBranch
) {
return this.add(
new bot.CatchAllBranch(action, options),
'act'
)
}
/** Create a natural language branch to match on NLU result attributes. */
NLU (
criteria: bot.NaturalLanguageCriteria,
action: bot.IBranchCallback | string,
options?: bot.IBranch
) {
return this.add(
new bot.NaturalLanguageBranch(criteria, action, options),
'understand'
)
}
/** Create a natural language branch pre-matched on the bot name as prefix. */
directNLU (
criteria: bot.NaturalLanguageCriteria,
action: bot.IBranchCallback | string,
options?: bot.IBranch
) {
return this.add(
new bot.NaturalLanguageDirectBranch(criteria, action, options),
'understand'
)
}
/** Create a natural language branch with custom matcher. */
customNLU (
matcher: bot.IMatcher,
action: bot.IBranchCallback | string,
options?: bot.IBranch
) {
return this.add(
new bot.CustomBranch(matcher, action, options),
'understand'
)
}
/** Create a branch that triggers when user enters a room. */
enter (action: bot.IBranchCallback | string, options?: bot.IBranch) {
return this.custom((message: bot.Message) => {
return message instanceof bot.EnterMessage
}, action, options)
}
/** Create a branch that triggers when user leaves a room. */
leave (action: bot.IBranchCallback | string, options?: bot.IBranch) {
return this.custom((message: bot.Message) => {
return message instanceof bot.LeaveMessage
}, action, options)
}
/** Create a branch that triggers when user changes the topic. */
topic (action: bot.IBranchCallback | string, options?: bot.IBranch) {
return this.custom((message: bot.Message) => {
return message instanceof bot.TopicMessage
}, action, options)
}
}
/** Global path to process any state not within specific isolated context. */
export const global = new Path()