mtproto 0.0.8 → 0.0.10

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 (132) hide show
  1. checksums.yaml +4 -4
  2. data/data/tl-schema.json +42686 -0
  3. data/ext/aes_ige/extconf.rb +3 -9
  4. data/ext/factorization/extconf.rb +2 -0
  5. data/lib/mtproto/auth_key_generator.rb +68 -105
  6. data/lib/mtproto/binary.rb +21 -0
  7. data/lib/mtproto/client/api/check_password.rb +41 -0
  8. data/lib/mtproto/client/api/export_login_token.rb +27 -0
  9. data/lib/mtproto/client/api/get_dialogs.rb +21 -0
  10. data/lib/mtproto/client/api/get_history.rb +20 -0
  11. data/lib/mtproto/client/api/get_updates_difference.rb +21 -0
  12. data/lib/mtproto/client/api/get_updates_state.rb +14 -0
  13. data/lib/mtproto/client/api/get_users.rb +14 -0
  14. data/lib/mtproto/client/api/import_login_token.rb +23 -0
  15. data/lib/mtproto/client/api/send_code.rb +21 -0
  16. data/lib/mtproto/client/api/sign_in.rb +27 -0
  17. data/lib/mtproto/client/api.rb +36 -0
  18. data/lib/mtproto/client/rpc/response.rb +63 -0
  19. data/lib/mtproto/client/rpc.rb +60 -127
  20. data/lib/mtproto/client.rb +143 -32
  21. data/lib/mtproto/crypto/dh_key_exchange.rb +1 -2
  22. data/lib/mtproto/crypto/dh_validator.rb +17 -19
  23. data/lib/mtproto/crypto/factorization.rb +1 -1
  24. data/lib/mtproto/crypto/rsa_key.rb +2 -2
  25. data/lib/mtproto/crypto/srp.rb +117 -0
  26. data/lib/mtproto/delegate_methods.rb +11 -0
  27. data/lib/mtproto/errors.rb +8 -0
  28. data/lib/mtproto/message/message.rb +85 -0
  29. data/lib/mtproto/session.rb +1 -1
  30. data/lib/mtproto/tl/constructor_names.rb +2271 -0
  31. data/lib/mtproto/tl/constructors.rb +99 -0
  32. data/lib/mtproto/tl/object.rb +25 -0
  33. data/lib/mtproto/tl/objects/account_password.rb +69 -0
  34. data/lib/mtproto/tl/objects/authorization.rb +70 -0
  35. data/lib/mtproto/tl/objects/check_password.rb +43 -0
  36. data/lib/mtproto/tl/objects/client_dh_inner_data.rb +45 -0
  37. data/lib/mtproto/tl/objects/dh_gen_response.rb +46 -0
  38. data/lib/mtproto/tl/objects/dialogs.rb +453 -0
  39. data/lib/mtproto/tl/objects/export_login_token.rb +48 -0
  40. data/lib/mtproto/tl/objects/get_config.rb +13 -0
  41. data/lib/mtproto/tl/objects/get_dialogs.rb +51 -0
  42. data/lib/mtproto/tl/objects/get_difference.rb +34 -0
  43. data/lib/mtproto/tl/objects/get_history.rb +49 -0
  44. data/lib/mtproto/tl/objects/get_password.rb +13 -0
  45. data/lib/mtproto/tl/objects/get_state.rb +13 -0
  46. data/lib/mtproto/tl/objects/get_users.rb +16 -0
  47. data/lib/mtproto/{type → tl/objects}/gzip_packed.rb +6 -6
  48. data/lib/mtproto/tl/objects/help_config.rb +76 -0
  49. data/lib/mtproto/tl/objects/import_login_token.rb +37 -0
  50. data/lib/mtproto/tl/objects/init_connection.rb +57 -0
  51. data/lib/mtproto/tl/objects/invoke_with_layer.rb +20 -0
  52. data/lib/mtproto/tl/objects/login_token.rb +78 -0
  53. data/lib/mtproto/{type → tl/objects}/message.rb +3 -3
  54. data/lib/mtproto/tl/objects/messages.rb +162 -0
  55. data/lib/mtproto/{type → tl/objects}/msg_container.rb +1 -3
  56. data/lib/mtproto/{type → tl/objects}/new_session_created.rb +1 -3
  57. data/lib/mtproto/tl/objects/pq_inner_data.rb +66 -0
  58. data/lib/mtproto/tl/objects/req_dh_params.rb +63 -0
  59. data/lib/mtproto/tl/objects/req_pq_multi.rb +21 -0
  60. data/lib/mtproto/tl/objects/res_pq.rb +73 -0
  61. data/lib/mtproto/{type → tl/objects}/rpc_error.rb +1 -4
  62. data/lib/mtproto/tl/objects/send_code.rb +47 -0
  63. data/lib/mtproto/tl/objects/sent_code.rb +79 -0
  64. data/lib/mtproto/tl/objects/server_dh_inner_data.rb +74 -0
  65. data/lib/mtproto/tl/objects/server_dh_params.rb +53 -0
  66. data/lib/mtproto/tl/objects/set_client_dh_params.rb +46 -0
  67. data/lib/mtproto/tl/objects/sign_in.rb +45 -0
  68. data/lib/mtproto/tl/objects/update.rb +77 -0
  69. data/lib/mtproto/tl/objects/update_short.rb +20 -0
  70. data/lib/mtproto/tl/objects/update_short_message.rb +65 -0
  71. data/lib/mtproto/tl/objects/updates_difference.rb +152 -0
  72. data/lib/mtproto/tl/objects/updates_state.rb +35 -0
  73. data/lib/mtproto/tl/objects/users.rb +83 -0
  74. data/lib/mtproto/tl/schema.rb +102 -0
  75. data/lib/mtproto/transport/abridged_packet_codec.rb +35 -12
  76. data/lib/mtproto/transport/connection.rb +23 -0
  77. data/lib/mtproto/transport/errors.rb +11 -0
  78. data/lib/mtproto/transport/packet.rb +19 -0
  79. data/lib/mtproto/transport/tcp_connection.rb +57 -46
  80. data/lib/mtproto/updates_poller.rb +37 -33
  81. data/lib/mtproto/version.rb +1 -1
  82. data/lib/mtproto.rb +17 -27
  83. data/scripts/generate_constructors.rb +65 -0
  84. metadata +76 -61
  85. data/lib/mtproto/async/middleware/base.rb +0 -17
  86. data/lib/mtproto/async/middleware/flood_wait.rb +0 -42
  87. data/lib/mtproto/async/request.rb +0 -18
  88. data/lib/mtproto/async/request_queue.rb +0 -63
  89. data/lib/mtproto/async_client.rb +0 -201
  90. data/lib/mtproto/rpc/get_config.rb +0 -34
  91. data/lib/mtproto/rpc/get_contacts.rb +0 -29
  92. data/lib/mtproto/rpc/get_updates_difference.rb +0 -51
  93. data/lib/mtproto/rpc/get_updates_state.rb +0 -29
  94. data/lib/mtproto/rpc/get_users.rb +0 -29
  95. data/lib/mtproto/rpc/ping.rb +0 -33
  96. data/lib/mtproto/rpc/send_code.rb +0 -41
  97. data/lib/mtproto/rpc/send_message.rb +0 -47
  98. data/lib/mtproto/rpc/sign_in.rb +0 -48
  99. data/lib/mtproto/type/auth_key/dh_gen_response.rb +0 -37
  100. data/lib/mtproto/type/auth_key/req_dh_params.rb +0 -31
  101. data/lib/mtproto/type/auth_key/req_pq_multi.rb +0 -18
  102. data/lib/mtproto/type/auth_key/res_pq.rb +0 -62
  103. data/lib/mtproto/type/auth_key/server_dh_params.rb +0 -43
  104. data/lib/mtproto/type/auth_key/set_client_dh_params.rb +0 -25
  105. data/lib/mtproto/type/bad_msg_notification.rb +0 -46
  106. data/lib/mtproto/type/client_dh_inner_data.rb +0 -29
  107. data/lib/mtproto/type/code_settings.rb +0 -25
  108. data/lib/mtproto/type/config.rb +0 -124
  109. data/lib/mtproto/type/pq_inner_data.rb +0 -41
  110. data/lib/mtproto/type/rpc/auth/authorization.rb +0 -107
  111. data/lib/mtproto/type/rpc/auth/send_code.rb +0 -28
  112. data/lib/mtproto/type/rpc/auth/sent_code.rb +0 -36
  113. data/lib/mtproto/type/rpc/auth/sign_in.rb +0 -32
  114. data/lib/mtproto/type/rpc/contacts/contacts.rb +0 -155
  115. data/lib/mtproto/type/rpc/contacts/get_contacts.rb +0 -18
  116. data/lib/mtproto/type/rpc/help/config.rb +0 -35
  117. data/lib/mtproto/type/rpc/help/get_config.rb +0 -17
  118. data/lib/mtproto/type/rpc/init_connection.rb +0 -28
  119. data/lib/mtproto/type/rpc/invoke_with_layer.rb +0 -19
  120. data/lib/mtproto/type/rpc/messages/send_message.rb +0 -43
  121. data/lib/mtproto/type/rpc/messages/updates.rb +0 -87
  122. data/lib/mtproto/type/rpc/ping.rb +0 -18
  123. data/lib/mtproto/type/rpc/pong.rb +0 -46
  124. data/lib/mtproto/type/rpc/updates/difference.rb +0 -332
  125. data/lib/mtproto/type/rpc/updates/get_difference.rb +0 -42
  126. data/lib/mtproto/type/rpc/updates/get_state.rb +0 -17
  127. data/lib/mtproto/type/rpc/updates/state.rb +0 -59
  128. data/lib/mtproto/type/rpc/users/get_users.rb +0 -25
  129. data/lib/mtproto/type/rpc/users/users.rb +0 -99
  130. data/lib/mtproto/type/sent_code.rb +0 -128
  131. data/lib/mtproto/type/serializer.rb +0 -55
  132. data/lib/mtproto/type/server_dh_inner_data.rb +0 -85
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'rpc/get_updates_state'
4
- require_relative 'rpc/get_updates_difference'
5
-
6
3
  module MTProto
