Commit f86cc0e1 authored by dasharatha.vamshi's avatar dasharatha.vamshi

agent-handoff

parent cb45c50a

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27428.2037
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IntermediatorBotSample", "IntermediatorBotSample\IntermediatorBotSample.csproj", "{C5442A0C-E1AB-4237-B069-097A470AF818}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C5442A0C-E1AB-4237-B069-097A470AF818}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C5442A0C-E1AB-4237-B069-097A470AF818}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C5442A0C-E1AB-4237-B069-097A470AF818}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C5442A0C-E1AB-4237-B069-097A470AF818}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4EAC083F-2C41-4CBF-895D-24097084BDA7}
EndGlobalSection
EndGlobal
using IntermediatorBotSample.CommandHandling;
using Microsoft.Bot;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Schema;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace IntermediatorBotSample.Bot
{
public class IntermediatorBot : IBot
{
private const string SampleUrl = "https://github.com/tompaana/intermediator-bot-sample";
public async Task OnTurnAsync(ITurnContext context, CancellationToken ct)
{
Command showOptionsCommand = new Command(Commands.ShowOptions);
await context.SendActivityAsync("text --> " + context.Activity.Text + "conv-id --> " + context.Activity.Conversation.Id);
HeroCard heroCard = new HeroCard()
{
Title = "Hello!",
Subtitle = "I am Intermediator Bot",
Text = $"My purpose is to serve as a sample on how to implement the human hand-off. Click/tap the button below or type \"{new Command(Commands.ShowOptions).ToString()}\" to see all possible commands. To learn more visit <a href=\"{SampleUrl}\">{SampleUrl}</a>.",
Buttons = new List<CardAction>()
{
new CardAction()
{
Title = "Show options",
Value = showOptionsCommand.ToString(),
Type = ActionTypes.ImBack
}
}
};
var singleton = Singleton.GetInstance();
singleton.Log("bot_message: " + "hero card displayed");
singleton.addToLog(context.Activity.Conversation.Id, "{" + DateTime.Now.ToLongTimeString().ToString() + "}" + " bot_message: " + "hero card displayed");
Activity replyActivity = context.Activity.CreateReply();
replyActivity.Attachments = new List<Attachment>() { heroCard.ToAttachment() };
await context.SendActivityAsync(replyActivity);
}
}
}
using Microsoft.Bot.Schema;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Underscore.Bot.MessageRouting.DataStore;
using Underscore.Bot.MessageRouting.Models;
namespace IntermediatorBotSample.CommandHandling
{
/// <summary>
/// The commands.
/// </summary>
public enum Commands
{
Undefined = 0,
ShowOptions,
Watch, // Adds aggregation channel
Unwatch, // Removes aggregation channel
GetRequests,
CreateRequest,
AcceptRequest,
RejectRequest,
GetHistory,
Disconnect
}
/// <summary>
/// Command representation.
/// </summary>
public class Command
{
public const string CommandKeyword = "command"; // Used if the channel does not support mentions
public const string CommandParameterAll = "*";
/// <summary>
/// The actual command such as "watch" or "unwatch".
/// </summary>
public Commands BaseCommand
{
get;
protected set;
}
/// <summary>
/// The command parameters.
/// </summary>
public IList<string> Parameters
{
get;
protected set;
}
/// <summary>
/// The bot name.
/// </summary>
public string BotName
{
get;
set;
}
/// <summary>
/// Constructor.
/// </summary>
/// <param name="baseCommand">The actual command.</param>
/// <param name="parameters">The command parameters.</param>
/// <param name="botName">The bot name (optional).</param>
public Command(Commands baseCommand, string[] parameters = null, string botName = null)
{
if (baseCommand == Commands.Undefined)
{
throw new ArgumentNullException("The base command must be defined");
}
BaseCommand = baseCommand;
if (parameters != null)
{
Parameters = parameters.ToList();
}
else
{
Parameters = new List<string>();
}
BotName = botName;
}
/// <summary>
/// Creates an accept/reject connection request command.
/// </summary>
/// <param name="connectionRequest">The connection request to accept/reject.</param>
/// <param name="doAccept">If true, will create an accept command. Reject command, if false.</param>
/// <param name="botName">The bot name (optional).</param>
/// <returns>A newly created accept/reject connection request command.</returns>
public static Command CreateAcceptOrRejectConnectionRequestCommand(
ConnectionRequest connectionRequest, bool doAccept, string botName = null)
{
ChannelAccount requestorChannelAccount =
RoutingDataManager.GetChannelAccount(connectionRequest.Requestor);
return new Command(
doAccept ? Commands.AcceptRequest : Commands.RejectRequest,
new string[] { requestorChannelAccount?.Id, connectionRequest.Requestor.Conversation?.Id },
botName);
}
/// <summary>
/// Tries to parse the given JSON string into a command object.
/// </summary>
/// <param name="commandAsJsonString">The command as JSON string.</param>
/// <returns>A newly created command instance or null, if failed to parse.</returns>
public static Command FromJson(string commandAsJsonString)
{
Command command = null;
if (!string.IsNullOrWhiteSpace(commandAsJsonString))
{
try
{
command = JsonConvert.DeserializeObject<Command>(commandAsJsonString);
}
catch (Exception)
{
}
}
return command;
}
/// <summary>
/// Serializes this object into a JSON string.
/// </summary>
/// <returns>A newly created JSON string based on this object instance.</returns>
public string ToJson()
{
return JsonConvert.SerializeObject(this);
}
/// <summary>
/// Tries to parse the given string into a command object.
/// </summary>
/// <param name="commandAsString">The command as string.</param>
/// <returns>A newly created command instance based on the string content or null, if no command found.</returns>
public static Command FromString(string commandAsString)
{
if (string.IsNullOrWhiteSpace(commandAsString))
{
return null;
}
string[] commandAsStringArray = commandAsString.Split(' ');
Command command = null;
int baseCommandIndex = -1;
for (int i = 1; i < commandAsStringArray.Length; ++i)
{
Commands baseCommand = StringToCommand(commandAsStringArray[i].Trim());
if (baseCommand != Commands.Undefined)
{
command = new Command(baseCommand);
baseCommandIndex = i;
break;
}
}
if (command != null)
{
if (baseCommandIndex == 1
&& !string.IsNullOrWhiteSpace(commandAsStringArray[baseCommandIndex - 1])
&& !commandAsStringArray[baseCommandIndex - 1].Equals(CommandKeyword))
{
command.BotName = commandAsStringArray[baseCommandIndex - 1];
command.BotName = command.BotName.Replace('@', ' ').Trim();
}
for (int i = baseCommandIndex + 1; i < commandAsStringArray.Length; ++i)
{
if (!string.IsNullOrWhiteSpace(commandAsStringArray[i]))
{
command.Parameters.Add(commandAsStringArray[i].Trim());
}
}
}
return command;
}
/// <summary>
/// For convenience.
/// Tries to parse the text content in the given message activity to a command object.
/// </summary>
/// <param name="messageActivity">The message activity whose text content to parse.</param>
/// <returns>A newly created command instance or null, if no command found.</returns>
public static Command FromMessageActivity(IMessageActivity messageActivity)
{
return FromString(messageActivity.Text?.Trim());
}
/// <summary>
/// Tries to parse the string in the channel data of the given activity to a command object.
/// </summary>
/// <param name="activity">The activity whose channel data to parse.</param>
/// <returns>A newly created command instance or null, if no command found.</returns>
public static Command FromChannelData(Activity activity)
{
return FromJson(activity.ChannelData as string);
}
public string ToString(bool addCommandKeywordOrBotName = true)
{
StringBuilder stringBuilder = new StringBuilder();
if (addCommandKeywordOrBotName)
{
if (string.IsNullOrWhiteSpace(BotName))
{
stringBuilder.Append(CommandKeyword);
}
else
{
stringBuilder.Append("@");
stringBuilder.Append(BotName);
}
stringBuilder.Append(' ');
}
stringBuilder.Append(CommandToString(BaseCommand));
if (Parameters != null && Parameters.Count > 0)
{
foreach (string parameter in Parameters)
{
stringBuilder.Append(' ');
stringBuilder.Append(parameter);
}
}
return stringBuilder.ToString();
}
public override string ToString()
{
return ToString(true);
}
/// <param name="command">The command (enum).</param>
/// <returns>The command as string.</returns>
public static string CommandToString(Commands command)
{
return command.ToString();
}
/// <param name="commandAsString">The command as string.</param>
/// <returns>The command (enum).</returns>
public static Commands StringToCommand(string commandAsString)
{
if (Enum.TryParse(commandAsString, out Commands result))
{
return result;
}
foreach (Commands command in Enum.GetValues(typeof(Commands)))
{
if (command.ToString().ToLower().Equals(commandAsString.ToLower()))
{
return command;
}
}
return Commands.Undefined;
}
}
}
This diff is collapsed.
This diff is collapsed.
using Microsoft.Bot.Schema;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
namespace IntermediatorBotSample.ConversationHistory
{
public class MessageLog
{
/// <summary>
/// The messages in the log.
/// </summary>
public IList<Activity> Activities
{
get;
private set;
}
/// <summary>
/// The user associated with this message log.
/// </summary>
public ConversationReference User
{
get;
private set;
}
/// <summary>
/// Constructor.
/// </summary>
/// <param name="user">The user associated with this message log.</param>
public MessageLog(ConversationReference user)
{
User = user;
Activities = new List<Activity>();
}
/// <summary>
/// Adds a message (an activity) to the log.
/// </summary>
/// <param name="activity">The activity to add.</param>
public void AddMessage(Activity activity)
{
Activities.Add(activity);
}
public string ToJson()
{
return JsonConvert.SerializeObject(this);
}
public static MessageLog FromJson(string messageLogAsJsonString)
{
MessageLog messageLog = null;
try
{
messageLog = JsonConvert.DeserializeObject<MessageLog>(messageLogAsJsonString);
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine($"Failed to deserialize message log: {e.Message}");
}
return messageLog;
}
}
}
using Microsoft.WindowsAzure.Storage.Table;
using System;
namespace IntermediatorBotSample.ConversationHistory
{
public class MessageLogEntity : TableEntity
{
public string Body
{
get;
set;
}
}
}
using Microsoft.Bot.Schema;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Threading.Tasks;
using Underscore.Bot.MessageRouting.DataStore;
using Underscore.Bot.MessageRouting.DataStore.Azure;
namespace IntermediatorBotSample.ConversationHistory
{
public class MessageLogs
{
private const string MessageLogsTableName = "testforagent47";
private const string PartitionKey = "IntermediatorBot";
private CloudTable _messageLogsTable;
private readonly IList<MessageLog> _inMemoryMessageLogs;
/// <summary>
/// Constructor.
/// </summary>
/// <param name="connectionString">The connection string for Azure Table Storage.</param>
public MessageLogs(string connectionString)
{
if (string.IsNullOrEmpty(connectionString))
{
System.Diagnostics.Debug.WriteLine("WARNING!!! No connection string - storing message logs in memory");
_inMemoryMessageLogs = new List<MessageLog>();
}
else
{
System.Diagnostics.Debug.WriteLine("Using Azure Table Storage for storing message logs");
_messageLogsTable = AzureStorageHelper.GetTable(connectionString, MessageLogsTableName);
MakeSureConversationHistoryTableExistsAsync().Wait();
}
}
/// <returns>All the message logs.</returns>
public IList<MessageLog> GetMessageLogs()
{
if (_messageLogsTable != null)
{
var entities = GetAllEntitiesFromTable(_messageLogsTable).Result;
return GetAllMessageLogsFromEntities(entities);
}
return _inMemoryMessageLogs;
}
/// <summary>
/// Finds the message log associated with the given user.
/// </summary>
/// <param name="user">The user whose message log to find.</param>
/// <returns>The message log of the user or null, if not found.</returns>
public MessageLog GetMessageLog(ConversationReference user)
{
var messageLogs = GetMessageLogs();
foreach (MessageLog messageLog in messageLogs)
{
if (RoutingDataManager.Match(user, messageLog.User))
{
return messageLog;
}
}
return null;
}
/// <summary>
/// Adds a message (an activity) to the log associated with the given user.
/// </summary>
/// <param name="activity">The activity to add.</param>
/// <param name="user">The user associated with the message.</param>
public void AddMessageLog(Microsoft.Bot.Schema.Activity activity, ConversationReference user)
{
if (_messageLogsTable != null)
{
// Add to AzureTable
}
else
{
// Add to InMemory storage
}
}
/// <summary>
///
/// </summary>
/// <param name="user">The user whose message log to delete.</param>
public void DeleteMessageLog(ConversationReference user)
{
// TODO
}
/// <summary>
/// Makes sure the cloud table for storing message logs exists.
/// A table is created, if one doesn't exist.
/// </summary>
private async Task MakeSureConversationHistoryTableExistsAsync()
{
try
{
await _messageLogsTable.CreateIfNotExistsAsync();
System.Diagnostics.Debug.WriteLine($"Table '{_messageLogsTable.Name}' created or did already exist");
}
catch (StorageException e)
{
System.Diagnostics.Debug.WriteLine($"Failed to create table '{_messageLogsTable.Name}' (perhaps it already exists): {e.Message}");
}
}
private async Task<IList<MessageLogEntity>> GetAllEntitiesFromTable(CloudTable table)
{
var query = new TableQuery<MessageLogEntity>()
.Where(TableQuery.GenerateFilterCondition(
"PartitionKey", QueryComparisons.Equal, PartitionKey));
return await table.ExecuteTableQueryAsync(query);
}
private IList<MessageLog> GetAllMessageLogsFromEntities(IList<MessageLogEntity> entities)
{
IList<MessageLog> messageLogs = new List<MessageLog>();
foreach (var entity in entities)
{
var messageLog = JsonConvert.DeserializeObject<MessageLog>(entity.Body);
messageLogs.Add(messageLog);
}
return messageLogs;
}
}
}
\ No newline at end of file
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Azure.Storage.Blobs" Version="12.6.0" />
<PackageReference Include="BotMessageRouting" Version="2.0.2-alpha" />
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.Bot.Builder" Version="4.2.2" />
<PackageReference Include="Microsoft.Bot.Builder.Integration.AspNet.Core" Version="4.2.2" />
<PackageReference Include="Microsoft.Bot.Configuration" Version="4.2.2" />
<PackageReference Include="Microsoft.Bot.Connector" Version="4.2.2" />
<PackageReference Include="Microsoft.Bot.Schema" Version="4.2.2" />
<PackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="2.2.0" />
<PackageReference Include="RestSharp" Version="106.11.4" />
</ItemGroup>
<ItemGroup>
<Compile Update="Resources\Strings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Strings.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Resources\Strings.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Strings.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Folder Include="Pages\" />
</ItemGroup>
</Project>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<NameOfLastUsedPublishProfile>agent-hand-off-test - Web Deploy</NameOfLastUsedPublishProfile>
</PropertyGroup>
</Project>
\ No newline at end of file
using Microsoft.Bot.Schema;
using System;
using System.Runtime.CompilerServices;
using Underscore.Bot.MessageRouting;
using Underscore.Bot.MessageRouting.Logging;
namespace IntermediatorBotSample.Logging
{
/// <summary>
/// Logger that outputs all log messages to all aggregation channel conversations.
/// </summary>
public class AggregationChannelLogger : ILogger
{
private MessageRouter _messageRouter;
public AggregationChannelLogger(MessageRouter messageRouter)
{
_messageRouter = messageRouter;
}
public async void Log(string message, [CallerMemberName] string methodName = "")
{
if (!string.IsNullOrWhiteSpace(methodName))
{
message = $"{DateTime.Now}> {methodName}: {message}";
}
bool wasSent = false;
foreach (ConversationReference aggregationChannel in
_messageRouter.RoutingDataManager.GetAggregationChannels())
{
ResourceResponse resourceResponse =
await _messageRouter.SendMessageAsync(aggregationChannel, message);
if (resourceResponse != null)
{
wasSent = true;
}
}
if (!wasSent)
{
System.Diagnostics.Debug.WriteLine(message);
}
}
}
}
using IntermediatorBotSample.Resources;
using Microsoft.Bot.Schema;
using System.Collections.Generic;
using System.Threading.Tasks;
using Underscore.Bot.MessageRouting;
using Underscore.Bot.MessageRouting.DataStore;
using Underscore.Bot.MessageRouting.Models;
using Underscore.Bot.MessageRouting.Results;
namespace IntermediatorBotSample.MessageRouting
{
/// <summary>
/// Contains utility methods for accepting and rejecting connection requests.
/// </summary>
public class ConnectionRequestHandler
{
private IList<string> _noDirectConversationsWithChannels;
/// <summary>
/// Constructor.
/// </summary>
/// <param name="noDirectConversationsWithChannels">Does not try to create direct
/// conversations when the agent is on one of the channels on this list.</param>
public ConnectionRequestHandler(IList<string> noDirectConversationsWithChannels)
{
_noDirectConversationsWithChannels = noDirectConversationsWithChannels;
}
/// <summary>
/// Tries to accept/reject a pending connection request.
/// </summary>
/// <param name="messageRouter">The message router.</param>
/// <param name="messageRouterResultHandler">The message router result handler.</param>
/// <param name="sender">The sender party (accepter/rejecter).</param>
/// <param name="doAccept">If true, will try to accept the request. If false, will reject.</param>
/// <param name="requestorChannelAccountId">The channel account ID of the user/bot whose request to accept/reject.</param>
/// <param name="requestorConversationAccountId">The conversation account ID of the user/bot whose request to accept/reject.</param>
/// <returns>The result.</returns>
public async Task<AbstractMessageRouterResult> AcceptOrRejectRequestAsync(
MessageRouter messageRouter, MessageRouterResultHandler messageRouterResultHandler,
ConversationReference sender, bool doAccept,
ChannelAccount requestorChannelAccountId, ConversationAccount requestorConversationAccountId)
{
AbstractMessageRouterResult messageRouterResult = new ConnectionRequestResult()
{
Type = ConnectionRequestResultType.Error
};
ConversationReference requestor =
new ConversationReference(
null, requestorChannelAccountId, null, requestorConversationAccountId);
ConnectionRequest connectionRequest =
messageRouter.RoutingDataManager.FindConnectionRequest(requestor);
if (connectionRequest == null)
{
// Try bot
requestor.Bot = requestor.User;
requestor.User = null;
connectionRequest =
messageRouter.RoutingDataManager.FindConnectionRequest(requestor);
}
if (connectionRequest != null)
{
Connection connection = null;
if (sender != null)
{
connection = messageRouter.RoutingDataManager.FindConnection(sender);
}
ConversationReference senderInConnection = null;
ConversationReference counterpart = null;
if (connection != null && connection.ConversationReference1 != null)
{
if (RoutingDataManager.Match(sender, connection.ConversationReference1))
{
senderInConnection = connection.ConversationReference1;
counterpart = connection.ConversationReference2;
}
else
{
senderInConnection = connection.ConversationReference2;
counterpart = connection.ConversationReference1;
}
}
if (doAccept)
{
if (senderInConnection != null)
{
// The sender (accepter/rejecter) is ALREADY connected to another party
if (counterpart != null)
{
messageRouterResult.ErrorMessage = string.Format(
Strings.AlreadyConnectedWithUser,
RoutingDataManager.GetChannelAccount(counterpart)?.Name);
}
else
{
messageRouterResult.ErrorMessage = Strings.ErrorOccured;
}
}
else
{
bool createNewDirectConversation =
(_noDirectConversationsWithChannels == null
|| !(_noDirectConversationsWithChannels.Contains(sender.ChannelId.ToLower())));
// Try to accept
messageRouterResult = await messageRouter.ConnectAsync(
sender,
connectionRequest.Requestor,
createNewDirectConversation);
}
}
else
{
// Note: Rejecting is OK even if the sender is alreay connected
messageRouterResult = messageRouter.RejectConnectionRequest(connectionRequest.Requestor, sender);
}
}
else
{
messageRouterResult.ErrorMessage = Strings.FailedToFindPendingRequest;
}
return messageRouterResult;
}
/// <summary>
/// Tries to reject all pending requests.
/// </summary>
/// <param name="messageRouter">The message router.</param>
/// <param name="messageRouterResultHandler">The message router result handler.</param>
/// <returns>True, if successful. False otherwise.</returns>
public async Task<bool> RejectAllPendingRequestsAsync(
MessageRouter messageRouter, MessageRouterResultHandler messageRouterResultHandler)
{
bool wasSuccessful = false;
IList<ConnectionRequest> connectionRequests = messageRouter.RoutingDataManager.GetConnectionRequests();
if (connectionRequests.Count > 0)
{
IList<ConnectionRequestResult> connectionRequestResults =
new List<ConnectionRequestResult>();
foreach (ConnectionRequest connectionRequest in connectionRequests)
{
connectionRequestResults.Add(
messageRouter.RejectConnectionRequest(connectionRequest.Requestor));
}
foreach (ConnectionRequestResult connectionRequestResult in connectionRequestResults)
{
await messageRouterResultHandler.HandleResultAsync(connectionRequestResult);
}
wasSuccessful = true;
}
return wasSuccessful;
}
}
}
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.Bot.Builder.Core.Extensions
{
/// <summary>
/// This piece of middleware can be added to allow you to handle exceptions when they are thrown
/// within your bot's code or middleware further down the pipeline. Using this handler you might
/// send an appropriate message to the user to let them know that something has gone wrong.
/// You can specify the type of exception the middleware should catch and this middleware can be added
/// multiple times to allow you to handle different exception types in different ways.
/// </summary>
/// <typeparam name="T">
/// The type of the exception that you want to catch. This can be 'Exception' to
/// catch all or a specific type of exception
/// </typeparam>
public class CatchExceptionMiddleware<T> : IMiddleware where T : Exception
{
private readonly Func<ITurnContext, T, Task> _handler;
public CatchExceptionMiddleware(Func<ITurnContext, T, Task> callOnException)
{
_handler = callOnException;
}
public async Task OnTurnAsync(ITurnContext context, NextDelegate next, CancellationToken cancellationToken = default(CancellationToken))
{
try
{
// Continue to route the activity through the pipeline
// any errors further down the pipeline will be caught by
// this try / catch
await next(cancellationToken).ConfigureAwait(false);
}
catch (T ex)
{
// If an error is thrown and the exception is of type T then invoke the handler
await _handler.Invoke(context, ex).ConfigureAwait(false);
}
}
}
}
using IntermediatorBotSample.CommandHandling;
using IntermediatorBotSample.ConversationHistory;
using IntermediatorBotSample.MessageRouting;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Connector.Authentication;
using Microsoft.Bot.Schema;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Underscore.Bot.MessageRouting;
using Underscore.Bot.MessageRouting.DataStore;
using Underscore.Bot.MessageRouting.DataStore.Azure;
using Underscore.Bot.MessageRouting.DataStore.Local;
using Underscore.Bot.MessageRouting.Results;
namespace IntermediatorBotSample.Middleware
{
public class HandoffMiddleware : IMiddleware
{
private const string KeyAzureTableStorageConnectionString = "AzureTableStorageConnectionString";
private const string KeyRejectConnectionRequestIfNoAggregationChannel = "RejectConnectionRequestIfNoAggregationChannel";
private const string KeyPermittedAggregationChannels = "PermittedAggregationChannels";
private const string KeyNoDirectConversationsWithChannels = "NoDirectConversationsWithChannels";
public IConfiguration Configuration
{
get;
protected set;
}
public MessageRouter MessageRouter
{
get;
protected set;
}
public MessageRouterResultHandler MessageRouterResultHandler
{
get;
protected set;
}
public CommandHandler CommandHandler
{
get;
protected set;
}
public MessageLogs MessageLogs
{
get;
protected set;
}
public HandoffMiddleware(IConfiguration configuration)
{
Configuration = configuration;
string connectionString = Configuration[KeyAzureTableStorageConnectionString];
IRoutingDataStore routingDataStore = null;
if (string.IsNullOrEmpty(connectionString))
{
System.Diagnostics.Debug.WriteLine($"WARNING!!! No connection string found - using {nameof(InMemoryRoutingDataStore)}");
routingDataStore = new InMemoryRoutingDataStore();
}
else
{
System.Diagnostics.Debug.WriteLine($"Found a connection string - using {nameof(AzureTableRoutingDataStore)}");
routingDataStore = new AzureTableRoutingDataStore(connectionString);
}
MessageRouter = new MessageRouter(
routingDataStore,
new MicrosoftAppCredentials(Configuration["MicrosoftAppId"], Configuration["MicrosoftAppPassword"]));
//MessageRouter.Logger = new Logging.AggregationChannelLogger(MessageRouter);
MessageRouterResultHandler = new MessageRouterResultHandler(MessageRouter);
ConnectionRequestHandler connectionRequestHandler =
new ConnectionRequestHandler(GetChannelList(KeyNoDirectConversationsWithChannels));
CommandHandler = new CommandHandler(
MessageRouter,
MessageRouterResultHandler,
connectionRequestHandler,
GetChannelList(KeyPermittedAggregationChannels));
MessageLogs = new MessageLogs(connectionString);
}
public async Task OnTurnAsync(ITurnContext context, NextDelegate next, CancellationToken ct)
{
Activity activity = context.Activity;
if (activity.Type is ActivityTypes.Message)
{
bool.TryParse(
Configuration[KeyRejectConnectionRequestIfNoAggregationChannel],
out bool rejectConnectionRequestIfNoAggregationChannel);
// Store the conversation references (identities of the sender and the recipient [bot])
// in the activity
MessageRouter.StoreConversationReferences(activity);
AbstractMessageRouterResult messageRouterResult = null;
// Check the activity for commands
if (await CommandHandler.HandleCommandAsync(context) == false)
{
// No command detected/handled
// Let the message router route the activity, if the sender is connected with
// another user/bot
messageRouterResult = await MessageRouter.RouteMessageIfSenderIsConnectedAsync(activity);
if (messageRouterResult is MessageRoutingResult
&& (messageRouterResult as MessageRoutingResult).Type == MessageRoutingResultType.NoActionTaken)
{
// No action was taken by the message router. This means that the user
// is not connected (in a 1:1 conversation) with a human
// (e.g. customer service agent) yet.
// Check for cry for help (agent assistance)
var singleton = Singleton.GetInstance();
if (!string.IsNullOrWhiteSpace(activity.Text)
&& activity.Text.ToLower().Contains("human"))
{
// Create a connection request on behalf of the sender
// Note that the returned result must be handled
singleton.Log( "input_message: " + context.Activity.Text);
singleton.addToLog(context.Activity.Conversation.Id, "{" + DateTime.Now.ToLongTimeString().ToString() + "}" + " input_message: " + context.Activity.Text);
await context.SendActivityAsync("text --> " + context.Activity.Text + " conv-id --> " + context.Activity.Conversation.Id);
//singleton.Log("end");
List<string> x = singleton.final_msg();
for (int i=0;i<x.Count;i++)
{
await context.SendActivityAsync("Transcript --> " + x[i].ToString());
}
messageRouterResult = MessageRouter.CreateConnectionRequest(
MessageRouter.CreateSenderConversationReference(activity),
rejectConnectionRequestIfNoAggregationChannel);
}
else
{
singleton.addconversationid(context.Activity.Conversation.Id);
singleton.Log("input_message: " + context.Activity.Text);
singleton.addToLog(context.Activity.Conversation.Id, "{" + DateTime.Now.ToLongTimeString().ToString() + "}" + " input_message: " + context.Activity.Text);
// No action taken - this middleware did not consume the activity so let it propagate
await next(ct).ConfigureAwait(false);
}
}
}
// Uncomment to see the result in a reply (may be useful for debugging)
//if (messageRouterResult != null)
//{
// await MessageRouter.ReplyToActivityAsync(activity, messageRouterResult.ToString());
//}
// Handle the result, if necessary
await MessageRouterResultHandler.HandleResultAsync(messageRouterResult);
}
else
{
// No action taken - this middleware did not consume the activity so let it propagate
await next(ct).ConfigureAwait(false);
}
}
/// <summary>
/// Extracts the channel list from the settings matching the given key.
/// </summary>
/// <returns>The list of channels or null, if none found.</returns>
private IList<string> GetChannelList(string key)
{
IList<string> channelList = null;
string channels = Configuration[key];
if (!string.IsNullOrWhiteSpace(channels))
{
System.Diagnostics.Debug.WriteLine($"Channels by key \"{key}\": {channels}");
string[] channelArray = channels.Split(',');
if (channelArray.Length > 0)
{
channelList = new List<string>();
foreach (string channel in channelArray)
{
channelList.Add(channel.Trim());
}
}
}
else
{
System.Diagnostics.Debug.WriteLine($"No channels defined by key \"{key}\" in app settings");
}
return channelList;
}
}
}
@page
@using IntermediatorBotSample.Pages
@model IndexModel
@{
}
<h1>Intermediator Bot Sample</h1>
<p>
The purpose is to serve as a sample on how to implement the human hand-off.
Visit <a href="https://github.com/tompaana/intermediator-bot-sample">https://github.com/tompaana/intermediator-bot-sample</a> to learn more.
</p>
<p>The bot endpoint URL is: <a id="botEndpointUrl" /></p>
<script>
var botEndpointUrlLink = document.getElementById("botEndpointUrl");
botEndpointUrlLink.setAttribute('href', location.protocol + "//" + location.host + "@Model.BotEndpointPath");
botEndpointUrlLink.innerHTML = location.protocol + "//" + location.host + "@Model.BotEndpointPath";
</script>
<p>The bot credentials are:</p>
<ul>
<li id="botAppId" />
<li id="botAppPassword" />
</ul>
<script>
var botAppIdItem = document.getElementById("botAppId");
botAppIdItem.innerHTML = "App ID: @Model.BotAppId";
var botAppPasswordItem = document.getElementById("botAppPassword");
botAppPasswordItem.innerHTML = "App password: @Model.BotAppPassword";
</script>
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Configuration;
namespace IntermediatorBotSample.Pages
{
public class IndexModel : PageModel
{
[BindProperty]
public string BotEndpointPath
{
get
{
return $"{Configuration["BotBasePath"]}{Configuration["BotMessagesPath"]}";
}
}
[BindProperty]
public string BotAppId
{
get
{
#if DEBUG
return Configuration["MicrosoftAppId"];
#else
return "None of your business";
#endif
}
}
[BindProperty]
public string BotAppPassword
{
get
{
#if DEBUG
return Configuration["MicrosoftAppPassword"];
#else
return "Also none of your business";
#endif
}
}
private IConfiguration Configuration
{
get;
}
public IndexModel(IConfiguration configuration)
{
Configuration = configuration;
}
public void OnGet()
{
}
}
}
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 IntermediatorBotSample
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
<?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>
<ResourceId>/subscriptions/a57571fe-3203-41d8-bd24-9fceb6f7972a/resourceGroups/rg-ppb/providers/Microsoft.Web/sites/agent-hand-off-test</ResourceId>
<ResourceGroup>rg-ppb</ResourceGroup>
<PublishProvider>AzureWebSite</PublishProvider>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish>http://agent-hand-off-test.azurewebsites.net</SiteUrlToLaunchAfterPublish>
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<ExcludeApp_Data>False</ExcludeApp_Data>
<ProjectGuid>c5442a0c-e1ab-4237-b069-097a470af818</ProjectGuid>
<MSDeployServiceURL>agent-hand-off-test.scm.azurewebsites.net:443</MSDeployServiceURL>
<DeployIisAppPath>agent-hand-off-test</DeployIisAppPath>
<RemoteSitePhysicalPath />
<SkipExtraFilesOnServer>True</SkipExtraFilesOnServer>
<MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
<EnableMSDeployBackup>True</EnableMSDeployBackup>
<UserName>$agent-hand-off-test</UserName>
<_SavePWD>True</_SavePWD>
<_DestinationType>AzureWebSite</_DestinationType>
<InstallAspNetCoreSiteExtension>False</InstallAspNetCoreSiteExtension>
</PropertyGroup>
</Project>
\ No newline at end of file
<?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>
<TimeStampOfAssociatedLegacyPublishXmlFile />
<EncryptedPassword>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAiYRDSigWlkmVK6UfeoqX1gAAAAACAAAAAAAQZgAAAAEAACAAAADHCb6bHieH9IWxccqti/qBFiK6SdFwd5MdenZzAK/myQAAAAAOgAAAAAIAACAAAACxoI4BNLW5wqx/VokZNlpDruCcHXUI+uWt31Gm3gbQM4AAAABDoEfdBfxpSI1e6DX4VMyWWpNGpyKfL/aupj8gCXm2aJDM6kSxHzTt80OmXqTeDR+sFd4kMMixjwCXGd2nLaejLlWcOBpchP5q+VoIv3vj5VC++X7jBHk3fUYR1xqia5Zkx4rDzTGnIjHfRI9BoQMiZqUDxDKjecdxcOnY1hAGjkAAAADhlnx+lIq8KqVvxfaN+MSKnHnan/fN2TB/NePfiLSol6AZDMYnTWrXlcVJ5CmNGHvqSWOKf3DSdvxj8BqzMjGg</EncryptedPassword>
</PropertyGroup>
</Project>
\ No newline at end of file
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:29210/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IntermediatorBotSample": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:29211/"
}
}
}
namespace IntermediatorBotSample.Resources
{
public class StringConstants
{
public static readonly string NoUserNamePlaceholder = "(no user name)";
public static readonly string NoNameOrId = "(no name or ID)";
public static readonly string LineBreak = "\n\r";
public static readonly char QuotationMark = '"';
// For parsing JSON
public static readonly string EndOfLineInJsonResponse = "\\r\\n";
public static readonly char BackslashInJsonResponse = '\\';
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
using IntermediatorBotSample.Bot;
using IntermediatorBotSample.Middleware;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Core.Extensions;
using Microsoft.Bot.Builder.BotFramework;
using Microsoft.Bot.Builder.Integration;
using Microsoft.Bot.Builder.Integration.AspNet.Core;
using Microsoft.Bot.Builder.TraceExtensions;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
namespace IntermediatorBotSample
{
public class Startup
{
public IConfiguration Configuration
{
get;
}
public Startup(IHostingEnvironment env)
{
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>
/// This method gets called by the runtime. Use this method to add services to the container.
/// </summary>
/// <param name="services"></param>
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddControllersAsServices();
services.AddSingleton(_ => Configuration);
services.AddBot<IntermediatorBot>(options =>
{
options.CredentialProvider = new ConfigurationCredentialProvider(Configuration);
// The CatchExceptionMiddleware provides a top-level exception handler for your bot.
// Any exceptions thrown by other Middleware, or by your OnTurn method, will be
// caught here. To facillitate debugging, the exception is sent out, via Trace,
// to the emulator. Trace activities are NOT displayed to users, so in addition
// an "Ooops" message is sent.
options.Middleware.Add(new CatchExceptionMiddleware<Exception>(async (context, exception) =>
{
await context.TraceActivityAsync("Bot Exception", exception);
await context.SendActivityAsync($"Sorry, it looks like something went wrong: {exception.Message}");
}));
// The Memory Storage used here is for local bot debugging only. When the bot
// is restarted, anything stored in memory will be gone.
IStorage dataStore = new MemoryStorage();
// The File data store, shown here, is suitable for bots that run on
// a single machine and need durable state across application restarts.
// IStorage dataStore = new FileStorage(System.IO.Path.GetTempPath());
// For production bots use the Azure Table Store, Azure Blob, or
// Azure CosmosDB storage provides, as seen below. To include any of
// 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/
// IStorage dataStore = new Microsoft.Bot.Builder.Azure.AzureTableStorage("AzureTablesConnectionString", "TableName");
// IStorage dataStore = new Microsoft.Bot.Builder.Azure.AzureBlobStorage("AzureBlobConnectionString", "containerName");
// Handoff middleware
options.Middleware.Add(new HandoffMiddleware(Configuration));
});
services.AddMvc(); // Required Razor pages
}
/// <summary>
/// This method gets called by the runtime.
/// Use this method to configure the HTTP request pipeline.
/// </summary>
/// <param name="app"></param>
/// <param name="env"></param>
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseDefaultFiles()
.UseStaticFiles()
.UseMvc() // Required Razor pages
.UseBotFramework();
}
}
}
{
"$schema": "https://statics.teams.microsoft.com/sdk/v1.2/manifest/MicrosoftTeams.schema.json",
"manifestVersion": "1.2",
"version": "0.0.1",
"id": "INSERT YOUR TEAMS APP ID HERE",
"packageName": "com.underscore.intermediator.bot.sample",
"developer": {
"name": "Tomi",
"websiteUrl": "https://github.com/tompaana/intermediator-bot-sample",
"privacyUrl": "https://github.com/tompaana/intermediator-bot-sample/README.md",
"termsOfUseUrl": "https://github.com/tompaana/intermediator-bot-sample/LICENSE"
},
"icons": {
"color": "color.png",
"outline": "outline.png"
},
"name": {
"short": "Intermediator Bot",
"full": "Intermediator Bot Sample"
},
"description": {
"short": "Intermediator Bot Sample",
"full": "A sample bot, that routes messages between two users on different channels."
},
"accentColor": "#00FF00",
"configurableTabs": [
],
"staticTabs": [
],
"bots": [
{
"botId": "INSERT YOUR BOT'S MICROSOFT APP ID HERE",
"scopes": [
"personal",
"team"
]
}
],
"permissions": [
"identity",
"messageTeamMembers"
],
"validDomains": [
"*.azurewebsites.net"
]
}
\ No newline at end of file
{
"MicrosoftAppId": "",
"MicrosoftAppPassword": "",
"BotBasePath": "/api",
"BotMessagesPath": "/messages",
"AzureTableStorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=azradlppb;AccountKey=VLhJjo77rwYnHWaeNh2UlEdswUypR0uWSTyLn6Hu9SWlAYtujHymXZxdFo9kuEK5WcpDwBySpOjizcqxd3hMHA==;EndpointSuffix=core.windows.net",
"RejectConnectionRequestIfNoAggregationChannel": true,
"PermittedAggregationChannels": "",
"NoDirectConversationsWithChannels": "emulator, facebook, skype, msteams, webchat"
}
{
"runtimeOptions": {
"additionalProbingPaths": [
"C:\\Users\\Admin\\.dotnet\\store\\|arch|\\|tfm|",
"C:\\Users\\Admin\\.nuget\\packages"
]
}
}
\ No newline at end of file
{
"runtimeOptions": {
"tfm": "netcoreapp2.2",
"framework": {
"name": "Microsoft.AspNetCore.App",
"version": "2.2.0"
},
"configProperties": {
"System.GC.Server": true
}
}
}
\ No newline at end of file
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:29210/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IntermediatorBotSample": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:29211/"
}
}
}
{
"$schema": "https://statics.teams.microsoft.com/sdk/v1.2/manifest/MicrosoftTeams.schema.json",
"manifestVersion": "1.2",
"version": "0.0.1",
"id": "INSERT YOUR TEAMS APP ID HERE",
"packageName": "com.underscore.intermediator.bot.sample",
"developer": {
"name": "Tomi",
"websiteUrl": "https://github.com/tompaana/intermediator-bot-sample",
"privacyUrl": "https://github.com/tompaana/intermediator-bot-sample/README.md",
"termsOfUseUrl": "https://github.com/tompaana/intermediator-bot-sample/LICENSE"
},
"icons": {
"color": "color.png",
"outline": "outline.png"
},
"name": {
"short": "Intermediator Bot",
"full": "Intermediator Bot Sample"
},
"description": {
"short": "Intermediator Bot Sample",
"full": "A sample bot, that routes messages between two users on different channels."
},
"accentColor": "#00FF00",
"configurableTabs": [
],
"staticTabs": [
],
"bots": [
{
"botId": "INSERT YOUR BOT'S MICROSOFT APP ID HERE",
"scopes": [
"personal",
"team"
]
}
],
"permissions": [
"identity",
"messageTeamMembers"
],
"validDomains": [
"*.azurewebsites.net"
]
}
\ No newline at end of file
{
"MicrosoftAppId": "",
"MicrosoftAppPassword": "",
"BotBasePath": "/api",
"BotMessagesPath": "/messages",
"AzureTableStorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=azradlppb;AccountKey=VLhJjo77rwYnHWaeNh2UlEdswUypR0uWSTyLn6Hu9SWlAYtujHymXZxdFo9kuEK5WcpDwBySpOjizcqxd3hMHA==;EndpointSuffix=core.windows.net",
"RejectConnectionRequestIfNoAggregationChannel": true,
"PermittedAggregationChannels": "",
"NoDirectConversationsWithChannels": "emulator, facebook, skype, msteams, webchat"
}
{
"runtimeOptions": {
"additionalProbingPaths": [
"C:\\Users\\Admin\\.dotnet\\store\\|arch|\\|tfm|",
"C:\\Users\\Admin\\.nuget\\packages"
]
}
}
\ No newline at end of file
{
"runtimeOptions": {
"tfm": "netcoreapp2.2",
"framework": {
"name": "Microsoft.AspNetCore.App",
"version": "2.2.0"
},
"configProperties": {
"System.GC.Server": true
}
}
}
\ No newline at end of file
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:29210/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IntermediatorBotSample": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:29211/"
}
}
}
{
"$schema": "https://statics.teams.microsoft.com/sdk/v1.2/manifest/MicrosoftTeams.schema.json",
"manifestVersion": "1.2",
"version": "0.0.1",
"id": "INSERT YOUR TEAMS APP ID HERE",
"packageName": "com.underscore.intermediator.bot.sample",
"developer": {
"name": "Tomi",
"websiteUrl": "https://github.com/tompaana/intermediator-bot-sample",
"privacyUrl": "https://github.com/tompaana/intermediator-bot-sample/README.md",
"termsOfUseUrl": "https://github.com/tompaana/intermediator-bot-sample/LICENSE"
},
"icons": {
"color": "color.png",
"outline": "outline.png"
},
"name": {
"short": "Intermediator Bot",
"full": "Intermediator Bot Sample"
},
"description": {
"short": "Intermediator Bot Sample",
"full": "A sample bot, that routes messages between two users on different channels."
},
"accentColor": "#00FF00",
"configurableTabs": [
],
"staticTabs": [
],
"bots": [
{
"botId": "INSERT YOUR BOT'S MICROSOFT APP ID HERE",
"scopes": [
"personal",
"team"
]
}
],
"permissions": [
"identity",
"messageTeamMembers"
],
"validDomains": [
"*.azurewebsites.net"
]
}
\ No newline at end of file
{
"MicrosoftAppId": "",
"MicrosoftAppPassword": "",
"BotBasePath": "/api",
"BotMessagesPath": "/messages",
"AzureTableStorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=azradlppb;AccountKey=VLhJjo77rwYnHWaeNh2UlEdswUypR0uWSTyLn6Hu9SWlAYtujHymXZxdFo9kuEK5WcpDwBySpOjizcqxd3hMHA==;EndpointSuffix=core.windows.net",
"RejectConnectionRequestIfNoAggregationChannel": true,
"PermittedAggregationChannels": "",
"NoDirectConversationsWithChannels": "emulator, facebook, skype, msteams, webchat"
}
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v2.2", FrameworkDisplayName = "")]
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("IntermediatorBotSample")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("IntermediatorBotSample")]
[assembly: System.Reflection.AssemblyTitleAttribute("IntermediatorBotSample")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.RelatedAssemblyAttribute("IntermediatorBotSample.Views")]
[assembly: Microsoft.AspNetCore.Razor.Hosting.RazorLanguageVersionAttribute("2.1")]
[assembly: Microsoft.AspNetCore.Razor.Hosting.RazorConfigurationNameAttribute("MVC-2.1")]
[assembly: Microsoft.AspNetCore.Razor.Hosting.RazorExtensionAssemblyNameAttribute("MVC-2.1", "Microsoft.AspNetCore.Mvc.Razor.Extensions")]
// Generated by the MSBuild WriteCodeFragment class.
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.ProvideApplicationPartFactoryAttribute("Microsoft.AspNetCore.Mvc.ApplicationParts.CompiledRazorAssemblyApplicationPartFac" +
"tory, Microsoft.AspNetCore.Mvc.Razor")]
[assembly: System.Reflection.AssemblyCompanyAttribute("IntermediatorBotSample")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyProductAttribute("IntermediatorBotSample")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyTitleAttribute("IntermediatorBotSample.Views")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Debug\netcoreapp2.2\appsettings.json
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Debug\netcoreapp2.2\Properties\launchSettings.json
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Debug\netcoreapp2.2\TeamsManifest\manifest.json
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Debug\netcoreapp2.2\IntermediatorBotSample.deps.json
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Debug\netcoreapp2.2\IntermediatorBotSample.runtimeconfig.json
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Debug\netcoreapp2.2\IntermediatorBotSample.runtimeconfig.dev.json
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Debug\netcoreapp2.2\IntermediatorBotSample.dll
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Debug\netcoreapp2.2\IntermediatorBotSample.pdb
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Debug\netcoreapp2.2\IntermediatorBotSample.Views.dll
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Debug\netcoreapp2.2\IntermediatorBotSample.Views.pdb
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.csprojAssemblyReference.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.Resources.Strings.resources
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.csproj.GenerateResource.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.AssemblyInfoInputs.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.AssemblyInfo.cs
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.RazorAssemblyInfo.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.RazorAssemblyInfo.cs
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.TagHelpers.input.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.TagHelpers.output.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.RazorCoreGenerate.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\Razor\Pages\Index.cshtml.g.cs
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.RazorTargetAssemblyInfo.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.RazorTargetAssemblyInfo.cs
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.Views.pdb
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.dll
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.pdb
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.genruntimeconfig.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Debug\netcoreapp2.2\IntermediatorBotSample.csproj.CopyComplete
#pragma checksum "E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\Pages\Index.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "62513363e2fb1c111ceec45dab9b820553d6df7a"
// <auto-generated/>
#pragma warning disable 1591
[assembly: global::Microsoft.AspNetCore.Razor.Hosting.RazorCompiledItemAttribute(typeof(AspNetCore.Pages_Index), @"mvc.1.0.razor-page", @"/Pages/Index.cshtml")]
[assembly:global::Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.RazorPageAttribute(@"/Pages/Index.cshtml", typeof(AspNetCore.Pages_Index), null)]
namespace AspNetCore
{
#line hidden
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
#line 2 "E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\Pages\Index.cshtml"
using IntermediatorBotSample.Pages;
#line default
#line hidden
[global::Microsoft.AspNetCore.Razor.Hosting.RazorSourceChecksumAttribute(@"SHA1", @"62513363e2fb1c111ceec45dab9b820553d6df7a", @"/Pages/Index.cshtml")]
public class Pages_Index : global::Microsoft.AspNetCore.Mvc.RazorPages.Page
{
#pragma warning disable 1998
public async override global::System.Threading.Tasks.Task ExecuteAsync()
{
BeginContext(71, 503, true);
WriteLiteral(@"
<h1>Intermediator Bot Sample</h1>
<p>
The purpose is to serve as a sample on how to implement the human hand-off.
Visit <a href=""https://github.com/tompaana/intermediator-bot-sample"">https://github.com/tompaana/intermediator-bot-sample</a> to learn more.
</p>
<p>The bot endpoint URL is: <a id=""botEndpointUrl"" /></p>
<script>
var botEndpointUrlLink = document.getElementById(""botEndpointUrl"");
botEndpointUrlLink.setAttribute('href', location.protocol + ""//"" + location.host + """);
EndContext();
BeginContext(575, 21, false);
#line 18 "E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\Pages\Index.cshtml"
Write(Model.BotEndpointPath);
#line default
#line hidden
EndContext();
BeginContext(596, 84, true);
WriteLiteral("\");\r\n botEndpointUrlLink.innerHTML = location.protocol + \"//\" + location.host + \"");
EndContext();
BeginContext(681, 21, false);
#line 19 "E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\Pages\Index.cshtml"
Write(Model.BotEndpointPath);
#line default
#line hidden
EndContext();
BeginContext(702, 232, true);
WriteLiteral("\";\r\n</script>\r\n\r\n<p>The bot credentials are:</p>\r\n<ul>\r\n <li id=\"botAppId\" />\r\n <li id=\"botAppPassword\" />\r\n</ul>\r\n\r\n<script>\r\n var botAppIdItem = document.getElementById(\"botAppId\");\r\n botAppIdItem.innerHTML = \"App ID: ");
EndContext();
BeginContext(935, 14, false);
#line 30 "E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\Pages\Index.cshtml"
Write(Model.BotAppId);
#line default
#line hidden
EndContext();
BeginContext(949, 127, true);
WriteLiteral("\";\r\n var botAppPasswordItem = document.getElementById(\"botAppPassword\");\r\n botAppPasswordItem.innerHTML = \"App password: ");
EndContext();
BeginContext(1077, 20, false);
#line 32 "E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\Pages\Index.cshtml"
Write(Model.BotAppPassword);
#line default
#line hidden
EndContext();
BeginContext(1097, 15, true);
WriteLiteral("\";\r\n</script>\r\n");
EndContext();
}
#pragma warning restore 1998
[global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute]
public global::Microsoft.AspNetCore.Mvc.ViewFeatures.IModelExpressionProvider ModelExpressionProvider { get; private set; }
[global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute]
public global::Microsoft.AspNetCore.Mvc.IUrlHelper Url { get; private set; }
[global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute]
public global::Microsoft.AspNetCore.Mvc.IViewComponentHelper Component { get; private set; }
[global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute]
public global::Microsoft.AspNetCore.Mvc.Rendering.IJsonHelper Json { get; private set; }
[global::Microsoft.AspNetCore.Mvc.Razor.Internal.RazorInjectAttribute]
public global::Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper<IndexModel> Html { get; private set; }
public global::Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary<IndexModel> ViewData => (global::Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary<IndexModel>)PageContext?.ViewData;
public IndexModel Model => ViewData.Model;
}
}
#pragma warning restore 1591
{
"format": 1,
"restore": {
"E:\\ChatBots\\poc\\intermediator-bot-sample\\IntermediatorBotSample\\IntermediatorBotSample.csproj": {}
},
"projects": {
"E:\\ChatBots\\poc\\intermediator-bot-sample\\IntermediatorBotSample\\IntermediatorBotSample.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\ChatBots\\poc\\intermediator-bot-sample\\IntermediatorBotSample\\IntermediatorBotSample.csproj",
"projectName": "IntermediatorBotSample",
"projectPath": "E:\\ChatBots\\poc\\intermediator-bot-sample\\IntermediatorBotSample\\IntermediatorBotSample.csproj",
"packagesPath": "C:\\Users\\Admin\\.nuget\\packages\\",
"outputPath": "E:\\ChatBots\\poc\\intermediator-bot-sample\\IntermediatorBotSample\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\Admin\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"netcoreapp2.2"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"netcoreapp2.2": {
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"netcoreapp2.2": {
"dependencies": {
"Azure.Storage.Blobs": {
"target": "Package",
"version": "[12.6.0, )"
},
"BotMessageRouting": {
"target": "Package",
"version": "[2.0.2-alpha, )"
},
"Microsoft.AspNetCore": {
"target": "Package",
"version": "[2.2.0, )"
},
"Microsoft.AspNetCore.App": {
"suppressParent": "All",
"target": "Package",
"version": "[2.2.0, )",
"autoReferenced": true
},
"Microsoft.Bot.Builder": {
"target": "Package",
"version": "[4.2.2, )"
},
"Microsoft.Bot.Builder.Integration.AspNet.Core": {
"target": "Package",
"version": "[4.2.2, )"
},
"Microsoft.Bot.Configuration": {
"target": "Package",
"version": "[4.2.2, )"
},
"Microsoft.Bot.Connector": {
"target": "Package",
"version": "[4.2.2, )"
},
"Microsoft.Bot.Schema": {
"target": "Package",
"version": "[4.2.2, )"
},
"Microsoft.Extensions.Logging.AzureAppServices": {
"target": "Package",
"version": "[2.2.0, )"
},
"Microsoft.NETCore.App": {
"suppressParent": "All",
"target": "Package",
"version": "[2.2.0, )",
"autoReferenced": true
},
"RestSharp": {
"target": "Package",
"version": "[106.11.4, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48"
],
"assetTargetFallback": true,
"warn": true,
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\3.1.301\\RuntimeIdentifierGraph.json"
}
}
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Admin\.nuget\packages\</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">5.6.0</NuGetToolVersion>
</PropertyGroup>
<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
</PropertyGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.netcore.app\2.2.0\build\netcoreapp2.2\Microsoft.NETCore.App.props" Condition="Exists('$(NuGetPackageRoot)microsoft.netcore.app\2.2.0\build\netcoreapp2.2\Microsoft.NETCore.App.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.extensions.fileproviders.embedded\2.2.0\build\netstandard2.0\Microsoft.Extensions.FileProviders.Embedded.props" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.fileproviders.embedded\2.2.0\build\netstandard2.0\Microsoft.Extensions.FileProviders.Embedded.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.extensions.configuration.usersecrets\2.2.0\build\netstandard2.0\Microsoft.Extensions.Configuration.UserSecrets.props" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.configuration.usersecrets\2.2.0\build\netstandard2.0\Microsoft.Extensions.Configuration.UserSecrets.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.entityframeworkcore.design\2.2.0\build\netcoreapp2.0\Microsoft.EntityFrameworkCore.Design.props" Condition="Exists('$(NuGetPackageRoot)microsoft.entityframeworkcore.design\2.2.0\build\netcoreapp2.0\Microsoft.EntityFrameworkCore.Design.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.aspnetcore.mvc.razor.extensions\2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.Extensions.props" Condition="Exists('$(NuGetPackageRoot)microsoft.aspnetcore.mvc.razor.extensions\2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.Extensions.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.aspnetcore.razor.design\2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Razor.Design.props" Condition="Exists('$(NuGetPackageRoot)microsoft.aspnetcore.razor.design\2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Razor.Design.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.aspnetcore.app\2.2.0\build\netcoreapp2.2\Microsoft.AspNetCore.App.props" Condition="Exists('$(NuGetPackageRoot)microsoft.aspnetcore.app\2.2.0\build\netcoreapp2.2\Microsoft.AspNetCore.App.props')" />
</ImportGroup>
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<PkgMicrosoft_CodeAnalysis_Analyzers Condition=" '$(PkgMicrosoft_CodeAnalysis_Analyzers)' == '' ">C:\Users\Admin\.nuget\packages\microsoft.codeanalysis.analyzers\1.1.0</PkgMicrosoft_CodeAnalysis_Analyzers>
<PkgMicrosoft_EntityFrameworkCore_Tools Condition=" '$(PkgMicrosoft_EntityFrameworkCore_Tools)' == '' ">C:\Users\Admin\.nuget\packages\microsoft.entityframeworkcore.tools\2.2.0</PkgMicrosoft_EntityFrameworkCore_Tools>
<PkgMicrosoft_AspNetCore_Razor_Design Condition=" '$(PkgMicrosoft_AspNetCore_Razor_Design)' == '' ">C:\Users\Admin\.nuget\packages\microsoft.aspnetcore.razor.design\2.2.0</PkgMicrosoft_AspNetCore_Razor_Design>
</PropertyGroup>
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
</PropertyGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)netstandard.library\2.0.3\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('$(NuGetPackageRoot)netstandard.library\2.0.3\build\netstandard2.0\NETStandard.Library.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.netcore.app\2.2.0\build\netcoreapp2.2\Microsoft.NETCore.App.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.netcore.app\2.2.0\build\netcoreapp2.2\Microsoft.NETCore.App.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.extensions.fileproviders.embedded\2.2.0\build\netstandard2.0\Microsoft.Extensions.FileProviders.Embedded.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.fileproviders.embedded\2.2.0\build\netstandard2.0\Microsoft.Extensions.FileProviders.Embedded.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.extensions.configuration.usersecrets\2.2.0\build\netstandard2.0\Microsoft.Extensions.Configuration.UserSecrets.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.configuration.usersecrets\2.2.0\build\netstandard2.0\Microsoft.Extensions.Configuration.UserSecrets.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.aspnetcore.mvc.razor.extensions\2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.Extensions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.aspnetcore.mvc.razor.extensions\2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.Extensions.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.aspnetcore.server.iisintegration\2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Server.IISIntegration.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.aspnetcore.server.iisintegration\2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Server.IISIntegration.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.aspnetcore.server.iis\2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Server.IIS.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.aspnetcore.server.iis\2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Server.IIS.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.aspnetcore.mvc.razor.viewcompilation\2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.aspnetcore.mvc.razor.viewcompilation\2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.aspnetcore.app\2.2.0\build\netcoreapp2.2\Microsoft.AspNetCore.App.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.aspnetcore.app\2.2.0\build\netcoreapp2.2\Microsoft.AspNetCore.App.targets')" />
</ImportGroup>
</Project>
\ No newline at end of file
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v2.2", FrameworkDisplayName = "")]
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("IntermediatorBotSample")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("IntermediatorBotSample")]
[assembly: System.Reflection.AssemblyTitleAttribute("IntermediatorBotSample")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.RelatedAssemblyAttribute("IntermediatorBotSample.Views")]
[assembly: Microsoft.AspNetCore.Razor.Hosting.RazorLanguageVersionAttribute("2.1")]
[assembly: Microsoft.AspNetCore.Razor.Hosting.RazorConfigurationNameAttribute("MVC-2.1")]
[assembly: Microsoft.AspNetCore.Razor.Hosting.RazorExtensionAssemblyNameAttribute("MVC-2.1", "Microsoft.AspNetCore.Mvc.Razor.Extensions")]
// Generated by the MSBuild WriteCodeFragment class.
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.ProvideApplicationPartFactoryAttribute("Microsoft.AspNetCore.Mvc.ApplicationParts.CompiledRazorAssemblyApplicationPartFac" +
"tory, Microsoft.AspNetCore.Mvc.Razor")]
[assembly: System.Reflection.AssemblyCompanyAttribute("IntermediatorBotSample")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyProductAttribute("IntermediatorBotSample")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyTitleAttribute("IntermediatorBotSample.Views")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Release\netcoreapp2.2\appsettings.json
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Release\netcoreapp2.2\Properties\launchSettings.json
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Release\netcoreapp2.2\TeamsManifest\manifest.json
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Release\netcoreapp2.2\IntermediatorBotSample.deps.json
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Release\netcoreapp2.2\IntermediatorBotSample.runtimeconfig.json
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Release\netcoreapp2.2\IntermediatorBotSample.runtimeconfig.dev.json
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Release\netcoreapp2.2\IntermediatorBotSample.dll
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Release\netcoreapp2.2\IntermediatorBotSample.pdb
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Release\netcoreapp2.2\IntermediatorBotSample.Views.dll
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\bin\Release\netcoreapp2.2\IntermediatorBotSample.Views.pdb
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.csprojAssemblyReference.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.Resources.Strings.resources
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.csproj.GenerateResource.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.AssemblyInfoInputs.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.AssemblyInfo.cs
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.csproj.CoreCompileInputs.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.RazorAssemblyInfo.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.RazorAssemblyInfo.cs
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.TagHelpers.input.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.TagHelpers.output.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.RazorCoreGenerate.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\Razor\Pages\Index.cshtml.g.cs
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.RazorTargetAssemblyInfo.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.RazorTargetAssemblyInfo.cs
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.Views.pdb
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.dll
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.pdb
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.genruntimeconfig.cache
E:\ChatBots\poc\intermediator-bot-sample\IntermediatorBotSample\obj\Release\netcoreapp2.2\IntermediatorBotSample.csproj.CopyComplete
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment