Sha256: d99c6c26489d83a254c5ddb25d3fcced582a758963495f78e2dda4aabfee4aff

Contents?: true

Size: 1.58 KB

Versions: 1

Compression:

Stored size: 1.58 KB

Contents

# frozen_string_literal: true

module Discorb::Voice
  # @private
  module ClientVoicePrepend
    attr_reader :voice_conditions

    def initialize(*, **)
      super
      @voice_clients = Discorb::Dictionary.new
      @voice_conditions = {}
    end

    def event_voice_server_update(data)
      @log.debug("Received VOICE_SERVER_UPDATE")
      client = Discorb::Voice::Client.new(self, data)
      @voice_clients[data[:guild_id]] = client
      client.connect_condition.wait
      @voice_conditions[data[:guild_id]].signal client
    end

    def disconnect_voice(guild_id)
      send_gateway(
        4,
        guild_id: guild_id,
        channel_id: nil,

      )
    end

    def connect_to(channel)
      Async do
        @log.debug("Connecting to #{channel.id}")
        send_gateway(
          4,
          guild_id: channel.guild.id.to_s,
          channel_id: channel.id.to_s,
          self_mute: channel.guild.me.voice_state&.self_mute?,
          self_deaf: channel.guild.me.voice_state&.self_deaf?,

        )
        condition = Async::Condition.new
        @voice_conditions[channel.guild.id.to_s] = condition
        condition.wait
      end
    end
  end
end

class Discorb::Client
  # @return [Discorb::Dictionary{String => Discorb::Voice::Client}] The voice clients.
  attr_accessor :voice_clients

  prepend Discorb::Voice::ClientVoicePrepend
end

class Discorb::Guild
  # @!attribute [r] voice_client
  #   @return [Discorb::Voice::Client] The voice client.
  #   @return [nil] If the client is not connected to the voice server.
  def voice_client
    @client.voice_clients[@id.to_s]
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
discorb-voice-0.1.0 lib/discorb/voice/extend.rb