# Copyright 2016 OpenMarket Ltd
#
# 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.
swagger: '2.0'
info:
  title: "Matrix Client-Server Presence API"
  version: "1.0.0"
host: localhost:8008
schemes:
  - https
  - http
basePath: /_matrix/client/%CLIENT_MAJOR_VERSION%
consumes:
  - application/json
produces:
  - application/json
securityDefinitions:
  $ref: definitions/security.yaml
paths:
  "/presence/{userId}/status":
    put:
      summary: Update this user's presence state.
      description: |-
        This API sets the given user's presence state. When setting the status,
        the activity time is updated to reflect that activity; the client does
        not need to specify the ``last_active_ago`` field. You cannot set the
        presence state of another user.
      operationId: setPresence
      security:
        - accessToken: []
      parameters:
        - in: path
          type: string
          name: userId
          description: The user whose presence state to update.
          required: true
          x-example: "@alice:example.com"
        - in: body
          name: presenceState
          description: The updated presence state.
          required: true
          schema:
            type: object
            example: {
                "presence": "online",
                "status_msg": "I am here."
              }
            properties:
              presence:
                type: string
                enum: ["online", "offline", "unavailable"]
                description: The new presence state.
              status_msg:
                type: string
                description: "The status message to attach to this state."
            required: ["presence"]
      responses:
        200:
          description: The new presence state was set.
          examples:
            application/json: {
              }
          schema:
            type: object  # empty json object
        429:
          description: This request was rate-limited.
          schema:
            "$ref": "definitions/errors/rate_limited.yaml"
      tags:
        - Presence
    get:
      summary: Get this user's presence state.
      description: |-
        Get the given user's presence state.
      operationId: getPresence
      security:
        - accessToken: []
      parameters:
        - in: path
          type: string
          name: userId
          description: The user whose presence state to get.
          required: true
          x-example: "@alice:example.com"
      responses:
        200:
          description: The presence state for this user.
          examples:
            application/json: {
                "presence": "unavailable",
                "last_active_ago": 420845
              }
          schema:
            type: object
            properties:
              presence:
                type: string
                enum: ["online", "offline", "unavailable"]
                description: This user's presence.
              last_active_ago:
                type: integer
                description: |-
                  The length of time in milliseconds since an action was performed
                  by this user.
              status_msg:
                type: [string, "null"]
                description: The state message for this user if one was set.
              currently_active:
                type: boolean
                description: "Whether the user is currently active"
            required: ["presence"]
        404:
          description: |-
            There is no presence state for this user. This user may not exist or
            isn't exposing presence information to you.
          schema:
            "$ref": "definitions/errors/error.yaml"
        403:
          description: You are not allowed to see this user's presence status.
          examples:
            application/json: {
              "errcode": "M_FORBIDDEN",
              "error": "You are not allowed to see their presence"
            }
          schema:
            "$ref": "definitions/errors/error.yaml"
      tags:
        - Presence
  "/presence/list/{userId}":
    post:
      summary: Add or remove users from this presence list.
      description: |-
        Adds or removes users from this presence list.
      operationId: modifyPresenceList
      security:
        - accessToken: []
      parameters:
        - in: path
          type: string
          name: userId
          description: The user whose presence list is being modified.
          required: true
          x-example: "@alice:example.com"
        - in: body
          name: presence_diff
          description: The modifications to make to this presence list.
          required: true
          schema:
            type: object
            example: {
                "invite": [
                  "@bob:matrix.org"
                ],
                "drop": [
                  "@alice:matrix.org"
                ]
              }
            properties:
              invite:
                type: array
                description: A list of user IDs to add to the list.
                items:
                  type: string
                  description: A list of user IDs.
              drop:
                type: array
                description: A list of user IDs to remove from the list.
                items:
                  type: string
                  description: A list of user IDs.
      responses:
        200:
          description: The list was updated.
          examples:
            application/json: {
              }
          schema:
            type: object  # empty json object
        429:
          description: This request was rate-limited.
          schema:
            "$ref": "definitions/errors/rate_limited.yaml"
      tags:
        - Presence
    get:
      summary: Get presence events for this presence list.
      description: |-
        Retrieve a list of presence events for every user on this list.
      operationId: getPresenceForList
      parameters:
        - in: path
          type: string
          name: userId
          description: The user whose presence list should be retrieved.
          required: true
          x-example: "@alice:example.com"
      responses:
        200:
          description: A list of presence events for this list.
          examples:
            application/json: [
                {
                  "content": {
                    "last_active_ago": 395,
                    "presence": "offline",
                    "user_id": "@alice:matrix.org"
                  },
                  "type": "m.presence"
                },
                {
                  "content": {
                    "last_active_ago": 16874,
                    "presence": "online",
                    "user_id": "@marisa:matrix.org",
                    "currently_active": true
                  },
                  "type": "m.presence"
                }
              ]
          schema:
            type: array
            items:
              type: object
              title: PresenceEvent
              allOf:
                - "$ref": "definitions/event-schemas/schema/core-event-schema/event.yaml"
      tags:
        - Presence