Как установить [Activity.From.Id], [member.Id] или [activity.Recipient.Id] с помощью DirectLine?

Я использую MS directline для интеграции пользовательского канала с чат-ботом на основе бот-фреймворка.

Я использую следующие функции для генерации токена и начала разговора, но ни одна из них не позволяет установить ни Context.Activity.From.Id, MembersAdded.FirstOrDefault().Id, ни Activity.Recipient.Id

  • GenerateTokenForNewConversationAsync()
  • StartConversationAsync()

Я знаю, что мы можем управлять идентификатором, когда отправляем первое сообщение пользователя по прямой линии, но я хочу контролировать любой из указанных выше идентификаторов еще до отправки сообщения от пользователя. Я хочу установить конкретный идентификатор и иметь возможность записывать его в событиях BOT OnTurnAsync и Activity типа ActivityTypes.ConversationUpdate .. что мне делать?


person user9942114    schedule 12.11.2019    source источник
comment
Похоже, вы используете Microsoft.Bot.Connector.DirectLine, верно? Насколько это укоренилось в вашем боте? Он не обновлялся с 2017 года, и я категорически не рекомендую его использовать. Я не верю, что вы можете делать с ним то, что ищете. Я бы рекомендовал вместо этого использовать Microsoft.Bot.Connector. Сообщите мне, какой из них вы собираетесь использовать, и я посмотрю, смогу ли я найти обходной путь.   -  person mdrichardson    schedule 12.11.2019


Ответы (1)


Что касается моего комментария, я решил, что просто расскажу, как делать то, что вы хотите, с обоими пакетами. Опять же, если переключиться не составляет особого труда, я настоятельно рекомендую использовать Microsoft.Bot.Connector (новее и чаще обновляется) через Microsoft.Bot.Connector.DirectLine (старше, не обновлялся через 2,5 года и устарел до тех пор, пока мы не откроем его исходный код Обновление: На самом деле это еще не устарело. В настоящее время мы работаем над открытый исходный код, но это низкоприоритетная задача).

Рекомендуется: Microsoft.Bot.Connector

Создавайте беседы с помощью «Кому» и «От», все в одном.

var userAccount = new ChannelAccount(toId,toName);
var botAccount = new ChannelAccount(fromId, fromName);
var connector = new ConnectorClient(new Uri(serviceUrl));

IMessageActivity message = Activity.CreateMessageActivity();
if (!string.IsNullOrEmpty(conversationId) && !string.IsNullOrEmpty(channelId))
{
    message.ChannelId = channelId;
}
else
{
    conversationId = (await connector.Conversations.CreateDirectConversationAsync( botAccount, userAccount)).Id;
}
message.From = botAccount;
message.Recipient = userAccount;
message.Conversation = new ConversationAccount(id: conversationId);
message.Text = "Hello, this is a notification";
message.Locale = "en-Us";
await connector.Conversations.SendToConversationAsync((Activity)message);

Кредит

Не рекомендуется: Microsoft.Bot.Connector.DirectLine.

Это своего рода хитрый обходной путь, но в основном вы создаете диалог, а затем отправляете ConversationUpdate действие.

//server side, retrieve token from secret
string directLineSecret = ConfigurationManager.AppSettings["DirectLineSecret"];
HttpClient httpClient = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post,$"https://directline.botframework.com/v3/directline/tokens/generate");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", directLineSecret);
var fromUser = $"dl_{Guid.NewGuid()}";
request.Content = new StringContent(
    JsonConvert.SerializeObject(
        new { User = new { Id = fromUser } }),
        Encoding.UTF8,
        "application/json");
var response = await httpClient.SendAsync(request);
DirectLineToken dlToken = null;
if (response.IsSuccessStatusCode)
{
    var body = await response.Content.ReadAsStringAsync();
    dlToken = JsonConvert.DeserializeObject<DirectLineToken>(body);
}
string token = dlToken.token;

//create DirectLineClient from token, client side
DirectLineClient client = new DirectLineClient(token);            
var conversation = await client.Conversations.StartConversationAsync();            
new System.Threading.Thread(async () => await ReadBotMessagesAsync(client, conversation.ConversationId)).Start();

//send conversationUpdate
var user = new ChannelAccount(fromUser);
await client.Conversations.PostActivityAsync(conversation.ConversationId,
    new Activity
    {
        From = user,
        Text = string.Empty,
        Type = ActivityTypes.ConversationUpdate,
        MembersAdded = new[] { user }
    }
);
TimeSpan delayTime = TimeSpan.FromSeconds(dlToken.expires_in) - TimeSpan.FromMinutes(5);
Task.Factory.StartNew(async () =>
{
    while (!_getTokenAsyncCancellation.IsCancellationRequested)
    {
        var t = await client.Tokens.RefreshTokenAsync().ConfigureAwait(false);

        await Task.Delay(delayTime, _getTokenAsyncCancellation.Token).ConfigureAwait(false);
    }
}).ConfigureAwait(false);

Кредит

person mdrichardson    schedule 12.11.2019
comment
Спасибо за ценную информацию и рекомендации :) - person user9942114; 13.11.2019
comment
DirectLineClient не является устаревшим. - person Eric Dahlvang; 15.05.2020
comment
@EricDahlvang Обновлено. - person mdrichardson; 15.05.2020