7
4
  class UpdatesPoller
8
5
  attr_reader :state, :running
@@ -14,7 +11,7 @@ module MTProto
14
11
  @running = false
15
12
  @on_message_callbacks = []
16
13
  @on_update_callbacks = []
17
- @users_cache = {} # Cache user_id => access_hash
14
+ @users_cache = {}
18
15
  end
19
16
 
20
17
  def on_message(&block)
@@ -27,11 +24,11 @@ module MTProto
27
24
 
28
25
  def start
29
26
  raise 'Already running' if @running
30
- raise 'Auth key not generated' unless @client.auth_key
27
+ raise 'Auth key not set' unless @client.auth_key?
31
28
 
32
29
  @running = true
33
30
 
34
- @state = RPC::GetUpdatesState.new(@client).call_sync
31
+ @state = call_with_retry { @client.api.get_updates_state }
35
32
 
36
33
  poll_loop
37
34
  end
@@ -45,65 +42,72 @@ module MTProto
45
42
  def poll_loop
46
43
  while @running
47
44
  begin
48
- difference = RPC::GetUpdatesDifference.new(@client).call_sync(
49
- pts: @state[:pts],
50
- date: @state[:date],
51
- qts: @state[:qts]
52
- )
45
+ difference = call_with_retry do
46
+ @client.api.get_updates_difference(
47
+ pts: @state.pts,
48
+ date: @state.date,
49
+ qts: @state.qts
50
+ )
51
+ end
53
52
 
