// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. syntax = "proto3"; package google.chat.v1; import "google/api/field_behavior.proto"; import "google/api/resource.proto"; import "google/apps/card/v1/card.proto"; import "google/chat/v1/action_status.proto"; import "google/chat/v1/annotation.proto"; import "google/chat/v1/attachment.proto"; import "google/chat/v1/contextual_addon.proto"; import "google/chat/v1/deletion_metadata.proto"; import "google/chat/v1/matched_url.proto"; import "google/chat/v1/reaction.proto"; import "google/chat/v1/slash_command.proto"; import "google/chat/v1/space.proto"; import "google/chat/v1/user.proto"; import "google/protobuf/field_mask.proto"; import "google/protobuf/timestamp.proto"; option csharp_namespace = "Google.Apps.Chat.V1"; option go_package = "cloud.google.com/go/chat/apiv1/chatpb;chatpb"; option java_multiple_files = true; option java_outer_classname = "MessageProto"; option java_package = "com.google.chat.v1"; option objc_class_prefix = "DYNAPIProto"; option php_namespace = "Google\\Apps\\Chat\\V1"; option ruby_package = "Google::Apps::Chat::V1"; // A message in a Google Chat space. message Message { option (google.api.resource) = { type: "chat.googleapis.com/Message" pattern: "spaces/{space}/messages/{message}" }; // Resource name of the message. // // Format: `spaces/{space}/messages/{message}` // // // Where `{space}` is the ID of the space where the message is posted and // `{message}` is a system-assigned ID for the message. For example, // `spaces/AAAAAAAAAAA/messages/BBBBBBBBBBB.BBBBBBBBBBB`. // // If you set a custom ID when you create a message, you can use this ID to // specify the message in a request by replacing `{message}` with the value // from the `clientAssignedMessageId` field. For example, // `spaces/AAAAAAAAAAA/messages/client-custom-name`. For details, see [Name // a // message](https://developers.google.com/workspace/chat/create-messages#name_a_created_message). string name = 1; // Output only. The user who created the message. // If your Chat app [authenticates as a // user](https://developers.google.com/workspace/chat/authenticate-authorize-chat-user), // the output populates the // [user](https://developers.google.com/workspace/chat/api/reference/rest/v1/User) // `name` and `type`. User sender = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; // Optional. Immutable. For spaces created in Chat, the time at which the // message was created. This field is output only, except when used in import // mode spaces. // // For import mode spaces, set this field to the historical timestamp at which // the message was created in the source in order to preserve the original // creation time. google.protobuf.Timestamp create_time = 3 [ (google.api.field_behavior) = IMMUTABLE, (google.api.field_behavior) = OPTIONAL ]; // Output only. The time at which the message was last edited by a user. If // the message has never been edited, this field is empty. google.protobuf.Timestamp last_update_time = 23 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. The time at which the message was deleted in // Google Chat. If the message is never deleted, this field is empty. google.protobuf.Timestamp delete_time = 26 [(google.api.field_behavior) = OUTPUT_ONLY]; // Plain-text body of the message. The first link to an image, video, or web // page generates a // [preview chip](https://developers.google.com/workspace/chat/preview-links). // You can also [@mention a Google Chat // user](https://developers.google.com/workspace/chat/format-messages#messages-@mention), // or everyone in the space. // // To learn about creating text messages, see [Send a text // message](https://developers.google.com/workspace/chat/create-messages#create-text-messages). string text = 4; // Output only. Contains the message `text` with markups added to communicate // formatting. This field might not capture all formatting visible in the UI, // but includes the following: // // * [Markup // syntax](https://developers.google.com/workspace/chat/format-messages) // for bold, italic, strikethrough, monospace, monospace block, and bulleted // list. // // * [User // mentions](https://developers.google.com/workspace/chat/format-messages#messages-@mention) // using the format ``. // // * Custom hyperlinks using the format `<{url}|{rendered_text}>` where the // first string is the URL and the second is the rendered text—for example, // ``. // // * Custom emoji using the format `:{emoji_name}:`—for example, `:smile:`. // This doesn't apply to Unicode emoji, such as `U+1F600` for a grinning // face emoji. // // For more information, see [View text formatting sent in a // message](https://developers.google.com/workspace/chat/format-messages#view_text_formatting_sent_in_a_message) string formatted_text = 43 [(google.api.field_behavior) = OUTPUT_ONLY]; // Deprecated: Use `cards_v2` instead. // // Rich, formatted, and interactive cards that you can use to display UI // elements such as: formatted texts, buttons, and clickable images. Cards are // normally displayed below the plain-text body of the message. `cards` and // `cards_v2` can have a maximum size of 32 KB. repeated ContextualAddOnMarkup.Card cards = 5 [deprecated = true]; // An array of // [cards](https://developers.google.com/workspace/chat/api/reference/rest/v1/cards). // // Only Chat apps can create cards. If your Chat app [authenticates as a // user](https://developers.google.com/workspace/chat/authenticate-authorize-chat-user), // the messages can't contain cards. // // To learn about cards and how to create them, see [Send card // messages](https://developers.google.com/workspace/chat/create-messages#create). // // [Card builder](https://addons.gsuite.google.com/uikit/builder) repeated CardWithId cards_v2 = 22; // Output only. Annotations associated with the `text` in this message. repeated Annotation annotations = 10 [(google.api.field_behavior) = OUTPUT_ONLY]; // The thread the message belongs to. For example usage, see // [Start or reply to a message // thread](https://developers.google.com/workspace/chat/create-messages#create-message-thread). Thread thread = 11; // If your Chat app [authenticates as a // user](https://developers.google.com/workspace/chat/authenticate-authorize-chat-user), // the output populates the // [space](https://developers.google.com/workspace/chat/api/reference/rest/v1/spaces) // `name`. Space space = 12; // A plain-text description of the message's cards, used when the actual cards // can't be displayed—for example, mobile notifications. string fallback_text = 13; // Input only. Parameters that a Chat app can use to configure how its // response is posted. ActionResponse action_response = 14 [(google.api.field_behavior) = INPUT_ONLY]; // Output only. Plain-text body of the message with all Chat app mentions // stripped out. string argument_text = 15 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. Slash command information, if applicable. SlashCommand slash_command = 17 [(google.api.field_behavior) = OUTPUT_ONLY]; // User-uploaded attachment. repeated Attachment attachment = 18; // Output only. A URL in `spaces.messages.text` that matches a link preview // pattern. For more information, see [Preview // links](https://developers.google.com/workspace/chat/preview-links). MatchedUrl matched_url = 20 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. When `true`, the message is a response in a reply thread. When // `false`, the message is visible in the space's top-level conversation as // either the first message of a thread or a message with no threaded replies. // // If the space doesn't support reply in threads, this field is always // `false`. bool thread_reply = 25 [(google.api.field_behavior) = OUTPUT_ONLY]; // Optional. A custom ID for the message. You can use field to identify a // message, or to get, delete, or update a message. To set a custom ID, // specify the // [`messageId`](https://developers.google.com/workspace/chat/api/reference/rest/v1/spaces.messages/create#body.QUERY_PARAMETERS.message_id) // field when you create the message. For details, see [Name a // message](https://developers.google.com/workspace/chat/create-messages#name_a_created_message). string client_assigned_message_id = 32; // Output only. The list of emoji reaction summaries on the message. repeated EmojiReactionSummary emoji_reaction_summaries = 33 [(google.api.field_behavior) = OUTPUT_ONLY]; // Immutable. Input for creating a message, otherwise output only. The user // that can view the message. When set, the message is private and only // visible to the specified user and the Chat app. Link previews and // attachments aren't supported for private messages. // // Only Chat apps can send private messages. If your Chat app [authenticates // as a // user](https://developers.google.com/workspace/chat/authenticate-authorize-chat-user) // to send a message, the message can't be private and must omit this field. // // For details, see [Send private messages to Google Chat // users](https://developers.google.com/workspace/chat/private-messages). User private_message_viewer = 36 [(google.api.field_behavior) = IMMUTABLE]; // Output only. Information about a deleted message. A message is deleted when // `delete_time` is set. DeletionMetadata deletion_metadata = 38 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. Information about a message that's quoted by a Google Chat // user in a space. Google Chat users can quote a message to reply to it. QuotedMessageMetadata quoted_message_metadata = 39 [(google.api.field_behavior) = OUTPUT_ONLY]; // Output only. GIF images that are attached to the message. repeated AttachedGif attached_gifs = 42 [(google.api.field_behavior) = OUTPUT_ONLY]; // One or more interactive widgets that appear at the bottom of a message. // You can add accessory widgets to messages that contain text, cards, or both // text and cards. Not supported for messages that contain dialogs. For // details, see [Add interactive widgets at the bottom of a // message](https://developers.google.com/workspace/chat/create-messages#add-accessory-widgets). // // Creating a message with accessory widgets requires [app // authentication] // (https://developers.google.com/workspace/chat/authenticate-authorize-chat-app). repeated AccessoryWidget accessory_widgets = 44; } // A GIF image that's specified by a URL. message AttachedGif { // Output only. The URL that hosts the GIF image. string uri = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; } // Information about a quoted message. message QuotedMessageMetadata { option (google.api.resource) = { type: "chat.googleapis.com/QuotedMessageMetadata" pattern: "spaces/{space}/messages/{message}/quotedMessageMetadata/{quoted_message_metadata}" }; // Output only. Resource name of the quoted message. // // Format: `spaces/{space}/messages/{message}` string name = 1 [ (google.api.field_behavior) = OUTPUT_ONLY, (google.api.resource_reference) = { type: "chat.googleapis.com/Message" } ]; // Output only. The timestamp when the quoted message was created or when the // quoted message was last updated. google.protobuf.Timestamp last_update_time = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; } // A thread in a Google Chat space. For example usage, see // [Start or reply to a message // thread](https://developers.google.com/workspace/chat/create-messages#create-message-thread). // // If you specify a thread when creating a message, you can set the // [`messageReplyOption`](https://developers.google.com/workspace/chat/api/reference/rest/v1/spaces.messages/create#messagereplyoption) // field to determine what happens if no matching thread is found. message Thread { option (google.api.resource) = { type: "chat.googleapis.com/Thread" pattern: "spaces/{space}/threads/{thread}" }; // Output only. Resource name of the thread. // // Example: `spaces/{space}/threads/{thread}` string name = 1; // Optional. Input for creating or updating a thread. Otherwise, output only. // ID for the thread. Supports up to 4000 characters. // // This ID is unique to the Chat app that sets it. For example, if // multiple Chat apps create a message using the same thread key, // the messages are posted in different threads. To reply in a // thread created by a person or another Chat app, specify the thread `name` // field instead. string thread_key = 3 [(google.api.field_behavior) = OPTIONAL]; } // Parameters that a Chat app can use to configure how its response is posted. message ActionResponse { // The type of Chat app response. enum ResponseType { // Default type that's handled as `NEW_MESSAGE`. TYPE_UNSPECIFIED = 0; // Post as a new message in the topic. NEW_MESSAGE = 1; // Update the Chat app's message. This is only permitted on a `CARD_CLICKED` // event where the message sender type is `BOT`. UPDATE_MESSAGE = 2; // Update the cards on a user's message. This is only permitted as a // response to a `MESSAGE` event with a matched url, or a `CARD_CLICKED` // event where the message sender type is `HUMAN`. Text is ignored. UPDATE_USER_MESSAGE_CARDS = 6; // Privately ask the user for additional authentication or configuration. REQUEST_CONFIG = 3; // Presents a // [dialog](https://developers.google.com/workspace/chat/dialogs). DIALOG = 4; // Widget text autocomplete options query. UPDATE_WIDGET = 7; } // List of widget autocomplete results. message SelectionItems { // An array of the SelectionItem objects. repeated google.apps.card.v1.SelectionInput.SelectionItem items = 1; } // The response of the updated widget. // Used to provide autocomplete options for a widget. message UpdatedWidget { // The widget updated in response to a user action. oneof updated_widget { // List of widget autocomplete results SelectionItems suggestions = 1; } // The ID of the updated widget. The ID must match the one for the // widget that triggered the update request. string widget = 2; } // Input only. The type of Chat app response. ResponseType type = 1 [(google.api.field_behavior) = INPUT_ONLY]; // Input only. URL for users to authenticate or configure. (Only for // `REQUEST_CONFIG` response types.) string url = 2 [(google.api.field_behavior) = INPUT_ONLY]; // Input only. A response to an interaction event related to a // [dialog](https://developers.google.com/workspace/chat/dialogs). Must be // accompanied by `ResponseType.Dialog`. DialogAction dialog_action = 3 [(google.api.field_behavior) = INPUT_ONLY]; // Input only. The response of the updated widget. UpdatedWidget updated_widget = 4 [(google.api.field_behavior) = INPUT_ONLY]; } // One or more interactive widgets that appear at the bottom of a message. For // details, see [Add interactive widgets at the bottom of a // message](https://developers.google.com/workspace/chat/create-messages#add-accessory-widgets). message AccessoryWidget { // The type of action. oneof action { // A list of buttons. google.apps.card.v1.ButtonList button_list = 1; } } // Request to get a message. message GetMessageRequest { // Required. Resource name of the message. // // Format: `spaces/{space}/messages/{message}` // // If you've set a custom ID for your message, you can use the value from the // `clientAssignedMessageId` field for `{message}`. For details, see [Name a // message] // (https://developers.google.com/workspace/chat/create-messages#name_a_created_message). string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "chat.googleapis.com/Message" } ]; } // Request to delete a message. message DeleteMessageRequest { // Required. Resource name of the message. // // Format: `spaces/{space}/messages/{message}` // // If you've set a custom ID for your message, you can use the value from the // `clientAssignedMessageId` field for `{message}`. For details, see [Name a // message] // (https://developers.google.com/workspace/chat/create-messages#name_a_created_message). string name = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { type: "chat.googleapis.com/Message" } ]; // When `true`, deleting a message also deletes its threaded replies. When // `false`, if a message has threaded replies, deletion fails. // // Only applies when [authenticating as a // user](https://developers.google.com/workspace/chat/authenticate-authorize-chat-user). // Has no effect when [authenticating as a Chat app] // (https://developers.google.com/workspace/chat/authenticate-authorize-chat-app). bool force = 2; } // Request to update a message. message UpdateMessageRequest { // Required. Message with fields updated. Message message = 1 [(google.api.field_behavior) = REQUIRED]; // Required. The field paths to update. Separate multiple values with commas // or use `*` to update all field paths. // // Currently supported field paths: // // - `text` // // - `attachment` // // - `cards` (Requires [app // authentication](/chat/api/guides/auth/service-accounts).) // // - `cards_v2` (Requires [app // authentication](/chat/api/guides/auth/service-accounts).) // // - `accessory_widgets` (Requires [app // authentication](/chat/api/guides/auth/service-accounts).) google.protobuf.FieldMask update_mask = 2; // Optional. If `true` and the message isn't found, a new message is created // and `updateMask` is ignored. The specified message ID must be // [client-assigned](https://developers.google.com/workspace/chat/create-messages#name_a_created_message) // or the request fails. bool allow_missing = 4 [(google.api.field_behavior) = OPTIONAL]; } // Creates a message. message CreateMessageRequest { // Specifies how to reply to a message. // More states might be added in the future. enum MessageReplyOption { // Default. Starts a new thread. Using this option ignores any [thread // ID][google.chat.v1.Thread.name] or // [`thread_key`][google.chat.v1.Thread.thread_key] that's included. MESSAGE_REPLY_OPTION_UNSPECIFIED = 0; // Creates the message as a reply to the thread specified by [thread // ID][google.chat.v1.Thread.name] or // [`thread_key`][google.chat.v1.Thread.thread_key]. If it fails, the // message starts a new thread instead. REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD = 1; // Creates the message as a reply to the thread specified by [thread // ID][google.chat.v1.Thread.name] or // [`thread_key`][google.chat.v1.Thread.thread_key]. If a new `thread_key` // is used, a new thread is created. If the message creation fails, a // `NOT_FOUND` error is returned instead. REPLY_MESSAGE_OR_FAIL = 2; } // Required. The resource name of the space in which to create a message. // // Format: `spaces/{space}` string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { child_type: "chat.googleapis.com/Message" } ]; // Required. Message body. Message message = 4 [(google.api.field_behavior) = REQUIRED]; // Optional. Deprecated: Use // [thread.thread_key][google.chat.v1.Thread.thread_key] instead. ID for the // thread. Supports up to 4000 characters. To start or add to a thread, create // a message and specify a `threadKey` or the // [thread.name][google.chat.v1.Thread.name]. For example usage, see [Start or // reply to a message // thread](https://developers.google.com/workspace/chat/create-messages#create-message-thread). string thread_key = 6 [deprecated = true, (google.api.field_behavior) = OPTIONAL]; // Optional. A unique request ID for this message. Specifying an existing // request ID returns the message created with that ID instead of creating a // new message. string request_id = 7 [(google.api.field_behavior) = OPTIONAL]; // Optional. Specifies whether a message starts a thread or replies to one. // Only supported in named spaces. MessageReplyOption message_reply_option = 8 [(google.api.field_behavior) = OPTIONAL]; // Optional. A custom ID for a message. Lets Chat apps get, update, or delete // a message without needing to store the system-assigned ID in the message's // resource name (represented in the message `name` field). // // The value for this field must meet the following requirements: // // * Begins with `client-`. For example, `client-custom-name` is a valid // custom ID, but `custom-name` is not. // * Contains up to 63 characters and only lowercase letters, numbers, and // hyphens. // * Is unique within a space. A Chat app can't use the same custom ID for // different messages. // // For details, see [Name a // message](https://developers.google.com/workspace/chat/create-messages#name_a_created_message). string message_id = 9 [(google.api.field_behavior) = OPTIONAL]; } // Lists messages in the specified space, that the user is a member of. message ListMessagesRequest { // Required. The resource name of the space to list messages from. // // Format: `spaces/{space}` string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { child_type: "chat.googleapis.com/Message" } ]; // The maximum number of messages returned. The service might return fewer // messages than this value. // // If unspecified, at most 25 are returned. // // The maximum value is 1000. If you use a value more than 1000, it's // automatically changed to 1000. // // Negative values return an `INVALID_ARGUMENT` error. int32 page_size = 2; // Optional, if resuming from a previous query. // // A page token received from a previous list messages call. Provide this // parameter to retrieve the subsequent page. // // When paginating, all other parameters provided should match the call that // provided the page token. Passing different values to the other parameters // might lead to unexpected results. string page_token = 3; // A query filter. // // You can filter messages by date (`create_time`) and thread (`thread.name`). // // To filter messages by the date they were created, specify the `create_time` // with a timestamp in [RFC-3339](https://www.rfc-editor.org/rfc/rfc3339) // format and double quotation marks. For example, // `"2023-04-21T11:30:00-04:00"`. You can use the greater than operator `>` to // list messages that were created after a timestamp, or the less than // operator `<` to list messages that were created before a timestamp. To // filter messages within a time interval, use the `AND` operator between two // timestamps. // // To filter by thread, specify the `thread.name`, formatted as // `spaces/{space}/threads/{thread}`. You can only specify one // `thread.name` per query. // // To filter by both thread and date, use the `AND` operator in your query. // // For example, the following queries are valid: // // ``` // create_time > "2012-04-21T11:30:00-04:00" // // create_time > "2012-04-21T11:30:00-04:00" AND // thread.name = spaces/AAAAAAAAAAA/threads/123 // // create_time > "2012-04-21T11:30:00+00:00" AND // // create_time < "2013-01-01T00:00:00+00:00" AND // thread.name = spaces/AAAAAAAAAAA/threads/123 // // thread.name = spaces/AAAAAAAAAAA/threads/123 // ``` // // Invalid queries are rejected by the server with an `INVALID_ARGUMENT` // error. string filter = 4; // Optional, if resuming from a previous query. // // How the list of messages is ordered. Specify a value to order by an // ordering operation. Valid ordering operation values are as follows: // // - `ASC` for ascending. // // - `DESC` for descending. // // The default ordering is `create_time ASC`. string order_by = 5; // Whether to include deleted messages. Deleted messages include deleted time // and metadata about their deletion, but message content is unavailable. bool show_deleted = 6; } // Response message for listing messages. message ListMessagesResponse { // List of messages. repeated Message messages = 1; // You can send a token as `pageToken` to retrieve the next page of // results. If empty, there are no subsequent pages. string next_page_token = 2; } // Contains a // [dialog](https://developers.google.com/workspace/chat/dialogs) and request // status code. message DialogAction { // Action to perform. oneof action { // Input only. // [Dialog](https://developers.google.com/workspace/chat/dialogs) for the // request. Dialog dialog = 1 [(google.api.field_behavior) = INPUT_ONLY]; } // Input only. Status for a request to either invoke or submit a // [dialog](https://developers.google.com/workspace/chat/dialogs). Displays // a status and message to users, if necessary. // For example, in case of an error or success. ActionStatus action_status = 2 [(google.api.field_behavior) = INPUT_ONLY]; } // Wrapper around the card body of the dialog. message Dialog { // Input only. Body of the dialog, which is rendered in a modal. // Google Chat apps don't support the following card entities: // `DateTimePicker`, `OnChangeAction`. google.apps.card.v1.Card body = 1 [(google.api.field_behavior) = INPUT_ONLY]; } // A // [card](https://developers.google.com/workspace/chat/api/reference/rest/v1/cards) // in a Google Chat message. // // Only Chat apps can create cards. If your Chat app [authenticates as a // user](https://developers.google.com/workspace/chat/authenticate-authorize-chat-user), // the message can't contain cards. // // [Card builder](https://addons.gsuite.google.com/uikit/builder) message CardWithId { // Required if the message contains multiple cards. A unique identifier for // a card in a message. string card_id = 1; // A card. Maximum size is 32 KB. google.apps.card.v1.Card card = 2; }