Interactive button doesn't work properly when using pub/sub

泄露秘密 提交于 2019-12-22 18:38:11

问题


I'm writing a Hangouts Chat bot in C# that uses pub/sub so I can host the bot on our side of a firewall. Everything seems to work well except interactive buttons within cards. If I create a button with a specific action method name, the bot does receive the CARD_CLICKED message with the appropriate action method name. However, it doesn't seem like the card in the Hangouts Chat app knows a response was sent because the bot ends up getting the CARD_CLICKED message three times before the Hangouts Chat app finally says "Unable to contact Bot. Try again later". I've been using the Google.Apis.HangoutsChat.v1 and Google.Cloud.PubSub.V1 packages from NuGet for the bot.

This is speculation, but it seems like the issue might be that interactive buttons don't work properly through pub/sub. Any help would be appreciated.

Here is a snippet of the code I have:

SubscriptionName subscriptionName = new SubscriptionName(PROJECT_ID, SUBSCRIPTION_ID);
SubscriberServiceApiClient client = SubscriberServiceApiClient.Create();

GoogleCredential credential = GoogleCredential.FromFile(CREDENTIALS_PATH_ENV_PROPERTY).CreateScoped(HANGOUTS_CHAT_API_SCOPE);
HangoutsChatService chatService = new HangoutsChatService(new BaseClientService.Initializer
{
    ApplicationName = "My Bot",
    HttpClientInitializer = credential
});

while (true)
{
    PullResponse response = client.Pull(subscriptionName, false, 3, CallSettings.FromCallTiming(CallTiming.FromExpiration(Expiration.FromTimeout(TimeSpan.FromSeconds(90)))));

    if ((response.ReceivedMessages == null) || (response.ReceivedMessages.Count == 0))
        Console.WriteLine("Pulled no messages.");
    else
    {
        foreach (ReceivedMessage message in response.ReceivedMessages)
        {
            try
            {
                byte[] jsonBytes = message.Message.Data.ToByteArray();
                JObject json = JObject.Parse(Encoding.UTF8.GetString(jsonBytes));

                string messageType = (string)json["type"];
                switch (messageType)
                {
                    case "MESSAGE":
                    {
                        // Get text
                        string messageText = (string)json["message"]["text"];
                        Console.WriteLine($"[{messageType}] {messageText}");

                        // Send response
                        string spaceName = (string)json["space"]["name"];
                        SpacesResource.MessagesResource.CreateRequest request = chatService.Spaces.Messages.Create(new Message
                        {
                            Cards = new[]
                            {
                                new Card
                                {
                                    Header = new CardHeader
                                    {
                                        Title = "Message Received!"
                                    },
                                    Sections = new[]
                                    {
                                        new Section
                                        {
                                            Widgets = new[]
                                            {
                                                new WidgetMarkup
                                                {
                                                    Buttons = new[]
                                                    {
                                                        new Button
                                                        {
                                                            TextButton = new TextButton
                                                            {
                                                                Text = "Click Me!",
                                                                OnClick = new OnClick
                                                                {
                                                                    Action = new FormAction
                                                                    {
                                                                        ActionMethodName = "ClickedAction"
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            },
                            Thread = new Thread
                            {
                                Name = (string)json["message"]["thread"]["name"]
                            }
                        }, spaceName);
                        Message responseMsg = request.Execute();

                        break;
                    }
                    case "CARD_CLICKED":
                    {
                        string actionMethodName = (string)json["action"]["actionMethodName"];
                        Console.WriteLine($"[{messageType}] {actionMethodName} at {((DateTime)json["message"]["createTime"]).ToString()}");

                        // Send response
                        string spaceName = (string)json["space"]["name"];
                        SpacesResource.MessagesResource.CreateRequest request = chatService.Spaces.Messages.Create(new Message
                        {
                            ActionResponse = new ActionResponse
                            {
                                Type = "UPDATE_MESSAGE"
                            },
                            Text = $"You clicked on '{actionMethodName}'.",
                            Thread = new Thread
                            {
                                Name = (string)json["message"]["thread"]["name"]
                            }
                        }, spaceName);
                        Message responseMsg = request.Execute();

                        break;
                    }
                    default:
                    {
                        Console.WriteLine($"[{messageType}]");
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error parsing message: {ex}");
            }
        }

        // Acknowledge the message so we don't see it again.
        string[] ackIds = new string[response.ReceivedMessages.Count];
        for (int i = 0; i < response.ReceivedMessages.Count; ++i)
            ackIds[i] = response.ReceivedMessages[i].AckId;
        client.Acknowledge(subscriptionName, ackIds);
    }
}

回答1:


Using buttons with Hangouts Chat API requires a custom answer including:

{
    'thread': {
        'name': thread_id
    },
    'actionResponse': {
        'type': 'UPDATE_MESSAGE'
    }
}

I'd recommend using Hangouts Chat API with a bot URL.



来源:https://stackoverflow.com/questions/49785504/interactive-button-doesnt-work-properly-when-using-pub-sub

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!