54
53
  process_difference(difference)
55
54
 
56
- if difference[:state]
57
- @state = @state.merge(difference[:state])
58
- elsif difference[:type] == :too_long
59
- @state = RPC::GetUpdatesState.new(@client).call_sync
60
- elsif difference[:date]
61
- @state[:date] = difference[:date]
55
+ if difference.state
56
+ @state = difference.state
57
+ elsif difference.type == :too_long
58
+ @state = call_with_retry { @client.api.get_updates_state }
59
+ elsif difference.date
60
+ @state.date = difference.date
62
61
  end
63
62
 
64
63
  sleep @poll_interval
65
64
  rescue MTProto::RpcError => e
66
- puts "RPC Error during polling: #{e.message}"
65
+ warn "RPC Error during polling: #{e.message}"
67
66
  sleep @poll_interval
68
67
  rescue StandardError => e
69
- puts "Error during polling: #{e.class} - #{e.message}"
70
- puts e.backtrace.first(5)
68
+ warn "Error during polling: #{e.class} - #{e.message}"
69
+ warn e.backtrace.first(5).join("\n")
71
70
  sleep @poll_interval
72
71
  end
73
72
  end
74
73
  end
75
74
 
75
+ def call_with_retry(max_retries: 5)
76
+ retries = 0
77
+ begin
78
+ yield
79
+ rescue MTProto::UnexpectedConstructorError, RuntimeError
80
+ retries += 1
81
+ retry if retries < max_retries
82
+ raise
83
+ end
84
+ end
85
+
76
86
  def process_difference(difference)
