// Copyright 2019 The Nakama Authors // // 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. /** * The realtime protocol for Nakama server. */ syntax = "proto3"; package nakama.realtime; import "google/protobuf/timestamp.proto"; import "google/protobuf/wrappers.proto"; import "api/api.proto"; option go_package = "github.com/heroiclabs/nakama-common/rtapi"; option java_multiple_files = true; option java_outer_classname = "NakamaRealtime"; option java_package = "com.heroiclabs.nakama.rtapi"; option csharp_namespace = "Nakama.Protobuf"; // An envelope for a realtime message. message Envelope { string cid = 1; oneof message { // A response from a channel join operation. Channel channel = 2; // Join a realtime chat channel. ChannelJoin channel_join = 3; // Leave a realtime chat channel. ChannelLeave channel_leave = 4; // An incoming message on a realtime chat channel. api.ChannelMessage channel_message = 5; // An acknowledgement received in response to sending a message on a chat channel. ChannelMessageAck channel_message_ack = 6; // Send a message to a realtime chat channel. ChannelMessageSend channel_message_send = 7; // Update a message previously sent to a realtime chat channel. ChannelMessageUpdate channel_message_update = 8; // Remove a message previously sent to a realtime chat channel. ChannelMessageRemove channel_message_remove = 9; // Presence update for a particular realtime chat channel. ChannelPresenceEvent channel_presence_event = 10; // Describes an error which occurred on the server. Error error = 11; // Incoming information about a realtime match. Match match = 12; // A client to server request to create a realtime match. MatchCreate match_create = 13; // Incoming realtime match data delivered from the server. MatchData match_data = 14; // A client to server request to send data to a realtime match. MatchDataSend match_data_send = 15; // A client to server request to join a realtime match. MatchJoin match_join = 16; // A client to server request to leave a realtime match. MatchLeave match_leave = 17; // Presence update for a particular realtime match. MatchPresenceEvent match_presence_event = 18; // Submit a new matchmaking process request. MatchmakerAdd matchmaker_add = 19; // A successful matchmaking result. MatchmakerMatched matchmaker_matched = 20; // Cancel a matchmaking process using a ticket. MatchmakerRemove matchmaker_remove = 21; // A response from starting a new matchmaking process. MatchmakerTicket matchmaker_ticket = 22; // Notifications send by the server. Notifications notifications = 23; // RPC call or response. api.Rpc rpc = 24; // An incoming status snapshot for some set of users. Status status = 25; // Start following some set of users to receive their status updates. StatusFollow status_follow = 26; // An incoming status update. StatusPresenceEvent status_presence_event = 27; // Stop following some set of users to no longer receive their status updates. StatusUnfollow status_unfollow = 28; // Set the user's own status. StatusUpdate status_update = 29; // A data message delivered over a stream. StreamData stream_data = 30; // Presence update for a particular stream. StreamPresenceEvent stream_presence_event = 31; // Application-level heartbeat and connection check. Ping ping = 32; // Application-level heartbeat and connection check response. Pong pong = 33; // Incoming information about a party. Party party = 34; // Create a party. PartyCreate party_create = 35; // Join a party, or request to join if the party is not open. PartyJoin party_join = 36; // Leave a party. PartyLeave party_leave = 37; // Promote a new party leader. PartyPromote party_promote = 38; // Announcement of a new party leader. PartyLeader party_leader = 39; // Accept a request to join. PartyAccept party_accept = 40; // Kick a party member, or decline a request to join. PartyRemove party_remove = 41; // End a party, kicking all party members and closing it. PartyClose party_close = 42; // Request a list of pending join requests for a party. PartyJoinRequestList party_join_request_list = 43; // Incoming notification for one or more new presences attempting to join the party. PartyJoinRequest party_join_request = 44; // Begin matchmaking as a party. PartyMatchmakerAdd party_matchmaker_add = 45; // Cancel a party matchmaking process using a ticket. PartyMatchmakerRemove party_matchmaker_remove = 46; // A response from starting a new party matchmaking process. PartyMatchmakerTicket party_matchmaker_ticket = 47; // Incoming party data delivered from the server. PartyData party_data = 48; // A client to server request to send data to a party. PartyDataSend party_data_send = 49; // Presence update for a particular party. PartyPresenceEvent party_presence_event = 50; } } // A realtime chat channel. message Channel { // The ID of the channel. string id = 1; // The users currently in the channel. repeated UserPresence presences = 2; // A reference to the current user's presence in the channel. UserPresence self = 3; // The name of the chat room, or an empty string if this message was not sent through a chat room. string room_name = 4; // The ID of the group, or an empty string if this message was not sent through a group channel. string group_id = 5; // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. string user_id_one = 6; // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. string user_id_two = 7; } // Join operation for a realtime chat channel. message ChannelJoin { // The type of chat channel. enum Type { // Default case. Assumed as ROOM type. TYPE_UNSPECIFIED = 0; // A room which anyone can join to chat. ROOM = 1; // A private channel for 1-on-1 chat. DIRECT_MESSAGE = 2; // A channel for group chat. GROUP = 3; } // The user ID to DM with, group ID to chat with, or room channel name to join. string target = 1; // The type of the chat channel. int32 type = 2; // one of "ChannelId.Type". // Whether messages sent on this channel should be persistent. google.protobuf.BoolValue persistence = 3; // Whether the user should appear in the channel's presence list and events. google.protobuf.BoolValue hidden = 4; } // Leave a realtime channel. message ChannelLeave { // The ID of the channel to leave. string channel_id = 1; } // A receipt reply from a channel message send operation. message ChannelMessageAck { // The channel the message was sent to. string channel_id = 1; // The unique ID assigned to the message. string message_id = 2; // The code representing a message type or category. google.protobuf.Int32Value code = 3; // Username of the message sender. string username = 4; // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the message was created. google.protobuf.Timestamp create_time = 5; // The UNIX time (for gRPC clients) or ISO string (for REST clients) when the message was last updated. google.protobuf.Timestamp update_time = 6; // True if the message was persisted to the channel's history, false otherwise. google.protobuf.BoolValue persistent = 7; // The name of the chat room, or an empty string if this message was not sent through a chat room. string room_name = 8; // The ID of the group, or an empty string if this message was not sent through a group channel. string group_id = 9; // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. string user_id_one = 10; // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. string user_id_two = 11; } // Send a message to a realtime channel. message ChannelMessageSend { // The channel to sent to. string channel_id = 1; // Message content. string content = 2; } // Update a message previously sent to a realtime channel. message ChannelMessageUpdate { // The channel the message was sent to. string channel_id = 1; // The ID assigned to the message to update. string message_id = 2; // New message content. string content = 3; } // Remove a message previously sent to a realtime channel. message ChannelMessageRemove { // The channel the message was sent to. string channel_id = 1; // The ID assigned to the message to update. string message_id = 2; } // A set of joins and leaves on a particular channel. message ChannelPresenceEvent { // The channel identifier this event is for. string channel_id = 1; // Presences joining the channel as part of this event, if any. repeated UserPresence joins = 2; // Presences leaving the channel as part of this event, if any. repeated UserPresence leaves = 3; // The name of the chat room, or an empty string if this message was not sent through a chat room. string room_name = 4; // The ID of the group, or an empty string if this message was not sent through a group channel. string group_id = 5; // The ID of the first DM user, or an empty string if this message was not sent through a DM chat. string user_id_one = 6; // The ID of the second DM user, or an empty string if this message was not sent through a DM chat. string user_id_two = 7; } // A logical error which may occur on the server. message Error { // The selection of possible error codes. enum Code { // An unexpected result from the server. RUNTIME_EXCEPTION = 0; // The server received a message which is not recognised. UNRECOGNIZED_PAYLOAD = 1; // A message was expected but contains no content. MISSING_PAYLOAD = 2; // Fields in the message have an invalid format. BAD_INPUT = 3; // The match id was not found. MATCH_NOT_FOUND = 4; // The match join was rejected. MATCH_JOIN_REJECTED = 5; // The runtime function does not exist on the server. RUNTIME_FUNCTION_NOT_FOUND = 6; // The runtime function executed with an error. RUNTIME_FUNCTION_EXCEPTION = 7; } // The error code which should be one of "Error.Code" enums. int32 code = 1; // A message in English to help developers debug the response. string message = 2; // Additional error details which may be different for each response. map context = 3; } // A realtime match. message Match { // The match unique ID. string match_id = 1; // True if it's an server-managed authoritative match, false otherwise. bool authoritative = 2; // Match label, if any. google.protobuf.StringValue label = 3; // The number of users currently in the match. int32 size = 4; // The users currently in the match. repeated UserPresence presences = 5; // A reference to the current user's presence in the match. UserPresence self = 6; } // Create a new realtime match. message MatchCreate { // Optional name to use when creating the match. string name = 1; } // Realtime match data received from the server. message MatchData { // The match unique ID. string match_id = 1; // A reference to the user presence that sent this data, if any. UserPresence presence = 2; // Op code value. int64 op_code = 3; // Data payload, if any. bytes data = 4; // True if this data was delivered reliably, false otherwise. bool reliable = 5; } // Send realtime match data to the server. message MatchDataSend { // The match unique ID. string match_id = 1; // Op code value. int64 op_code = 2; // Data payload, if any. bytes data = 3; // List of presences in the match to deliver to, if filtering is required. Otherwise deliver to everyone in the match. repeated UserPresence presences = 4; // True if the data should be sent reliably, false otherwise. bool reliable = 5; } // Join an existing realtime match. message MatchJoin { oneof id { // The match unique ID. string match_id = 1; // A matchmaking result token. string token = 2; } // An optional set of key-value metadata pairs to be passed to the match handler, if any. map metadata = 3; } // Leave a realtime match. message MatchLeave { // The match unique ID. string match_id = 1; } // A set of joins and leaves on a particular realtime match. message MatchPresenceEvent { // The match unique ID. string match_id = 1; // User presences that have just joined the match. repeated UserPresence joins = 2; // User presences that have just left the match. repeated UserPresence leaves = 3; } // Start a new matchmaking process. message MatchmakerAdd { // Minimum total user count to match together. int32 min_count = 1; // Maximum total user count to match together. int32 max_count = 2; // Filter query used to identify suitable users. string query = 3; // String properties. map string_properties = 4; // Numeric properties. map numeric_properties = 5; // Optional multiple of the count that must be satisfied. google.protobuf.Int32Value count_multiple = 6; } // A successful matchmaking result. message MatchmakerMatched { message MatchmakerUser { // User info. UserPresence presence = 1; // Party identifier, if this user was matched as a party member. string party_id = 2; // String properties. map string_properties = 5; // Numeric properties. map numeric_properties = 6; } // The matchmaking ticket that has completed. string ticket = 1; // The match token or match ID to join. oneof id { // Match ID. string match_id = 2; // Match join token. string token = 3; } // The users that have been matched together, and information about their matchmaking data. repeated MatchmakerUser users = 4; // A reference to the current user and their properties. MatchmakerUser self = 5; } // Cancel an existing ongoing matchmaking process. message MatchmakerRemove { // The ticket to cancel. string ticket = 1; } // A ticket representing a new matchmaking process. message MatchmakerTicket { // The ticket that can be used to cancel matchmaking. string ticket = 1; } // A collection of zero or more notifications. message Notifications { // Collection of notifications. repeated api.Notification notifications = 1; } // Incoming information about a party. message Party { // Unique party identifier. string party_id = 1; // Open flag. bool open = 2; // Maximum number of party members. int32 max_size = 3; // Self. UserPresence self = 4; // Leader. UserPresence leader = 5; // All current party members. repeated UserPresence presences = 6; } // Create a party. message PartyCreate { // Whether or not the party will require join requests to be approved by the party leader. bool open = 1; // Maximum number of party members. int32 max_size = 2; } // Join a party, or request to join if the party is not open. message PartyJoin { // Party ID to join. string party_id = 1; } // Leave a party. message PartyLeave { // Party ID to leave. string party_id = 1; } // Promote a new party leader. message PartyPromote { // Party ID to promote a new leader for. string party_id = 1; // The presence of an existing party member to promote as the new leader. UserPresence presence = 2; } // Announcement of a new party leader. message PartyLeader { // Party ID to announce the new leader for. string party_id = 1; // The presence of the new party leader. UserPresence presence = 2; } // Accept a request to join. message PartyAccept { // Party ID to accept a join request for. string party_id = 1; // The presence to accept as a party member. UserPresence presence = 2; } // Kick a party member, or decline a request to join. message PartyRemove { // Party ID to remove/reject from. string party_id = 1; // The presence to remove or reject. UserPresence presence = 2; } // End a party, kicking all party members and closing it. message PartyClose { // Party ID to close. string party_id = 1; } // Request a list of pending join requests for a party. message PartyJoinRequestList { // Party ID to get a list of join requests for. string party_id = 1; } // Incoming notification for one or more new presences attempting to join the party. message PartyJoinRequest { // Party ID these presences are attempting to join. string party_id = 1; // Presences attempting to join. repeated UserPresence presences = 2; } // Begin matchmaking as a party. message PartyMatchmakerAdd { // Party ID. string party_id = 1; // Minimum total user count to match together. int32 min_count = 2; // Maximum total user count to match together. int32 max_count = 3; // Filter query used to identify suitable users. string query = 4; // String properties. map string_properties = 5; // Numeric properties. map numeric_properties = 6; // Optional multiple of the count that must be satisfied. google.protobuf.Int32Value count_multiple = 7; } // Cancel a party matchmaking process using a ticket. message PartyMatchmakerRemove { // Party ID. string party_id = 1; // The ticket to cancel. string ticket = 2; } // A response from starting a new party matchmaking process. message PartyMatchmakerTicket { // Party ID. string party_id = 1; // The ticket that can be used to cancel matchmaking. string ticket = 2; } // Incoming party data delivered from the server. message PartyData { // The party ID. string party_id = 1; // A reference to the user presence that sent this data, if any. UserPresence presence = 2; // Op code value. int64 op_code = 3; // Data payload, if any. bytes data = 4; } // Send data to a party. message PartyDataSend { // Party ID to send to. string party_id = 1; // Op code value. int64 op_code = 2; // Data payload, if any. bytes data = 3; } // Presence update for a particular party. message PartyPresenceEvent { // The party ID. string party_id = 1; // User presences that have just joined the party. repeated UserPresence joins = 2; // User presences that have just left the party. repeated UserPresence leaves = 3; } // Application-level heartbeat and connection check. message Ping {} // Application-level heartbeat and connection check response. message Pong {} // A snapshot of statuses for some set of users. message Status { // User statuses. repeated UserPresence presences = 1; } // Start receiving status updates for some set of users. message StatusFollow { // User IDs to follow. repeated string user_ids = 1; // Usernames to follow. repeated string usernames = 2; } // A batch of status updates for a given user. message StatusPresenceEvent { // New statuses for the user. repeated UserPresence joins = 2; // Previous statuses for the user. repeated UserPresence leaves = 3; } // Stop receiving status updates for some set of users. message StatusUnfollow { // Users to unfollow. repeated string user_ids = 1; } // Set the user's own status. message StatusUpdate { // Status string to set, if not present the user will appear offline. google.protobuf.StringValue status = 1; } // Represents identifying information for a stream. message Stream { // Mode identifies the type of stream. int32 mode = 1; // Subject is the primary identifier, if any. string subject = 2; // Subcontext is a secondary identifier, if any. string subcontext = 3; // The label is an arbitrary identifying string, if the stream has one. string label = 4; } // A data message delivered over a stream. message StreamData { // The stream this data message relates to. Stream stream = 1; // The sender, if any. UserPresence sender = 2; // Arbitrary contents of the data message. string data = 3; // True if this data was delivered reliably, false otherwise. bool reliable = 4; } // A set of joins and leaves on a particular stream. message StreamPresenceEvent { // The stream this event relates to. Stream stream = 1; // Presences joining the stream as part of this event, if any. repeated UserPresence joins = 2; // Presences leaving the stream as part of this event, if any. repeated UserPresence leaves = 3; } // A user session associated to a stream, usually through a list operation or a join/leave event. message UserPresence { // The user this presence belongs to. string user_id = 1; // A unique session ID identifying the particular connection, because the user may have many. string session_id = 2; // The username for display purposes. string username = 3; // Whether this presence generates persistent data/messages, if applicable for the stream type. bool persistence = 4; // A user-set status message for this stream, if applicable. google.protobuf.StringValue status = 5; }