Отправка сообщения в групповой чат с использованием бота фреймворка от команд - PullRequest
0 голосов
/ 01 мая 2020

Я хочу предварительно отправить сообщение группе, в которую был добавлен бот (не команда, простой групповой чат)

Пока я сохраняю (в памяти) разговор Идентифицируйте в одноэлементном словаре, а затем выдайте уведомление всем разговорам. Это код конечной точки API ..

        public CINotificationsController(
            IBotFrameworkHttpAdapter adapter,
            IBot bot,
            IConfiguration config,
            ConcurrentDictionary<string, ConversationReference> conversationReferences,
            ILogger<CINotificationsController> logger)
        {
            _Adapter = adapter;
            _Bot = bot;
            _ConversationReferences = conversationReferences;
            _Logger = logger;
            _AppId = config.GetSection("MicrosoftAppId").Value;

        }

        [HttpPost]
        public async Task<IActionResult> PostAsync(CINotification notificationData)
        {
            _Logger.LogInformation($"Got CI notification, {JsonConvert.SerializeObject(notificationData)}");
            var jobName = notificationData.JobName;
            var culpritsEmails = notificationData.Commiter;

            foreach (var conv in _ConversationReferences.Values)
            {
                await ((BotAdapter)_Adapter).ContinueConversationAsync(_AppId, conv, GetBotCallBack(notificationData, conv), default);
            }

            return Ok(culpritsEmails);

        }

        private BotCallbackHandler GetBotCallBack(CINotification notificationData, ConversationReference conv)
        {
            return async (ctx, cts) =>
            {
                _Logger.LogDebug($"conversationId:[{conv.ActivityId}], serviceUrl:[{conv.ServiceUrl}]");
                var mention = new Mention();
                if (!string.IsNullOrEmpty(notificationData.Commiter))
                {
                    var membersByEmail = (await TeamsInfo.GetMembersAsync(ctx, cts)).ToDictionary(k => k.Email, v => v, StringComparer.OrdinalIgnoreCase);
                    _Logger.LogDebug($"members:[{string.Join(",", membersByEmail.Keys)}]");
                    if (membersByEmail.TryGetValue(notificationData.Commiter, out var teamMemeber))
                    {
                        mention.Mentioned = teamMemeber;
                        mention.Text = $"<at>{teamMemeber.Name}</at>";
                    }

                    _Logger.LogDebug($"got mentions: {mention.Text}");

                }

                var msgText = $"{mention.Text} {notificationData.Message}";
                _Logger.LogDebug($"Sending message text: {msgText}");
                var replyActivity = MessageFactory.Text(msgText);
                replyActivity.Entities.Add(mention);

                await ctx.SendActivityAsync(replyActivity);
            };
        }

Конечно, словарь в памяти _ConversationReferences - плохая идея, и я ищу какой-то способ (API, что-то из SDK), чтобы иметь возможность перечислять все группы, в которые был добавлен бот, или все начатые разговоры.

Ответы [ 2 ]

1 голос
/ 01 мая 2020

Я не думаю, что такой вызов API существует. Например, из Graph API можно получить список всех приложений, установленных в команде , но для групповых или 1-1 чатов такого нет.

Однако вы -все уже есть вся эта информация - просто сохраните ее на своей стороне с таким большим количеством хороших вариантов хранения данных (облачных и других). В любом случае, он полностью под вашим контролем.

0 голосов
/ 02 мая 2020

Вы можете сделать это с помощью этого кода

    // Create or get existing chat conversation with user
    var response = client.Conversations.CreateOrGetDirectConversation(activity.Recipient, activity.From, activity.GetTenantId());

    // Construct the message to post to conversation
    Activity newActivity = new Activity()
    {
        Text = "Hello",
        Type = ActivityTypes.Message,
        Conversation = new ConversationAccount
        {
            Id = response.Id
        },
    };

// Post the message to chat conversation with user
await client.Conversations.SendToConversationAsync(newActivity, response.Id);

Есть здесь

https://docs.microsoft.com/en-us/microsoftteams/platform/bots/how-to/conversations/send-proactive-messages?tabs=dotnet

...