77
- case difference[:type]
87
+ case difference.type
78
88
  when :empty
79
89
  nil
80
90
  when :difference, :slice, :short_message
81
- if difference[:users]
82
- difference[:users].each do |user|
83
- if user[:access_hash]
84
- @users_cache[user[:id]] = user[:access_hash]
85
- end
86
- end
91
+ difference.users&.each do |user|
92
+ @users_cache[user[:id]] = user[:access_hash] if user[:access_hash]
87
93
  end
88
94
 
89
- if difference[:new_messages] && !difference[:new_messages].empty?
90
- difference[:new_messages].each do |message|
95
+ if difference.new_messages && !difference.new_messages.empty?
96
+ difference.new_messages.each do |message|
91
97
  process_message(message)
92
98
  end
93
99
  end
94
100
 
95
101
  @on_update_callbacks.each { |callback| callback.call(difference) }
96
102
  when :too_long
97
- puts "Update gap too long (pts=#{difference[:pts]}), refreshing state..."
103
+ puts "Update gap too long (pts=#{difference.pts}), refreshing state..."
98
104
  end
99
105
  end
100
106
 
101
107
  def process_message(message)
102
108
  return unless message
103
109
 
104
- if message[:user_id] && @users_cache[message[:user_id]]
105
- message[:access_hash] = @users_cache[message[:user_id]]
106
- end
110
+ message[:access_hash] = @users_cache[message[:user_id]] if message[:user_id] && @users_cache[message[:user_id]]
107
111
 
108
112
  @on_message_callbacks.each { |callback| callback.call(message) }
109
113
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MTProto
4
- VERSION = '0.0.8'
4
+ VERSION = '0.0.10'
5
5
  end
data/lib/mtproto.rb CHANGED
@@ -2,21 +2,25 @@
2
2
 
3
3
  require_relative 'mtproto/version'
4
4
  require_relative 'mtproto/errors'
5
+ require_relative 'mtproto/binary'
6
+ require_relative 'mtproto/delegate_methods'
7
+ require_relative 'mtproto/transport/errors'
8
+ require_relative 'mtproto/transport/packet'
5
9
  require_relative 'mtproto/transport/abridged_packet_codec'
6
10
  require_relative 'mtproto/transport/tcp_connection'
7
- require_relative 'mtproto/type/message'
8
- require_relative 'mtproto/type/serializer'
9
- require_relative 'mtproto/type/pq_inner_data'
10
- require_relative 'mtproto/type/server_dh_inner_data'
11
- require_relative 'mtproto/type/client_dh_inner_data'
12
- require_relative 'mtproto/type/bad_msg_notification'
13
- require_relative 'mtproto/type/msg_container'
14
- require_relative 'mtproto/type/new_session_created'
15
- require_relative 'mtproto/type/rpc_error'
16
- require_relative 'mtproto/type/gzip_packed'
17
- require_relative 'mtproto/type/config'
18
- require_relative 'mtproto/type/code_settings'
19
- require_relative 'mtproto/type/sent_code'
11
+ require_relative 'mtproto/transport/connection'
12
+ require_relative 'mtproto/message/message'
13
+ require_relative 'mtproto/tl/constructors'
14
+ require_relative 'mtproto/tl/constructor_names'
15
+ require_relative 'mtproto/tl/object'
16
+ require_relative 'mtproto/tl/objects/update'
17
+ require_relative 'mtproto/tl/objects/update_short'
18
+ require_relative 'mtproto/tl/objects/update_short_message'
19
+ require_relative 'mtproto/tl/objects/message'
20
+ require_relative 'mtproto/tl/objects/msg_container'
21
+ require_relative 'mtproto/tl/objects/new_session_created'
22
+ require_relative 'mtproto/tl/objects/rpc_error'
23
+ require_relative 'mtproto/tl/objects/gzip_packed'
20
24
  require_relative 'mtproto/crypto/rsa_key'
