Merge pull request #18 from Microsoft/bot-replacement
Replace old Bot with new Demo Echo Bot Sample
This commit is contained in:
Коммит
3055f25986
|
@ -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"
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netcoreapp2.0</TargetFramework>
|
||||||
|
<CodeAnalysisRuleSet>EchoBotWithCounter.ruleset</CodeAnalysisRuleSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="BotConfiguration.bot">
|
||||||
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore" Version="2.1.3" />
|
||||||
|
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.7" />
|
||||||
|
<PackageReference Include="Microsoft.Bot.Builder" Version="4.0.8" />
|
||||||
|
<PackageReference Include="Microsoft.Bot.Builder.Integration.AspNet.Core" Version="4.0.8" />
|
||||||
|
<PackageReference Include="Microsoft.Bot.Configuration" Version="4.0.8" />
|
||||||
|
<PackageReference Include="Microsoft.Bot.Connector" Version="4.0.8" />
|
||||||
|
<PackageReference Include="Microsoft.Bot.Schema" Version="4.0.8" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="2.1.1" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
// Licensed under the MIT License.
|
||||||
|
|
||||||
|
namespace ContosoMaintenance.Bot
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Stores counter state for the conversation.
|
||||||
|
/// Stored in <see cref="Microsoft.Bot.Builder.ConversationState"/> and
|
||||||
|
/// backed by <see cref="Microsoft.Bot.Builder.MemoryStorage"/>.
|
||||||
|
/// </summary>
|
||||||
|
public class CounterState
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the number of turns in the conversation.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The number of turns in the conversation.</value>
|
||||||
|
public int TurnCount { get; set; } = 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This class is created as a Singleton and passed into the IBot-derived constructor.
|
||||||
|
/// - See <see cref="EchoWithCounterBot"/> constructor for how that is injected.
|
||||||
|
/// - See the Startup.cs file for more details on creating the Singleton that gets
|
||||||
|
/// injected into the constructor.
|
||||||
|
/// </summary>
|
||||||
|
public class EchoBotAccessors
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="EchoBotAccessors"/> class.
|
||||||
|
/// Contains the <see cref="ConversationState"/> and associated <see cref="IStatePropertyAccessor{T}"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="conversationState">The state object that stores the counter.</param>
|
||||||
|
public EchoBotAccessors(ConversationState conversationState)
|
||||||
|
{
|
||||||
|
ConversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="IStatePropertyAccessor{T}"/> name used for the <see cref="CounterState"/> accessor.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>Accessors require a unique name.</remarks>
|
||||||
|
/// <value>The accessor name for the counter accessor.</value>
|
||||||
|
public static string CounterStateName { get; } = $"{nameof(EchoBotAccessors)}.CounterState";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the <see cref="IStatePropertyAccessor{T}"/> for CounterState.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>
|
||||||
|
/// The accessor stores the turn count for the conversation.
|
||||||
|
/// </value>
|
||||||
|
public IStatePropertyAccessor<CounterState> CounterState { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the <see cref="ConversationState"/> object for the conversation.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The <see cref="ConversationState"/> object.</value>
|
||||||
|
public ConversationState ConversationState { get; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RuleSet Name="Microsoft Managed Recommended Rules" Description="These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. It is recommended to include this rule set in any custom rule set you create for your projects." ToolsVersion="10.0">
|
||||||
|
<Localization ResourceAssembly="Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.dll" ResourceBaseName="Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.Localized">
|
||||||
|
<Name Resource="MinimumRecommendedRules_Name" />
|
||||||
|
<Description Resource="MinimumRecommendedRules_Description" />
|
||||||
|
</Localization>
|
||||||
|
<Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers">
|
||||||
|
<Rule Id="SA1011" Action="None" />
|
||||||
|
<Rule Id="SA1200" Action="None" />
|
||||||
|
<Rule Id="SA1101" Action="None" />
|
||||||
|
<Rule Id="SA1129" Action="None" />
|
||||||
|
<Rule Id="SA1305" Action="Warning" />
|
||||||
|
<Rule Id="SA1309" Action="None" />
|
||||||
|
<Rule Id="SA1412" Action="Warning" />
|
||||||
|
<Rule Id="SA1600" Action="None" />
|
||||||
|
<Rule Id="SA1609" Action="Warning" />
|
||||||
|
<Rule Id="SA1633" Action="None" />
|
||||||
|
</Rules>
|
||||||
|
<Rules AnalyzerId="AsyncUsageAnalyzers" RuleNamespace="AsyncUsageAnalyzers">
|
||||||
|
<Rule Id="AvoidAsyncVoid" Action="Warning" />
|
||||||
|
</Rules>
|
||||||
|
</RuleSet>
|
|
@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 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 <see cref="MemoryStorage"/> object and associated
|
||||||
|
/// <see cref="IStatePropertyAccessor{T}"/> object are created with a singleton lifetime.
|
||||||
|
/// </summary>
|
||||||
|
/// <seealso cref="https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1"/>
|
||||||
|
public class EchoWithCounterBot : IBot
|
||||||
|
{
|
||||||
|
private readonly EchoBotAccessors _accessors;
|
||||||
|
private readonly ILogger _logger;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="EchoWithCounterBot"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="accessors">A class containing <see cref="IStatePropertyAccessor{T}"/> used to manage state.</param>
|
||||||
|
/// <param name="loggerFactory">A <see cref="ILoggerFactory"/> that is hooked to the Azure App Service provider.</param>
|
||||||
|
/// <seealso cref="https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1#windows-eventlog-provider"/>
|
||||||
|
public EchoWithCounterBot(EchoBotAccessors accessors, ILoggerFactory loggerFactory)
|
||||||
|
{
|
||||||
|
if (loggerFactory == null)
|
||||||
|
{
|
||||||
|
throw new System.ArgumentNullException(nameof(loggerFactory));
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger = loggerFactory.CreateLogger<EchoWithCounterBot>();
|
||||||
|
_logger.LogTrace("EchoBot turn start.");
|
||||||
|
_accessors = accessors ?? throw new System.ArgumentNullException(nameof(accessors));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 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.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="turnContext">A <see cref="ITurnContext"/> containing all the data needed
|
||||||
|
/// for processing this conversation turn. </param>
|
||||||
|
/// <param name="cancellationToken">(Optional) A <see cref="CancellationToken"/> that can be used by other objects
|
||||||
|
/// or threads to receive notice of cancellation.</param>
|
||||||
|
/// <returns>A <see cref="Task"/> that represents the work queued to execute.</returns>
|
||||||
|
/// <seealso cref="BotStateSet"/>
|
||||||
|
/// <seealso cref="ConversationState"/>
|
||||||
|
/// <seealso cref="IMiddleware"/>
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<Startup>()
|
||||||
|
.Build();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 <BOT-NAME> -l <Azure-location> --subscriptionId <Azure-subscription-id>
|
||||||
|
```
|
||||||
|
# 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)
|
|
@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The Startup class configures services and the request pipeline.
|
||||||
|
/// </summary>
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the configuration that represents a set of key/value application configuration properties.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>
|
||||||
|
/// The <see cref="IConfiguration"/> that represents a set of key/value application configuration properties.
|
||||||
|
/// </value>
|
||||||
|
public IConfiguration Configuration { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This method gets called by the runtime. Use this method to add services to the container.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="services">The <see cref="IServiceCollection"/> specifies the contract for a collection of service descriptors.</param>
|
||||||
|
/// <seealso cref="IStatePropertyAccessor{T}"/>
|
||||||
|
/// <seealso cref="https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection"/>
|
||||||
|
/// <seealso cref="https://docs.microsoft.com/en-us/azure/bot-service/bot-service-manage-channels?view=azure-bot-service-4.0"/>
|
||||||
|
public void ConfigureServices(IServiceCollection services)
|
||||||
|
{
|
||||||
|
services.AddBot<EchoWithCounterBot>(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<EchoWithCounterBot>();
|
||||||
|
|
||||||
|
// 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 = "<STORAGE-NAME-OR-ID-FROM-BOT-FILE>";
|
||||||
|
// 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 = "<DEFAULT-CONTAINER>";
|
||||||
|
// 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<EchoBotAccessors>(sp =>
|
||||||
|
{
|
||||||
|
var options = sp.GetRequiredService<IOptions<BotFrameworkOptions>>().Value;
|
||||||
|
if (options == null)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("BotFrameworkOptions must be configured prior to setting up the state accessors");
|
||||||
|
}
|
||||||
|
|
||||||
|
var conversationState = options.State.OfType<ConversationState>().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<CounterState>(EchoBotAccessors.CounterStateName),
|
||||||
|
};
|
||||||
|
|
||||||
|
return accessors;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
|
||||||
|
{
|
||||||
|
_loggerFactory = loggerFactory;
|
||||||
|
|
||||||
|
app.UseDefaultFiles()
|
||||||
|
.UseStaticFiles()
|
||||||
|
.UseBotFramework();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"botFilePath": "BotConfiguration.bot",
|
||||||
|
"botFileSecret": ""
|
||||||
|
}
|
|
@ -0,0 +1,419 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Echo bot with counter sample</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
font-family: Segoe UI;
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
background-image: url("data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 4638.9 651.6' style='enable-background:new 0 0 4638.9 651.6;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%2355A0E0;%7D .st1%7Bfill:none;%7D .st2%7Bfill:%230058A8;%7D .st3%7Bfill:%23328BD8;%7D .st4%7Bfill:%23B6DCF1;%7D .st5%7Bopacity:0.2;fill:url(%23SVGID_1_);enable-background:new ;%7D%0A%3C/style%3E%3Crect y='1.1' class='st0' width='4640' height='646.3'/%3E%3Cpath class='st1' d='M3987.8,323.6L4310.3,1.1h-65.6l-460.1,460.1c-17.5,17.5-46.1,17.5-63.6,0L3260.9,1.1H0v646.3h3660.3 L3889,418.7c17.5-17.5,46.1-17.5,63.6,0l228.7,228.7h66.6l-260.2-260.2C3970.3,369.8,3970.3,341.1,3987.8,323.6z'/%3E%3Cpath class='st2' d='M3784.6,461.2L4244.7,1.1h-983.9l460.1,460.1C3738.4,478.7,3767.1,478.7,3784.6,461.2z'/%3E%3Cpath class='st3' d='M4640,1.1h-329.8l-322.5,322.5c-17.5,17.5-17.5,46.1,0,63.6l260.2,260.2H4640L4640,1.1L4640,1.1z'/%3E%3Cpath class='st4' d='M3889,418.8l-228.7,228.7h521.1l-228.7-228.7C3935.2,401.3,3906.5,401.3,3889,418.8z'/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='3713.7576' y1='438.1175' x2='3911.4084' y2='14.2535' gradientTransform='matrix(1 0 0 -1 0 641.3969)'%3E%3Cstop offset='0' style='stop-color:%23FFFFFF;stop-opacity:0.5'/%3E%3Cstop offset='1' style='stop-color:%23FFFFFF'/%3E%3C/linearGradient%3E%3Cpath class='st5' d='M3952.7,124.5c-17.5-17.5-46.1-17.5-63.6,0l-523,523h1109.6L3952.7,124.5z'/%3E%3C/svg%3E%0A");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: 100%;
|
||||||
|
background-position: right;
|
||||||
|
background-color: #55A0E0;
|
||||||
|
width: 100%;
|
||||||
|
font-size: 44px;
|
||||||
|
height: 120px;
|
||||||
|
color: white;
|
||||||
|
padding: 30px 0 40px 0px;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-icon {
|
||||||
|
background-image: url("data:image/svg+xml;utf8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20150.2%20125%22%20style%3D%22enable-background%3Anew%200%200%20150.2%20125%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23FFFFFF%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.5%22%20class%3D%22st0%22%20width%3D%22149.7%22%20height%3D%22125%22/%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M59%2C102.9L21.8%2C66c-3.5-3.5-3.5-9.1%2C0-12.5l37-36.5l2.9%2C3l-37%2C36.4c-1.8%2C1.8-1.8%2C4.7%2C0%2C6.6l37.2%2C37L59%2C102.9z%22%0A%09%09/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M92.5%2C102.9l-3-3l37.2-37c0.9-0.9%2C1.4-2%2C1.4-3.3c0-1.2-0.5-2.4-1.4-3.3L89.5%2C20l2.9-3l37.2%2C36.4%0A%09%09c1.7%2C1.7%2C2.6%2C3.9%2C2.6%2C6.3s-0.9%2C4.6-2.6%2C6.3L92.5%2C102.9z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M90.1%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C98.1%2C64.7%2C94.4%2C68.4%2C90.1%2C68.4z%0A%09%09%20M90.1%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S91.9%2C56.5%2C90.1%2C56.5z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M61.4%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C69.5%2C64.7%2C65.8%2C68.4%2C61.4%2C68.4z%0A%09%09%20M61.4%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S63.3%2C56.5%2C61.4%2C56.5z%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
float: left;
|
||||||
|
height: 140px;
|
||||||
|
width: 140px;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-text {
|
||||||
|
padding-left: 1%;
|
||||||
|
color: #FFFFFF;
|
||||||
|
font-family: "Segoe UI";
|
||||||
|
font-size: 72px;
|
||||||
|
font-weight: 300;
|
||||||
|
letter-spacing: 0.35px;
|
||||||
|
line-height: 96px;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-inner-container {
|
||||||
|
min-width: 480px;
|
||||||
|
max-width: 1366px;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-inner-container::after {
|
||||||
|
content: "";
|
||||||
|
clear: both;
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-content-area {
|
||||||
|
padding-left: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-title {
|
||||||
|
color: #000000;
|
||||||
|
font-family: "Segoe UI";
|
||||||
|
font-size: 46px;
|
||||||
|
font-weight: 300;
|
||||||
|
line-height: 62px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-text {
|
||||||
|
color: #808080;
|
||||||
|
font-size: 24px;
|
||||||
|
font-family: "Segoe UI";
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: 200;
|
||||||
|
line-height: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-text-p1{
|
||||||
|
padding-top: 48px;
|
||||||
|
padding-bottom: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.endpoint {
|
||||||
|
height: 32px;
|
||||||
|
width: 571px;
|
||||||
|
color: #808080;
|
||||||
|
font-family: "Segoe UI";
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: 200;
|
||||||
|
line-height: 32px;
|
||||||
|
padding-top: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.how-to-build-section {
|
||||||
|
padding-top: 20px;
|
||||||
|
padding-left: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.how-to-build-section>h3 {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.35px;
|
||||||
|
line-height: 22px;
|
||||||
|
margin: 0 0 24px 0;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: stretch;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-container dl {
|
||||||
|
border-left: 1px solid #A0A0A0;
|
||||||
|
display: block;
|
||||||
|
padding: 0 24px;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-container dl>dt::before {
|
||||||
|
background-color: white;
|
||||||
|
border: 1px solid #A0A0A0;
|
||||||
|
border-radius: 100%;
|
||||||
|
content: '';
|
||||||
|
left: 47px;
|
||||||
|
height: 11px;
|
||||||
|
position: absolute;
|
||||||
|
width: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-container dl>.test-bullet::before {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-container dl>dt {
|
||||||
|
display: block;
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-container dl>dd {
|
||||||
|
font-size: inherit;
|
||||||
|
line-height: 20px;
|
||||||
|
margin-left: 0;
|
||||||
|
padding-bottom: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-container:last-child dl {
|
||||||
|
border-left: 1px solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctaLink {
|
||||||
|
background-color: transparent;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
color: #006AB1;
|
||||||
|
cursor: pointer;
|
||||||
|
font-weight: 600;
|
||||||
|
padding: 0;
|
||||||
|
white-space: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctaLink:focus {
|
||||||
|
outline: 1px solid #00bcf2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctaLink:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-icon {
|
||||||
|
display: flex;
|
||||||
|
height: 38px;
|
||||||
|
margin-right: 15px;
|
||||||
|
width: 38px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-icon>div {
|
||||||
|
height: 30px;
|
||||||
|
width: 30px;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ms-logo-container {
|
||||||
|
min-width: 580px;
|
||||||
|
max-width: 980px;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
transition: bottom 400ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ms-logo {
|
||||||
|
float: right;
|
||||||
|
background-image: url("data:image/svg+xml;utf8,%0A%3Csvg%20version%3D%221.1%22%20id%3D%22MS-symbol%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20400%20120%22%20style%3D%22enable-background%3Anew%200%200%20400%20120%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23737474%3B%7D%0A%09.st2%7Bfill%3A%23D63F26%3B%7D%0A%09.st3%7Bfill%3A%23167D3E%3B%7D%0A%09.st4%7Bfill%3A%232E76BC%3B%7D%0A%09.st5%7Bfill%3A%23FDB813%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.6%22%20class%3D%22st0%22%20width%3D%22398.7%22%20height%3D%22119%22/%3E%0A%3Cpath%20class%3D%22st1%22%20d%3D%22M171.3%2C38.4v43.2h-7.5V47.7h-0.1l-13.4%2C33.9h-5l-13.7-33.9h-0.1v33.9h-6.9V38.4h10.8l12.4%2C32h0.2l13.1-32H171.3%0A%09z%20M177.6%2C41.7c0-1.2%2C0.4-2.2%2C1.3-3c0.9-0.8%2C1.9-1.2%2C3.1-1.2c1.3%2C0%2C2.4%2C0.4%2C3.2%2C1.3c0.8%2C0.8%2C1.3%2C1.8%2C1.3%2C3c0%2C1.2-0.4%2C2.2-1.3%2C3%0A%09c-0.9%2C0.8-1.9%2C1.2-3.2%2C1.2s-2.3-0.4-3.1-1.2C178%2C43.8%2C177.6%2C42.8%2C177.6%2C41.7z%20M185.7%2C50.6v31h-7.3v-31H185.7z%20M207.8%2C76.3%0A%09c1.1%2C0%2C2.3-0.3%2C3.6-0.8c1.3-0.5%2C2.5-1.2%2C3.6-2v6.8c-1.2%2C0.7-2.5%2C1.2-4%2C1.5c-1.5%2C0.3-3.1%2C0.5-4.9%2C0.5c-4.6%2C0-8.3-1.4-11.1-4.3%0A%09c-2.9-2.9-4.3-6.6-4.3-11c0-5%2C1.5-9.1%2C4.4-12.3c2.9-3.2%2C7-4.8%2C12.4-4.8c1.4%2C0%2C2.7%2C0.2%2C4.1%2C0.5c1.4%2C0.4%2C2.5%2C0.8%2C3.3%2C1.2v7%0A%09c-1.1-0.8-2.3-1.5-3.4-1.9c-1.2-0.5-2.4-0.7-3.6-0.7c-2.9%2C0-5.2%2C0.9-7%2C2.8c-1.8%2C1.9-2.7%2C4.4-2.7%2C7.6c0%2C3.1%2C0.8%2C5.6%2C2.5%2C7.3%0A%09C202.6%2C75.4%2C204.9%2C76.3%2C207.8%2C76.3z%20M235.7%2C50.1c0.6%2C0%2C1.1%2C0%2C1.6%2C0.1s0.9%2C0.2%2C1.2%2C0.3v7.4c-0.4-0.3-0.9-0.5-1.7-0.8%0A%09c-0.7-0.3-1.6-0.4-2.7-0.4c-1.8%2C0-3.3%2C0.8-4.5%2C2.3c-1.2%2C1.5-1.9%2C3.8-1.9%2C7v15.6h-7.3v-31h7.3v4.9h0.1c0.7-1.7%2C1.7-3%2C3-4%0A%09C232.2%2C50.6%2C233.8%2C50.1%2C235.7%2C50.1z%20M238.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3%0A%09c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5c-4.8%2C0-8.6-1.4-11.4-4.2C240.3%2C75.3%2C238.9%2C71.4%2C238.9%2C66.6z%0A%09%20M246.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5%0A%09c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7C247.2%2C60.5%2C246.5%2C63%2C246.5%2C66.3z%20M281.5%2C58.8c0%2C1%2C0.3%2C1.9%2C1%2C2.5%0A%09c0.7%2C0.6%2C2.1%2C1.3%2C4.4%2C2.2c2.9%2C1.2%2C5%2C2.5%2C6.1%2C3.9c1.2%2C1.5%2C1.8%2C3.2%2C1.8%2C5.3c0%2C2.9-1.1%2C5.3-3.4%2C7c-2.2%2C1.8-5.3%2C2.7-9.1%2C2.7%0A%09c-1.3%2C0-2.7-0.2-4.3-0.5c-1.6-0.3-2.9-0.7-4-1.2v-7.2c1.3%2C0.9%2C2.8%2C1.7%2C4.3%2C2.2c1.5%2C0.5%2C2.9%2C0.8%2C4.2%2C0.8c1.6%2C0%2C2.9-0.2%2C3.6-0.7%0A%09c0.8-0.5%2C1.2-1.2%2C1.2-2.3c0-1-0.4-1.9-1.2-2.5c-0.8-0.7-2.4-1.5-4.6-2.4c-2.7-1.1-4.6-2.4-5.7-3.8c-1.1-1.4-1.7-3.2-1.7-5.4%0A%09c0-2.8%2C1.1-5.1%2C3.3-6.9c2.2-1.8%2C5.1-2.7%2C8.6-2.7c1.1%2C0%2C2.3%2C0.1%2C3.6%2C0.4c1.3%2C0.2%2C2.5%2C0.6%2C3.4%2C0.9v6.9c-1-0.6-2.1-1.2-3.4-1.7%0A%09c-1.3-0.5-2.6-0.7-3.8-0.7c-1.4%2C0-2.5%2C0.3-3.2%2C0.8C281.9%2C57.1%2C281.5%2C57.8%2C281.5%2C58.8z%20M297.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2%0A%09c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5%0A%09c-4.8%2C0-8.6-1.4-11.4-4.2C299.4%2C75.3%2C297.9%2C71.4%2C297.9%2C66.6z%20M305.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6%0A%09c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7%0A%09C306.3%2C60.5%2C305.5%2C63%2C305.5%2C66.3z%20M353.9%2C56.6h-10.9v25h-7.4v-25h-5.2v-6h5.2v-4.3c0-3.3%2C1.1-5.9%2C3.2-8c2.1-2.1%2C4.8-3.1%2C8.1-3.1%0A%09c0.9%2C0%2C1.7%2C0%2C2.4%2C0.1c0.7%2C0.1%2C1.3%2C0.2%2C1.8%2C0.4V42c-0.2-0.1-0.7-0.3-1.3-0.5c-0.6-0.2-1.3-0.3-2.1-0.3c-1.5%2C0-2.7%2C0.5-3.5%2C1.4%0A%09s-1.2%2C2.4-1.2%2C4.2v3.7h10.9v-7l7.3-2.2v9.2h7.4v6h-7.4v14.5c0%2C1.9%2C0.3%2C3.3%2C1%2C4c0.7%2C0.8%2C1.8%2C1.2%2C3.3%2C1.2c0.4%2C0%2C0.9-0.1%2C1.5-0.3%0A%09c0.6-0.2%2C1.1-0.4%2C1.6-0.7v6c-0.5%2C0.3-1.2%2C0.5-2.3%2C0.7c-1.1%2C0.2-2.1%2C0.3-3.2%2C0.3c-3.1%2C0-5.4-0.8-6.9-2.5c-1.5-1.6-2.3-4.1-2.3-7.4%0A%09V56.6z%22/%3E%0A%3Cg%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2224%22%20class%3D%22st2%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2224%22%20class%3D%22st3%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2261.8%22%20class%3D%22st4%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2261.8%22%20class%3D%22st5%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A");
|
||||||
|
}
|
||||||
|
|
||||||
|
.ms-logo-container>div {
|
||||||
|
min-height: 60px;
|
||||||
|
width: 150px;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
.row {
|
||||||
|
padding: 90px 0px 0 20px;
|
||||||
|
min-width: 480px;
|
||||||
|
max-width: 1366px;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.column {
|
||||||
|
float: left;
|
||||||
|
width: 45%;
|
||||||
|
padding-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.row:after {
|
||||||
|
content: "";
|
||||||
|
display: table;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.download-the-emulator {
|
||||||
|
height: 20px;
|
||||||
|
color: #0063B1;
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 20px;
|
||||||
|
padding-bottom: 70px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.how-to-iframe {
|
||||||
|
max-width: 700px !important;
|
||||||
|
min-width: 650px !important;
|
||||||
|
height: 700px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.remove-frame-height {
|
||||||
|
height: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 1300px) {
|
||||||
|
.ms-logo {
|
||||||
|
padding-top: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-text {
|
||||||
|
font-size: 40x;
|
||||||
|
}
|
||||||
|
|
||||||
|
.column {
|
||||||
|
float: none;
|
||||||
|
padding-top: 30px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ms-logo-container {
|
||||||
|
padding-top: 30px;
|
||||||
|
min-width: 480px;
|
||||||
|
max-width: 650px;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.row {
|
||||||
|
padding: 20px 0px 0 20px;
|
||||||
|
min-width: 480px;
|
||||||
|
max-width: 650px;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 1370px) {
|
||||||
|
header {
|
||||||
|
background-color: #55A0E0;
|
||||||
|
background-size: auto 200px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 1230px) {
|
||||||
|
header {
|
||||||
|
background-color: #55A0E0;
|
||||||
|
background-size: auto 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-text {
|
||||||
|
font-size: 44px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-icon {
|
||||||
|
height: 120px;
|
||||||
|
width: 120px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 1000px) {
|
||||||
|
header {
|
||||||
|
background-color: #55A0E0;
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 632px) {
|
||||||
|
.header-text {
|
||||||
|
font-size: 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.row {
|
||||||
|
padding: 10px 0px 0 10px;
|
||||||
|
max-width: 490px !important;
|
||||||
|
min-width: 410px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.endpoint {
|
||||||
|
font-size: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-text {
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.step-container dl>dd {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.column {
|
||||||
|
padding-right: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-icon {
|
||||||
|
height: 110px;
|
||||||
|
width: 110px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.how-to-iframe {
|
||||||
|
max-width: 480px !important;
|
||||||
|
min-width: 400px !important;
|
||||||
|
height: 650px !important;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.remove-frame-height {
|
||||||
|
max-height: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
loadFrame();
|
||||||
|
});
|
||||||
|
var loadFrame = function () {
|
||||||
|
var iframe = document.createElement('iframe');
|
||||||
|
iframe.setAttribute("id", "iframe");
|
||||||
|
var offLineHTMLContent = "";
|
||||||
|
var frameElement = document.getElementById("how-to-iframe");
|
||||||
|
if (window.navigator.onLine) {
|
||||||
|
iframe.src = 'https://docs.botframework.com/static/abs/pages/f5.htm';
|
||||||
|
iframe.setAttribute("scrolling", "no");
|
||||||
|
iframe.setAttribute("frameborder", "0");
|
||||||
|
iframe.setAttribute("width", "100%");
|
||||||
|
iframe.setAttribute("height", "100%");
|
||||||
|
var frameDiv = document.getElementById("how-to-iframe");
|
||||||
|
frameDiv.appendChild(iframe);
|
||||||
|
} else {
|
||||||
|
frameElement.classList.add("remove-frame-height");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<header class="header">
|
||||||
|
<div class="header-inner-container">
|
||||||
|
<div class="header-icon" style="display: inline-block"></div>
|
||||||
|
<div class="header-text" style="display: inline-block">Echo with Counter Bot</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<div class="row">
|
||||||
|
<div class="column" class="main-content-area">
|
||||||
|
<div class="content-title">Your bot is ready!</div>
|
||||||
|
<div class="main-text main-text-p1">You can test your bot in the Bot Framework Emulator<br />
|
||||||
|
by opening the .bot file in the project folder.</div>
|
||||||
|
<div class="main-text download-the-emulator"><a class="ctaLink" href="https://aka.ms/bot-framework-F5-download-emulator"
|
||||||
|
target="_blank">Download the Emulator</a></div>
|
||||||
|
<div class="main-text">Visit <a class="ctaLink" href="https://aka.ms/bot-framework-F5-abs-home" target="_blank">Azure
|
||||||
|
Bot Service</a> to register your bot and add it to<br />
|
||||||
|
various channels. The bot's endpoint URL typically looks
|
||||||
|
like this:</div>
|
||||||
|
<div class="endpoint">https://<i>your_bots_hostname</i>/api/messages</div>
|
||||||
|
</div>
|
||||||
|
<div class="column how-to-iframe" id="how-to-iframe"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="ms-logo-container">
|
||||||
|
<div class="ms-logo"></div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -1,21 +0,0 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>netcoreapp2.0</TargetFramework>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Folder Include="Dialogs\" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
|
|
||||||
<PackageReference Include="Microsoft.Bot.Connector.AspNetCore" Version="2.0.0.8" />
|
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.2" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.2" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
|
@ -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<OkResult> 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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<string> 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)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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<Startup>()
|
|
||||||
.Build();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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<FacetResult> FetchFacets()
|
|
||||||
{
|
|
||||||
using (var httpClient = new HttpClient())
|
|
||||||
{
|
|
||||||
string facetQuey = $"{QueryString}facet=Category";
|
|
||||||
string response = await httpClient.GetStringAsync(facetQuey);
|
|
||||||
return JsonConvert.DeserializeObject<FacetResult>(response);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<SearchResult> 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<SearchResult>(response);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<SearchResult> 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<SearchResult>(response);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
{
|
|
||||||
"Logging": {
|
|
||||||
"IncludeScopes": false,
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Debug",
|
|
||||||
"System": "Information",
|
|
||||||
"Microsoft": "Information"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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": ""
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Contoso Chat Bot</title>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
</head>
|
|
||||||
<body style="font-family:'Segoe UI'">
|
|
||||||
<h1>Contoso Luis Bot</h1>
|
|
||||||
<p>A bot that shows how to handle natural language using the Cognitive Services LUIS API with Azure Search to look for Jobs. </p>
|
|
||||||
<p>Here are some handy links to get started:</p>
|
|
||||||
<p>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-overview">Get started building bots with .NET.</a></li>
|
|
||||||
<li><a href="https://docs.microsoft.com/en-us/bot-framework/cognitive-services-bot-intelligence-overview#language-understanding">Learn more about LUIS and the Cognitive Services.</a></li>
|
|
||||||
<li><a href="https://www.luis.ai">Visit the LUIS portal.</a></li>
|
|
||||||
<li><a href="https://docs.microsoft.com/en-us/bot-framework/azure/azure-bot-service-continuous-deployment#set-up-continuous-deployment">Get the bot code and setup continuous deployment.</a></li>
|
|
||||||
<li><a href="https://docs.microsoft.com/en-us/bot-framework/debug-bots-emulator">Debug your bot.</a></li>
|
|
||||||
</ul>
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,2 +0,0 @@
|
||||||
[config]
|
|
||||||
command = deploy.cmd
|
|
|
@ -1,6 +0,0 @@
|
||||||
obj/
|
|
||||||
bin/
|
|
||||||
packages/
|
|
||||||
*.pubxml.user
|
|
||||||
*.csproj.user
|
|
||||||
.vs/
|
|
|
@ -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 }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,258 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(SolutionDir)\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('$(SolutionDir)\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
|
|
||||||
<Import Project="$(SolutionDir)\packages\Microsoft.Net.Compilers.1.2.1\build\Microsoft.Net.Compilers.props" Condition="Exists('$(SolutionDir)\packages\Microsoft.Net.Compilers.1.2.1\build\Microsoft.Net.Compilers.props')" />
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProductVersion>
|
|
||||||
</ProductVersion>
|
|
||||||
<SchemaVersion>2.0</SchemaVersion>
|
|
||||||
<ProjectGuid>{9C7E3A46-B60F-4052-9A21-DC8D1A942216}</ProjectGuid>
|
|
||||||
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
|
|
||||||
<OutputType>Library</OutputType>
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>LuisBot</RootNamespace>
|
|
||||||
<AssemblyName>LuisBot</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
|
|
||||||
<UseIISExpress>true</UseIISExpress>
|
|
||||||
<IISExpressSSLPort />
|
|
||||||
<IISExpressAnonymousAuthentication />
|
|
||||||
<IISExpressWindowsAuthentication />
|
|
||||||
<IISExpressUseClassicPipelineMode />
|
|
||||||
<UseGlobalApplicationHostFile />
|
|
||||||
<NuGetPackageImportStamp>
|
|
||||||
</NuGetPackageImportStamp>
|
|
||||||
<TargetFrameworkProfile />
|
|
||||||
<Use64BitIISExpress />
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<NoWarn>CS1998</NoWarn>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<NoWarn>CS1998</NoWarn>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="AdaptiveCards, Version=0.5.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.AdaptiveCards.0.5.1\lib\net452\AdaptiveCards.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Autofac, Version=3.5.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Autofac.3.5.2\lib\net40\Autofac.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Chronic, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3bd1f1ef638b0d3c, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Chronic.Signed.0.3.2\lib\net40\Chronic.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.Azure.Documents.Client, Version=1.11.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.Azure.DocumentDB.1.11.0\lib\net45\Microsoft.Azure.Documents.Client.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.Azure.KeyVault.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.Azure.KeyVault.Core.1.0.0\lib\net40\Microsoft.Azure.KeyVault.Core.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.Bot.Builder, Version=3.13.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\Microsoft.Bot.Builder.3.13.1\lib\net46\Microsoft.Bot.Builder.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.Bot.Builder.Autofac, Version=3.13.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\Microsoft.Bot.Builder.3.13.1\lib\net46\Microsoft.Bot.Builder.Autofac.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.Bot.Builder.Azure, Version=3.2.5.0, Culture=neutral, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.Bot.Builder.Azure.3.2.5\lib\net46\Microsoft.Bot.Builder.Azure.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.Bot.Builder.History, Version=3.13.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\Microsoft.Bot.Builder.History.3.13.1\lib\net46\Microsoft.Bot.Builder.History.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.Bot.Connector, Version=3.13.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\..\packages\Microsoft.Bot.Connector.3.13.1\lib\net46\Microsoft.Bot.Connector.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
<Reference Include="Microsoft.Data.Edm, Version=5.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.Data.Edm.5.6.4\lib\net40\Microsoft.Data.Edm.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.Data.OData, Version=5.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.Data.OData.5.6.4\lib\net40\Microsoft.Data.OData.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.Data.Services.Client, Version=5.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.Data.Services.Client.5.6.4\lib\net40\Microsoft.Data.Services.Client.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.IdentityModel.Logging, Version=1.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.IdentityModel.Logging.1.1.4\lib\net451\Microsoft.IdentityModel.Logging.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.IdentityModel.Protocol.Extensions, Version=1.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\lib\net45\Microsoft.IdentityModel.Protocol.Extensions.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.IdentityModel.Protocols, Version=2.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.IdentityModel.Protocols.2.1.4\lib\net451\Microsoft.IdentityModel.Protocols.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect, Version=2.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.2.1.4\lib\net451\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.IdentityModel.Tokens, Version=5.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.IdentityModel.Tokens.5.1.4\lib\net451\Microsoft.IdentityModel.Tokens.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.Rest.ClientRuntime.2.3.2\lib\net45\Microsoft.Rest.ClientRuntime.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.WindowsAzure.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.WindowsAzure.ConfigurationManager.3.2.1\lib\net40\Microsoft.WindowsAzure.Configuration.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Microsoft.WindowsAzure.Storage, Version=7.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\WindowsAzure.Storage.7.2.1\lib\net40\Microsoft.WindowsAzure.Storage.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="System.IdentityModel.Tokens.Jwt, Version=5.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\System.IdentityModel.Tokens.Jwt.5.1.4\lib\net451\System.IdentityModel.Tokens.Jwt.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Net" />
|
|
||||||
<Reference Include="System.Net.Http" />
|
|
||||||
<Reference Include="System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Net.Http.WebRequest" />
|
|
||||||
<Reference Include="System.Runtime.Serialization" />
|
|
||||||
<Reference Include="System.Spatial, Version=5.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\System.Spatial.5.6.4\lib\net40\System.Spatial.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Web.DynamicData" />
|
|
||||||
<Reference Include="System.Web.Entity" />
|
|
||||||
<Reference Include="System.Web.ApplicationServices" />
|
|
||||||
<Reference Include="System.ComponentModel.DataAnnotations" />
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Web.Extensions" />
|
|
||||||
<Reference Include="System.Drawing" />
|
|
||||||
<Reference Include="System.Web" />
|
|
||||||
<Reference Include="System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<HintPath>$(SolutionDir)\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll</HintPath>
|
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
<Reference Include="System.Configuration" />
|
|
||||||
<Reference Include="System.Web.Services" />
|
|
||||||
<Reference Include="System.EnterpriseServices" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="default.htm" />
|
|
||||||
<Content Include="Global.asax" />
|
|
||||||
<Content Include="Web.config">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</Content>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="App_Start\WebApiConfig.cs" />
|
|
||||||
<Compile Include="Definitions\ServiceEntities.cs" />
|
|
||||||
<Compile Include="Dialogs\BasicLuisDialog.cs" />
|
|
||||||
<Compile Include="Controllers\MessagesController.cs" />
|
|
||||||
<Compile Include="Dialogs\SearchServiceDialog.cs" />
|
|
||||||
<Compile Include="Global.asax.cs">
|
|
||||||
<DependentUpon>Global.asax</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Models\JobModel.cs" />
|
|
||||||
<Compile Include="Models\SearchResultModel.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="Services\AzureSearchService.cs" />
|
|
||||||
<Compile Include="Utils\CardUtil.cs" />
|
|
||||||
<Compile Include="Utils\JobModelExtension.cs" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="packages.config" />
|
|
||||||
<None Include="Properties\PublishProfiles\contosomaintenance-bot - FTP.pubxml" />
|
|
||||||
<None Include="Properties\PublishProfiles\contosomaintenance-bot - Web Deploy.pubxml" />
|
|
||||||
<None Include="Web.Debug.config">
|
|
||||||
<DependentUpon>Web.config</DependentUpon>
|
|
||||||
</None>
|
|
||||||
<None Include="Web.Release.config">
|
|
||||||
<DependentUpon>Web.config</DependentUpon>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup />
|
|
||||||
<PropertyGroup>
|
|
||||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
|
||||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup>
|
|
||||||
<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
|
||||||
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
|
|
||||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
|
|
||||||
<ProjectExtensions>
|
|
||||||
<VisualStudio>
|
|
||||||
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
|
|
||||||
<WebProjectProperties>
|
|
||||||
<UseIIS>True</UseIIS>
|
|
||||||
<AutoAssignPort>True</AutoAssignPort>
|
|
||||||
<DevelopmentServerPort>3978</DevelopmentServerPort>
|
|
||||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
|
||||||
<IISUrl>http://localhost:3984/</IISUrl>
|
|
||||||
<NTLMAuthentication>False</NTLMAuthentication>
|
|
||||||
<UseCustomServer>False</UseCustomServer>
|
|
||||||
<CustomServerUrl>
|
|
||||||
</CustomServerUrl>
|
|
||||||
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
|
|
||||||
</WebProjectProperties>
|
|
||||||
</FlavorProperties>
|
|
||||||
</VisualStudio>
|
|
||||||
</ProjectExtensions>
|
|
||||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
|
||||||
<PropertyGroup>
|
|
||||||
<ErrorText>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}.</ErrorText>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Error Condition="!Exists('$(SolutionDir)\packages\Microsoft.Net.Compilers.1.2.1\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\Microsoft.Net.Compilers.1.2.1\build\Microsoft.Net.Compilers.props'))" />
|
|
||||||
<Error Condition="!Exists('$(SolutionDir)\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />
|
|
||||||
<Error Condition="!Exists('$(SolutionDir)\packages\Microsoft.Azure.DocumentDB.1.11.0\build\Microsoft.Azure.DocumentDB.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\Microsoft.Azure.DocumentDB.1.11.0\build\Microsoft.Azure.DocumentDB.targets'))" />
|
|
||||||
</Target>
|
|
||||||
<Import Project="$(SolutionDir)\packages\Microsoft.Azure.DocumentDB.1.11.0\build\Microsoft.Azure.DocumentDB.targets" Condition="Exists('$(SolutionDir)\packages\Microsoft.Azure.DocumentDB.1.11.0\build\Microsoft.Azure.DocumentDB.targets')" />
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
|
||||||
<Target Name="BeforeBuild">
|
|
||||||
</Target>
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
</Target>
|
|
||||||
-->
|
|
||||||
<Import Project="PostDeployScripts\IncludeSources.targets" Condition="Exists('PostDeployScripts\IncludeSources.targets')" />
|
|
||||||
<Import Project="..\PostDeployScripts\IncludeSources.targets" Condition="Exists('..\PostDeployScripts\IncludeSources.targets')" />
|
|
||||||
</Project>
|
|
|
@ -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
|
|
|
@ -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
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// POST: api/Messages
|
|
||||||
/// receive a message from a user and send replies
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="activity"></param>
|
|
||||||
[ResponseType(typeof(void))]
|
|
||||||
public virtual async Task<HttpResponseMessage> 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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<object>
|
|
||||||
{
|
|
||||||
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<IMessageActivity> 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<object>;
|
|
||||||
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<object> result)
|
|
||||||
{
|
|
||||||
var messageHandled = (string)await result;
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(messageHandled))
|
|
||||||
{
|
|
||||||
context.Done(messageHandled);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
context.Done<object>(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<object>
|
|
||||||
{
|
|
||||||
readonly AzureSearchService searchService = new AzureSearchService();
|
|
||||||
|
|
||||||
public async Task StartAsync(IDialogContext context)
|
|
||||||
{
|
|
||||||
context.Wait(this.MessageReceivedAsync);
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> 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<Attachment> foundItems = new List<Attachment>();
|
|
||||||
|
|
||||||
//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<object>(null);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await context.PostAsync($"Sorry! I couldn't find anything that matched the search '{model.SearchTerm}'");
|
|
||||||
context.Done<object>(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async Task AfterDialog(IDialogContext context, IAwaitable<object> result)
|
|
||||||
{
|
|
||||||
var messageHandled = (string)await result;
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(messageHandled))
|
|
||||||
{
|
|
||||||
context.Done(messageHandled);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
context.Done<object>(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"]
|
|
|
@ -1 +0,0 @@
|
||||||
<%@ Application CodeBehind="Global.asax.cs" Inherits="SimpleEchoBot.WebApiApplication" Language="C#" %>
|
|
|
@ -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<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
|
|
||||||
.AsSelf()
|
|
||||||
.SingleInstance();
|
|
||||||
|
|
||||||
});
|
|
||||||
GlobalConfiguration.Configure(WebApiConfig.Register);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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>(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>(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
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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; }
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<CoreCompileDependsOn>$(CoreCompileDependsOn);IncludeSource</CoreCompileDependsOn>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Target Name="IncludeSource">
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="**\*.cs" />
|
|
||||||
<Content Include="**\*.csproj" />
|
|
||||||
<Content Include="PostDeployScripts\*.*" />
|
|
||||||
</ItemGroup>
|
|
||||||
</Target>
|
|
||||||
</Project>
|
|
|
@ -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
|
|
||||||
}
|
|
|
@ -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
|
|
|
@ -1,3 +0,0 @@
|
||||||
nuget restore
|
|
||||||
msbuild {SOLUTION_NAME} -p:DeployOnBuild=true -p:PublishProfile={PUBLISH_PROFILE} -p:Password={PASSWORD}
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
This file is used by the publish/package process of your Web project. You can customize the behavior of this process
|
|
||||||
by editing this MSBuild file. In order to learn more about this please visit https://go.microsoft.com/fwlink/?LinkID=208121.
|
|
||||||
-->
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<PropertyGroup>
|
|
||||||
<WebPublishMethod>MSDeploy</WebPublishMethod>
|
|
||||||
<PublishProvider>AzureWebSite</PublishProvider>
|
|
||||||
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
|
|
||||||
<LastUsedPlatform>Any CPU</LastUsedPlatform>
|
|
||||||
<SiteUrlToLaunchAfterPublish>http://{WEB_SITE_NAME}.azurewebsites.net</SiteUrlToLaunchAfterPublish>
|
|
||||||
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
|
|
||||||
<ExcludeApp_Data>False</ExcludeApp_Data>
|
|
||||||
<MSDeployServiceURL>{WEB_SITE_NAME}.scm.azurewebsites.net:443</MSDeployServiceURL>
|
|
||||||
<DeployIisAppPath>{WEB_SITE_NAME}</DeployIisAppPath>
|
|
||||||
<RemoteSitePhysicalPath />
|
|
||||||
<SkipExtraFilesOnServer>True</SkipExtraFilesOnServer>
|
|
||||||
<MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
|
|
||||||
<EnableMSDeployBackup>True</EnableMSDeployBackup>
|
|
||||||
<UserName>${WEB_SITE_NAME}</UserName>
|
|
||||||
<_SavePWD>True</_SavePWD>
|
|
||||||
<_DestinationType>AzureWebSite</_DestinationType>
|
|
||||||
</PropertyGroup>
|
|
||||||
</Project>
|
|
|
@ -1,15 +0,0 @@
|
||||||
<publishData>
|
|
||||||
<publishProfile profileName="{WEB_SITE_NAME}-Web-Deploy"
|
|
||||||
publishMethod="MSDeploy"
|
|
||||||
publishUrl="{WEB_SITE_NAME}.scm.azurewebsites.net:443"
|
|
||||||
msdeploySite="{WEB_SITE_NAME}" userName="${WEB_SITE_NAME}"
|
|
||||||
userPWD="{PASSWORD}"
|
|
||||||
destinationAppUrl="http://{WEB_SITE_NAME}.azurewebsites.net"
|
|
||||||
SQLServerDBConnectionString=""
|
|
||||||
mySQLDBConnectionString=""
|
|
||||||
hostingProviderForumLink=""
|
|
||||||
controlPanelLink="http://windows.azure.com"
|
|
||||||
webSystem="WebSites">
|
|
||||||
<databases />
|
|
||||||
</publishProfile>
|
|
||||||
</publishData>
|
|
|
@ -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
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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")]
|
|
|
@ -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<FacetResult> FetchFacets()
|
|
||||||
{
|
|
||||||
using (var httpClient = new HttpClient())
|
|
||||||
{
|
|
||||||
string facetQuey = $"{QueryString}facet=Category";
|
|
||||||
string response = await httpClient.GetStringAsync(facetQuey);
|
|
||||||
return JsonConvert.DeserializeObject<FacetResult>(response);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Although this method is not used, but it show a nice demo of wide search of the index
|
|
||||||
//public async Task<SearchResult> 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<SearchResult>(response);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
public async Task<SearchResult> 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<SearchResult>(response);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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<CardImage>()
|
|
||||||
{
|
|
||||||
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<CardAction>()
|
|
||||||
//{
|
|
||||||
// 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<CardElement> {
|
|
||||||
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<ActionBase>
|
|
||||||
//{
|
|
||||||
// new OpenUrlAction{Title = "View Job", Url=value.id}
|
|
||||||
//}
|
|
||||||
|
|
||||||
return card;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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>(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>(JobModel.ID, model);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void ClearContextData(IDialogContext context)
|
|
||||||
{
|
|
||||||
context.ConversationData.RemoveValue(JobModel.ID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
|
|
||||||
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
|
|
||||||
|
|
||||||
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
|
|
||||||
<!--
|
|
||||||
In the example below, the "SetAttributes" transform will change the value of
|
|
||||||
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
|
|
||||||
finds an attribute "name" that has a value of "MyDB".
|
|
||||||
|
|
||||||
<connectionStrings>
|
|
||||||
<add name="MyDB"
|
|
||||||
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
|
|
||||||
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
|
|
||||||
</connectionStrings>
|
|
||||||
-->
|
|
||||||
<system.web>
|
|
||||||
<!--
|
|
||||||
In the example below, the "Replace" transform will replace the entire
|
|
||||||
<customErrors> section of your web.config file.
|
|
||||||
Note that because there is only one customErrors section under the
|
|
||||||
<system.web> node, there is no need to use the "xdt:Locator" attribute.
|
|
||||||
|
|
||||||
<customErrors defaultRedirect="GenericError.htm"
|
|
||||||
mode="RemoteOnly" xdt:Transform="Replace">
|
|
||||||
<error statusCode="500" redirect="InternalError.htm"/>
|
|
||||||
</customErrors>
|
|
||||||
-->
|
|
||||||
</system.web>
|
|
||||||
</configuration>
|
|
|
@ -1,31 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
|
|
||||||
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
|
|
||||||
|
|
||||||
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
|
|
||||||
<!--
|
|
||||||
In the example below, the "SetAttributes" transform will change the value of
|
|
||||||
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
|
|
||||||
finds an attribute "name" that has a value of "MyDB".
|
|
||||||
|
|
||||||
<connectionStrings>
|
|
||||||
<add name="MyDB"
|
|
||||||
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
|
|
||||||
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
|
|
||||||
</connectionStrings>
|
|
||||||
-->
|
|
||||||
<system.web>
|
|
||||||
<compilation xdt:Transform="RemoveAttributes(debug)" />
|
|
||||||
<!--
|
|
||||||
In the example below, the "Replace" transform will replace the entire
|
|
||||||
<customErrors> section of your web.config file.
|
|
||||||
Note that because there is only one customErrors section under the
|
|
||||||
<system.web> node, there is no need to use the "xdt:Locator" attribute.
|
|
||||||
|
|
||||||
<customErrors defaultRedirect="GenericError.htm"
|
|
||||||
mode="RemoteOnly" xdt:Transform="Replace">
|
|
||||||
<error statusCode="500" redirect="InternalError.htm"/>
|
|
||||||
</customErrors>
|
|
||||||
-->
|
|
||||||
</system.web>
|
|
||||||
</configuration>
|
|
|
@ -1,119 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
For more information on how to configure your ASP.NET application, please visit
|
|
||||||
http://go.microsoft.com/fwlink/?LinkId=301879
|
|
||||||
-->
|
|
||||||
<configuration>
|
|
||||||
<configSections>
|
|
||||||
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
|
|
||||||
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
|
|
||||||
</configSections>
|
|
||||||
<appSettings>
|
|
||||||
<!-- update these with your Microsoft App Id and your Microsoft App Password-->
|
|
||||||
<add key="MicrosoftAppId" value="YOURS" />
|
|
||||||
<add key="MicrosoftAppPassword" value="YOURS" />
|
|
||||||
<add key="SearchName" value="YOURS" />
|
|
||||||
<add key="IndexName" value="YOURS-index" />
|
|
||||||
<add key="SearchKey" value="YOURS" />
|
|
||||||
<add key="LuisAppId" value="YOURS" />
|
|
||||||
<add key="LuisAPIKey" value="YOURS" />
|
|
||||||
<add key="LuisAPIHostName" value="YOURS" />
|
|
||||||
<add key="AzureWebJobsStorage" value="YOURS" />
|
|
||||||
<add key="BotCardsBlobStorageURL" value="YOURS" />
|
|
||||||
</appSettings>
|
|
||||||
<!--
|
|
||||||
For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.
|
|
||||||
|
|
||||||
The following attributes can be set on the <httpRuntime> tag.
|
|
||||||
<system.Web>
|
|
||||||
<httpRuntime targetFramework="4.6" />
|
|
||||||
</system.Web>
|
|
||||||
-->
|
|
||||||
<system.web>
|
|
||||||
<customErrors mode="Off" />
|
|
||||||
<compilation debug="true" targetFramework="4.6" />
|
|
||||||
<httpRuntime targetFramework="4.6" />
|
|
||||||
</system.web>
|
|
||||||
<system.webServer>
|
|
||||||
<defaultDocument>
|
|
||||||
<files>
|
|
||||||
<clear />
|
|
||||||
<add value="default.htm" />
|
|
||||||
</files>
|
|
||||||
</defaultDocument>
|
|
||||||
<handlers>
|
|
||||||
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
|
|
||||||
<remove name="OPTIONSVerbHandler" />
|
|
||||||
<remove name="TRACEVerbHandler" />
|
|
||||||
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
|
|
||||||
</handlers>
|
|
||||||
</system.webServer>
|
|
||||||
<runtime>
|
|
||||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
|
|
||||||
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
|
|
||||||
<bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
|
|
||||||
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
|
||||||
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
|
||||||
<bindingRedirect oldVersion="0.0.0.0-4.2.29.0" newVersion="4.2.29.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
|
|
||||||
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral" />
|
|
||||||
<bindingRedirect oldVersion="0.0.0.0-5.1.4.0" newVersion="5.1.4.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="Microsoft.Bot.Connector" publicKeyToken="31bf3856ad364e35" culture="neutral" />
|
|
||||||
<bindingRedirect oldVersion="0.0.0.0-3.13.1.0" newVersion="3.13.1.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="Microsoft.Bot.Builder" publicKeyToken="31bf3856ad364e35" culture="neutral" />
|
|
||||||
<bindingRedirect oldVersion="0.0.0.0-3.13.1.0" newVersion="3.13.1.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="Microsoft.Azure.Documents.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" />
|
|
||||||
<bindingRedirect oldVersion="0.0.0.0-1.11.0.0" newVersion="1.11.0.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="Microsoft.Bot.Builder.History" publicKeyToken="31bf3856ad364e35" culture="neutral" />
|
|
||||||
<bindingRedirect oldVersion="0.0.0.0-3.13.1.0" newVersion="3.13.1.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="Microsoft.Bot.Builder.Autofac" publicKeyToken="31bf3856ad364e35" culture="neutral" />
|
|
||||||
<bindingRedirect oldVersion="0.0.0.0-3.13.1.0" newVersion="3.13.1.0" />
|
|
||||||
</dependentAssembly>
|
|
||||||
</assemblyBinding>
|
|
||||||
</runtime>
|
|
||||||
<system.codedom>
|
|
||||||
<compilers>
|
|
||||||
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
|
|
||||||
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
|
|
||||||
</compilers>
|
|
||||||
</system.codedom>
|
|
||||||
<entityFramework>
|
|
||||||
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
|
|
||||||
<parameters>
|
|
||||||
<parameter value="mssqllocaldb" />
|
|
||||||
</parameters>
|
|
||||||
</defaultConnectionFactory>
|
|
||||||
<providers>
|
|
||||||
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
|
|
||||||
</providers>
|
|
||||||
</entityFramework>
|
|
||||||
</configuration>
|
|
|
@ -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
|
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Contoso Chat Bot</title>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
</head>
|
|
||||||
<body style="font-family:'Segoe UI'">
|
|
||||||
<h1>Contoso Luis Bot</h1>
|
|
||||||
<p>A bot that shows how to handle natural language using the Cognitive Services LUIS API with Azure Search to look for Jobs. </p>
|
|
||||||
<p>Here are some handy links to get started:</p>
|
|
||||||
<p>
|
|
||||||
<ul>
|
|
||||||
<li><a href="https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-overview">Get started building bots with .NET.</a></li>
|
|
||||||
<li><a href="https://docs.microsoft.com/en-us/bot-framework/cognitive-services-bot-intelligence-overview#language-understanding">Learn more about LUIS and the Cognitive Services.</a></li>
|
|
||||||
<li><a href="https://www.luis.ai">Visit the LUIS portal.</a></li>
|
|
||||||
<li><a href="https://docs.microsoft.com/en-us/bot-framework/azure/azure-bot-service-continuous-deployment#set-up-continuous-deployment">Get the bot code and setup continuous deployment.</a></li>
|
|
||||||
<li><a href="https://docs.microsoft.com/en-us/bot-framework/debug-bots-emulator">Debug your bot.</a></li>
|
|
||||||
</ul>
|
|
||||||
</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -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.
|
|
|
@ -1,34 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<packages>
|
|
||||||
<package id="Autofac" version="3.5.2" targetFramework="net46" />
|
|
||||||
<package id="Chronic.Signed" version="0.3.2" targetFramework="net46" />
|
|
||||||
<package id="EntityFramework" version="6.1.3" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.AdaptiveCards" version="0.5.1" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.Azure.DocumentDB" version="1.11.0" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.Azure.KeyVault.Core" version="1.0.0" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.Bot.Builder" version="3.13.1" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.Bot.Builder.Azure" version="3.2.5" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.Bot.Builder.History" version="3.13.1" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.Bot.Connector" version="3.13.1" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.1" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.CSharp" version="4.3.0" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.Data.Edm" version="5.6.4" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.Data.OData" version="5.6.4" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.Data.Services.Client" version="5.6.4" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.IdentityModel.Logging" version="1.1.4" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.IdentityModel.Protocol.Extensions" version="1.0.4.403061554" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.IdentityModel.Protocols" version="2.1.4" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="2.1.4" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.IdentityModel.Tokens" version="5.1.4" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.Net.Compilers" version="1.2.1" targetFramework="net46" developmentDependency="true" />
|
|
||||||
<package id="Microsoft.Rest.ClientRuntime" version="2.3.2" targetFramework="net46" />
|
|
||||||
<package id="Microsoft.WindowsAzure.ConfigurationManager" version="3.2.1" targetFramework="net46" />
|
|
||||||
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net46" />
|
|
||||||
<package id="System.IdentityModel.Tokens.Jwt" version="5.1.4" targetFramework="net46" />
|
|
||||||
<package id="System.Spatial" version="5.6.4" targetFramework="net46" />
|
|
||||||
<package id="WindowsAzure.Storage" version="7.2.1" targetFramework="net46" />
|
|
||||||
</packages>
|
|
|
@ -6,13 +6,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebAPI", "WebAPI", "{9F0FD8
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile", "Mobile", "{A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile", "Mobile", "{A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}"
|
||||||
EndProject
|
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}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{F9802EBB-7857-4380-B1AD-F4CDE60F43F2}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platforms", "Platforms", "{ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platforms", "Platforms", "{ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC}"
|
||||||
EndProject
|
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
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Functions", "Functions", "{A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Functions", "Functions", "{A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA}"
|
||||||
EndProject
|
EndProject
|
||||||
|
@ -20,15 +18,17 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.Droid",
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.iOS", "Mobile\iOS\ContosoFieldService.iOS.csproj", "{E2745280-BDD1-4F5D-B976-199B9AA7602C}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.iOS", "Mobile\iOS\ContosoFieldService.iOS.csproj", "{E2745280-BDD1-4F5D-B976-199B9AA7602C}"
|
||||||
EndProject
|
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
|
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
|
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
|
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
|
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
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
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|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.ActiveCfg = Test Cloud|iPhoneSimulator
|
||||||
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|iPhoneSimulator.Build.0 = 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
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.DebugBackend|iPhone.Build.0 = Debug|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|iPhone.Build.0 = Debug|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Release|Any CPU.Build.0 = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Release|iPhone.ActiveCfg = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Test Cloud|iPhone.Build.0 = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|iPhone.Build.0 = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
{61BFA852-2AAC-42BB-9073-B8857D45FE3A}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.DebugBackend|iPhone.Build.0 = Debug|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|iPhone.Build.0 = Debug|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Release|Any CPU.Build.0 = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Release|iPhone.ActiveCfg = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Test Cloud|iPhone.Build.0 = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|iPhone.Build.0 = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
|
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.DebugBackend|iPhone.Build.0 = Debug|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|iPhone.Build.0 = Debug|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Release|Any CPU.Build.0 = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Release|iPhone.ActiveCfg = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Test Cloud|iPhone.Build.0 = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|iPhone.Build.0 = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|iPhone.Build.0 = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.DebugBackend|iPhone.Build.0 = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|iPhone.Build.0 = Debug|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|Any CPU.Build.0 = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|iPhone.ActiveCfg = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|iPhone.Build.0 = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|iPhone.Build.0 = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|Any CPU.Build.0 = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Test Cloud|iPhone.Build.0 = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|iPhone.Build.0 = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
|
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(NestedProjects) = preSolution
|
GlobalSection(NestedProjects) = preSolution
|
||||||
{FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A} = {A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}
|
{F9802EBB-7857-4380-B1AD-F4CDE60F43F2} = {A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}
|
||||||
{F9802EBB-7857-4380-B1AD-F4CDE60F43F2} = {FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A}
|
{ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC} = {A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}
|
||||||
{ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC} = {FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A}
|
{8D50D622-6D39-4894-B679-BB60C5D60648} = {A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}
|
||||||
{8D50D622-6D39-4894-B679-BB60C5D60648} = {FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A}
|
|
||||||
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C} = {ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC}
|
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C} = {ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC}
|
||||||
{E2745280-BDD1-4F5D-B976-199B9AA7602C} = {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}
|
{4D37B422-71A1-41EC-A389-7FC1D3D76F40} = {9F0FD859-1134-4C77-99E5-83703A2DE5A2}
|
||||||
{0980AA2E-1C59-4AD4-A8B4-C38C8676F323} = {A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA}
|
{32E514F2-5855-4301-A6EC-387B6BED09B7} = {F9802EBB-7857-4380-B1AD-F4CDE60F43F2}
|
||||||
{B6E498F2-60A4-44BE-B4D9-D8D2F953066D} = {F9802EBB-7857-4380-B1AD-F4CDE60F43F2}
|
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3} = {A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA}
|
||||||
{9C7E3A46-B60F-4052-9A21-DC8D1A942216} = {140A5FB1-CD49-4998-8196-74EF067452B3}
|
{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
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {60FF5FF1-44FA-4082-8169-95F16F23BE13}
|
SolutionGuid = {60FF5FF1-44FA-4082-8169-95F16F23BE13}
|
||||||
|
@ -275,53 +277,5 @@ Global
|
||||||
$0.DotNetNamingPolicy = $1
|
$0.DotNetNamingPolicy = $1
|
||||||
$1.DirectoryNamespaceAssociation = PrefixedHierarchical
|
$1.DirectoryNamespaceAssociation = PrefixedHierarchical
|
||||||
$0.TextStylePolicy = $20
|
$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
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
|
@ -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.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.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.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.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.always = global::ContosoFieldService.Droid.Resource.Id.always;
|
||||||
global::Microsoft.Identity.Client.Resource.Id.async = global::ContosoFieldService.Droid.Resource.Id.async;
|
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.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.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.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_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_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;
|
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
|
// aapt resource value: 0x7f0d0024
|
||||||
public const int adjust_width = 2131558436;
|
public const int adjust_width = 2131558436;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0d00f7
|
|
||||||
public const int agentWebView = 2131558647;
|
|
||||||
|
|
||||||
// aapt resource value: 0x7f0d0098
|
// aapt resource value: 0x7f0d0098
|
||||||
public const int alertTitle = 2131558552;
|
public const int alertTitle = 2131558552;
|
||||||
|
|
||||||
|
@ -7714,8 +7708,8 @@ namespace ContosoFieldService.Droid
|
||||||
// aapt resource value: 0x7f0d001d
|
// aapt resource value: 0x7f0d001d
|
||||||
public const int lottie_layer_name = 2131558429;
|
public const int lottie_layer_name = 2131558429;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0d00f9
|
// aapt resource value: 0x7f0d00f8
|
||||||
public const int masked = 2131558649;
|
public const int masked = 2131558648;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0d003f
|
// aapt resource value: 0x7f0d003f
|
||||||
public const int match_global_nicknames = 2131558463;
|
public const int match_global_nicknames = 2131558463;
|
||||||
|
@ -8110,8 +8104,8 @@ namespace ContosoFieldService.Droid
|
||||||
// aapt resource value: 0x7f0d0016
|
// aapt resource value: 0x7f0d0016
|
||||||
public const int view_offset_helper = 2131558422;
|
public const int view_offset_helper = 2131558422;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0d00f8
|
// aapt resource value: 0x7f0d00f7
|
||||||
public const int visible = 2131558648;
|
public const int visible = 2131558647;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0d00d9
|
// aapt resource value: 0x7f0d00d9
|
||||||
public const int volume_item_container = 2131558617;
|
public const int volume_item_container = 2131558617;
|
||||||
|
@ -8428,9 +8422,6 @@ namespace ContosoFieldService.Droid
|
||||||
// aapt resource value: 0x7f040045
|
// aapt resource value: 0x7f040045
|
||||||
public const int vertical_viewpager = 2130968645;
|
public const int vertical_viewpager = 2130968645;
|
||||||
|
|
||||||
// aapt resource value: 0x7f040046
|
|
||||||
public const int WebAuthenticationBroker = 2130968646;
|
|
||||||
|
|
||||||
static Layout()
|
static Layout()
|
||||||
{
|
{
|
||||||
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
|
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
|
||||||
|
@ -8466,9 +8457,6 @@ namespace ContosoFieldService.Droid
|
||||||
public partial class String
|
public partial class String
|
||||||
{
|
{
|
||||||
|
|
||||||
// aapt resource value: 0x7f0a004f
|
|
||||||
public const int ApplicationName = 2131361871;
|
|
||||||
|
|
||||||
// aapt resource value: 0x7f0a0028
|
// aapt resource value: 0x7f0a0028
|
||||||
public const int abc_action_bar_home_description = 2131361832;
|
public const int abc_action_bar_home_description = 2131361832;
|
||||||
|
|
||||||
|
@ -8559,62 +8547,62 @@ namespace ContosoFieldService.Droid
|
||||||
// aapt resource value: 0x7f0a0046
|
// aapt resource value: 0x7f0a0046
|
||||||
public const int appbar_scrolling_view_behavior = 2131361862;
|
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
|
// 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
|
// 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
|
// aapt resource value: 0x7f0a0052
|
||||||
public const int appcenter_distribute_downloading_mandatory_update = 2131361874;
|
public const int appcenter_distribute_install = 2131361874;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0a0053
|
// aapt resource value: 0x7f0a0053
|
||||||
public const int appcenter_distribute_install = 2131361875;
|
public const int appcenter_distribute_install_ready_message = 2131361875;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0a0054
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// 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
|
// aapt resource value: 0x7f0a0061
|
||||||
public const int appcenter_distribute_update_failed_dialog_reinstall = 2131361889;
|
public const int appcenter_distribute_update_failed_dialog_title = 2131361889;
|
||||||
|
|
||||||
// aapt resource value: 0x7f0a0062
|
|
||||||
public const int appcenter_distribute_update_failed_dialog_title = 2131361890;
|
|
||||||
|
|
||||||
// aapt resource value: 0x7f0a0047
|
// aapt resource value: 0x7f0a0047
|
||||||
public const int bottom_sheet_behavior = 2131361863;
|
public const int bottom_sheet_behavior = 2131361863;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче