├── global.json
├── SkillAssets
├── SpaceFactsIntentSchema.json
└── Utterances.txt
├── SpaceGeek
├── project.json
├── SpaceGeek.xproj
├── Properties
│ └── AssemblyInfo.cs
├── Readme.md
└── Function.cs
├── SpaceGeek.sln
├── README.md
└── .gitignore
/global.json:
--------------------------------------------------------------------------------
1 | {
2 | "sdk": {
3 | "version": "1.0.0-preview2-003131"
4 | }
5 | }
--------------------------------------------------------------------------------
/SkillAssets/SpaceFactsIntentSchema.json:
--------------------------------------------------------------------------------
1 | {
2 | "intents": [
3 | { "intent": "GetNewFactIntent"},
4 | { "intent": "GetFactIntent" },
5 | { "intent": "AMAZON.HelpIntent" },
6 | { "intent": "AMAZON.StopIntent" },
7 | { "intent": "AMAZON.CancelIntent" }
8 | ]
9 | }
10 |
--------------------------------------------------------------------------------
/SkillAssets/Utterances.txt:
--------------------------------------------------------------------------------
1 | GetFactIntent give me a space fact
2 | GetFactIntent tell me a space fact
3 | GetFactIntent give me a fact
4 | GetFactIntent tell me a fact
5 | GetFactIntent tell me something
6 |
7 | GetNewFactIntent tell me a new fact
8 | GetNewFactIntent tell me another fact
9 | GetNewFactIntent tell me something new
10 |
11 | AMAZON.StopIntent we're done
12 | AMAZON.StopIntent that is enough
--------------------------------------------------------------------------------
/SpaceGeek/project.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "1.0.0-*",
3 | "buildOptions": {
4 | },
5 |
6 | "dependencies": {
7 | "Microsoft.NETCore.App": {
8 | "type": "platform",
9 | "version": "1.0.0"
10 | },
11 | "Amazon.Lambda.Core": "1.0.0*",
12 | "Amazon.Lambda.Serialization.Json": "1.0.1",
13 | "Amazon.Lambda.Tools": {
14 | "type": "build",
15 | "version": "1.1.0-preview1"
16 | },
17 | "Newtonsoft.Json": "9.0.1",
18 | "Alexa.NET": "1.0.0-beta-2"
19 | },
20 |
21 | "tools": {
22 | "Amazon.Lambda.Tools" : "1.1.0-preview1"
23 | },
24 |
25 | "frameworks": {
26 | "netcoreapp1.0": {
27 | "imports": "dnxcore50"
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/SpaceGeek.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 14
4 | VisualStudioVersion = 14.0.25420.1
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SpaceGeek", "SpaceGeek\SpaceGeek.xproj", "{3F8FFF30-2D96-4166-98A1-1F36BEBAB098}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {3F8FFF30-2D96-4166-98A1-1F36BEBAB098}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {3F8FFF30-2D96-4166-98A1-1F36BEBAB098}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {3F8FFF30-2D96-4166-98A1-1F36BEBAB098}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {3F8FFF30-2D96-4166-98A1-1F36BEBAB098}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | EndGlobal
23 |
--------------------------------------------------------------------------------
/SpaceGeek/SpaceGeek.xproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 14.0
5 | $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)
6 |
7 |
8 |
9 |
10 | 3f8fff30-2d96-4166-98a1-1f36bebab098
11 | .\obj
12 | .\bin\
13 | v4.5
14 | true
15 |
16 |
17 |
18 | 2.0
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Alexa Trivia Skill in .NET
2 | This is a C# port of the [Alexa Space Geek sample](https://github.com/alexa/skill-sample-nodejs-trivia)
3 |
4 | This is the code refereed to in my 3 part Alexa Skills tutorial series
5 |
6 | 1. [AWS Setup for Alexa Skills](http://matthiasshapiro.com/2017/02/10/tutorial-alexa-skills-in-c-setup/)
7 | 2. [Writing an Alexa Skill in C#](http://matthiasshapiro.com/2017/02/10/tutorial-alexa-skills-in-c-the-code/) - a detailed overview of this project
8 | 3. [Deploying and Testing an Alexa Skill](http://matthiasshapiro.com/2017/02/10/tutorial-alexa-skills-in-c-setup/Deploying)
9 |
10 | This skill utilizes the [Alexa Skills SDK for .NET](https://github.com/timheuer/alexa-skills-dotnet).
11 |
12 | # Key Components #
13 | There are two key parts to this project (and to any Alexa Skill running of Amazon's Lambda service).
14 |
15 | The first is the code itself, which is in [Function.cs](https://github.com/matthiasxc/alexa-net-trivia/blob/master/SpaceGeek/Function.cs).
16 |
17 | The second part are the Utterances and Intent Schema, which are both found in the [SkillAssets folder](https://github.com/matthiasxc/alexa-net-trivia/tree/master/SkillAssets). These are not compiled into the skill but are used when declaring and deploying the application through [Amazon's Alexa Skill portal.](https://developer.amazon.com/edw/home.html#/)
18 |
--------------------------------------------------------------------------------
/SpaceGeek/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // General Information about an assembly is controlled through the following
6 | // set of attributes. Change these attribute values to modify the information
7 | // associated with an assembly.
8 | [assembly: AssemblyTitle("SpaceGeek")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("SpaceGeek")]
13 | [assembly: AssemblyCopyright("Copyright © 2017")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Setting ComVisible to false makes the types in this assembly not visible
18 | // to COM components. If you need to access a type in this assembly from
19 | // COM, set the ComVisible attribute to true on that type.
20 | [assembly: ComVisible(false)]
21 |
22 | // The following GUID is for the ID of the typelib if this project is exposed to COM
23 | [assembly: Guid("3f8fff30-2d96-4166-98a1-1f36bebab098")]
24 |
25 | // Version information for an assembly consists of the following four values:
26 | //
27 | // Major Version
28 | // Minor Version
29 | // Build Number
30 | // Revision
31 | //
32 | // You can specify all the values or you can default the Build and Revision Numbers
33 | // by using the '*' as shown below:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/SpaceGeek/Readme.md:
--------------------------------------------------------------------------------
1 | # AWS Lambda Empty Function Project
2 |
3 | This starter project consists of:
4 | * Function.cs - class file containing a class with a single function handler method
5 | * aws-lambda-tools-defaults.json - default argument settings for use with Visual Studio and command line deployment tools for AWS
6 | * project.json - .NET Core project file with build and tool declarations for the Amazon.Lambda.Tools Nuget package
7 |
8 | You may also have a test project depending on the options selected.
9 |
10 | The generated function handler is a simple method accepting a string argument that returns the uppercase equivalent of the input string. Replace the body of this method, and parameters, to suit your needs.
11 |
12 | ## Here are some steps to follow from Visual Studio:
13 |
14 | To deploy your function to AWS Lambda, right click the project in Solution Explorer and select *Publish to AWS Lambda*.
15 |
16 | To view your deployed function open its Function View window by double-clicking the function name shown beneath the AWS Lambda node in the AWS Explorer tree.
17 |
18 | To perform testing against your deployed function use the Test Invoke tab in the opened Function View window.
19 |
20 | To configure event sources for your deployed function, for example to have your function invoked when an object is created in an Amazon S3 bucket, use the Event Sources tab in the opened Function View window.
21 |
22 | To update the runtime configuration of your deployed function use the Configuration tab in the opened Function View window.
23 |
24 | To view execution logs of invocations of your function use the Logs tab in the opened Function View window.
25 |
26 | ## Here are some steps to follow to get started from the command line:
27 |
28 | Once you have edited your function you can use the following command lines to build, test and deploy your function to AWS Lambda from the command line (these examples assume the project name is *EmptyFunction*):
29 |
30 | Restore dependencies
31 | ```
32 | cd "EmptyFunction"
33 | dotnet restore
34 | ```
35 |
36 | Execute unit tests
37 | ```
38 | cd "EmptyFunction/test/EmptyFunction.Tests"
39 | dotnet test
40 | ```
41 |
42 | Deploy function to AWS Lambda
43 | ```
44 | cd "EmptyFunction/src/EmptyFunction"
45 | dotnet lambda deploy-function
46 | ```
47 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.suo
8 | *.user
9 | *.userosscache
10 | *.sln.docstates
11 |
12 | # User-specific files (MonoDevelop/Xamarin Studio)
13 | *.userprefs
14 |
15 | # Build results
16 | [Dd]ebug/
17 | [Dd]ebugPublic/
18 | [Rr]elease/
19 | [Rr]eleases/
20 | x64/
21 | x86/
22 | bld/
23 | [Bb]in/
24 | [Oo]bj/
25 | [Ll]og/
26 |
27 | # Visual Studio 2015 cache/options directory
28 | .vs/
29 | # Uncomment if you have tasks that create the project's static files in wwwroot
30 | #wwwroot/
31 |
32 | # MSTest test Results
33 | [Tt]est[Rr]esult*/
34 | [Bb]uild[Ll]og.*
35 |
36 | # NUNIT
37 | *.VisualState.xml
38 | TestResult.xml
39 |
40 | # Build Results of an ATL Project
41 | [Dd]ebugPS/
42 | [Rr]eleasePS/
43 | dlldata.c
44 |
45 | # .NET Core
46 | project.lock.json
47 | project.fragment.lock.json
48 | artifacts/
49 | **/Properties/launchSettings.json
50 |
51 | *_i.c
52 | *_p.c
53 | *_i.h
54 | *.ilk
55 | *.meta
56 | *.obj
57 | *.pch
58 | *.pdb
59 | *.pgc
60 | *.pgd
61 | *.rsp
62 | *.sbr
63 | *.tlb
64 | *.tli
65 | *.tlh
66 | *.tmp
67 | *.tmp_proj
68 | *.log
69 | *.vspscc
70 | *.vssscc
71 | .builds
72 | *.pidb
73 | *.svclog
74 | *.scc
75 |
76 | # Chutzpah Test files
77 | _Chutzpah*
78 |
79 | # Visual C++ cache files
80 | ipch/
81 | *.aps
82 | *.ncb
83 | *.opendb
84 | *.opensdf
85 | *.sdf
86 | *.cachefile
87 | *.VC.db
88 | *.VC.VC.opendb
89 |
90 | # Visual Studio profiler
91 | *.psess
92 | *.vsp
93 | *.vspx
94 | *.sap
95 |
96 | # TFS 2012 Local Workspace
97 | $tf/
98 |
99 | # Guidance Automation Toolkit
100 | *.gpState
101 |
102 | # ReSharper is a .NET coding add-in
103 | _ReSharper*/
104 | *.[Rr]e[Ss]harper
105 | *.DotSettings.user
106 |
107 | # JustCode is a .NET coding add-in
108 | .JustCode
109 |
110 | # TeamCity is a build add-in
111 | _TeamCity*
112 |
113 | # DotCover is a Code Coverage Tool
114 | *.dotCover
115 |
116 | # Visual Studio code coverage results
117 | *.coverage
118 | *.coveragexml
119 |
120 | # NCrunch
121 | _NCrunch_*
122 | .*crunch*.local.xml
123 | nCrunchTemp_*
124 |
125 | # MightyMoose
126 | *.mm.*
127 | AutoTest.Net/
128 |
129 | # Web workbench (sass)
130 | .sass-cache/
131 |
132 | # Installshield output folder
133 | [Ee]xpress/
134 |
135 | # DocProject is a documentation generator add-in
136 | DocProject/buildhelp/
137 | DocProject/Help/*.HxT
138 | DocProject/Help/*.HxC
139 | DocProject/Help/*.hhc
140 | DocProject/Help/*.hhk
141 | DocProject/Help/*.hhp
142 | DocProject/Help/Html2
143 | DocProject/Help/html
144 |
145 | # Click-Once directory
146 | publish/
147 |
148 | # Publish Web Output
149 | *.[Pp]ublish.xml
150 | *.azurePubxml
151 | # TODO: Comment the next line if you want to checkin your web deploy settings
152 | # but database connection strings (with potential passwords) will be unencrypted
153 | *.pubxml
154 | *.publishproj
155 |
156 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
157 | # checkin your Azure Web App publish settings, but sensitive information contained
158 | # in these scripts will be unencrypted
159 | PublishScripts/
160 |
161 | # NuGet Packages
162 | *.nupkg
163 | # The packages folder can be ignored because of Package Restore
164 | **/packages/*
165 | # except build/, which is used as an MSBuild target.
166 | !**/packages/build/
167 | # Uncomment if necessary however generally it will be regenerated when needed
168 | #!**/packages/repositories.config
169 | # NuGet v3's project.json files produces more ignoreable files
170 | *.nuget.props
171 | *.nuget.targets
172 |
173 | # Microsoft Azure Build Output
174 | csx/
175 | *.build.csdef
176 |
177 | # Microsoft Azure Emulator
178 | ecf/
179 | rcf/
180 |
181 | # Windows Store app package directories and files
182 | AppPackages/
183 | BundleArtifacts/
184 | Package.StoreAssociation.xml
185 | _pkginfo.txt
186 |
187 | # Visual Studio cache files
188 | # files ending in .cache can be ignored
189 | *.[Cc]ache
190 | # but keep track of directories ending in .cache
191 | !*.[Cc]ache/
192 |
193 | # Others
194 | ClientBin/
195 | ~$*
196 | *~
197 | *.dbmdl
198 | *.dbproj.schemaview
199 | *.jfm
200 | *.pfx
201 | *.publishsettings
202 | orleans.codegen.cs
203 |
204 | # Since there are multiple workflows, uncomment next line to ignore bower_components
205 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
206 | #bower_components/
207 |
208 | # RIA/Silverlight projects
209 | Generated_Code/
210 |
211 | # Backup & report files from converting an old project file
212 | # to a newer Visual Studio version. Backup files are not needed,
213 | # because we have git ;-)
214 | _UpgradeReport_Files/
215 | Backup*/
216 | UpgradeLog*.XML
217 | UpgradeLog*.htm
218 |
219 | # SQL Server files
220 | *.mdf
221 | *.ldf
222 |
223 | # Business Intelligence projects
224 | *.rdl.data
225 | *.bim.layout
226 | *.bim_*.settings
227 |
228 | # Microsoft Fakes
229 | FakesAssemblies/
230 |
231 | # GhostDoc plugin setting file
232 | *.GhostDoc.xml
233 |
234 | # Node.js Tools for Visual Studio
235 | .ntvs_analysis.dat
236 | node_modules/
237 |
238 | # Typescript v1 declaration files
239 | typings/
240 |
241 | # Visual Studio 6 build log
242 | *.plg
243 |
244 | # Visual Studio 6 workspace options file
245 | *.opt
246 |
247 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
248 | *.vbw
249 |
250 | # Visual Studio LightSwitch build output
251 | **/*.HTMLClient/GeneratedArtifacts
252 | **/*.DesktopClient/GeneratedArtifacts
253 | **/*.DesktopClient/ModelManifest.xml
254 | **/*.Server/GeneratedArtifacts
255 | **/*.Server/ModelManifest.xml
256 | _Pvt_Extensions
257 |
258 | # Paket dependency manager
259 | .paket/paket.exe
260 | paket-files/
261 |
262 | # FAKE - F# Make
263 | .fake/
264 |
265 | # JetBrains Rider
266 | .idea/
267 | *.sln.iml
268 |
269 | # CodeRush
270 | .cr/
271 |
272 | # Python Tools for Visual Studio (PTVS)
273 | __pycache__/
274 | *.pyc
275 |
276 | # Cake - Uncomment if you are using it
277 | # tools/**
278 | # !tools/packages.config
--------------------------------------------------------------------------------
/SpaceGeek/Function.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using Amazon.Lambda.Core;
6 | using Amazon.Lambda.Serialization;
7 | using Alexa.NET.Response;
8 | using Alexa.NET.Request;
9 | using Alexa.NET.Request.Type;
10 | using Newtonsoft.Json;
11 |
12 | // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
13 | [assembly: LambdaSerializerAttribute(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]
14 |
15 | namespace SpaceGeek
16 | {
17 | public class Function
18 | {
19 | public List GetResources()
20 | {
21 | List resources = new List();
22 | FactResource enUSResource = new FactResource("en-US");
23 | enUSResource.SkillName = "American Science Facts";
24 | enUSResource.GetFactMessage = "Here's your science fact: ";
25 | enUSResource.HelpMessage = "You can say tell me a science fact, or, you can say exit... What can I help you with?";
26 | enUSResource.HelpReprompt = "You can say tell me a science fact to start";
27 | enUSResource.StopMessage = "Goodbye!";
28 | enUSResource.Facts.Add("A year on Mercury is just 88 days long.");
29 | enUSResource.Facts.Add("Despite being farther from the Sun, Venus experiences higher temperatures than Mercury.");
30 | enUSResource.Facts.Add("Venus rotates counter-clockwise, possibly because of a collision in the past with an asteroid.");
31 | enUSResource.Facts.Add("On Mars, the Sun appears about half the size as it does on Earth.");
32 | enUSResource.Facts.Add("Earth is the only planet not named after a god.");
33 | enUSResource.Facts.Add("Jupiter has the shortest day of all the planets.");
34 | enUSResource.Facts.Add("The Milky Way galaxy will collide with the Andromeda Galaxy in about 5 billion years.");
35 | enUSResource.Facts.Add("The Sun contains 99.86% of the mass in the Solar System.");
36 | enUSResource.Facts.Add("The Sun is an almost perfect sphere.");
37 | enUSResource.Facts.Add("A total solar eclipse can happen once every 1 to 2 years. This makes them a rare event.");
38 | enUSResource.Facts.Add("Saturn radiates two and a half times more energy into space than it receives from the sun.");
39 | enUSResource.Facts.Add("The temperature inside the Sun can reach 15 million degrees Celsius.");
40 | enUSResource.Facts.Add("The Moon is moving approximately 3.8 cm away from our planet every year.");
41 |
42 | resources.Add(enUSResource);
43 | return resources;
44 | }
45 |
46 | ///
47 | /// A simple function that takes a string and does a ToUpper
48 | ///
49 | ///
50 | ///
51 | ///
52 | public SkillResponse FunctionHandler(SkillRequest input, ILambdaContext context)
53 | {
54 | SkillResponse response = new SkillResponse();
55 | response.Response = new ResponseBody();
56 | response.Response.ShouldEndSession = false;
57 | IOutputSpeech innerResponse = null;
58 | var log = context.Logger;
59 | log.LogLine($"Skill Request Object:");
60 | log.LogLine(JsonConvert.SerializeObject(input));
61 |
62 | var allResources = GetResources();
63 | var resource = allResources.FirstOrDefault();
64 |
65 | if (input.GetRequestType() == typeof(LaunchRequest))
66 | {
67 | log.LogLine($"Default LaunchRequest made: 'Alexa, open Science Facts");
68 | innerResponse = new PlainTextOutputSpeech();
69 | (innerResponse as PlainTextOutputSpeech).Text = emitNewFact(resource, true);
70 |
71 | }
72 | else if (input.GetRequestType() == typeof(IntentRequest))
73 | {
74 | var intentRequest = (IntentRequest)input.Request;
75 |
76 | switch (intentRequest.Intent.Name)
77 | {
78 | case "AMAZON.CancelIntent":
79 | log.LogLine($"AMAZON.CancelIntent: send StopMessage");
80 | innerResponse = new PlainTextOutputSpeech();
81 | (innerResponse as PlainTextOutputSpeech).Text = resource.StopMessage;
82 | response.Response.ShouldEndSession = true;
83 | break;
84 | case "AMAZON.StopIntent":
85 | log.LogLine($"AMAZON.StopIntent: send StopMessage");
86 | innerResponse = new PlainTextOutputSpeech();
87 | (innerResponse as PlainTextOutputSpeech).Text = resource.StopMessage;
88 | response.Response.ShouldEndSession = true;
89 | break;
90 | case "AMAZON.HelpIntent":
91 | log.LogLine($"AMAZON.HelpIntent: send HelpMessage");
92 | innerResponse = new PlainTextOutputSpeech();
93 | (innerResponse as PlainTextOutputSpeech).Text = resource.HelpMessage;
94 | break;
95 | case "GetFactIntent":
96 | log.LogLine($"GetFactIntent sent: send new fact");
97 | innerResponse = new PlainTextOutputSpeech();
98 | (innerResponse as PlainTextOutputSpeech).Text = emitNewFact(resource, false);
99 | break;
100 | case "GetNewFactIntent":
101 | log.LogLine($"GetFactIntent sent: send new fact");
102 | innerResponse = new PlainTextOutputSpeech();
103 | (innerResponse as PlainTextOutputSpeech).Text = emitNewFact(resource, false);
104 | break;
105 | default:
106 | log.LogLine($"Unknown intent: " + intentRequest.Intent.Name);
107 | innerResponse = new PlainTextOutputSpeech();
108 | (innerResponse as PlainTextOutputSpeech).Text = resource.HelpReprompt;
109 | break;
110 | }
111 | }
112 |
113 | response.Response.OutputSpeech = innerResponse;
114 | response.Version = "1.0";
115 | log.LogLine($"Skill Response Object...");
116 | log.LogLine(JsonConvert.SerializeObject(response));
117 | return response;
118 | }
119 |
120 | public string emitNewFact(FactResource resource, bool withPreface)
121 | {
122 | Random r = new Random();
123 | if(withPreface)
124 | return resource.GetFactMessage + resource.Facts[r.Next(resource.Facts.Count)];
125 | return resource.Facts[r.Next(resource.Facts.Count)];
126 | }
127 |
128 | }
129 |
130 | public class FactResource
131 | {
132 | public FactResource(string language)
133 | {
134 | this.Language = language;
135 | this.Facts = new List();
136 | }
137 |
138 | public string Language { get; set; }
139 | public string SkillName { get; set; }
140 | public List Facts { get; set; }
141 | public string GetFactMessage { get; set; }
142 | public string HelpMessage { get; set; }
143 | public string HelpReprompt { get; set; }
144 | public string StopMessage { get; set; }
145 | }
146 | }
147 |
--------------------------------------------------------------------------------