21
25
  require_relative 'mtproto/crypto/factorization'
22
26
  require_relative 'mtproto/crypto/aes_ige'
@@ -29,21 +33,7 @@ require_relative 'mtproto/auth_key_generator'
29
33
  require_relative 'mtproto/session'
30
34
  require_relative 'mtproto/encrypted_message'
31
35
  require_relative 'mtproto/client'
32
- require_relative 'mtproto/rpc/ping'
33
- require_relative 'mtproto/rpc/get_config'
34
- require_relative 'mtproto/rpc/send_code'
35
- require_relative 'mtproto/rpc/sign_in'
36
- require_relative 'mtproto/rpc/get_users'
37
- require_relative 'mtproto/rpc/send_message'
38
- require_relative 'mtproto/rpc/get_updates_state'
39
- require_relative 'mtproto/rpc/get_updates_difference'
40
- require_relative 'mtproto/rpc/get_contacts'
41
36
  require_relative 'mtproto/updates_poller'
42
- require_relative 'mtproto/async/request'
43
- require_relative 'mtproto/async/request_queue'
44
- require_relative 'mtproto/async/middleware/base'
45
- require_relative 'mtproto/async/middleware/flood_wait'
46
- require_relative 'mtproto/async_client'
47
37
 
48
38
  module MTProto
49
39
  end
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'json'
5
+ require 'net/http'
6
+ require 'uri'
7
+
8
+ SCHEMAS = {
9
+ 'https://core.telegram.org/schema/mtproto-json' => 'MTProto',
10
+ 'https://core.telegram.org/schema/json' => 'API'
11
+ }.freeze
12
+
13
+ def fetch_schema(url)
14
+ uri = URI(url)
15
+ response = Net::HTTP.get(uri)
16
+ JSON.parse(response)
17
+ end
18
+
19
+ def signed_to_unsigned(id)
20
+ id = id.to_i
21
+ id < 0 ? id + (2**32) : id
22
+ end
23
+
24
+ entries = {}
25
+
26
+ SCHEMAS.each do |url, label|
27
+ schema = fetch_schema(url)
28
+ puts "#{label}: #{schema['constructors'].size} constructors, #{schema['methods'].size} methods"
29
+
30
+ schema['constructors'].each do |c|
31
+ hex = signed_to_unsigned(c['id'])
32
+ entries[hex] = c['predicate']
33
+ end
34
+
35
+ schema['methods'].each do |m|
36
+ hex = signed_to_unsigned(m['id'])
37
+ entries[hex] = m['method']
38
+ end
39
+ end
40
+
41
+ puts "Total: #{entries.size} entries"
42
+
43
+ lines = entries.sort_by { |hex, _| hex }.map do |hex, name|
44
+ " 0x#{hex.to_s(16).rjust(8, '0')} => '#{name}'"
45
+ end
46
+
47
+ output = <<~RUBY
48
+ # frozen_string_literal: true
49
+
50
+ # Auto-generated from Telegram TL schemas.
51
+ # Run: ruby scripts/generate_constructors.rb
52
+
53
+ module MTProto
54
+ module TL
55
+ module Constructors
56
+ NAMES = {
57
+ #{lines.join(",\n")}
58
+ }.freeze
59
+ end
60
+ end
61
+ end
62
+ RUBY
63
+
64
+ File.write(File.expand_path('../lib/mtproto/tl/constructors.rb', __dir__), output)
65
+ puts 'Written to lib/mtproto/tl/constructors.rb'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mtproto
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artem Levenkov
@@ -10,57 +10,68 @@ cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
- name: base64
13
+ name: async
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '0.2'
18
+ version: '2.0'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: '0.2'
25
+ version: '2.0'
26
26
  - !ruby/object:Gem::Dependency
27
- name: concurrent-ruby
27
+ name: base64
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: '1.3'
32
+ version: '0.2'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '1.3'
39
+ version: '0.2'
40
40
  description: A Ruby library for Telegram MTProto protocol with TCP abridged transport
