Class: MTProto::Client::RPC

Inherits:
Object
  • Object
show all
Defined in:
lib/mtproto/client/rpc.rb,
lib/mtproto/client/rpc/response.rb

Defined Under Namespace

Classes: Response

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client) ⇒ RPC

Returns a new instance of RPC.



11
12
13
14
# File 'lib/mtproto/client/rpc.rb', line 11

def initialize(client)
  @client = client
  @pending_requests = {}
end

Instance Attribute Details

#pending_requestsObject (readonly)

Returns the value of attribute pending_requests.



9
10
11
# File 'lib/mtproto/client/rpc.rb', line 9

def pending_requests
  @pending_requests
end

Instance Method Details

#call(request, response_class) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/mtproto/client/rpc.rb', line 16

def call(request, response_class)
  raise 'Mainloop not running' unless @client.mainloop_running?
  raise 'Auth key not generated' unless @client.auth_key?
  raise 'Session not initialized' unless @client.session

  body = serialize_request(request)
  msg_id = send_encrypted(body)
  response = Response.new(msg_id, response_class, body)
  @pending_requests[msg_id] = response

  response
end

#handle_bad_server_salt(response_body, client) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/mtproto/client/rpc.rb', line 29

def handle_bad_server_salt(response_body, client)
  bad_msg_id = response_body[4, 8].unpack1('Q<')
  new_server_salt = response_body[20, 8].unpack1('Q<')

  client.update_server_salt(new_server_salt)

  response = @pending_requests.delete(bad_msg_id)
  return unless response

  new_msg_id = send_encrypted(response.body_bytes)
  response.instance_variable_set(:@msg_id, new_msg_id)
  @pending_requests[new_msg_id] = response
end

#handle_rpc_result(response_body) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/mtproto/client/rpc.rb', line 43

def handle_rpc_result(response_body)
  req_msg_id = response_body[4, 8].unpack1('Q<')
  result = response_body[12..]

  result_constructor = result[0, 4].unpack1('L<')
  if result_constructor == TL::Constructors::GZIP_PACKED
    result = TL::GzipPacked.unpack(result)
    result_constructor = result[0, 4].unpack1('L<')
  end

  response = @pending_requests.delete(req_msg_id)
  return unless response

  if result_constructor == TL::Constructors::RPC_ERROR
    error = TL::RpcError.deserialize(result)
    response.signal_error(RpcError.new(error.error_code, error.error_message))
  else
    response.signal(result)
  end
end

#signal_all_error(error) ⇒ Object



64
65
66
67
# File 'lib/mtproto/client/rpc.rb', line 64

def signal_all_error(error)
  @pending_requests.each_value { |response| response.signal_error(error) }
  @pending_requests.clear
end