mtproto 0.0.9 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/data/tl-schema.json +42686 -0
  3. data/ext/aes_ige/extconf.rb +1 -1
  4. data/ext/factorization/extconf.rb +1 -1
  5. data/lib/mtproto/client/api/get_dialogs.rb +21 -0
  6. data/lib/mtproto/client/api/get_history.rb +20 -0
  7. data/lib/mtproto/client/api.rb +8 -0
  8. data/lib/mtproto/client/rpc.rb +4 -7
  9. data/lib/mtproto/client.rb +7 -7
  10. data/lib/mtproto/errors.rb +8 -0
  11. data/lib/mtproto/tl/constructor_names.rb +2271 -0
  12. data/lib/mtproto/tl/constructors.rb +91 -2261
  13. data/lib/mtproto/tl/object.rb +1 -1
  14. data/lib/mtproto/tl/objects/account_password.rb +2 -5
  15. data/lib/mtproto/tl/objects/authorization.rb +2 -5
  16. data/lib/mtproto/tl/objects/check_password.rb +2 -5
  17. data/lib/mtproto/tl/objects/client_dh_inner_data.rb +1 -3
  18. data/lib/mtproto/tl/objects/dh_gen_response.rb +3 -7
  19. data/lib/mtproto/tl/objects/dialogs.rb +453 -0
  20. data/lib/mtproto/tl/objects/export_login_token.rb +2 -5
  21. data/lib/mtproto/tl/objects/get_config.rb +1 -3
  22. data/lib/mtproto/tl/objects/get_dialogs.rb +51 -0
  23. data/lib/mtproto/tl/objects/get_difference.rb +1 -3
  24. data/lib/mtproto/tl/objects/get_history.rb +49 -0
  25. data/lib/mtproto/tl/objects/get_password.rb +1 -3
  26. data/lib/mtproto/tl/objects/get_state.rb +1 -3
  27. data/lib/mtproto/tl/objects/get_users.rb +3 -7
  28. data/lib/mtproto/{type → tl/objects}/gzip_packed.rb +1 -3
  29. data/lib/mtproto/tl/objects/help_config.rb +4 -5
  30. data/lib/mtproto/tl/objects/import_login_token.rb +1 -3
  31. data/lib/mtproto/tl/objects/init_connection.rb +1 -3
  32. data/lib/mtproto/tl/objects/invoke_with_layer.rb +1 -3
  33. data/lib/mtproto/tl/objects/login_token.rb +3 -7
  34. data/lib/mtproto/{type → tl/objects}/message.rb +1 -1
  35. data/lib/mtproto/tl/objects/messages.rb +162 -0
  36. data/lib/mtproto/{type → tl/objects}/msg_container.rb +1 -3
  37. data/lib/mtproto/{type → tl/objects}/new_session_created.rb +1 -3
  38. data/lib/mtproto/tl/objects/pq_inner_data.rb +1 -4
  39. data/lib/mtproto/tl/objects/req_dh_params.rb +1 -3
  40. data/lib/mtproto/tl/objects/req_pq_multi.rb +1 -3
  41. data/lib/mtproto/tl/objects/res_pq.rb +2 -4
  42. data/lib/mtproto/{type → tl/objects}/rpc_error.rb +1 -3
  43. data/lib/mtproto/tl/objects/send_code.rb +2 -5
  44. data/lib/mtproto/tl/objects/sent_code.rb +4 -4
  45. data/lib/mtproto/tl/objects/server_dh_inner_data.rb +3 -3
  46. data/lib/mtproto/tl/objects/server_dh_params.rb +3 -3
  47. data/lib/mtproto/tl/objects/set_client_dh_params.rb +1 -3
  48. data/lib/mtproto/tl/objects/sign_in.rb +1 -3
  49. data/lib/mtproto/tl/objects/update.rb +3 -6
  50. data/lib/mtproto/tl/objects/update_short.rb +0 -2
  51. data/lib/mtproto/tl/objects/update_short_message.rb +0 -2
  52. data/lib/mtproto/tl/objects/updates_difference.rb +6 -11
  53. data/lib/mtproto/tl/objects/updates_state.rb +1 -3
  54. data/lib/mtproto/tl/objects/users.rb +2 -5
  55. data/lib/mtproto/tl/schema.rb +102 -0
  56. data/lib/mtproto/version.rb +1 -1
  57. data/lib/mtproto.rb +6 -10
  58. metadata +15 -11
  59. data/lib/mtproto/type/bad_msg_notification.rb +0 -46
  60. data/lib/mtproto/type/client_dh_inner_data.rb +0 -29
  61. data/lib/mtproto/type/pq_inner_data.rb +0 -41
  62. data/lib/mtproto/type/serializer.rb +0 -55
  63. data/lib/mtproto/type/server_dh_inner_data.rb +0 -85