41
41
  support
42
42
  email:
43
43
  - me@alev.pro
44
44
  executables: []
45
- extensions: []
45
+ extensions:
46
+ - ext/aes_ige/extconf.rb
47
+ - ext/factorization/extconf.rb
46
48
  extra_rdoc_files: []
47
49
  files:
48
50
  - ".env.example"
49
51
  - ".ruby-version"
50
52
  - Rakefile
53
+ - data/tl-schema.json
51
54
  - ext/aes_ige/aes_ige.c
52
55
  - ext/aes_ige/extconf.rb
53
56
  - ext/factorization/extconf.rb
54
57
  - ext/factorization/factorization.c
55
58
  - lib/mtproto.rb
56
- - lib/mtproto/async/middleware/base.rb
57
- - lib/mtproto/async/middleware/flood_wait.rb
58
- - lib/mtproto/async/request.rb
59
- - lib/mtproto/async/request_queue.rb
60
- - lib/mtproto/async_client.rb
61
59
  - lib/mtproto/auth_key_generator.rb
60
+ - lib/mtproto/binary.rb
62
61
  - lib/mtproto/client.rb
62
+ - lib/mtproto/client/api.rb
63
+ - lib/mtproto/client/api/check_password.rb
64
+ - lib/mtproto/client/api/export_login_token.rb
65
+ - lib/mtproto/client/api/get_dialogs.rb
66
+ - lib/mtproto/client/api/get_history.rb
67
+ - lib/mtproto/client/api/get_updates_difference.rb
68
+ - lib/mtproto/client/api/get_updates_state.rb
69
+ - lib/mtproto/client/api/get_users.rb
70
+ - lib/mtproto/client/api/import_login_token.rb
71
+ - lib/mtproto/client/api/send_code.rb
72
+ - lib/mtproto/client/api/sign_in.rb
63
73
  - lib/mtproto/client/rpc.rb
74
+ - lib/mtproto/client/rpc/response.rb
64
75
  - lib/mtproto/crypto/aes_ige.rb
65
76
  - lib/mtproto/crypto/auth_key_helper.rb
66
77
  - lib/mtproto/crypto/dh_key_exchange.rb
@@ -69,62 +80,66 @@ files:
69
80
  - lib/mtproto/crypto/message_key.rb
70
81
  - lib/mtproto/crypto/rsa_key.rb
71
82
  - lib/mtproto/crypto/rsa_pad.rb
83
+ - lib/mtproto/crypto/srp.rb
84
+ - lib/mtproto/delegate_methods.rb
72
85
  - lib/mtproto/encrypted_message.rb
73
86
  - lib/mtproto/errors.rb
87
+ - lib/mtproto/message/message.rb
74
88
  - lib/mtproto/message_id.rb
75
- - lib/mtproto/rpc/get_config.rb
76
- - lib/mtproto/rpc/get_contacts.rb
77
- - lib/mtproto/rpc/get_updates_difference.rb
78
- - lib/mtproto/rpc/get_updates_state.rb
79
- - lib/mtproto/rpc/get_users.rb
80
- - lib/mtproto/rpc/ping.rb
81
- - lib/mtproto/rpc/send_code.rb
82
- - lib/mtproto/rpc/send_message.rb
83
- - lib/mtproto/rpc/sign_in.rb
84
89
  - lib/mtproto/session.rb
