// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Bot.Connector.DirectLine; using System.Collections.Generic; using System.Threading.Tasks; using System.Threading; using System; using System.Linq; using Microsoft.Extensions.Configuration; namespace TranslationBot.Translation { public class DirectLineService { private const int _botReplyWaitIntervalInMilSec = 3000; private string _botName; public DirectLineService(IConfiguration configuration) { _botName = configuration["BotName"]; } /// /// Use directlineClient to start the conversation and get the conversationId /// /// Token generated /// activity to be sent public async Task StartConversation(string token) { using (var directLineClient = new DirectLineClient(token)) { var conversation = await directLineClient.Conversations.StartConversationAsync(); return conversation.ConversationId; } } /// /// Use directlineClient to post the user message /// /// Activity set /// activity to be sent /// current token /// current conversation ID /// current watermark public async Task PostUserMessage(Activity activity, string token, string conversationId, string watermark) { using (var directLineClient = new DirectLineClient(token)) { // Send user message using directlineClient var res = await directLineClient.Conversations.PostActivityAsync(conversationId, activity); Thread.Sleep(_botReplyWaitIntervalInMilSec); // Get bot response using directlinClient var responses = await GetBotResponseActivitiesAsync(directLineClient, conversationId, watermark); return responses; } } /// /// Use directlineClient to get bot response /// /// Activity set /// directline client /// current conversation ID /// current watermark private async Task GetBotResponseActivitiesAsync(DirectLineClient directLineClient, string conversationtId, string watermark) { ActivitySet response = null; List result = new List(); do { response = await directLineClient.Conversations.GetActivitiesAsync(conversationtId, watermark); if (response == null) { // response can be null if directLineClient token expires // TODO } result = response?.Activities?.Where(x => x.Type == ActivityTypes.Message && string.Equals(x.From.Name, _botName, StringComparison.Ordinal)).ToList(); if (result != null && result.Any()) { return new ActivitySet() { Watermark = response?.Watermark, Activities = result }; } Thread.Sleep(1000); } while (response != null && response.Activities.Any()); return new ActivitySet(); } } }