From 88b4db05128d9c0a74610f0b4bb15589197e4ab1 Mon Sep 17 00:00:00 2001 From: Robin-Manuel Thiel Date: Wed, 17 Oct 2018 16:53:11 +0200 Subject: [PATCH] Replace old bot with new Echo Sample --- Backend/Bot/BotConfiguration.bot | 15 + Backend/Bot/ContosoMaintenance.Bot.csproj | 26 ++ Backend/Bot/CounterState.cs | 19 + .../DeploymentScripts/MsbotClone/bot.recipe | 33 ++ Backend/Bot/EchoBotAccessors.cs | 48 ++ Backend/Bot/EchoBotWithCounter.ruleset | 22 + Backend/Bot/EchoWithCounterBot.cs | 88 ++++ Backend/Bot/Program.cs | 38 ++ Backend/Bot/README.md | 54 +++ Backend/Bot/Startup.cs | 151 +++++++ Backend/Bot/appsettings.json | 4 + Backend/Bot/wwwroot/default.htm | 419 ++++++++++++++++++ .../ContosoMaintenance.Bot.WebApp.Core.csproj | 21 - .../Controllers/MessagesController.cs | 74 ---- .../Controllers/ValuesController.cs | 44 -- .../Program.cs | 25 -- .../Services/AzureSearchService.cs | 54 --- .../Startup.cs | 65 --- .../appsettings.Development.json | 10 - .../appsettings.json | 25 -- .../wwwroot/default.htm | 21 - Backend/BotBackend/.deployment | 2 - Backend/BotBackend/.gitignore | 6 - Backend/BotBackend/App_Start/WebApiConfig.cs | 37 -- .../ContosoMaintenance.Bot.WebApp.csproj | 258 ----------- Backend/BotBackend/ContosoMaintenance.Bot.sln | 24 - .../Controllers/MessagesController.cs | 69 --- .../BotBackend/Definitions/ServiceEntities.cs | 16 - Backend/BotBackend/Dialogs/BasicLuisDialog.cs | 116 ----- .../BotBackend/Dialogs/SearchServiceDialog.cs | 92 ---- Backend/BotBackend/Dockerfile | 37 -- Backend/BotBackend/Global.asax | 1 - Backend/BotBackend/Global.asax.cs | 43 -- Backend/BotBackend/Models/JobModel.cs | 51 --- .../BotBackend/Models/SearchResultModel.cs | 92 ---- .../PostDeployScripts/IncludeSources.targets | 12 - .../githubProject.json.template | 9 - .../PostDeployScripts/prepareSrc.cmd | 70 --- .../PostDeployScripts/publish.cmd.template | 3 - .../publishProfile.xml.template | 25 -- .../publishSettings.xml.template | 15 - .../BotBackend/PostDeployScripts/runGulp.cmd | 23 - .../setupGithubRemoteRepo.cmd | 44 -- .../PostDeployScripts/setupVsoRemoteRepo.cmd | 50 --- .../vsoProject.json.template | 12 - Backend/BotBackend/Properties/AssemblyInfo.cs | 35 -- .../BotBackend/Services/AzureSearchService.cs | 56 --- Backend/BotBackend/Utils/CardUtil.cs | 128 ------ Backend/BotBackend/Utils/JobModelExtension.cs | 36 -- Backend/BotBackend/Web.Debug.config | 30 -- Backend/BotBackend/Web.Release.config | 31 -- Backend/BotBackend/Web.config | 119 ----- Backend/BotBackend/build.cmd | 14 - Backend/BotBackend/default.htm | 21 - Backend/BotBackend/deploy.cmd | 116 ----- Backend/BotBackend/packages.config | 34 -- ContosoMaintenance.sln | 298 ++++++------- Mobile/Droid/Resources/Resource.designer.cs | 62 ++- 58 files changed, 1068 insertions(+), 2275 deletions(-) create mode 100755 Backend/Bot/BotConfiguration.bot create mode 100755 Backend/Bot/ContosoMaintenance.Bot.csproj create mode 100755 Backend/Bot/CounterState.cs create mode 100755 Backend/Bot/DeploymentScripts/MsbotClone/bot.recipe create mode 100755 Backend/Bot/EchoBotAccessors.cs create mode 100755 Backend/Bot/EchoBotWithCounter.ruleset create mode 100755 Backend/Bot/EchoWithCounterBot.cs create mode 100755 Backend/Bot/Program.cs create mode 100755 Backend/Bot/README.md create mode 100755 Backend/Bot/Startup.cs create mode 100755 Backend/Bot/appsettings.json create mode 100755 Backend/Bot/wwwroot/default.htm delete mode 100644 Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/ContosoMaintenance.Bot.WebApp.Core.csproj delete mode 100644 Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Controllers/MessagesController.cs delete mode 100644 Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Controllers/ValuesController.cs delete mode 100644 Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Program.cs delete mode 100644 Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Services/AzureSearchService.cs delete mode 100644 Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Startup.cs delete mode 100644 Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/appsettings.Development.json delete mode 100644 Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/appsettings.json delete mode 100644 Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/wwwroot/default.htm delete mode 100644 Backend/BotBackend/.deployment delete mode 100644 Backend/BotBackend/.gitignore delete mode 100644 Backend/BotBackend/App_Start/WebApiConfig.cs delete mode 100644 Backend/BotBackend/ContosoMaintenance.Bot.WebApp.csproj delete mode 100644 Backend/BotBackend/ContosoMaintenance.Bot.sln delete mode 100644 Backend/BotBackend/Controllers/MessagesController.cs delete mode 100644 Backend/BotBackend/Definitions/ServiceEntities.cs delete mode 100644 Backend/BotBackend/Dialogs/BasicLuisDialog.cs delete mode 100644 Backend/BotBackend/Dialogs/SearchServiceDialog.cs delete mode 100644 Backend/BotBackend/Dockerfile delete mode 100644 Backend/BotBackend/Global.asax delete mode 100644 Backend/BotBackend/Global.asax.cs delete mode 100644 Backend/BotBackend/Models/JobModel.cs delete mode 100644 Backend/BotBackend/Models/SearchResultModel.cs delete mode 100644 Backend/BotBackend/PostDeployScripts/IncludeSources.targets delete mode 100644 Backend/BotBackend/PostDeployScripts/githubProject.json.template delete mode 100644 Backend/BotBackend/PostDeployScripts/prepareSrc.cmd delete mode 100644 Backend/BotBackend/PostDeployScripts/publish.cmd.template delete mode 100644 Backend/BotBackend/PostDeployScripts/publishProfile.xml.template delete mode 100644 Backend/BotBackend/PostDeployScripts/publishSettings.xml.template delete mode 100644 Backend/BotBackend/PostDeployScripts/runGulp.cmd delete mode 100644 Backend/BotBackend/PostDeployScripts/setupGithubRemoteRepo.cmd delete mode 100644 Backend/BotBackend/PostDeployScripts/setupVsoRemoteRepo.cmd delete mode 100644 Backend/BotBackend/PostDeployScripts/vsoProject.json.template delete mode 100644 Backend/BotBackend/Properties/AssemblyInfo.cs delete mode 100644 Backend/BotBackend/Services/AzureSearchService.cs delete mode 100644 Backend/BotBackend/Utils/CardUtil.cs delete mode 100644 Backend/BotBackend/Utils/JobModelExtension.cs delete mode 100644 Backend/BotBackend/Web.Debug.config delete mode 100644 Backend/BotBackend/Web.Release.config delete mode 100644 Backend/BotBackend/Web.config delete mode 100644 Backend/BotBackend/build.cmd delete mode 100644 Backend/BotBackend/default.htm delete mode 100644 Backend/BotBackend/deploy.cmd delete mode 100644 Backend/BotBackend/packages.config diff --git a/Backend/Bot/BotConfiguration.bot b/Backend/Bot/BotConfiguration.bot new file mode 100755 index 0000000..671a84f --- /dev/null +++ b/Backend/Bot/BotConfiguration.bot @@ -0,0 +1,15 @@ +{ + "name": "ContosoMaintenance.Bot", + "services": [ + { + "type": "endpoint", + "name": "development", + "endpoint": "http://localhost:3978/api/messages", + "appId": "", + "appPassword": "", + "id": "1" + } + ], + "padlock": "", + "version": "2.0" +} \ No newline at end of file diff --git a/Backend/Bot/ContosoMaintenance.Bot.csproj b/Backend/Bot/ContosoMaintenance.Bot.csproj new file mode 100755 index 0000000..fc9eeed --- /dev/null +++ b/Backend/Bot/ContosoMaintenance.Bot.csproj @@ -0,0 +1,26 @@ + + + + netcoreapp2.0 + EchoBotWithCounter.ruleset + + + + + + Always + + + + + + + + + + + + + + + diff --git a/Backend/Bot/CounterState.cs b/Backend/Bot/CounterState.cs new file mode 100755 index 0000000..f42c81a --- /dev/null +++ b/Backend/Bot/CounterState.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +namespace ContosoMaintenance.Bot +{ + /// + /// Stores counter state for the conversation. + /// Stored in and + /// backed by . + /// + public class CounterState + { + /// + /// Gets or sets the number of turns in the conversation. + /// + /// The number of turns in the conversation. + public int TurnCount { get; set; } = 0; + } +} diff --git a/Backend/Bot/DeploymentScripts/MsbotClone/bot.recipe b/Backend/Bot/DeploymentScripts/MsbotClone/bot.recipe new file mode 100755 index 0000000..c19c325 --- /dev/null +++ b/Backend/Bot/DeploymentScripts/MsbotClone/bot.recipe @@ -0,0 +1,33 @@ +{ + "version": "1.0", + "resources": [ + { + "type": "endpoint", + "id": "1", + "name": "development", + "url": "http://localhost:3978/api/messages" + }, + { + "type": "endpoint", + "id": "2", + "name": "production", + "url": "https://your-bot-url.azurewebsites.net/api/messages" + }, + { + "type": "abs", + "id": "3", + "name": "ContosoMaintenance.Bot-abs" + }, + { + "type": "appInsights", + "id": "4", + "name": "ContosoMaintenance.Bot-insights" + }, + { + "type": "blob", + "id": "5", + "name": "ContosoMaintenance.Bot-blob", + "container": "botstatestore" + } + ] +} diff --git a/Backend/Bot/EchoBotAccessors.cs b/Backend/Bot/EchoBotAccessors.cs new file mode 100755 index 0000000..ed9f7f8 --- /dev/null +++ b/Backend/Bot/EchoBotAccessors.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using Microsoft.Bot.Builder; + +namespace ContosoMaintenance.Bot +{ + /// + /// This class is created as a Singleton and passed into the IBot-derived constructor. + /// - See constructor for how that is injected. + /// - See the Startup.cs file for more details on creating the Singleton that gets + /// injected into the constructor. + /// + public class EchoBotAccessors + { + /// + /// Initializes a new instance of the class. + /// Contains the and associated . + /// + /// The state object that stores the counter. + public EchoBotAccessors(ConversationState conversationState) + { + ConversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState)); + } + + /// + /// Gets the name used for the accessor. + /// + /// Accessors require a unique name. + /// The accessor name for the counter accessor. + public static string CounterStateName { get; } = $"{nameof(EchoBotAccessors)}.CounterState"; + + /// + /// Gets or sets the for CounterState. + /// + /// + /// The accessor stores the turn count for the conversation. + /// + public IStatePropertyAccessor CounterState { get; set; } + + /// + /// Gets the object for the conversation. + /// + /// The object. + public ConversationState ConversationState { get; } + } +} diff --git a/Backend/Bot/EchoBotWithCounter.ruleset b/Backend/Bot/EchoBotWithCounter.ruleset new file mode 100755 index 0000000..13e4095 --- /dev/null +++ b/Backend/Bot/EchoBotWithCounter.ruleset @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Backend/Bot/EchoWithCounterBot.cs b/Backend/Bot/EchoWithCounterBot.cs new file mode 100755 index 0000000..6d9505b --- /dev/null +++ b/Backend/Bot/EchoWithCounterBot.cs @@ -0,0 +1,88 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Bot.Builder; +using Microsoft.Bot.Schema; +using Microsoft.Extensions.Logging; + +namespace ContosoMaintenance.Bot +{ + /// + /// Represents a bot that processes incoming activities. + /// For each user interaction, an instance of this class is created and the OnTurnAsync method is called. + /// This is a Transient lifetime service. Transient lifetime services are created + /// each time they're requested. For each Activity received, a new instance of this + /// class is created. Objects that are expensive to construct, or have a lifetime + /// beyond the single turn, should be carefully managed. + /// For example, the object and associated + /// object are created with a singleton lifetime. + /// + /// + public class EchoWithCounterBot : IBot + { + private readonly EchoBotAccessors _accessors; + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + /// A class containing used to manage state. + /// A that is hooked to the Azure App Service provider. + /// + public EchoWithCounterBot(EchoBotAccessors accessors, ILoggerFactory loggerFactory) + { + if (loggerFactory == null) + { + throw new System.ArgumentNullException(nameof(loggerFactory)); + } + + _logger = loggerFactory.CreateLogger(); + _logger.LogTrace("EchoBot turn start."); + _accessors = accessors ?? throw new System.ArgumentNullException(nameof(accessors)); + } + + /// + /// Every conversation turn for our Echo Bot will call this method. + /// There are no dialogs used, since it's "single turn" processing, meaning a single + /// request and response. + /// + /// A containing all the data needed + /// for processing this conversation turn. + /// (Optional) A that can be used by other objects + /// or threads to receive notice of cancellation. + /// A that represents the work queued to execute. + /// + /// + /// + public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken)) + { + // Handle Message activity type, which is the main activity type for shown within a conversational interface + // Message activities may contain text, speech, interactive cards, and binary or unknown attachments. + // see https://aka.ms/about-bot-activity-message to learn more about the message and other activity types + if (turnContext.Activity.Type == ActivityTypes.Message) + { + // Get the conversation state from the turn context. + var state = await _accessors.CounterState.GetAsync(turnContext, () => new CounterState()); + + // Bump the turn count for this conversation. + state.TurnCount++; + + // Set the property using the accessor. + await _accessors.CounterState.SetAsync(turnContext, state); + + // Save the new turn count into the conversation state. + await _accessors.ConversationState.SaveChangesAsync(turnContext); + + // Echo back to the user whatever they typed. + var responseMessage = $"Turn {state.TurnCount}: You sent '{turnContext.Activity.Text}'\n"; + await turnContext.SendActivityAsync(responseMessage); + } + else + { + await turnContext.SendActivityAsync($"{turnContext.Activity.Type} event detected"); + } + } + } +} diff --git a/Backend/Bot/Program.cs b/Backend/Bot/Program.cs new file mode 100755 index 0000000..77cf2bf --- /dev/null +++ b/Backend/Bot/Program.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Logging; + +namespace ContosoMaintenance.Bot +{ + public class Program + { + public static void Main(string[] args) + { + BuildWebHost(args).Run(); + } + + public static IWebHost BuildWebHost(string[] args) => + WebHost.CreateDefaultBuilder(args) + .ConfigureLogging((hostingContext, logging) => + { + // Add Azure Logging + logging.AddAzureWebAppDiagnostics(); + + // Logging Options. + // There are other logging options available: + // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1 + // logging.AddDebug(); + // logging.AddConsole(); + }) + + // Logging Options. + // Consider using Application Insights for your logging and metrics needs. + // https://azure.microsoft.com/en-us/services/application-insights/ + // .UseApplicationInsights() + .UseStartup() + .Build(); + } +} diff --git a/Backend/Bot/README.md b/Backend/Bot/README.md new file mode 100755 index 0000000..83c4cde --- /dev/null +++ b/Backend/Bot/README.md @@ -0,0 +1,54 @@ +This sample demonstrates a simple echo bot with state with ASP.Net Core 2. The bot maintains a simple counter that increases with each message from the user. + +# To try this sample +- Clone the samples repository +```bash +git clone https://github.com/Microsoft/botbuilder-samples.git +``` +- [Optional] Update the `appsettings.json` file under `botbuilder-samples\samples\csharp_dotnetcore\02.echo-with-counter` with your botFileSecret. For Azure Bot Service bots, you can find the botFileSecret under application settings. +# Prerequisites +## Visual Studio +- Navigate to the samples folder (`botbuilder-samples\samples\csharp_dotnetcore\02.echo-with-counter`) and open EchoBotWithCounter.csproj in Visual Studio. +- Hit F5. + +## Visual Studio Code +- Open `botbuilder-samples\samples\csharp_dotnetcore\02.echo-with-counter` sample folder. +- Bring up a terminal, navigate to `botbuilder-samples\samples\csharp_dotnetcore\02.echo-with-counter` folder. +- Type 'dotnet run'. + +## Testing the bot using Bot Framework Emulator +[Microsoft Bot Framework Emulator](https://github.com/microsoft/botframework-emulator) is a desktop application that allows bot +developers to test and debug their bots on localhost or running remotely through a tunnel. +- Install the Bot Framework emulator from [here](https://aka.ms/botframeworkemulator). + +## Connect to bot using Bot Framework Emulator **V4** +- Launch the Bot Framework Emulator. +- File -> Open bot and navigate to `botbuilder-samples\samples\csharp_dotnetcore\02.echo-with-counter` folder. +- Select `BotConfiguration.bot` file. +# Bot state +A key to good bot design is to track the context of a conversation, so that your bot remembers things like the answers to previous questions. Depending on what your bot is used for, you may even need to keep track of conversation state or store user related information for longer than the lifetime of one given conversation. + +In this example, the bot's state is used to track number of messages. + + A bot's state is information it remembers in order to respond appropriately to incoming messages. The Bot Builder SDK provides classes for [storing and retrieving state data](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-state?view=azure-bot-service-4.0&tabs=js) as an object associated with a user or a conversation. + + - Conversation properties help your bot keep track of the current conversation the bot is having with the user. If your bot needs to complete a sequence of steps or switch between conversation topics, you can use conversation properties to manage steps in a sequence or track the current topic. Since conversation properties reflect the state of the current conversation, you typically clear them at the end of a session, when the bot receives an end of conversation activity. + + - User properties can be used for many purposes, such as determining where the user's prior conversation left off or simply greeting a returning user by name. If you store a user's preferences, you can use that information to customize the conversation the next time you chat. For example, you might alert the user to a news article about a topic that interests her, or alert a user when an appointment becomes available. You should clear them if the bot receives a delete user data activity. + +# Deploy this bot to Azure +You can use the [MSBot](https://github.com/microsoft/botbuilder-tools) Bot Builder CLI tool to clone and configure any services this sample depends on. + +To install all Bot Builder tools - +```bash +npm i -g msbot chatdown ludown qnamaker luis-apis botdispatch luisgen +``` +To clone this bot, run +``` +msbot clone services -f deploymentScripts/msbotClone -n -l --subscriptionId +``` +# Further reading +- [Azure Bot Service Introduction](https://docs.microsoft.com/en-us/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0) +- [Bot State](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-storage-concept?view=azure-bot-service-4.0) +- [Write directly to storage](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-storage?view=azure-bot-service-4.0&tabs=jsechoproperty%2Ccsetagoverwrite%2Ccsetag) +- [Managing conversation and user state](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-state?view=azure-bot-service-4.0&tabs=js) diff --git a/Backend/Bot/Startup.cs b/Backend/Bot/Startup.cs new file mode 100755 index 0000000..c0d8194 --- /dev/null +++ b/Backend/Bot/Startup.cs @@ -0,0 +1,151 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Linq; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Bot.Builder; +using Microsoft.Bot.Builder.Integration; +using Microsoft.Bot.Builder.Integration.AspNet.Core; +using Microsoft.Bot.Configuration; +using Microsoft.Bot.Connector.Authentication; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; + +namespace ContosoMaintenance.Bot +{ + /// + /// The Startup class configures services and the request pipeline. + /// + public class Startup + { + private ILoggerFactory _loggerFactory; + private bool _isProduction = false; + + public Startup(IHostingEnvironment env) + { + _isProduction = env.IsProduction(); + var builder = new ConfigurationBuilder() + .SetBasePath(env.ContentRootPath) + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) + .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) + .AddEnvironmentVariables(); + + Configuration = builder.Build(); + } + + /// + /// Gets the configuration that represents a set of key/value application configuration properties. + /// + /// + /// The that represents a set of key/value application configuration properties. + /// + public IConfiguration Configuration { get; } + + /// + /// This method gets called by the runtime. Use this method to add services to the container. + /// + /// The specifies the contract for a collection of service descriptors. + /// + /// + /// + public void ConfigureServices(IServiceCollection services) + { + services.AddBot(options => + { + var secretKey = Configuration.GetSection("botFileSecret")?.Value; + var botFilePath = Configuration.GetSection("botFilePath")?.Value; + + // Loads .bot configuration file and adds a singleton that your Bot can access through dependency injection. + var botConfig = BotConfiguration.Load(botFilePath ?? @".\BotConfiguration.bot", secretKey); + services.AddSingleton(sp => botConfig ?? throw new InvalidOperationException($"The .bot config file could not be loaded. ({botConfig})")); + + // Retrieve current endpoint. + var environment = _isProduction ? "production" : "development"; + var service = botConfig.Services.Where(s => s.Type == "endpoint" && s.Name == environment).FirstOrDefault(); + if (!(service is EndpointService endpointService)) + { + throw new InvalidOperationException($"The .bot file does not contain an endpoint with name '{environment}'."); + } + + options.CredentialProvider = new SimpleCredentialProvider(endpointService.AppId, endpointService.AppPassword); + + // Creates a logger for the application to use. + ILogger logger = _loggerFactory.CreateLogger(); + + // Catches any errors that occur during a conversation turn and logs them. + options.OnTurnError = async (context, exception) => + { + logger.LogError($"Exception caught : {exception}"); + await context.SendActivityAsync("Sorry, it looks like something went wrong."); + }; + + // The Memory Storage used here is for local bot debugging only. When the bot + // is restarted, everything stored in memory will be gone. + IStorage dataStore = new MemoryStorage(); + + // For production bots use the Azure Blob or + // Azure CosmosDB storage providers. For the Azure + // based storage providers, add the Microsoft.Bot.Builder.Azure + // Nuget package to your solution. That package is found at: + // https://www.nuget.org/packages/Microsoft.Bot.Builder.Azure/ + // Uncomment the following lines to use Azure Blob Storage + // //Storage configuration name or ID from the .bot file. + // const string StorageConfigurationId = ""; + // var blobConfig = botConfig.FindServiceByNameOrId(StorageConfigurationId); + // if (!(blobConfig is BlobStorageService blobStorageConfig)) + // { + // throw new InvalidOperationException($"The .bot file does not contain an blob storage with name '{StorageConfigurationId}'."); + // } + // // Default container name. + // const string DefaultBotContainer = ""; + // var storageContainer = string.IsNullOrWhiteSpace(blobStorageConfig.Container) ? DefaultBotContainer : blobStorageConfig.Container; + // IStorage dataStore = new Microsoft.Bot.Builder.Azure.AzureBlobStorage(blobStorageConfig.ConnectionString, storageContainer); + + // Create Conversation State object. + // The Conversation State object is where we persist anything at the conversation-scope. + var conversationState = new ConversationState(dataStore); + + options.State.Add(conversationState); + }); + + // Create and register state accesssors. + // Acessors created here are passed into the IBot-derived class on every turn. + services.AddSingleton(sp => + { + var options = sp.GetRequiredService>().Value; + if (options == null) + { + throw new InvalidOperationException("BotFrameworkOptions must be configured prior to setting up the state accessors"); + } + + var conversationState = options.State.OfType().FirstOrDefault(); + if (conversationState == null) + { + throw new InvalidOperationException("ConversationState must be defined and added before adding conversation-scoped state accessors."); + } + + // Create the custom state accessor. + // State accessors enable other components to read and write individual properties of state. + var accessors = new EchoBotAccessors(conversationState) + { + CounterState = conversationState.CreateProperty(EchoBotAccessors.CounterStateName), + }; + + return accessors; + }); + } + + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) + { + _loggerFactory = loggerFactory; + + app.UseDefaultFiles() + .UseStaticFiles() + .UseBotFramework(); + } + } +} diff --git a/Backend/Bot/appsettings.json b/Backend/Bot/appsettings.json new file mode 100755 index 0000000..5206b71 --- /dev/null +++ b/Backend/Bot/appsettings.json @@ -0,0 +1,4 @@ +{ + "botFilePath": "BotConfiguration.bot", + "botFileSecret": "" +} \ No newline at end of file diff --git a/Backend/Bot/wwwroot/default.htm b/Backend/Bot/wwwroot/default.htm new file mode 100755 index 0000000..c31ffa7 --- /dev/null +++ b/Backend/Bot/wwwroot/default.htm @@ -0,0 +1,419 @@ + + + + + + + Echo bot with counter sample + + + + + +
+
+
+
Echo with Counter Bot
+
+
+
+
+
Your bot is ready!
+
You can test your bot in the Bot Framework Emulator
+ by opening the .bot file in the project folder.
+ +
Visit Azure + Bot Service to register your bot and add it to
+ various channels. The bot's endpoint URL typically looks + like this:
+
https://your_bots_hostname/api/messages
+
+
+
+ +
+ +
+ + + diff --git a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/ContosoMaintenance.Bot.WebApp.Core.csproj b/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/ContosoMaintenance.Bot.WebApp.Core.csproj deleted file mode 100644 index 8ddf8e5..0000000 --- a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/ContosoMaintenance.Bot.WebApp.Core.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - netcoreapp2.0 - - - - - - - - - - - - - - - - - diff --git a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Controllers/MessagesController.cs b/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Controllers/MessagesController.cs deleted file mode 100644 index 4e9308d..0000000 --- a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Controllers/MessagesController.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Bot.Connector; -using Microsoft.Extensions.Configuration; - -namespace ContosoMaintenance.Bot.WebApp.Core.Controllers -{ - [Produces("application/json")] - [Route("api/Messages")] - public class MessagesController : Controller - { - //private IConfiguration configuration; - private MicrosoftAppCredentials appCredentials; - - public MessagesController(IConfiguration configuration) - { - //this.configuration = configuration; - appCredentials = new MicrosoftAppCredentials(configuration); - } - [Authorize(Roles = "Bot")] - [HttpPost] - public async Task Post([FromBody] Activity activity) - { - if (activity.GetActivityType() == ActivityTypes.Message) - { - var connector = new ConnectorClient(new Uri(activity.ServiceUrl), appCredentials); - //connector.Conversations.SendToConversationAsync(activity, () => new BasicLuisDialog()); - //await Conversation.SendAsync(activity, () => new BasicLuisDialog()); - // return our reply to the user - var reply = activity.CreateReply("HelloWorld"); - await connector.Conversations.ReplyToActivityAsync(reply); - } - else - { - HandleSystemMessage(activity); - } - return Ok(); - } - - private Activity HandleSystemMessage(Activity message) - { - if (message.Type == ActivityTypes.DeleteUserData) - { - // Implement user deletion here - // If we handle user deletion, return a real message - } - else if (message.Type == ActivityTypes.ConversationUpdate) - { - // Handle conversation state changes, like members being added and removed - // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info - // Not available in all channels - } - else if (message.Type == ActivityTypes.ContactRelationUpdate) - { - // Handle add/remove from contact lists - // Activity.From + Activity.Action represent what happened - } - else if (message.Type == ActivityTypes.Typing) - { - // Handle knowing tha the user is typing - } - else if (message.Type == ActivityTypes.Ping) - { - } - - return null; - } - } -} \ No newline at end of file diff --git a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Controllers/ValuesController.cs b/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Controllers/ValuesController.cs deleted file mode 100644 index 1ce3810..0000000 --- a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Controllers/ValuesController.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; - -namespace ContosoMaintenance.Bot.WebApp.Core.Controllers -{ - [Route("api/[controller]")] - public class ValuesController : Controller - { - // GET api/values - [HttpGet] - public IEnumerable Get() - { - return new string[] { "value1", "value2" }; - } - - // GET api/values/5 - [HttpGet("{id}")] - public string Get(int id) - { - return "value"; - } - - // POST api/values - [HttpPost] - public void Post([FromBody]string value) - { - } - - // PUT api/values/5 - [HttpPut("{id}")] - public void Put(int id, [FromBody]string value) - { - } - - // DELETE api/values/5 - [HttpDelete("{id}")] - public void Delete(int id) - { - } - } -} diff --git a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Program.cs b/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Program.cs deleted file mode 100644 index 9ee8f91..0000000 --- a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Program.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; - -namespace ContosoMaintenance.Bot.WebApp.Core -{ - public class Program - { - public static void Main(string[] args) - { - BuildWebHost(args).Run(); - } - - public static IWebHost BuildWebHost(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseStartup() - .Build(); - } -} diff --git a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Services/AzureSearchService.cs b/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Services/AzureSearchService.cs deleted file mode 100644 index bb1b13c..0000000 --- a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Services/AzureSearchService.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Threading.Tasks; - -namespace ContosoMaintenance.Bot.WebApp.Core.Services -{ - [Serializable] - public class AzureSearchService - { - private static readonly string QueryString = $"https://{WebConfigurationManager.AppSettings["SearchName"]}.search.windows.net/indexes/{WebConfigurationManager.AppSettings["IndexName"]}/docs?api-key={WebConfigurationManager.AppSettings["SearchKey"]}&api-version=2016-09-01&"; - - public async Task FetchFacets() - { - using (var httpClient = new HttpClient()) - { - string facetQuey = $"{QueryString}facet=Category"; - string response = await httpClient.GetStringAsync(facetQuey); - return JsonConvert.DeserializeObject(response); - } - } - - public async Task Search(string value) - { - if (string.IsNullOrEmpty(value)) - throw new ArgumentNullException("Cannot search with a null value"); - - using (var httpClient = new HttpClient()) - { - string parsedSearch = WebUtility.UrlEncode(value); - string query = $"{QueryString}search='{parsedSearch}'"; - string response = await httpClient.GetStringAsync(query); - return JsonConvert.DeserializeObject(response); - } - } - - public async Task FilterByStatus(string value) - { - if (string.IsNullOrEmpty(value)) - throw new ArgumentNullException("Cannot search with a null value"); - - using (var httpClient = new HttpClient()) - { - string parsedStatus = WebUtility.UrlEncode(value.Replace(" ", "+")); - //$filter=status eq 'Waiting' - string query = $"{QueryString}$filter=status eq '{value}'"; - string response = await httpClient.GetStringAsync(query); - return JsonConvert.DeserializeObject(response); - } - } - } -} diff --git a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Startup.cs b/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Startup.cs deleted file mode 100644 index e55f0bb..0000000 --- a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/Startup.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Bot.Connector; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; - -namespace ContosoMaintenance.Bot.WebApp.Core -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddSingleton(_ => Configuration); - - var credentialProvider = new StaticCredentialProvider( - Configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value, - Configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppPasswordKey)?.Value); - - services.AddAuthentication( - // This can be removed after https://github.com/aspnet/IISIntegration/issues/371 - options => - { - options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - } - ) - .AddBotAuthentication(credentialProvider); - - services.AddSingleton(typeof(ICredentialProvider), credentialProvider); - services.AddMvc(options => - { - options.Filters.Add(typeof(TrustServiceUrlAttribute)); - }); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IHostingEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - app.UseStaticFiles(); - - app.UseAuthentication(); - - app.UseMvc(); - } - } -} diff --git a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/appsettings.Development.json b/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/appsettings.Development.json deleted file mode 100644 index fa8ce71..0000000 --- a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/appsettings.Development.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Logging": { - "IncludeScopes": false, - "LogLevel": { - "Default": "Debug", - "System": "Information", - "Microsoft": "Information" - } - } -} diff --git a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/appsettings.json b/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/appsettings.json deleted file mode 100644 index c543e94..0000000 --- a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/appsettings.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "Logging": { - "IncludeScopes": false, - "Debug": { - "LogLevel": { - "Default": "Warning" - } - }, - "Console": { - "LogLevel": { - "Default": "Warning" - } - } - }, - "MicrosoftAppId": "616266b2-fe17-41b7-b720-9399b4b7ed4b", - "MicrosoftAppPassword": "WQF:1M5Lm-9w1V3D", - "SearchName": "", - "IndexName": "", - "SearchKey": "", - "LuisAppId": "", - "LuisAPIKey": "", - "LuisAPIHostName": "", - "AzureWebJobsStorage": "", - "BotCardsBlobStorageURL": "" -} diff --git a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/wwwroot/default.htm b/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/wwwroot/default.htm deleted file mode 100644 index 0857643..0000000 --- a/Backend/BotBackend-Core/ContosoMaintenance.Bot.WebApp.Core/wwwroot/default.htm +++ /dev/null @@ -1,21 +0,0 @@ - - - - Contoso Chat Bot - - - -

Contoso Luis Bot

-

A bot that shows how to handle natural language using the Cognitive Services LUIS API with Azure Search to look for Jobs.

-

Here are some handy links to get started:

-

-

-

- - diff --git a/Backend/BotBackend/.deployment b/Backend/BotBackend/.deployment deleted file mode 100644 index db5488a..0000000 --- a/Backend/BotBackend/.deployment +++ /dev/null @@ -1,2 +0,0 @@ -[config] -command = deploy.cmd \ No newline at end of file diff --git a/Backend/BotBackend/.gitignore b/Backend/BotBackend/.gitignore deleted file mode 100644 index db9350f..0000000 --- a/Backend/BotBackend/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -obj/ -bin/ -packages/ -*.pubxml.user -*.csproj.user -.vs/ diff --git a/Backend/BotBackend/App_Start/WebApiConfig.cs b/Backend/BotBackend/App_Start/WebApiConfig.cs deleted file mode 100644 index 97deaa6..0000000 --- a/Backend/BotBackend/App_Start/WebApiConfig.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web.Http; - -namespace SimpleEchoBot -{ - public static class WebApiConfig - { - public static void Register(HttpConfiguration config) - { - // Json settings - config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; - config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); - config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented; - JsonConvert.DefaultSettings = () => new JsonSerializerSettings() - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - Formatting = Newtonsoft.Json.Formatting.Indented, - NullValueHandling = NullValueHandling.Ignore, - }; - - // Web API configuration and services - - // Web API routes - config.MapHttpAttributeRoutes(); - - config.Routes.MapHttpRoute( - name: "DefaultApi", - routeTemplate: "api/{controller}/{id}", - defaults: new { id = RouteParameter.Optional } - ); - } - } -} diff --git a/Backend/BotBackend/ContosoMaintenance.Bot.WebApp.csproj b/Backend/BotBackend/ContosoMaintenance.Bot.WebApp.csproj deleted file mode 100644 index ba0af25..0000000 --- a/Backend/BotBackend/ContosoMaintenance.Bot.WebApp.csproj +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - - Debug - AnyCPU - - - 2.0 - {9C7E3A46-B60F-4052-9A21-DC8D1A942216} - {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} - Library - Properties - LuisBot - LuisBot - v4.6 - true - - - - - - - - - - - - true - full - false - bin\ - DEBUG;TRACE - prompt - 4 - CS1998 - - - pdbonly - true - bin\ - TRACE - prompt - 4 - CS1998 - - - - $(SolutionDir)\packages\Microsoft.AdaptiveCards.0.5.1\lib\net452\AdaptiveCards.dll - - - $(SolutionDir)\packages\Autofac.3.5.2\lib\net40\Autofac.dll - True - - - $(SolutionDir)\packages\Chronic.Signed.0.3.2\lib\net40\Chronic.dll - True - - - $(SolutionDir)\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll - - - $(SolutionDir)\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll - - - $(SolutionDir)\packages\Microsoft.Azure.DocumentDB.1.11.0\lib\net45\Microsoft.Azure.Documents.Client.dll - True - - - $(SolutionDir)\packages\Microsoft.Azure.KeyVault.Core.1.0.0\lib\net40\Microsoft.Azure.KeyVault.Core.dll - True - - - ..\..\packages\Microsoft.Bot.Builder.3.13.1\lib\net46\Microsoft.Bot.Builder.dll - - - ..\..\packages\Microsoft.Bot.Builder.3.13.1\lib\net46\Microsoft.Bot.Builder.Autofac.dll - - - $(SolutionDir)\packages\Microsoft.Bot.Builder.Azure.3.2.5\lib\net46\Microsoft.Bot.Builder.Azure.dll - - - ..\..\packages\Microsoft.Bot.Builder.History.3.13.1\lib\net46\Microsoft.Bot.Builder.History.dll - - - ..\..\packages\Microsoft.Bot.Connector.3.13.1\lib\net46\Microsoft.Bot.Connector.dll - - - $(SolutionDir)\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll - True - - - - $(SolutionDir)\packages\Microsoft.Data.Edm.5.6.4\lib\net40\Microsoft.Data.Edm.dll - True - - - $(SolutionDir)\packages\Microsoft.Data.OData.5.6.4\lib\net40\Microsoft.Data.OData.dll - True - - - $(SolutionDir)\packages\Microsoft.Data.Services.Client.5.6.4\lib\net40\Microsoft.Data.Services.Client.dll - True - - - $(SolutionDir)\packages\Microsoft.IdentityModel.Logging.1.1.4\lib\net451\Microsoft.IdentityModel.Logging.dll - - - $(SolutionDir)\packages\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\lib\net45\Microsoft.IdentityModel.Protocol.Extensions.dll - True - - - $(SolutionDir)\packages\Microsoft.IdentityModel.Protocols.2.1.4\lib\net451\Microsoft.IdentityModel.Protocols.dll - - - $(SolutionDir)\packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.2.1.4\lib\net451\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll - - - $(SolutionDir)\packages\Microsoft.IdentityModel.Tokens.5.1.4\lib\net451\Microsoft.IdentityModel.Tokens.dll - - - $(SolutionDir)\packages\Microsoft.Rest.ClientRuntime.2.3.2\lib\net45\Microsoft.Rest.ClientRuntime.dll - True - - - $(SolutionDir)\packages\Microsoft.WindowsAzure.ConfigurationManager.3.2.1\lib\net40\Microsoft.WindowsAzure.Configuration.dll - True - - - $(SolutionDir)\packages\WindowsAzure.Storage.7.2.1\lib\net40\Microsoft.WindowsAzure.Storage.dll - True - - - $(SolutionDir)\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll - - - - $(SolutionDir)\packages\System.IdentityModel.Tokens.Jwt.5.1.4\lib\net451\System.IdentityModel.Tokens.Jwt.dll - - - - - $(SolutionDir)\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll - True - - - - - $(SolutionDir)\packages\System.Spatial.5.6.4\lib\net40\System.Spatial.dll - True - - - - - - - - - - - - $(SolutionDir)\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll - True - - - $(SolutionDir)\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll - True - - - - - - - - - - - - Designer - - - - - - - - - - Global.asax - - - - - - - - - - - - - - Web.config - - - Web.config - - - - - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - true - - - - - - - - - True - True - 3978 - / - http://localhost:3984/ - False - False - - - False - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - - \ No newline at end of file diff --git a/Backend/BotBackend/ContosoMaintenance.Bot.sln b/Backend/BotBackend/ContosoMaintenance.Bot.sln deleted file mode 100644 index 4bc0718..0000000 --- a/Backend/BotBackend/ContosoMaintenance.Bot.sln +++ /dev/null @@ -1,24 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2024 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoMaintenance.Bot.WebApp", "ContosoMaintenance.Bot.WebApp.csproj", "{9C7E3A46-B60F-4052-9A21-DC8D1A942216}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {CF32C9E4-7251-4B2D-9AE2-EA65FDE232BB} - EndGlobalSection -EndGlobal diff --git a/Backend/BotBackend/Controllers/MessagesController.cs b/Backend/BotBackend/Controllers/MessagesController.cs deleted file mode 100644 index b4da028..0000000 --- a/Backend/BotBackend/Controllers/MessagesController.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; -using System.Threading.Tasks; -using System.Web.Http; - -using Microsoft.Bot.Connector; -using Microsoft.Bot.Builder.Dialogs; -using System.Web.Http.Description; -using System.Net.Http; -using System.Diagnostics; - -namespace Microsoft.Bot.Sample.LuisBot -{ - [BotAuthentication] - public class MessagesController : ApiController - { - /// - /// POST: api/Messages - /// receive a message from a user and send replies - /// - /// - [ResponseType(typeof(void))] - public virtual async Task Post([FromBody] Activity activity) - { - // check if activity is of type message, this is what currently look for :) - if (activity.GetActivityType() == ActivityTypes.Message) - { - await Conversation.SendAsync(activity, () => new BasicLuisDialog()); - } - else - { - HandleSystemMessage(activity); - } - return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted); - } - - Activity HandleSystemMessage(Activity message) - { - //The Bot Framework support a lot of message types. Here is sample of potential message types that you may want to support. - switch (message.Type) - { - case ActivityTypes.DeleteUserData: - // Implement user deletion here - // If we handle user deletion, return a real message - break; - case ActivityTypes.ConversationUpdate: - // Handle conversation state changes, like members being added and removed - // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info - // Not available in all channels - break; - case ActivityTypes.ContactRelationUpdate: - // Handle add/remove from contact lists - // Activity.From + Activity.Action represent what happened - break; - case ActivityTypes.Typing: - // Handle knowing that the user is typing - break; - case ActivityTypes.Ping: - // Handle a ping message - break; - default: - //Handle other message types - break; - } - - - return null; - } - } -} \ No newline at end of file diff --git a/Backend/BotBackend/Definitions/ServiceEntities.cs b/Backend/BotBackend/Definitions/ServiceEntities.cs deleted file mode 100644 index 331d4fa..0000000 --- a/Backend/BotBackend/Definitions/ServiceEntities.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace LuisBot.Definitions -{ - public static class ServiceEntities - { - public const string TimeFrame = "maintenance.timeframe"; - public const string ServiceType = "maintenance.type"; - public const string ServiceDate = "maintenance.date"; - public const string ServiceStatus = "maintenance.status"; - } -} diff --git a/Backend/BotBackend/Dialogs/BasicLuisDialog.cs b/Backend/BotBackend/Dialogs/BasicLuisDialog.cs deleted file mode 100644 index 5a1fdaf..0000000 --- a/Backend/BotBackend/Dialogs/BasicLuisDialog.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Globalization; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using CognitiveServicesBot.Services; -using LuisBot.Definitions; -using LuisBot.Dialogs; -using LuisBot.Models; -using LuisBot.Utils; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Luis; -using Microsoft.Bot.Builder.Luis.Models; -using Microsoft.Bot.Connector; - -namespace Microsoft.Bot.Sample.LuisBot -{ - // For more information about this template visit http://aka.ms/azurebots-csharp-luis - [Serializable] - public class BasicLuisDialog : LuisDialog - { - readonly AzureSearchService searchService = new AzureSearchService(); - public BasicLuisDialog() : base(new LuisService(new LuisModelAttribute( - ConfigurationManager.AppSettings["LuisAppId"], - ConfigurationManager.AppSettings["LuisAPIKey"], - domain: ConfigurationManager.AppSettings["LuisAPIHostName"]))) - { - } - - [LuisIntent("None")] - public async Task NoneIntent(IDialogContext context, LuisResult result) - { - - string response = "Sorry, what was that? I can only help w specific travels questions. Try asking me stuff like: what are my waiting jobs?"; - await this.ShowLuisResult(context, result, response); - } - - // Go to https://luis.ai and create a new intent, then train/publish your luis app. - [LuisIntent("greeting")] - public async Task GreetingIntent(IDialogContext context, LuisResult result) - { - await this.ShowLuisResult(context, result, "Hello there! Need maintenance jobs help? I've got you covered :)"); - } - - [LuisIntent("services.listjobs")] - public async Task ListJobsIntent(IDialogContext context, IAwaitable message, LuisResult result) - { - { - var messageToForward = await message; - - EntityRecommendation jobSearch; - if (result.TryFindEntity(ServiceEntities.ServiceStatus, out jobSearch)) - { - var model = JobModelExtension.GetContextData(context); - // Title case the search entity for consistency - model.SearchTerm = new CultureInfo("en").TextInfo.ToTitleCase(jobSearch.Entity.ToLower()); - var res = jobSearch.Resolution.Values; - var resV = res.ToList()[0] as List; - model.ResolutionTerm = resV[0].ToString(); - - JobModelExtension.SetContextData(context, model); - await context.PostAsync($"OK, let me look for information on ({model.SearchTerm}) jobs."); - await context.Forward(new SearchServiceDialog(), AfterDialog, messageToForward, CancellationToken.None); - } - - // If we cant identify a product entity, start an explore dialog - else - { - await context.PostAsync($"I couldn't find any jobs with the required status! Waiting, In Progress and Completed are the accepted status"); - } - } - } - - [LuisIntent("Cancel")] - public async Task CancelIntent(IDialogContext context, LuisResult result) - { - var response = "Thank you!"; - await this.ShowLuisResult(context, result, response); - } - - [LuisIntent("Help")] - public async Task HelpIntent(IDialogContext context, LuisResult result) - { - await this.ShowLuisResult(context, result); - } - - async Task ShowLuisResult(IDialogContext context, LuisResult result) - { - //Sorry, what was that? I can only help w specific travels questions. Try asking me stuff like: ... - await context.PostAsync($"I couldn't understand {result.Intents[0].Intent}. You said: {result.Query}. I can answer questions like (what are my jobs?)."); - context.Wait(MessageReceived); - } - - async Task ShowLuisResult(IDialogContext context, LuisResult result, string customMessaage) - { - await context.PostAsync($"{customMessaage}"); - context.Wait(MessageReceived); - } - - async Task AfterDialog(IDialogContext context, IAwaitable result) - { - var messageHandled = (string)await result; - - if (!string.IsNullOrEmpty(messageHandled)) - { - context.Done(messageHandled); - } - else - { - context.Done(null); - } - } - } -} \ No newline at end of file diff --git a/Backend/BotBackend/Dialogs/SearchServiceDialog.cs b/Backend/BotBackend/Dialogs/SearchServiceDialog.cs deleted file mode 100644 index 79275d0..0000000 --- a/Backend/BotBackend/Dialogs/SearchServiceDialog.cs +++ /dev/null @@ -1,92 +0,0 @@ -using CognitiveServicesBot.Services; -using LuisBot.Models; -using LuisBot.Utils; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Connector; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using LuisBot.Utils; - -namespace LuisBot.Dialogs -{ - [Serializable] - public class SearchServiceDialog : IDialog - { - readonly AzureSearchService searchService = new AzureSearchService(); - - public async Task StartAsync(IDialogContext context) - { - context.Wait(this.MessageReceivedAsync); - } - - public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable result) - { - var message = await result; - - //You can indicate to the user you are running the query :) - //await context.PostAsync("Hold on one second!"); - var model = JobModelExtension.GetContextData(context); - - - if(false) - { - //Here you can check if the intention is not found so you can list all the available options - } - else - { - var results = await searchService.FilterByStatus(model.ResolutionTerm); - var channelID = message.ChannelId; - - //Check weather we have values in the search result - if (results.Values.Length > 0) - { - List foundItems = new List(); - - //To display the result in a nice card like boxes, we use custom CardUtil which provide a nice channel specific render of a card using Microsoft.Bot.Connector.Attachment - for (int i = 0; i < results.Values.Length; i++) - { - var searchItem = results.Values[i]; - - //We are not interested in deleted items - if (searchItem.IsDeleted == true) - continue; - - var attachment = CardUtil.CreateCardAttachment(channelID, results.Values[i]); - foundItems.Add(attachment); - } - - var reply = context.MakeMessage(); - reply.AttachmentLayout = AttachmentLayoutTypes.List; - reply.Attachments = foundItems; - - await context.PostAsync(reply); - - context.Done(null); - } - else - { - await context.PostAsync($"Sorry! I couldn't find anything that matched the search '{model.SearchTerm}'"); - context.Done(null); - } - } - } - - async Task AfterDialog(IDialogContext context, IAwaitable result) - { - var messageHandled = (string)await result; - - if (!string.IsNullOrEmpty(messageHandled)) - { - context.Done(messageHandled); - } - else - { - context.Done(null); - } - } - } -} diff --git a/Backend/BotBackend/Dockerfile b/Backend/BotBackend/Dockerfile deleted file mode 100644 index a0762d1..0000000 --- a/Backend/BotBackend/Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -####################################################### -# Step 1: Build the application in a container # -####################################################### - -# Download the official ASP.NET Core SDK image -# to build the project while creating the docker image -FROM microsoft/dotnet:2.1-sdk-alpine as build -WORKDIR /app - -# Restore NuGet packages -COPY *.csproj . -RUN dotnet restore - -# Copy the rest of the files over -COPY . . - -# Build the application -RUN dotnet publish --output /out/ --configuration Release - -####################################################### -# Step 2: Run the build outcome in a container # -####################################################### - -# Download the official ASP.NET Core Runtime image -# to run the compiled application -FROM microsoft/dotnet:2.1.3-aspnetcore-runtime-alpine -WORKDIR /app - -# Open HTTP and HTTPS ports -EXPOSE 80 -EXPOSE 443 - -# Copy the build output from the SDK image -COPY --from=build /out . - -# Start the application -ENTRYPOINT ["dotnet", "ContosoMaintenance.Bot.dll"] \ No newline at end of file diff --git a/Backend/BotBackend/Global.asax b/Backend/BotBackend/Global.asax deleted file mode 100644 index 6b5eef2..0000000 --- a/Backend/BotBackend/Global.asax +++ /dev/null @@ -1 +0,0 @@ -<%@ Application CodeBehind="Global.asax.cs" Inherits="SimpleEchoBot.WebApiApplication" Language="C#" %> diff --git a/Backend/BotBackend/Global.asax.cs b/Backend/BotBackend/Global.asax.cs deleted file mode 100644 index 65be1d4..0000000 --- a/Backend/BotBackend/Global.asax.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using Autofac; -using System.Web.Http; -using System.Configuration; -using System.Reflection; -using Microsoft.Bot.Builder.Azure; -using Microsoft.Bot.Builder.Dialogs; -using Microsoft.Bot.Builder.Dialogs.Internals; -using Microsoft.Bot.Connector; - -namespace SimpleEchoBot -{ - public class WebApiApplication : System.Web.HttpApplication - { - protected void Application_Start() - { - // Bot Storage: This is a great spot to register the private state storage for your bot. - // We provide adapters for Azure Table, CosmosDb, SQL Azure, or you can implement your own! - // For samples and documentation, see: https://github.com/Microsoft/BotBuilder-Azure - - Conversation.UpdateContainer( - builder => - { - builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly())); - - // Using Azure Table Storage - var store = new TableBotDataStore(ConfigurationManager.AppSettings["AzureWebJobsStorage"]); // requires Microsoft.BotBuilder.Azure Nuget package - - // To use CosmosDb or InMemory storage instead of the default table storage, uncomment the corresponding line below - // var store = new DocumentDbBotDataStore("cosmos db uri", "cosmos db key"); // requires Microsoft.BotBuilder.Azure Nuget package - // var store = new InMemoryDataStore(); // volatile in-memory store - - builder.Register(c => store) - .Keyed>(AzureModule.Key_DataStore) - .AsSelf() - .SingleInstance(); - - }); - GlobalConfiguration.Configure(WebApiConfig.Register); - } - } -} diff --git a/Backend/BotBackend/Models/JobModel.cs b/Backend/BotBackend/Models/JobModel.cs deleted file mode 100644 index 950a4bc..0000000 --- a/Backend/BotBackend/Models/JobModel.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Microsoft.Bot.Builder.Dialogs; -using Newtonsoft.Json; -using System; - -namespace LuisBot.Models -{ - public class JobModel - { - public const string ID = "JobModel"; - public string SearchTerm { get; set; } - public string ResolutionTerm { get; set; } - - //public static JobModel GetContextData(IDialogContext context) - //{ - // JobModel model; - // context.ConversationData.TryGetValue(JobModel.ID, out model); - // if (model == null) - // { - // model = new JobModel(); - // SetContextData(context, model); - // } - - // return model; - //} - - //public static void SetContextData(IDialogContext context, JobModel model) - //{ - // context.ConversationData.SetValue(JobModel.ID, model); - //} - - //public static void ClearContextData(IDialogContext context) - //{ - // context.ConversationData.RemoveValue(JobModel.ID); - //} - } - - public enum JobType - { - Installation, - Repair, - Service - } - - public enum JobStatus - - { - Waiting, - InProgress, - Complete - } -} \ No newline at end of file diff --git a/Backend/BotBackend/Models/SearchResultModel.cs b/Backend/BotBackend/Models/SearchResultModel.cs deleted file mode 100644 index d3d44d4..0000000 --- a/Backend/BotBackend/Models/SearchResultModel.cs +++ /dev/null @@ -1,92 +0,0 @@ -using Newtonsoft.Json; -using System; - -namespace CognitiveServicesBot.Model -{ - //As we are using direct Http calls to the Search APIs, we needed to use the below models - //In the future, this should be replaced with Azure Search Nuget for cleaner implementation. - //Data model for search - public class SearchResult - { - [JsonProperty("@odata.context")] - public string odatacontext { get; set; } - - [JsonProperty("value")] - public Value[] Values { get; set; } - } - - //Data model for fetching facets - public class FacetResult - { - [JsonProperty("@odata.context")] - public string ODataContext { get; set; } - - [JsonProperty("@search.facets")] - public SearchFacets SearchFacets { get; set; } - - [JsonProperty("value")] - public Value[] Values { get; set; } - } - - public class Value - { - //The below JSON is returned from the search service: - // "@search.score":1.0, - // "name":"Testing again", - // "details":"oh I love to test. It\u2019s so much fun! ", - // "type":"Installation", - // "status":"Waiting", - // "id":"c0f66ccd-f5c6-418b-87a7-8497cefbaa0d", - // "createdAt":"2018-01-25T00:34:49.753Z" - //"@search.score": 1, - // "Name": "Service ATR 42 Engine", - // "Details": "General Service", - // "Type": "Service", - // "Status": "Complete", - // "DueDate": "0001-01-01T00:00:00Z", - // "id": "3de8f6d0-e1b6-416a-914d-cd13554929a5", - // "isDeleted": false - [JsonProperty("@search.score")] - public float SearchScore { get; set; } - - [JsonProperty("Details")] - public string Details { get; set; } - - [JsonProperty("Name")] - public string Name { get; set; } - - [JsonProperty("Type")] - public string Type { get; set; } - - [JsonProperty("Status")] - public string Status { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("DueDate")] - public DateTime DueDate { get; set; } - - [JsonProperty("isDeleted")] - public bool IsDeleted { get; set; } - - } - - public class SearchFacets - { - [JsonProperty("Category@odata.type")] - public string Categoryodatatype { get; set; } - - [JsonProperty("Category")] - public Category[] Category { get; set; } - } - - public class Category - { - [JsonProperty("count")] - public int Count { get; set; } - - [JsonProperty("value")] - public string Value { get; set; } - } -} \ No newline at end of file diff --git a/Backend/BotBackend/PostDeployScripts/IncludeSources.targets b/Backend/BotBackend/PostDeployScripts/IncludeSources.targets deleted file mode 100644 index 86a265b..0000000 --- a/Backend/BotBackend/PostDeployScripts/IncludeSources.targets +++ /dev/null @@ -1,12 +0,0 @@ - - - $(CoreCompileDependsOn);IncludeSource - - - - - - - - - diff --git a/Backend/BotBackend/PostDeployScripts/githubProject.json.template b/Backend/BotBackend/PostDeployScripts/githubProject.json.template deleted file mode 100644 index 953220a..0000000 --- a/Backend/BotBackend/PostDeployScripts/githubProject.json.template +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "{WEB_SITE_NAME}", - "description": "{WEB_SITE_NAME} Azure Bot Service Code", - "homepage": "https://github.com", - "private": false, - "has_issues": true, - "has_projects": true, - "has_wiki": true -} \ No newline at end of file diff --git a/Backend/BotBackend/PostDeployScripts/prepareSrc.cmd b/Backend/BotBackend/PostDeployScripts/prepareSrc.cmd deleted file mode 100644 index 80701cf..0000000 --- a/Backend/BotBackend/PostDeployScripts/prepareSrc.cmd +++ /dev/null @@ -1,70 +0,0 @@ -@echo off -setlocal -SET password=%1 -SET repoName=srcRepo -SET repoUrl=file:///%HOMEDRIVE:~0,1%/%HOMEPATH:~1%/site/%repoName% -SET download=bot-src - -echo %repoUrl% - -rem cd to project root -pushd ..\wwwroot - -rem init git -call git init -call git config user.name "botframework" -call git config user.email "util@botframework.com" -call git add . -call git commit -m "prepare to download source" -call git remote add srcRepo %repoUrl% -popd - -rem init upstream -pushd %HOME%\site -mkdir srcRepo -cd srcRepo -call git init --bare -popd - -rem push to upstream -pushd ..\wwwroot -call git push --set-upstream srcRepo master -popd - -rem clone srcRepo -pushd %HOME%\site -call git clone %repoUrl% %download% -rem delete .git -cd %download% -call rm -r -f .git -popd - -rem prepare for publish -pushd %HOME%\site\%download% -mkdir Properties\PublishProfiles -pushd Properties\PublishProfiles -type ..\..\PostDeployScripts\publishProfile.xml.template | sed -e s/\{WEB_SITE_NAME\}/%WEBSITE_SITE_NAME%/g > %WEBSITE_SITE_NAME%-Web-Deploy.pubxml -popd - -set SOLUTION_NAME= -for /f "delims=" %%a in ('dir /b *.sln') do @set SOLUTION_NAME=%%a - -type PostDeployScripts\publish.cmd.template | sed -e s/\{SOLUTION_NAME\}/%SOLUTION_NAME%/g | sed -e s/\{PUBLISH_PROFILE\}/%WEBSITE_SITE_NAME%-Web-Deploy.pubxml/g | sed -e s/\{PASSWORD\}/%password%/g > publish.cmd -type PostDeployScripts\publishSettings.xml.template | sed -e s/\{WEB_SITE_NAME\}/%WEBSITE_SITE_NAME%/g | sed -e s/\{PASSWORD\}/%password%/g > PostDeployScripts\%WEBSITE_SITE_NAME%.PublishSettings - -popd - -rem preare the zip file -%HOMEDRIVE%\7zip\7za a %HOME%\site\%download%.zip %HOME%\site\%download%\* - -rem cleanup git stuff -pushd ..\wwwroot -call rm -r -f .git -popd - -pushd %HOME%\site -call rm -r -f %download% -call rm -r -f %repoName% -popd - -endlocal diff --git a/Backend/BotBackend/PostDeployScripts/publish.cmd.template b/Backend/BotBackend/PostDeployScripts/publish.cmd.template deleted file mode 100644 index 7a15558..0000000 --- a/Backend/BotBackend/PostDeployScripts/publish.cmd.template +++ /dev/null @@ -1,3 +0,0 @@ -nuget restore -msbuild {SOLUTION_NAME} -p:DeployOnBuild=true -p:PublishProfile={PUBLISH_PROFILE} -p:Password={PASSWORD} - diff --git a/Backend/BotBackend/PostDeployScripts/publishProfile.xml.template b/Backend/BotBackend/PostDeployScripts/publishProfile.xml.template deleted file mode 100644 index fdafaec..0000000 --- a/Backend/BotBackend/PostDeployScripts/publishProfile.xml.template +++ /dev/null @@ -1,25 +0,0 @@ - - - - - MSDeploy - AzureWebSite - Release - Any CPU - http://{WEB_SITE_NAME}.azurewebsites.net - True - False - {WEB_SITE_NAME}.scm.azurewebsites.net:443 - {WEB_SITE_NAME} - - True - WMSVC - True - ${WEB_SITE_NAME} - <_SavePWD>True - <_DestinationType>AzureWebSite - - \ No newline at end of file diff --git a/Backend/BotBackend/PostDeployScripts/publishSettings.xml.template b/Backend/BotBackend/PostDeployScripts/publishSettings.xml.template deleted file mode 100644 index 2e02606..0000000 --- a/Backend/BotBackend/PostDeployScripts/publishSettings.xml.template +++ /dev/null @@ -1,15 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Backend/BotBackend/PostDeployScripts/runGulp.cmd b/Backend/BotBackend/PostDeployScripts/runGulp.cmd deleted file mode 100644 index 61e30c0..0000000 --- a/Backend/BotBackend/PostDeployScripts/runGulp.cmd +++ /dev/null @@ -1,23 +0,0 @@ -@echo off -setlocal - -set DEPLOYMENT_SOURCE= -set IN_PLACE_DEPLOYMENT=1 - -if exist ..\wwwroot\deploy.cmd ( - pushd ..\wwwroot - rem call deploy.cmd - popd -) - -rem kick of build of csproj - -echo record deployment timestamp -date /t >> ..\deployment.log -time /t >> ..\deployment.log -echo ---------------------- >> ..\deployment.log -echo Deployment done - -endlocal - - diff --git a/Backend/BotBackend/PostDeployScripts/setupGithubRemoteRepo.cmd b/Backend/BotBackend/PostDeployScripts/setupGithubRemoteRepo.cmd deleted file mode 100644 index f6a1f50..0000000 --- a/Backend/BotBackend/PostDeployScripts/setupGithubRemoteRepo.cmd +++ /dev/null @@ -1,44 +0,0 @@ -@echo off -setlocal -rem ------------------------------------------------------------------------------------------ -rem setupVsoRemoteRepo [remoteUser] [personalAccessToken] [projName{optional}] -rem create and populate VSO git repo for the ABS code instance -rem -rem remoteUser: user account name of the personal access token -rem personalAccessToken: the personal access token used to access github REST API (requires repos scope) -rem projName the name of the project to create (default to WEBSITE_SITE_NAME) -rem ------------------------------------------------------------------------------------------ -set remoteUrl=https://api.github.com -set remoteUser=%1 -set remotePwd=%2 -set projName=%3 -if '%projName%'=='' set projName=%WEBSITE_SITE_NAME% -set repoUrl=https://%remoteUser%:%remotePwd%@github.com/%remoteUser%/%projName%.git -rem use curl to create project -pushd ..\wwwroot -type PostDeployScripts\githubProject.json.template | sed -e s/\{WEB_SITE_NAME\}/%projName%/g > %TEMP%\githubProject.json -call curl -H "Content-Type: application/json" -u %remoteUser%:%remotePwd% -d "@%TEMP%\githubProject.json" -X POST %remoteUrl%/user/repos -rem rm %TEMP%\githubProject.json -popd - -popd -rem cd to project root -pushd ..\wwwroot - -rem init git -call git init -call git config user.name "%remoteUser%" -call git config user.password "%remotePwd%" -call git config user.email "util@botframework.com" -call git add . -call git commit -m "prepare to setup source control" -call git push %repoUrl% master -popd - - -rem cleanup git stuff -pushd ..\wwwroot -call rm -r -f .git -popd - -endlocal \ No newline at end of file diff --git a/Backend/BotBackend/PostDeployScripts/setupVsoRemoteRepo.cmd b/Backend/BotBackend/PostDeployScripts/setupVsoRemoteRepo.cmd deleted file mode 100644 index 4fa1ac1..0000000 --- a/Backend/BotBackend/PostDeployScripts/setupVsoRemoteRepo.cmd +++ /dev/null @@ -1,50 +0,0 @@ -@echo off -setlocal -rem ------------------------------------------------------------------------------------------ -rem setupVsoRemoteRepo [vsoRemote] [vsoUserName] [vsoPersonalAccessToken] [projName{optional}] -rem create and populate VSO git repo for the ABS code instance -rem -rem vsoRmote: url of the VSO site (e.g. https://awesomebot.visualstudio.com ) -rem vosUserName: user account name of the personal access token -rem vsoPersonalAccessToken: the personal access token used to access VSO REST api -rem projName the name of the project to create (default to WEBSITE_SITE_NAME) -rem ------------------------------------------------------------------------------------------ -set remoteUrl=%1 -set remoteUser=%2 -set remotePwd=%3 -set projName=%4 -if '%projName%'=='' set projName=%WEBSITE_SITE_NAME% -set vstsRoot=%remoteUrl% -set repoUrl=https://%remoteUser%:%remotePwd%@%remoteUrl:~8%/_git/%projName% -set vstsCreateProject=https://%remoteUser%:%remotePwd%@%remoteUrl:~8%/defaultcollection/_apis/projects?api-version=3.0 - -rem use curl to create project -pushd ..\wwwroot -type PostDeployScripts\vsoProject.json.template | sed -e s/\{WEB_SITE_NAME\}/%projName%/g > %TEMP%\vsoProject.json -call curl -H "Content-Type: application/json" -d "@%TEMP%\vsoProject.json" -X POST %vstsCreateProject% -rm %TEMP%\vsoProject.json -rem sleep for 15 seconds for the creation to complete, this is a wild guess -call sleep 15 -popd - -popd -rem cd to project root -pushd ..\wwwroot - -rem init git -call git init -call git config user.name "%remoteUser%" -call git config user.password "%remotePwd%" -call git config user.email "util@botframework.com" -call git add . -call git commit -m "prepare to setup source control" -call git push %repoUrl% master -popd - - -rem cleanup git stuff -pushd ..\wwwroot -call rm -r -f .git -popd - -endlocal \ No newline at end of file diff --git a/Backend/BotBackend/PostDeployScripts/vsoProject.json.template b/Backend/BotBackend/PostDeployScripts/vsoProject.json.template deleted file mode 100644 index e7bcdc9..0000000 --- a/Backend/BotBackend/PostDeployScripts/vsoProject.json.template +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "{WEB_SITE_NAME}", - "description": "{WEB_SITE_NAME} Azure Bot Service Code", - "capabilities": { - "versioncontrol": { - "sourceControlType": "Git" - }, - "processTemplate": { - "templateTypeId": "6b724908-ef14-45cf-84f8-768b5384da45" - } - } -} \ No newline at end of file diff --git a/Backend/BotBackend/Properties/AssemblyInfo.cs b/Backend/BotBackend/Properties/AssemblyInfo.cs deleted file mode 100644 index 0a2dfce..0000000 --- a/Backend/BotBackend/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("SimpleEchoBot")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("SimpleEchoBot")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a8ba1066-5695-4d71-abb4-65e5a5e0c3d4")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Backend/BotBackend/Services/AzureSearchService.cs b/Backend/BotBackend/Services/AzureSearchService.cs deleted file mode 100644 index 06cd1ce..0000000 --- a/Backend/BotBackend/Services/AzureSearchService.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Net.Http; -using System.Web.Configuration; -using System.Threading.Tasks; -using CognitiveServicesBot.Model; -using Newtonsoft.Json; -using System; -using System.Net; - -namespace CognitiveServicesBot.Services -{ - [Serializable] - public class AzureSearchService - { - static readonly string QueryString = $"https://{WebConfigurationManager.AppSettings["SearchName"]}.search.windows.net/indexes/{WebConfigurationManager.AppSettings["IndexName"]}/docs?api-key={WebConfigurationManager.AppSettings["SearchKey"]}&api-version=2016-09-01&"; - - public async Task FetchFacets() - { - using (var httpClient = new HttpClient()) - { - string facetQuey = $"{QueryString}facet=Category"; - string response = await httpClient.GetStringAsync(facetQuey); - return JsonConvert.DeserializeObject(response); - } - } - - //Although this method is not used, but it show a nice demo of wide search of the index - //public async Task Search(string value) - //{ - // if (string.IsNullOrEmpty(value)) - // throw new ArgumentNullException("Cannot search with a null value"); - - // using (var httpClient = new HttpClient()) - // { - // string parsedSearch = WebUtility.UrlEncode(value); - // string query = $"{QueryString}search='{parsedSearch}'"; - // string response = await httpClient.GetStringAsync(query); - // return JsonConvert.DeserializeObject(response); - // } - //} - - public async Task FilterByStatus(string value) - { - if (string.IsNullOrEmpty(value)) - throw new ArgumentNullException("Cannot search with a null value"); - - using (var httpClient = new HttpClient()) - { - string parsedStatus = WebUtility.UrlEncode(value.Replace(" ", "+")); - //$filter=status eq 'Waiting' - string query = $"{QueryString}$filter=Status eq '{value}'"; - string response = await httpClient.GetStringAsync(query); - return JsonConvert.DeserializeObject(response); - } - } - } -} \ No newline at end of file diff --git a/Backend/BotBackend/Utils/CardUtil.cs b/Backend/BotBackend/Utils/CardUtil.cs deleted file mode 100644 index a8686c9..0000000 --- a/Backend/BotBackend/Utils/CardUtil.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Web.Configuration; -using AdaptiveCards; -using CognitiveServicesBot.Model; -using Microsoft.Bot.Connector; - -namespace LuisBot.Utils -{ - public static class CardUtil - { - public const string ContosoLogoUrl = "contosologo.png"; - public static Attachment CreateCardAttachment(string channelID, Value value) - { - Attachment attachment = null; - switch (channelID) - { - case "skype": - attachment = CreateThumbnailCard(value).ToAttachment(); - break; - default: - attachment = new Attachment() - { - ContentType = AdaptiveCard.ContentType, - Content = CreateFeatureCard(value) - }; - break; - } - return attachment; - } - - public static ThumbnailCard CreateThumbnailCard(Value value) - { - var card = new ThumbnailCard(); - card.Title = value.Name; - card.Subtitle = value.Type + " / " + value.Status; - card.Images = new List() - { - new CardImage(string.Format(WebConfigurationManager.AppSettings["BotCardsBlobStorageURL"], ContosoLogoUrl)) - }; - card.Text = value.Details; - - //If an action to be introduced to every job result, here is where to put it - //card.Buttons = new List() - //{ - // new CardAction() - // { - // Value = value.id, - // Type = ActionTypes.OpenUrl, - // Title = "View Job" - // } - //}; - - return card; - } - - public static AdaptiveCard CreateFeatureCard(Value value) - { - AdaptiveCard card = new AdaptiveCard(); - card.Speak = value.Name; - card.Body = new List { - new ColumnSet - { - Columns = - { - new Column - { - Size = ColumnSize.Auto, - Items = - { - new Image - { - Url = string.Format(WebConfigurationManager.AppSettings["BotCardsBlobStorageURL"], ContosoLogoUrl), - Size = ImageSize.Small, - Style = ImageStyle.Normal - } - } - }, - new Column - { - Size = ColumnSize.Stretch, - Items = - { - new TextBlock - { - Text = value.Name, - Weight = TextWeight.Bolder, - Size = TextSize.Large - } - } - } - } - }, - new Container - { - Items = - { - new TextBlock - { - Text = value.Details, - Speak = value.Details, - Wrap = true - }, - new FactSet - { - Facts = - { - new AdaptiveCards.Fact{Title = "Type", Value = value.Type}, - new AdaptiveCards.Fact{Title = "Status", Value = value.Status} - } - } - } - } - }; - - //If an action to be introduced to every job result, here is where to put it - //card.Actions = new List - //{ - // new OpenUrlAction{Title = "View Job", Url=value.id} - //} - - return card; - } - } -} diff --git a/Backend/BotBackend/Utils/JobModelExtension.cs b/Backend/BotBackend/Utils/JobModelExtension.cs deleted file mode 100644 index 57e3827..0000000 --- a/Backend/BotBackend/Utils/JobModelExtension.cs +++ /dev/null @@ -1,36 +0,0 @@ -using LuisBot.Models; -using Microsoft.Bot.Builder.Dialogs; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace LuisBot.Utils -{ - public static class JobModelExtension - { - public static JobModel GetContextData(IDialogContext context) - { - JobModel model; - context.ConversationData.TryGetValue(JobModel.ID, out model); - if (model == null) - { - model = new JobModel(); - SetContextData(context, model); - } - - return model; - } - - public static void SetContextData(IDialogContext context, JobModel model) - { - context.ConversationData.SetValue(JobModel.ID, model); - } - - public static void ClearContextData(IDialogContext context) - { - context.ConversationData.RemoveValue(JobModel.ID); - } - } -} diff --git a/Backend/BotBackend/Web.Debug.config b/Backend/BotBackend/Web.Debug.config deleted file mode 100644 index 2e302f9..0000000 --- a/Backend/BotBackend/Web.Debug.config +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/Backend/BotBackend/Web.Release.config b/Backend/BotBackend/Web.Release.config deleted file mode 100644 index c358444..0000000 --- a/Backend/BotBackend/Web.Release.config +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/Backend/BotBackend/Web.config b/Backend/BotBackend/Web.config deleted file mode 100644 index 7dbc2e6..0000000 --- a/Backend/BotBackend/Web.config +++ /dev/null @@ -1,119 +0,0 @@ - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Backend/BotBackend/build.cmd b/Backend/BotBackend/build.cmd deleted file mode 100644 index 69fbd68..0000000 --- a/Backend/BotBackend/build.cmd +++ /dev/null @@ -1,14 +0,0 @@ -@echo off -setlocal - -set DEPLOYMENT_SOURCE= -set IN_PLACE_DEPLOYMENT=1 - -if exist ..\wwwroot\deploy.cmd ( - pushd ..\wwwroot - call deploy.cmd - popd -) - -endlocal - diff --git a/Backend/BotBackend/default.htm b/Backend/BotBackend/default.htm deleted file mode 100644 index 0857643..0000000 --- a/Backend/BotBackend/default.htm +++ /dev/null @@ -1,21 +0,0 @@ - - - - Contoso Chat Bot - - - -

Contoso Luis Bot

-

A bot that shows how to handle natural language using the Cognitive Services LUIS API with Azure Search to look for Jobs.

-

Here are some handy links to get started:

-

-

-

- - diff --git a/Backend/BotBackend/deploy.cmd b/Backend/BotBackend/deploy.cmd deleted file mode 100644 index 2760fa9..0000000 --- a/Backend/BotBackend/deploy.cmd +++ /dev/null @@ -1,116 +0,0 @@ -@if "%SCM_TRACE_LEVEL%" NEQ "4" @echo off - -:: ---------------------- -:: KUDU Deployment Script -:: Version: 1.0.15 -:: ---------------------- - -:: Prerequisites -:: ------------- - -:: Verify node.js installed -where node 2>nul >nul -IF %ERRORLEVEL% NEQ 0 ( - echo Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment. - goto error -) - -:: Setup -:: ----- - -setlocal enabledelayedexpansion - -SET ARTIFACTS=%~dp0%..\artifacts - -IF NOT DEFINED DEPLOYMENT_SOURCE ( - SET DEPLOYMENT_SOURCE=%~dp0%. -) - -IF NOT DEFINED DEPLOYMENT_TARGET ( - SET DEPLOYMENT_TARGET=%ARTIFACTS%\wwwroot -) - -IF NOT DEFINED NEXT_MANIFEST_PATH ( - SET NEXT_MANIFEST_PATH=%ARTIFACTS%\manifest - - IF NOT DEFINED PREVIOUS_MANIFEST_PATH ( - SET PREVIOUS_MANIFEST_PATH=%ARTIFACTS%\manifest - ) -) - -IF NOT DEFINED KUDU_SYNC_CMD ( - :: Install kudu sync - echo Installing Kudu Sync - call npm install kudusync -g --silent - IF !ERRORLEVEL! NEQ 0 goto error - - :: Locally just running "kuduSync" would also work - SET KUDU_SYNC_CMD=%appdata%\npm\kuduSync.cmd -) -IF NOT DEFINED DEPLOYMENT_TEMP ( - SET DEPLOYMENT_TEMP=%temp%\___deployTemp%random% - SET CLEAN_LOCAL_DEPLOYMENT_TEMP=true -) - -IF DEFINED CLEAN_LOCAL_DEPLOYMENT_TEMP ( - IF EXIST "%DEPLOYMENT_TEMP%" rd /s /q "%DEPLOYMENT_TEMP%" - mkdir "%DEPLOYMENT_TEMP%" -) - -IF DEFINED MSBUILD_PATH goto MsbuildPathDefined -SET MSBUILD_PATH=%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe -:MsbuildPathDefined - -:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -:: Deployment -:: ---------- - -echo Handling .NET Web Application deployment. - -:: 1. Restore NuGet packages -IF /I "Microsoft.Bot.Sample.LuisBot.sln" NEQ "" ( - call :ExecuteCmd nuget restore "%DEPLOYMENT_SOURCE%\Microsoft.Bot.Sample.LuisBot.sln" - IF !ERRORLEVEL! NEQ 0 goto error -) - -:: 2. Build to the temporary path -IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" ( - call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\Microsoft.Bot.Sample.LuisBot.csproj" /nologo /verbosity:m /t:Build /t:pipelinePreDeployCopyAllFilesToOneFolder /p:_PackageTempDir="%DEPLOYMENT_TEMP%";AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release;UseSharedCompilation=false /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS% -) ELSE ( - call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\Microsoft.Bot.Sample.LuisBot.csproj" /nologo /verbosity:m /t:Build /p:AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release;UseSharedCompilation=false /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS% -) - -IF !ERRORLEVEL! NEQ 0 goto error - -:: 3. KuduSync -IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" ( - call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_TEMP%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd" - IF !ERRORLEVEL! NEQ 0 goto error -) - -:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -goto end - -:: Execute command routine that will echo out when error -:ExecuteCmd -setlocal -set _CMD_=%* -call %_CMD_% -if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_% -exit /b %ERRORLEVEL% - -:error -endlocal -echo An error has occurred during web site deployment. -call :exitSetErrorLevel -call :exitFromFunction 2>nul - -:exitSetErrorLevel -exit /b 1 - -:exitFromFunction -() - -:end -endlocal -echo Finished successfully. diff --git a/Backend/BotBackend/packages.config b/Backend/BotBackend/packages.config deleted file mode 100644 index fc28793..0000000 --- a/Backend/BotBackend/packages.config +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ContosoMaintenance.sln b/ContosoMaintenance.sln index 71b37be..2cbb739 100644 --- a/ContosoMaintenance.sln +++ b/ContosoMaintenance.sln @@ -6,13 +6,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebAPI", "WebAPI", "{9F0FD8 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile", "Mobile", "{A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Forms", "Forms", "{FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{F9802EBB-7857-4380-B1AD-F4CDE60F43F2}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platforms", "Platforms", "{ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ContosoFieldService.Core", "Mobile\ContosoFieldService.Core\ContosoFieldService.Core.csproj", "{8D50D622-6D39-4894-B679-BB60C5D60648}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.Core", "Mobile\ContosoFieldService.Core\ContosoFieldService.Core.csproj", "{8D50D622-6D39-4894-B679-BB60C5D60648}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Functions", "Functions", "{A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA}" EndProject @@ -20,15 +18,17 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.Droid", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.iOS", "Mobile\iOS\ContosoFieldService.iOS.csproj", "{E2745280-BDD1-4F5D-B976-199B9AA7602C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BotWebApp", "BotWebApp", "{140A5FB1-CD49-4998-8196-74EF067452B3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoMaintenance.WebAPI", "Backend\Monolithic\ContosoMaintenance.WebAPI.csproj", "{4D37B422-71A1-41EC-A389-7FC1D3D76F40}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ContosoMaintenance.WebAPI", "Backend\Monolithic\ContosoMaintenance.WebAPI.csproj", "{61BFA852-2AAC-42BB-9073-B8857D45FE3A}" +Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "ContosoFieldService.UITests", "Mobile\UITests\ContosoFieldService.UITests.csproj", "{32E514F2-5855-4301-A6EC-387B6BED09B7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ContosoMaintenance.Functions", "Backend\Functions\ContosoMaintenance.Functions.csproj", "{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoMaintenance.Functions", "Backend\Functions\ContosoMaintenance.Functions.csproj", "{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.UITests", "Mobile\UITests\ContosoFieldService.UITests.csproj", "{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Backend", "Backend", "{8B8DB082-89C7-4554-AA41-18F3ACA8F3AD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoMaintenance.Bot.WebApp", "Backend\BotBackend\ContosoMaintenance.Bot.WebApp.csproj", "{9C7E3A46-B60F-4052-9A21-DC8D1A942216}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Bot", "Bot", "{5790C1F9-2943-448E-82CC-3D4DB963F189}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoMaintenance.Bot", "Backend\Bot\ContosoMaintenance.Bot.csproj", "{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -143,129 +143,131 @@ Global {E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|iPhone.Build.0 = Test Cloud|iPhone {E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|iPhoneSimulator.ActiveCfg = Test Cloud|iPhoneSimulator {E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|iPhoneSimulator.Build.0 = Test Cloud|iPhoneSimulator - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.DebugBackend|iPhone.Build.0 = Debug|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Release|Any CPU.Build.0 = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Release|iPhone.ActiveCfg = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Test Cloud|iPhone.Build.0 = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU - {61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.DebugBackend|iPhone.Build.0 = Debug|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Release|Any CPU.Build.0 = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Release|iPhone.ActiveCfg = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Test Cloud|iPhone.Build.0 = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.DebugBackend|iPhone.Build.0 = Debug|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Release|Any CPU.Build.0 = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Release|iPhone.ActiveCfg = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Test Cloud|iPhone.Build.0 = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|iPhone.Build.0 = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.DebugBackend|iPhone.Build.0 = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|Any CPU.Build.0 = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|iPhone.ActiveCfg = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|iPhone.Build.0 = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Test Cloud|iPhone.Build.0 = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU - {9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|iPhone.Build.0 = Debug|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Release|Any CPU.Build.0 = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Release|iPhone.ActiveCfg = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|iPhone.Build.0 = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU + {4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|iPhone.Build.0 = Debug|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Release|Any CPU.Build.0 = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Release|iPhone.ActiveCfg = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|iPhone.Build.0 = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU + {32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|iPhone.Build.0 = Debug|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Release|Any CPU.Build.0 = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Release|iPhone.ActiveCfg = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|iPhone.Build.0 = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|iPhone.Build.0 = Debug|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|iPhone.Build.0 = Debug|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|Any CPU.Build.0 = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|iPhone.ActiveCfg = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|iPhone.Build.0 = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|Any CPU.ActiveCfg = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|Any CPU.Build.0 = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|iPhone.Build.0 = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A} = {A652EB72-D4A3-41DF-80F8-D3DD0DDE5665} - {F9802EBB-7857-4380-B1AD-F4CDE60F43F2} = {FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A} - {ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC} = {FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A} - {8D50D622-6D39-4894-B679-BB60C5D60648} = {FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A} + {F9802EBB-7857-4380-B1AD-F4CDE60F43F2} = {A652EB72-D4A3-41DF-80F8-D3DD0DDE5665} + {ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC} = {A652EB72-D4A3-41DF-80F8-D3DD0DDE5665} + {8D50D622-6D39-4894-B679-BB60C5D60648} = {A652EB72-D4A3-41DF-80F8-D3DD0DDE5665} {7ABD1905-E31B-4857-B4EA-B47ED1C55D0C} = {ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC} {E2745280-BDD1-4F5D-B976-199B9AA7602C} = {ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC} - {61BFA852-2AAC-42BB-9073-B8857D45FE3A} = {9F0FD859-1134-4C77-99E5-83703A2DE5A2} - {0980AA2E-1C59-4AD4-A8B4-C38C8676F323} = {A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA} - {B6E498F2-60A4-44BE-B4D9-D8D2F953066D} = {F9802EBB-7857-4380-B1AD-F4CDE60F43F2} - {9C7E3A46-B60F-4052-9A21-DC8D1A942216} = {140A5FB1-CD49-4998-8196-74EF067452B3} + {4D37B422-71A1-41EC-A389-7FC1D3D76F40} = {9F0FD859-1134-4C77-99E5-83703A2DE5A2} + {32E514F2-5855-4301-A6EC-387B6BED09B7} = {F9802EBB-7857-4380-B1AD-F4CDE60F43F2} + {D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3} = {A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA} + {A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA} = {8B8DB082-89C7-4554-AA41-18F3ACA8F3AD} + {9F0FD859-1134-4C77-99E5-83703A2DE5A2} = {8B8DB082-89C7-4554-AA41-18F3ACA8F3AD} + {5790C1F9-2943-448E-82CC-3D4DB963F189} = {8B8DB082-89C7-4554-AA41-18F3ACA8F3AD} + {A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884} = {5790C1F9-2943-448E-82CC-3D4DB963F189} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {60FF5FF1-44FA-4082-8169-95F16F23BE13} @@ -275,53 +277,5 @@ Global $0.DotNetNamingPolicy = $1 $1.DirectoryNamespaceAssociation = PrefixedHierarchical $0.TextStylePolicy = $20 - $2.FileWidth = 80 - $2.scope = text/plain - $2.TabsToSpaces = True - $3.inheritsSet = null - $3.scope = text/x-csharp - $0.CSharpFormattingPolicy = $4 - $4.scope = text/x-csharp - $5.inheritsSet = null - $5.scope = text/x-json - $0.JSONFormattingPolicy = $6 - $6.AutoStructureCompletion = True - $6.BracePositions = SemiExpanded - $6.FormatOnPaste = True - $6.scope = text/x-json - $7.inheritsSet = null - $7.scope = text/x-web - $8.inheritsSet = null - $8.scope = text/x-vs - $9.inheritsSet = null - $9.scope = application/config+xml - $0.XmlFormattingPolicy = $19 - $10.inheritsSet = null - $10.scope = application/config+xml - $11.inheritsSet = null - $11.scope = application/xml - $12.DefaultFormat = $13 - $13.MaxAttributesPerLine = 999 - $12.scope = application/xml - $14.inheritsSet = null - $14.scope = application/android+xml - $15.inheritsSet = null - $15.scope = application/android+xml - $16.inheritsSet = null - $16.scope = application/vnd.apple-xcode-storyboard - $17.inheritsSet = null - $17.scope = application/vnd.apple-xcode-storyboard - $18.inheritsSet = null - $18.scope = application/xaml+xml - $19.inheritsSet = null - $19.scope = application/xaml+xml - $20.inheritsSet = null - $20.scope = text/x-html - $0.HTMLFormattingPolicy = $21 - $21.FormatOnPaste = True - $21.XHTMLCodingStyle = True - $21.scope = text/x-html - $0.StandardHeader = $22 - $0.VersionControlPolicy = $23 EndGlobalSection EndGlobal diff --git a/Mobile/Droid/Resources/Resource.designer.cs b/Mobile/Droid/Resources/Resource.designer.cs index d92111f..4ac172a 100644 --- a/Mobile/Droid/Resources/Resource.designer.cs +++ b/Mobile/Droid/Resources/Resource.designer.cs @@ -2828,7 +2828,6 @@ namespace ContosoFieldService.Droid global::Microsoft.Identity.Client.Resource.Id.actions = global::ContosoFieldService.Droid.Resource.Id.actions; global::Microsoft.Identity.Client.Resource.Id.activity_chooser_view_content = global::ContosoFieldService.Droid.Resource.Id.activity_chooser_view_content; global::Microsoft.Identity.Client.Resource.Id.add = global::ContosoFieldService.Droid.Resource.Id.add; - global::Microsoft.Identity.Client.Resource.Id.agentWebView = global::ContosoFieldService.Droid.Resource.Id.agentWebView; global::Microsoft.Identity.Client.Resource.Id.alertTitle = global::ContosoFieldService.Droid.Resource.Id.alertTitle; global::Microsoft.Identity.Client.Resource.Id.always = global::ContosoFieldService.Droid.Resource.Id.always; global::Microsoft.Identity.Client.Resource.Id.async = global::ContosoFieldService.Droid.Resource.Id.async; @@ -2975,8 +2974,6 @@ namespace ContosoFieldService.Droid global::Microsoft.Identity.Client.Resource.Layout.select_dialog_singlechoice_material = global::ContosoFieldService.Droid.Resource.Layout.select_dialog_singlechoice_material; global::Microsoft.Identity.Client.Resource.Layout.support_simple_spinner_dropdown_item = global::ContosoFieldService.Droid.Resource.Layout.support_simple_spinner_dropdown_item; global::Microsoft.Identity.Client.Resource.Layout.tooltip = global::ContosoFieldService.Droid.Resource.Layout.tooltip; - global::Microsoft.Identity.Client.Resource.Layout.WebAuthenticationBroker = global::ContosoFieldService.Droid.Resource.Layout.WebAuthenticationBroker; - global::Microsoft.Identity.Client.Resource.String.ApplicationName = global::ContosoFieldService.Droid.Resource.String.ApplicationName; global::Microsoft.Identity.Client.Resource.String.abc_action_bar_home_description = global::ContosoFieldService.Droid.Resource.String.abc_action_bar_home_description; global::Microsoft.Identity.Client.Resource.String.abc_action_bar_up_description = global::ContosoFieldService.Droid.Resource.String.abc_action_bar_up_description; global::Microsoft.Identity.Client.Resource.String.abc_action_menu_overflow_description = global::ContosoFieldService.Droid.Resource.String.abc_action_menu_overflow_description; @@ -7465,9 +7462,6 @@ namespace ContosoFieldService.Droid // aapt resource value: 0x7f0d0024 public const int adjust_width = 2131558436; - // aapt resource value: 0x7f0d00f7 - public const int agentWebView = 2131558647; - // aapt resource value: 0x7f0d0098 public const int alertTitle = 2131558552; @@ -7714,8 +7708,8 @@ namespace ContosoFieldService.Droid // aapt resource value: 0x7f0d001d public const int lottie_layer_name = 2131558429; - // aapt resource value: 0x7f0d00f9 - public const int masked = 2131558649; + // aapt resource value: 0x7f0d00f8 + public const int masked = 2131558648; // aapt resource value: 0x7f0d003f public const int match_global_nicknames = 2131558463; @@ -8110,8 +8104,8 @@ namespace ContosoFieldService.Droid // aapt resource value: 0x7f0d0016 public const int view_offset_helper = 2131558422; - // aapt resource value: 0x7f0d00f8 - public const int visible = 2131558648; + // aapt resource value: 0x7f0d00f7 + public const int visible = 2131558647; // aapt resource value: 0x7f0d00d9 public const int volume_item_container = 2131558617; @@ -8428,9 +8422,6 @@ namespace ContosoFieldService.Droid // aapt resource value: 0x7f040045 public const int vertical_viewpager = 2130968645; - // aapt resource value: 0x7f040046 - public const int WebAuthenticationBroker = 2130968646; - static Layout() { global::Android.Runtime.ResourceIdManager.UpdateIdValues(); @@ -8466,9 +8457,6 @@ namespace ContosoFieldService.Droid public partial class String { - // aapt resource value: 0x7f0a004f - public const int ApplicationName = 2131361871; - // aapt resource value: 0x7f0a0028 public const int abc_action_bar_home_description = 2131361832; @@ -8559,62 +8547,62 @@ namespace ContosoFieldService.Droid // aapt resource value: 0x7f0a0046 public const int appbar_scrolling_view_behavior = 2131361862; + // aapt resource value: 0x7f0a004f + public const int appcenter_distribute_dialog_actioned_on_disabled_toast = 2131361871; + // aapt resource value: 0x7f0a0050 - public const int appcenter_distribute_dialog_actioned_on_disabled_toast = 2131361872; + public const int appcenter_distribute_download_progress_number_format = 2131361872; // aapt resource value: 0x7f0a0051 - public const int appcenter_distribute_download_progress_number_format = 2131361873; + public const int appcenter_distribute_downloading_mandatory_update = 2131361873; // aapt resource value: 0x7f0a0052 - public const int appcenter_distribute_downloading_mandatory_update = 2131361874; + public const int appcenter_distribute_install = 2131361874; // aapt resource value: 0x7f0a0053 - public const int appcenter_distribute_install = 2131361875; + public const int appcenter_distribute_install_ready_message = 2131361875; // aapt resource value: 0x7f0a0054 - public const int appcenter_distribute_install_ready_message = 2131361876; + public const int appcenter_distribute_install_ready_title = 2131361876; // aapt resource value: 0x7f0a0055 - public const int appcenter_distribute_install_ready_title = 2131361877; + public const int appcenter_distribute_notification_category = 2131361877; // aapt resource value: 0x7f0a0056 - public const int appcenter_distribute_notification_category = 2131361878; + public const int appcenter_distribute_unknown_sources_dialog_message = 2131361878; // aapt resource value: 0x7f0a0057 - public const int appcenter_distribute_unknown_sources_dialog_message = 2131361879; + public const int appcenter_distribute_unknown_sources_dialog_settings = 2131361879; // aapt resource value: 0x7f0a0058 - public const int appcenter_distribute_unknown_sources_dialog_settings = 2131361880; + public const int appcenter_distribute_update_dialog_download = 2131361880; // aapt resource value: 0x7f0a0059 - public const int appcenter_distribute_update_dialog_download = 2131361881; + public const int appcenter_distribute_update_dialog_message_mandatory = 2131361881; // aapt resource value: 0x7f0a005a - public const int appcenter_distribute_update_dialog_message_mandatory = 2131361882; + public const int appcenter_distribute_update_dialog_message_optional = 2131361882; // aapt resource value: 0x7f0a005b - public const int appcenter_distribute_update_dialog_message_optional = 2131361883; + public const int appcenter_distribute_update_dialog_postpone = 2131361883; // aapt resource value: 0x7f0a005c - public const int appcenter_distribute_update_dialog_postpone = 2131361884; + public const int appcenter_distribute_update_dialog_title = 2131361884; // aapt resource value: 0x7f0a005d - public const int appcenter_distribute_update_dialog_title = 2131361885; + public const int appcenter_distribute_update_dialog_view_release_notes = 2131361885; // aapt resource value: 0x7f0a005e - public const int appcenter_distribute_update_dialog_view_release_notes = 2131361886; + public const int appcenter_distribute_update_failed_dialog_ignore = 2131361886; // aapt resource value: 0x7f0a005f - public const int appcenter_distribute_update_failed_dialog_ignore = 2131361887; + public const int appcenter_distribute_update_failed_dialog_message = 2131361887; // aapt resource value: 0x7f0a0060 - public const int appcenter_distribute_update_failed_dialog_message = 2131361888; + public const int appcenter_distribute_update_failed_dialog_reinstall = 2131361888; // aapt resource value: 0x7f0a0061 - public const int appcenter_distribute_update_failed_dialog_reinstall = 2131361889; - - // aapt resource value: 0x7f0a0062 - public const int appcenter_distribute_update_failed_dialog_title = 2131361890; + public const int appcenter_distribute_update_failed_dialog_title = 2131361889; // aapt resource value: 0x7f0a0047 public const int bottom_sheet_behavior = 2131361863;