90
+ - lib/mtproto/tl/constructor_names.rb
91
+ - lib/mtproto/tl/constructors.rb
92
+ - lib/mtproto/tl/object.rb
93
+ - lib/mtproto/tl/objects/account_password.rb
94
+ - lib/mtproto/tl/objects/authorization.rb
95
+ - lib/mtproto/tl/objects/check_password.rb
96
+ - lib/mtproto/tl/objects/client_dh_inner_data.rb
97
+ - lib/mtproto/tl/objects/dh_gen_response.rb
98
+ - lib/mtproto/tl/objects/dialogs.rb
99
+ - lib/mtproto/tl/objects/export_login_token.rb
100
+ - lib/mtproto/tl/objects/get_config.rb
101
+ - lib/mtproto/tl/objects/get_dialogs.rb
102
+ - lib/mtproto/tl/objects/get_difference.rb
103
+ - lib/mtproto/tl/objects/get_history.rb
104
+ - lib/mtproto/tl/objects/get_password.rb
105
+ - lib/mtproto/tl/objects/get_state.rb
106
+ - lib/mtproto/tl/objects/get_users.rb
107
+ - lib/mtproto/tl/objects/gzip_packed.rb
108
+ - lib/mtproto/tl/objects/help_config.rb
109
+ - lib/mtproto/tl/objects/import_login_token.rb
110
+ - lib/mtproto/tl/objects/init_connection.rb
111
+ - lib/mtproto/tl/objects/invoke_with_layer.rb
112
+ - lib/mtproto/tl/objects/login_token.rb
113
+ - lib/mtproto/tl/objects/message.rb
114
+ - lib/mtproto/tl/objects/messages.rb
115
+ - lib/mtproto/tl/objects/msg_container.rb
116
+ - lib/mtproto/tl/objects/new_session_created.rb
117
+ - lib/mtproto/tl/objects/pq_inner_data.rb
118
+ - lib/mtproto/tl/objects/req_dh_params.rb
119
+ - lib/mtproto/tl/objects/req_pq_multi.rb
120
+ - lib/mtproto/tl/objects/res_pq.rb
121
+ - lib/mtproto/tl/objects/rpc_error.rb
122
+ - lib/mtproto/tl/objects/send_code.rb
123
+ - lib/mtproto/tl/objects/sent_code.rb
124
+ - lib/mtproto/tl/objects/server_dh_inner_data.rb
125
+ - lib/mtproto/tl/objects/server_dh_params.rb
126
+ - lib/mtproto/tl/objects/set_client_dh_params.rb
127
+ - lib/mtproto/tl/objects/sign_in.rb
128
+ - lib/mtproto/tl/objects/update.rb
129
+ - lib/mtproto/tl/objects/update_short.rb
130
+ - lib/mtproto/tl/objects/update_short_message.rb
131
+ - lib/mtproto/tl/objects/updates_difference.rb
132
+ - lib/mtproto/tl/objects/updates_state.rb
133
+ - lib/mtproto/tl/objects/users.rb
134
+ - lib/mtproto/tl/schema.rb
85
135
  - lib/mtproto/transport/abridged_packet_codec.rb
136
+ - lib/mtproto/transport/connection.rb
137
+ - lib/mtproto/transport/errors.rb
138
+ - lib/mtproto/transport/packet.rb
86
139
  - lib/mtproto/transport/tcp_connection.rb
87
- - lib/mtproto/type/auth_key/dh_gen_response.rb
88
- - lib/mtproto/type/auth_key/req_dh_params.rb
89
- - lib/mtproto/type/auth_key/req_pq_multi.rb
90
- - lib/mtproto/type/auth_key/res_pq.rb
91
- - lib/mtproto/type/auth_key/server_dh_params.rb
92
- - lib/mtproto/type/auth_key/set_client_dh_params.rb
93
- - lib/mtproto/type/bad_msg_notification.rb
94
- - lib/mtproto/type/client_dh_inner_data.rb
95
- - lib/mtproto/type/code_settings.rb
96
- - lib/mtproto/type/config.rb
97
- - lib/mtproto/type/gzip_packed.rb
98
- - lib/mtproto/type/message.rb
99
- - lib/mtproto/type/msg_container.rb
100
- - lib/mtproto/type/new_session_created.rb
101
- - lib/mtproto/type/pq_inner_data.rb
102
- - lib/mtproto/type/rpc/auth/authorization.rb
103
- - lib/mtproto/type/rpc/auth/send_code.rb
104
- - lib/mtproto/type/rpc/auth/sent_code.rb
105
- - lib/mtproto/type/rpc/auth/sign_in.rb
106
- - lib/mtproto/type/rpc/contacts/contacts.rb
107
- - lib/mtproto/type/rpc/contacts/get_contacts.rb
108
- - lib/mtproto/type/rpc/help/config.rb
109
- - lib/mtproto/type/rpc/help/get_config.rb
110
- - lib/mtproto/type/rpc/init_connection.rb
111
- - lib/mtproto/type/rpc/invoke_with_layer.rb
112
- - lib/mtproto/type/rpc/messages/send_message.rb
113
- - lib/mtproto/type/rpc/messages/updates.rb
114
- - lib/mtproto/type/rpc/ping.rb
115
- - lib/mtproto/type/rpc/pong.rb
116
- - lib/mtproto/type/rpc/updates/difference.rb
117
- - lib/mtproto/type/rpc/updates/get_difference.rb
118
- - lib/mtproto/type/rpc/updates/get_state.rb
119
- - lib/mtproto/type/rpc/updates/state.rb
120
- - lib/mtproto/type/rpc/users/get_users.rb
121
- - lib/mtproto/type/rpc/users/users.rb
122
- - lib/mtproto/type/rpc_error.rb
123
- - lib/mtproto/type/sent_code.rb
124
- - lib/mtproto/type/serializer.rb
125
- - lib/mtproto/type/server_dh_inner_data.rb
126
140
  - lib/mtproto/updates_poller.rb
