@@ -4,6 +4,7 @@ import { Request } from './request';
44import { Struct } from './struct' ;
55import { IActivator } from '../interfaces/activator' ;
66import { Logger } from '../lib/logger' ;
7+ import { Trigger } from './trigger' ;
78
89const logger = new Logger ( 'Context' ) ;
910
@@ -28,6 +29,8 @@ export class Context {
2829 */
2930 idctx : string ;
3031
32+ private _sorted_triggers : Trigger [ ] ;
33+
3134 constructor ( ) {
3235 this . definitions = new Map ( ) ;
3336 this . dialogues = new Map ( ) ;
@@ -37,6 +40,7 @@ export class Context {
3740 this . plugins = new Map ( ) ;
3841 this . directives = new Map ( ) ;
3942 this . idctx = newid ( ) ;
43+ this . _sorted_triggers = [ ] ;
4044 }
4145
4246 /**
@@ -48,6 +52,64 @@ export class Context {
4852 : this . idctx ;
4953 }
5054
55+ /**
56+ * Get all of context triggers
57+ */
58+ get triggers ( ) : Trigger [ ] {
59+ if ( this . _sorted_triggers ?. length > 0 ) {
60+ return this . _sorted_triggers ;
61+ } else {
62+ this . sortTriggers ( ) ;
63+ return this . _sorted_triggers ;
64+ }
65+ }
66+
67+ /**
68+ * Get struct type
69+ * @param type type
70+ */
71+ private type ( type : string ) : Map < string , Struct > {
72+ switch ( type ) {
73+ case 'definition' :
74+ return this . definitions ;
75+ case 'dialogue' :
76+ return this . dialogues ;
77+ case 'flows' :
78+ return this . flows ;
79+ case 'command' :
80+ return this . commands ;
81+ case 'plugin' :
82+ return this . plugins ;
83+ case 'directive' :
84+ return this . directives ;
85+ default :
86+ throw new Error ( 'Not found type: ' + type ) ;
87+ }
88+ }
89+
90+ /**
91+ * Add context struct
92+ * @param struct
93+ */
94+ add ( struct : Struct ) {
95+ this . type ( struct . type ) . set ( struct . name , struct ) ;
96+ return this ;
97+ }
98+
99+ /**
100+ * sort trigger
101+ */
102+ sortTriggers ( ) : void {
103+ const vTriggers : Trigger [ ] = [ ] ;
104+ this . _sorted_triggers = [ ] ;
105+ Array . from ( this . dialogues . values ( ) )
106+ . forEach ( x => {
107+ vTriggers . push ( ...x . triggers . map ( t => new Trigger ( t , x . name ) ) ) ;
108+ } ) ;
109+ // sort & cache triggers.
110+ this . _sorted_triggers = vTriggers . sort ( Trigger . sorter ) ;
111+ }
112+
51113 /**
52114 * Get dialogue by name
53115 * Notice: a flow is a dialogue
0 commit comments