lib/vox/http/routes/user.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

require 'vox/http/route'
require 'vox/http/util'

module Vox
  module HTTP
    module Routes
      # Mixin for user routes.
      module User
        include Util

        # rubocop:disable Naming/AccessorMethodName

        # Get information about the current user.
        # @return [Hash<Symbol, Object>] The [user](https://discord.com/developers/docs/resources/user#user-object)
        #   object for the current user.
        # @vox.oauth_scope identify
        # @vox.api_docs https://discord.com/developers/docs/resources/user#get-current-user
        def get_current_user
          request(Route.new(:GET, '/users/@me'))
        end

        # Get information about a user by ID.
        # @return [Hash<Symbol, Object] The [user](https://discord.com/developers/docs/resources/user#user-object)
        #   object for the target user.
        # @vox.api_docs https://discord.com/developers/docs/resources/user#get-user
        def get_user(user_id)
          request(Route.new(:GET, '/users/%{user_id}', user_id: user_id))
        end

        # Modify the current user.
        # @param username [String]
        # @param avatar [UploadIO]
        # @return [Hash<Symbol, Object>] The updated [user](https://discord.com/developers/docs/resources/user#user-object)
        #   object.
        # @vox.api_docs https://discord.com/developers/docs/resources/user#modify-current-user
        def modify_current_user(username: :undef, avatar: :undef)
          avatar = if avatar != :undef && !avatar.nil?
                     image_data = avatar.io.read
                     "data:#{avatar.content_type};base64,#{Base64.encode64(image_data)}"
                   else
                     :undef
                   end
          json = filter_undef({ username: username, avatar: avatar })
          request(Route.new(:PATCH, '/users/@me'), json: json)
        end

        # List the guilds that the current user is in.
        # @param before [String, Integer] Get guilds before this ID.
        # @param after [String, Integer] Get guilds after this ID.
        # @param limit [String, Integer] Maximum number of guilds to return.
        # @return [Array<Hash<Symbol, Object>>] An array of [guild](https://discord.com/developers/docs/resources/guild#guild-object)
        #   objects.
        # @vox.oauth_scope guilds
        # @vox.api_docs https://discord.com/developers/docs/resources/user#get-current-user-guilds
        def get_current_user_guilds(before: :undef, after: :undef, limit: :undef)
          params = filter_undef({ before: before, after: after, limit: limit })
          request(Route.new(:GET, '/users/@me/guilds'), query: params)
        end

        # Leave a guild.
        # @param guild_id [String, Integer] The ID of the guild to leave.
        # @return [nil] Returns nil on success.
        # @vox.api_docs https://discord.com/developers/docs/resources/user#get-current-user-guilds
        def leave_guild(guild_id)
          request(Route.new(:DELETE, '/users/@me/guilds/%{guild_id}', guild_id: guild_id))
        end

        # Get a list of the current user's DM channels.
        # @return [Array<Hash<Symbol, Object>>] An array of [DM channel](https://discord.com/developers/docs/resources/channel#channel-object)
        #   objects.
        # @vox.api_docs https://discord.com/developers/docs/resources/user#get-user-dms
        def get_user_dms
          request(Route.new(:GET, '/users/@me/channels'))
        end

        # Create a new DM channel with a user.
        # @param recipient_id [String, Integer] The ID of the recipient to open a DM with.
        # @return [Hash<Symbol, Object>] The [DM channel](https://discord.com/developers/docs/resources/channel#channel-object)
        #   object.
        # @vox.api_docs https://discord.com/developers/docs/resources/user#create-dm
        def create_dm(recipient_id)
          request(Route.new(:POST, '/users/@me/channels'), json: { recipient_id: recipient_id })
        end

        # Create a new DM with multiple users.
        # @param access_tokens [Array<String, Integer>] Access tokens of users that have granted your app the `gdm.join`
        #   scope.
        # @param nicks [Hash<(String, Integer), String>] A hash mapping user IDs to their nicknames.
        # @note This endpoint was intended for a now deprecated SDK. DMs created with this endpoint are not
        #   visible in the Discord client.
        # @note This endpoint is limited to 10 active group DMs.
        # @vox.oauth_scope gdm.join
        # @vox.api_docs https://discord.com/developers/docs/resources/user#create-group-dm
        def create_group_dm(access_tokens, nicks: :undef)
          json = filter_undef({ access_tokens: access_tokens, nicks: nicks })
          request(Route.new(:POST, '/users/@me/channels'), json: json)
        end

        # Get a list of connection objects for the current user.
        # @return [Array<Hash<Symbol, Object>>] An array of [connection](https://discord.com/developers/docs/resources/user#connection-object)
        #   objects.
        # @vox.oauth_scope connections
        # @vox.api_docs https://discord.com/developers/docs/resources/user#get-user-connections
        def get_user_connections
          request(Route.new(:GET, '/users/@me/connections'))
        end

        # rubocop:enable Naming/AccessorMethodName
      end
    end
  end
end