127
141
  - lib/mtproto/version.rb
142
+ - scripts/generate_constructors.rb
128
143
  - tmp/.keep
129
144
  homepage: https://github.com/alev-pro/mtproto-ruby
130
145
  licenses:
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MTProto
4
- module Async
5
- module Middleware
6
- class Base
7
- def initialize(app)
8
- @app = app
9
- end
10
-
11
- def call(request, future, retry_fn, retries)
12
- @app.call(request, future, retry_fn, retries)
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
-
5
- module MTProto
6
- module Async
7
- module Middleware
8
- class FloodWait < Base
9
- def initialize(app, max_retries: 5)
10
- super(app)
11
- @max_retries = max_retries
12
- end
13
-
14
- def call(request, future, retry_fn, retries)
15
- wrapped = @app.call(request, future, retry_fn, retries)
16
-
17
- wrapped.rescue do |error|
18
- if flood_wait_error?(error) && retries < @max_retries
19
- delay = extract_delay(error.error_message)
20
- sleep(delay)
21
- retry_fn.call.value!
22
- else
23
- raise error
24
- end
25
- end
26
- end
27
-
28
- private
29
-
30
- def flood_wait_error?(error)
31
- error.is_a?(MTProto::RpcError) &&
32
- error.error_code == 420 &&
33
- error.error_message.start_with?('FLOOD_WAIT_')
34
- end
35
-
36
- def extract_delay(error_message)
37
- error_message[11..-1].to_i
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MTProto
4
- module Async
5
- class Request
6
- attr_reader :body, :metadata
7
-
8
- def initialize(body:, metadata: {})
9
- @body = body
10
- @metadata = metadata
11
- end
12
-
13
- def key
14
- metadata[:key] || :default
15
- end
16
- end
17
- end
18
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'concurrent-ruby'
4
-
5
- module MTProto
6
- module Async
7
- class RequestQueue
8
- def initialize
9
- @queues = Concurrent::Hash.new
10
- @threads = Concurrent::Hash.new
11
- @running = Concurrent::AtomicBoolean.new(true)
12
- end
13
-
14
- def call(key:, &blk)
15
- ensure_worker_running!(key)
16
-
17
- future = Concurrent::Promises.resolvable_future
18
- @queues[key] << [blk, future]
19
- future
20
- end
21
-
22
- def shutdown
23
- @running.make_false
24
- @threads.each_value do |thread|
25
- thread.join(2)
26
- thread.kill if thread.alive?
27
- end
28
- @threads.clear
29
- @queues.clear
30
- end
31
-
32
- private
33
-
34
- def ensure_worker_running!(key)
35
- return if @threads.key?(key) && @threads[key].alive?
36
-
37
- @queues[key] ||= Queue.new
38
- @threads[key] = Thread.new { worker_loop(key) }
39
- end
40
-
41
- def worker_loop(key)
42
- queue = @queues[key]
43
- loop do
44
- break unless @running.true?
45
-
46
- begin
47
- blk, future = queue.pop(true)
48
- result = blk.call
49
- if result.is_a?(Concurrent::Promises::Future)
50
- result.then { |v| future.fulfill(v) }.rescue { |e| future.reject(e) }
51
- else
52
- future.fulfill(result)
53
- end
54
- rescue ThreadError
55
- sleep 0.01
56
- rescue => e
57
- future&.reject(e) if future
58
- end
59
- end
60
- end
61
- end
62
- end
63
- end