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.
- checksums.yaml +4 -4
- data/data/tl-schema.json +42686 -0
- data/ext/aes_ige/extconf.rb +3 -9
- data/ext/factorization/extconf.rb +2 -0
- data/lib/mtproto/auth_key_generator.rb +68 -105
- data/lib/mtproto/binary.rb +21 -0
- data/lib/mtproto/client/api/check_password.rb +41 -0
- data/lib/mtproto/client/api/export_login_token.rb +27 -0
- data/lib/mtproto/client/api/get_dialogs.rb +21 -0
- data/lib/mtproto/client/api/get_history.rb +20 -0
- data/lib/mtproto/client/api/get_updates_difference.rb +21 -0
- data/lib/mtproto/client/api/get_updates_state.rb +14 -0
- data/lib/mtproto/client/api/get_users.rb +14 -0
- data/lib/mtproto/client/api/import_login_token.rb +23 -0
- data/lib/mtproto/client/api/send_code.rb +21 -0
- data/lib/mtproto/client/api/sign_in.rb +27 -0
- data/lib/mtproto/client/api.rb +36 -0
- data/lib/mtproto/client/rpc/response.rb +63 -0
- data/lib/mtproto/client/rpc.rb +60 -127
- data/lib/mtproto/client.rb +143 -32
- data/lib/mtproto/crypto/dh_key_exchange.rb +1 -2
- data/lib/mtproto/crypto/dh_validator.rb +17 -19
- data/lib/mtproto/crypto/factorization.rb +1 -1
- data/lib/mtproto/crypto/rsa_key.rb +2 -2
- data/lib/mtproto/crypto/srp.rb +117 -0
- data/lib/mtproto/delegate_methods.rb +11 -0
- data/lib/mtproto/errors.rb +8 -0
- data/lib/mtproto/message/message.rb +85 -0
- data/lib/mtproto/session.rb +1 -1
- data/lib/mtproto/tl/constructor_names.rb +2271 -0
- data/lib/mtproto/tl/constructors.rb +99 -0
- data/lib/mtproto/tl/object.rb +25 -0
- data/lib/mtproto/tl/objects/account_password.rb +69 -0
- data/lib/mtproto/tl/objects/authorization.rb +70 -0
- data/lib/mtproto/tl/objects/check_password.rb +43 -0
- data/lib/mtproto/tl/objects/client_dh_inner_data.rb +45 -0
- data/lib/mtproto/tl/objects/dh_gen_response.rb +46 -0
- data/lib/mtproto/tl/objects/dialogs.rb +453 -0
- data/lib/mtproto/tl/objects/export_login_token.rb +48 -0
- data/lib/mtproto/tl/objects/get_config.rb +13 -0
- data/lib/mtproto/tl/objects/get_dialogs.rb +51 -0
- data/lib/mtproto/tl/objects/get_difference.rb +34 -0
- data/lib/mtproto/tl/objects/get_history.rb +49 -0
- data/lib/mtproto/tl/objects/get_password.rb +13 -0
- data/lib/mtproto/tl/objects/get_state.rb +13 -0
- data/lib/mtproto/tl/objects/get_users.rb +16 -0
- data/lib/mtproto/{type → tl/objects}/gzip_packed.rb +6 -6
- data/lib/mtproto/tl/objects/help_config.rb +76 -0
- data/lib/mtproto/tl/objects/import_login_token.rb +37 -0
- data/lib/mtproto/tl/objects/init_connection.rb +57 -0
- data/lib/mtproto/tl/objects/invoke_with_layer.rb +20 -0
- data/lib/mtproto/tl/objects/login_token.rb +78 -0
- data/lib/mtproto/{type → tl/objects}/message.rb +3 -3
- data/lib/mtproto/tl/objects/messages.rb +162 -0
- data/lib/mtproto/{type → tl/objects}/msg_container.rb +1 -3
- data/lib/mtproto/{type → tl/objects}/new_session_created.rb +1 -3
- data/lib/mtproto/tl/objects/pq_inner_data.rb +66 -0
- data/lib/mtproto/tl/objects/req_dh_params.rb +63 -0
- data/lib/mtproto/tl/objects/req_pq_multi.rb +21 -0
- data/lib/mtproto/tl/objects/res_pq.rb +73 -0
- data/lib/mtproto/{type → tl/objects}/rpc_error.rb +1 -4
- data/lib/mtproto/tl/objects/send_code.rb +47 -0
- data/lib/mtproto/tl/objects/sent_code.rb +79 -0
- data/lib/mtproto/tl/objects/server_dh_inner_data.rb +74 -0
- data/lib/mtproto/tl/objects/server_dh_params.rb +53 -0
- data/lib/mtproto/tl/objects/set_client_dh_params.rb +46 -0
- data/lib/mtproto/tl/objects/sign_in.rb +45 -0
- data/lib/mtproto/tl/objects/update.rb +77 -0
- data/lib/mtproto/tl/objects/update_short.rb +20 -0
- data/lib/mtproto/tl/objects/update_short_message.rb +65 -0
- data/lib/mtproto/tl/objects/updates_difference.rb +152 -0
- data/lib/mtproto/tl/objects/updates_state.rb +35 -0
- data/lib/mtproto/tl/objects/users.rb +83 -0
- data/lib/mtproto/tl/schema.rb +102 -0
- data/lib/mtproto/transport/abridged_packet_codec.rb +35 -12
- data/lib/mtproto/transport/connection.rb +23 -0
- data/lib/mtproto/transport/errors.rb +11 -0
- data/lib/mtproto/transport/packet.rb +19 -0
- data/lib/mtproto/transport/tcp_connection.rb +57 -46
- data/lib/mtproto/updates_poller.rb +37 -33
- data/lib/mtproto/version.rb +1 -1
- data/lib/mtproto.rb +17 -27
- data/scripts/generate_constructors.rb +65 -0
- metadata +76 -61
- data/lib/mtproto/async/middleware/base.rb +0 -17
- data/lib/mtproto/async/middleware/flood_wait.rb +0 -42
- data/lib/mtproto/async/request.rb +0 -18
- data/lib/mtproto/async/request_queue.rb +0 -63
- data/lib/mtproto/async_client.rb +0 -201
- data/lib/mtproto/rpc/get_config.rb +0 -34
- data/lib/mtproto/rpc/get_contacts.rb +0 -29
- data/lib/mtproto/rpc/get_updates_difference.rb +0 -51
- data/lib/mtproto/rpc/get_updates_state.rb +0 -29
- data/lib/mtproto/rpc/get_users.rb +0 -29
- data/lib/mtproto/rpc/ping.rb +0 -33
- data/lib/mtproto/rpc/send_code.rb +0 -41
- data/lib/mtproto/rpc/send_message.rb +0 -47
- data/lib/mtproto/rpc/sign_in.rb +0 -48
- data/lib/mtproto/type/auth_key/dh_gen_response.rb +0 -37
- data/lib/mtproto/type/auth_key/req_dh_params.rb +0 -31
- data/lib/mtproto/type/auth_key/req_pq_multi.rb +0 -18
- data/lib/mtproto/type/auth_key/res_pq.rb +0 -62
- data/lib/mtproto/type/auth_key/server_dh_params.rb +0 -43
- data/lib/mtproto/type/auth_key/set_client_dh_params.rb +0 -25
- data/lib/mtproto/type/bad_msg_notification.rb +0 -46
- data/lib/mtproto/type/client_dh_inner_data.rb +0 -29
- data/lib/mtproto/type/code_settings.rb +0 -25
- data/lib/mtproto/type/config.rb +0 -124
- data/lib/mtproto/type/pq_inner_data.rb +0 -41
- data/lib/mtproto/type/rpc/auth/authorization.rb +0 -107
- data/lib/mtproto/type/rpc/auth/send_code.rb +0 -28
- data/lib/mtproto/type/rpc/auth/sent_code.rb +0 -36
- data/lib/mtproto/type/rpc/auth/sign_in.rb +0 -32
- data/lib/mtproto/type/rpc/contacts/contacts.rb +0 -155
- data/lib/mtproto/type/rpc/contacts/get_contacts.rb +0 -18
- data/lib/mtproto/type/rpc/help/config.rb +0 -35
- data/lib/mtproto/type/rpc/help/get_config.rb +0 -17
- data/lib/mtproto/type/rpc/init_connection.rb +0 -28
- data/lib/mtproto/type/rpc/invoke_with_layer.rb +0 -19
- data/lib/mtproto/type/rpc/messages/send_message.rb +0 -43
- data/lib/mtproto/type/rpc/messages/updates.rb +0 -87
- data/lib/mtproto/type/rpc/ping.rb +0 -18
- data/lib/mtproto/type/rpc/pong.rb +0 -46
- data/lib/mtproto/type/rpc/updates/difference.rb +0 -332
- data/lib/mtproto/type/rpc/updates/get_difference.rb +0 -42
- data/lib/mtproto/type/rpc/updates/get_state.rb +0 -17
- data/lib/mtproto/type/rpc/updates/state.rb +0 -59
- data/lib/mtproto/type/rpc/users/get_users.rb +0 -25
- data/lib/mtproto/type/rpc/users/users.rb +0 -99
- data/lib/mtproto/type/sent_code.rb +0 -128
- data/lib/mtproto/type/serializer.rb +0 -55
- 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 = {}
|
|
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
|
|
27
|
+
raise 'Auth key not set' unless @client.auth_key?
|
|
31
28
|
|
|
32
29
|
@running = true
|
|
33
30
|
|
|
34
|
-
@state =
|
|
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 =
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
57
|
-
@state =
|
|
58
|
-
elsif difference
|
|
59
|
-
@state =
|
|
60
|
-
elsif difference
|
|
61
|
-
@state
|
|
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
|
-
|
|
65
|
+
warn "RPC Error during polling: #{e.message}"
|
|
67
66
|
sleep @poll_interval
|
|
68
67
|
rescue StandardError => e
|
|
69
|
-
|
|
70
|
-
|
|
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
|
|
87
|
+
case difference.type
|
|
78
88
|
when :empty
|
|
79
89
|
nil
|
|
80
90
|
when :difference, :slice, :short_message
|
|
81
|
-
|
|
82
|
-
|
|
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
|
|
90
|
-
difference
|
|
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
|
|
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
|
data/lib/mtproto/version.rb
CHANGED
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/
|
|
8
|
-
require_relative 'mtproto/
|
|
9
|
-
require_relative 'mtproto/
|
|
10
|
-
require_relative 'mtproto/
|
|
11
|
-
require_relative 'mtproto/
|
|
12
|
-
require_relative 'mtproto/
|
|
13
|
-
require_relative 'mtproto/
|
|
14
|
-
require_relative 'mtproto/
|
|
15
|
-
require_relative 'mtproto/
|
|
16
|
-
require_relative 'mtproto/
|
|
17
|
-
require_relative 'mtproto/
|
|
18
|
-
require_relative 'mtproto/
|
|
19
|
-
require_relative 'mtproto/
|
|
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.
|
|
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:
|
|
13
|
+
name: async
|
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
|
15
15
|
requirements:
|
|
16
16
|
- - "~>"
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: '0
|
|
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
|
|
25
|
+
version: '2.0'
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
|
-
name:
|
|
27
|
+
name: base64
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
29
29
|
requirements:
|
|
30
30
|
- - "~>"
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: '
|
|
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: '
|
|
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
|