@@ -16,4 +16,4 @@ abort 'AES_ige_encrypt function not found in OpenSSL library.' unless have_func(
16
16
  # Suppress deprecation warnings for OpenSSL 3.0
17
17
  $CFLAGS += ' -Wno-deprecated-declarations'
18
18
 
19
- create_makefile('aes_ige/aes_ige')
19
+ create_makefile('aes_ige')
@@ -2,4 +2,4 @@
2
2
 
3
3
  require 'mkmf'
4
4
 
5
- create_makefile('factorization/factorization')
5
+ create_makefile('factorization')
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../tl/objects/get_dialogs'
4
+ require_relative '../../tl/objects/dialogs'
5
+
6
+ module MTProto
7
+ class Client
8
+ class API
9
+ def get_dialogs(offset_date: 0, offset_id: 0, offset_peer: nil, limit: 100, exclude_pinned: false, folder_id: nil)
10
+ rpc_call(
11
+ TL::GetDialogs.new(
12
+ offset_date: offset_date, offset_id: offset_id,
13
+ offset_peer: offset_peer, limit: limit,
14
+ exclude_pinned: exclude_pinned, folder_id: folder_id
15
+ ),
16
+ TL::Dialogs
17
+ ).body
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../tl/objects/get_history'
4
+ require_relative '../../tl/objects/messages'
5
+
6
+ module MTProto
7
+ class Client
8
+ class API
9
+ def get_history(peer:, offset_id: 0, offset_date: 0, add_offset: 0, limit: 100, max_id: 0, min_id: 0)
10
+ rpc_call(
11
+ TL::GetHistory.new(
12
+ peer: peer, offset_id: offset_id, offset_date: offset_date,
13
+ add_offset: add_offset, limit: limit, max_id: max_id, min_id: min_id
14
+ ),
15
+ TL::Messages
16
+ ).body
17
+ end
18
+ end
19
+ end
20
+ end
@@ -6,6 +6,8 @@ require_relative 'api/export_login_token'
6
6
  require_relative 'api/import_login_token'
7
7
  require_relative 'api/check_password'
8
8
  require_relative 'api/get_users'
9
+ require_relative 'api/get_dialogs'
10
+ require_relative 'api/get_history'
9
11
  require_relative 'api/get_updates_state'
10
12
  require_relative 'api/get_updates_difference'
11
13
 
@@ -22,6 +24,12 @@ module MTProto
22
24
  response = @client.rpc.call(request, response_class)
23
25
  response.wait!(@client.timeout)
24
26
  response
27
+ rescue RpcError => e
28
+ raise unless e.flood_wait?
29
+
30
+ warn "[MTProto] FLOOD_WAIT: retrying in #{e.flood_wait_seconds}s..."
31
+ sleep(e.flood_wait_seconds)
32
+ retry
25
33
  end
26
34
  end
27
35
  end
@@ -6,9 +6,6 @@ require_relative 'rpc/response'
6
6
  module MTProto
7
7
  class Client
8
8
  class RPC
9
- CONSTRUCTOR_RPC_RESULT = 0xf35c6d01
10
- CONSTRUCTOR_BAD_SERVER_SALT = 0xedab447b
11
-
12
9
  attr_reader :pending_requests
13
10
 
14
11
  def initialize(client)
@@ -48,16 +45,16 @@ module MTProto
48
45
  result = response_body[12..]
49
46
 
50
47
  result_constructor = result[0, 4].unpack1('L<')
51
- if result_constructor == Type::GzipPacked::CONSTRUCTOR
52
- result = Type::GzipPacked.unpack(result)
48
+ if result_constructor == TL::Constructors::GZIP_PACKED
49
+ result = TL::GzipPacked.unpack(result)
53
50
  result_constructor = result[0, 4].unpack1('L<')
54
51
  end
55
52
 
56
53
  response = @pending_requests.delete(req_msg_id)
57
54
  return unless response
58
55
 
59
- if result_constructor == Type::RpcError::CONSTRUCTOR
60
- error = Type::RpcError.deserialize(result)
56
+ if result_constructor == TL::Constructors::RPC_ERROR
57
+ error = TL::RpcError.deserialize(result)
61
58
  response.signal_error(RpcError.new(error.error_code, error.error_message))
62
59
  else
63
60
  response.signal(result)
@@ -8,7 +8,7 @@ require 'async/condition'
8
8
  require_relative 'transport/tcp_connection'
9
9
  require_relative 'transport/connection'
10
10
  require_relative 'transport/abridged_packet_codec'
11
- require_relative 'type/message'
11
+ require_relative 'tl/objects/message'
12
12
  require_relative 'client/rpc'
13
13
  require_relative 'client/api'
14
14
  require_relative 'tl/objects/invoke_with_layer'
@@ -226,13 +226,13 @@ module MTProto
226
226
  constructor = response_body[0, 4].unpack1('L<')
227
227
 
228
228
  case constructor
229
- when RPC::CONSTRUCTOR_BAD_SERVER_SALT
229
+ when TL::Constructors::BAD_SERVER_SALT
230
230
  rpc.handle_bad_server_salt(response_body, self)
231
- when Type::NewSessionCreated::CONSTRUCTOR
231
+ when TL::Constructors::NEW_SESSION_CREATED
232
232
  handle_new_session(response_body)
233
- when Type::MsgContainer::CONSTRUCTOR
233
+ when TL::Constructors::MSG_CONTAINER
234
234
  handle_container(response_body)
235
- when RPC::CONSTRUCTOR_RPC_RESULT
235
+ when TL::Constructors::RPC_RESULT
236
236
  rpc.handle_rpc_result(response_body)
237
237
  else
238
238
  @on_update_callbacks.each { |cb| cb.call(constructor, response_body) }
@@ -240,12 +240,12 @@ module MTProto
240
240
  end
241
241
 
242
242
  def handle_new_session(response_body)
243
- session_info = Type::NewSessionCreated.deserialize(response_body)
243
+ session_info = TL::NewSessionCreated.deserialize(response_body)
244
244
  @server_salt = session_info.server_salt
245
245
  end
246
246
 
247
247
  def handle_container(response_body)
248
- container = Type::MsgContainer.deserialize(response_body)
248
+ container = TL::MsgContainer.deserialize(response_body)
249
249
 
250
250
  container.messages.each do |msg|
251
251
  process_message(msg[:body])
@@ -23,6 +23,14 @@ module MTProto
23
23
  @error_message = error_message
24
24
  super("RPC Error #{error_code}: #{error_message}")
25
25
  end
26
+
27
+ def flood_wait?
28
+ error_message&.start_with?('FLOOD_WAIT_')
29
+ end
30
+
31
+ def flood_wait_seconds
32
+ error_message&.match(/FLOOD_WAIT_(\d+)/)&.[](1)&.to_i
33
+ end
26
34
  end
27
35
 
28
36
  class UnexpectedConstructorError < Error