telegem 2.0.1 → 2.0.3
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/lib/api/client.rb +38 -125
- data/lib/telegem.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 533bb8c8d591dc333e24b9efb5de8a07d95da7099b0a3cee6b35ede7f7b61bfb
|
|
4
|
+
data.tar.gz: 3acd65c37be2cff539dfc84307c512432a7470ad5cf80bcdbf0275b3285e2c6d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 98e26d47fda83ef2f083fb77e368146d4b125c0d43b15336c8f0caee7edf11b73bfd3e6e09f8493c00b3b8472ef991691409be2477902b9859ec7578168c0133
|
|
7
|
+
data.tar.gz: af192183c15e597958318b845c71eb01cac22e75dd250a53ddfa5fc2dcc8d8c1e4013f3589fee48f4278f92fdc741aa60a617140411ddffcdfcc5347807a699f
|
data/lib/api/client.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# lib/api/client.rb -
|
|
1
|
+
# lib/api/client.rb - MINIMAL WORKING VERSION
|
|
2
2
|
require 'httpx'
|
|
3
3
|
require 'json'
|
|
4
4
|
|
|
@@ -7,83 +7,54 @@ module Telegem
|
|
|
7
7
|
class Client
|
|
8
8
|
BASE_URL = 'https://api.telegram.org'
|
|
9
9
|
|
|
10
|
-
attr_reader :token, :logger, :http
|
|
10
|
+
attr_reader :token, :logger, :http
|
|
11
11
|
|
|
12
12
|
def initialize(token, **options)
|
|
13
13
|
@token = token
|
|
14
14
|
@logger = options[:logger] || Logger.new($stdout)
|
|
15
15
|
timeout = options[:timeout] || 30
|
|
16
|
-
pool_size = options[:pool_size] || 10
|
|
17
16
|
|
|
18
|
-
@http = HTTPX.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
keep_alive_timeout: 15
|
|
25
|
-
},
|
|
26
|
-
headers: {
|
|
27
|
-
'Content-Type' => 'application/json',
|
|
28
|
-
'User-Agent' => "Telegem/#{Telegem::VERSION} (Ruby #{RUBY_VERSION}; #{RUBY_PLATFORM})"
|
|
29
|
-
},
|
|
30
|
-
max_requests: pool_size
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
if HTTPX.plugins.key?(:retries)
|
|
34
|
-
@http = @http.plugin(:retries, max_retries: 3, retry_on: [500, 502, 503, 504])
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
ObjectSpace.define_finalizer(self, proc { close })
|
|
17
|
+
@http = HTTPX.with(
|
|
18
|
+
timeout: timeout,
|
|
19
|
+
headers: {
|
|
20
|
+
'Content-Type' => 'application/json'
|
|
21
|
+
}
|
|
22
|
+
)
|
|
38
23
|
end
|
|
39
24
|
|
|
40
25
|
def call(method, params = {})
|
|
41
26
|
url = "#{BASE_URL}/bot#{@token}/#{method}"
|
|
42
|
-
|
|
43
|
-
@logger.debug("🚀 Async API: #{method}") if @logger
|
|
44
|
-
|
|
45
27
|
@http.post(url, json: params.compact)
|
|
46
|
-
.then(&method(:handle_response_async))
|
|
47
|
-
.on_error(&method(:handle_error_async))
|
|
48
28
|
end
|
|
49
29
|
|
|
50
|
-
def call!(method, params = {}
|
|
51
|
-
timeout ||= @http.options.timeout[:read_timeout]
|
|
52
|
-
|
|
30
|
+
def call!(method, params = {})
|
|
53
31
|
request = call(method, params)
|
|
32
|
+
request.wait
|
|
54
33
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if request.error
|
|
59
|
-
raise APIError, request.error.message
|
|
60
|
-
elsif !wait_result
|
|
61
|
-
raise NetworkError, "Request timeout after #{timeout}s"
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
request.instance_variable_get(:@result) || request.response
|
|
65
|
-
rescue Timeout::Error
|
|
66
|
-
raise NetworkError, "Request timeout after #{timeout}s"
|
|
34
|
+
if request.error
|
|
35
|
+
handle_error(request.error)
|
|
36
|
+
return nil
|
|
67
37
|
end
|
|
38
|
+
|
|
39
|
+
handle_response(request.response)
|
|
68
40
|
end
|
|
69
41
|
|
|
70
42
|
def upload(method, params)
|
|
71
43
|
url = "#{BASE_URL}/bot#{@token}/#{method}"
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
44
|
+
form = params.map do |key, value|
|
|
45
|
+
if file_object?(value)
|
|
46
|
+
[key.to_s, HTTPX::FormData::File.new(value)]
|
|
47
|
+
else
|
|
48
|
+
[key.to_s, value.to_s]
|
|
49
|
+
end
|
|
50
|
+
end
|
|
77
51
|
@http.post(url, form: form)
|
|
78
|
-
.then(&method(:handle_response_async))
|
|
79
|
-
.on_error(&method(:handle_error_async))
|
|
80
52
|
end
|
|
81
53
|
|
|
82
54
|
def get_updates(offset: nil, timeout: 30, limit: 100, allowed_updates: nil)
|
|
83
55
|
params = { timeout: timeout, limit: limit }
|
|
84
56
|
params[:offset] = offset if offset
|
|
85
57
|
params[:allowed_updates] = allowed_updates if allowed_updates
|
|
86
|
-
|
|
87
58
|
call('getUpdates', params)
|
|
88
59
|
end
|
|
89
60
|
|
|
@@ -93,80 +64,31 @@ module Telegem
|
|
|
93
64
|
|
|
94
65
|
private
|
|
95
66
|
|
|
96
|
-
def
|
|
97
|
-
|
|
67
|
+
def handle_response(response)
|
|
68
|
+
return nil unless response
|
|
98
69
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
retry_after = response.headers['retry-after']&.to_i || 1
|
|
102
|
-
raise RateLimitError.new("Rate limited", retry_after)
|
|
103
|
-
when 200
|
|
104
|
-
begin
|
|
105
|
-
json = response.json
|
|
106
|
-
rescue JSON::ParserError => e
|
|
107
|
-
raise APIError, "Invalid JSON: #{e.message}"
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
unless json
|
|
111
|
-
raise APIError, "Empty response"
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
if json['ok']
|
|
115
|
-
response.request.instance_variable_set(:@result, json['result'])
|
|
116
|
-
json['result']
|
|
117
|
-
else
|
|
118
|
-
raise APIError.new(json['description'], json['error_code'])
|
|
119
|
-
end
|
|
120
|
-
else
|
|
121
|
-
response.raise_for_status
|
|
70
|
+
if response.status != 200
|
|
71
|
+
raise APIError, "HTTP #{response.status}"
|
|
122
72
|
end
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
raise NetworkError, "Timeout: #{error.message}"
|
|
130
|
-
when HTTPX::ConnectionError
|
|
131
|
-
@logger.error("🔌 Connection: #{error.message}") if @logger
|
|
132
|
-
raise NetworkError, "Connection failed: #{error.message}"
|
|
133
|
-
when HTTPX::HTTPError
|
|
134
|
-
@logger.error("🌐 HTTP #{error.response.status}: #{error.message}") if @logger
|
|
135
|
-
raise APIError, "HTTP #{error.response.status}: #{error.message}"
|
|
136
|
-
when RateLimitError
|
|
137
|
-
@logger.error("🚦 Rate limit: retry after #{error.retry_after}s") if @logger
|
|
138
|
-
raise error
|
|
73
|
+
|
|
74
|
+
json = response.json
|
|
75
|
+
return nil unless json
|
|
76
|
+
|
|
77
|
+
if json['ok']
|
|
78
|
+
json['result']
|
|
139
79
|
else
|
|
140
|
-
|
|
141
|
-
raise APIError, error.message
|
|
80
|
+
raise APIError.new(json['description'], json['error_code'])
|
|
142
81
|
end
|
|
143
82
|
end
|
|
144
83
|
|
|
145
|
-
def
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
[key.to_s, HTTPX::FormData::File.new(value)]
|
|
149
|
-
else
|
|
150
|
-
[key.to_s, value.to_s]
|
|
151
|
-
end
|
|
152
|
-
end
|
|
84
|
+
def handle_error(error)
|
|
85
|
+
@logger.error("API Error: #{error.message}") if @logger
|
|
86
|
+
raise APIError, error.message
|
|
153
87
|
end
|
|
154
88
|
|
|
155
89
|
def file_object?(obj)
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
true
|
|
159
|
-
when Pathname
|
|
160
|
-
obj.exist? && obj.readable?
|
|
161
|
-
when String
|
|
162
|
-
if obj.start_with?('http://', 'https://', 'ftp://')
|
|
163
|
-
false
|
|
164
|
-
else
|
|
165
|
-
File.exist?(obj) && File.readable?(obj)
|
|
166
|
-
end
|
|
167
|
-
else
|
|
168
|
-
false
|
|
169
|
-
end
|
|
90
|
+
obj.is_a?(File) || obj.is_a?(StringIO) || obj.is_a?(Tempfile) ||
|
|
91
|
+
(obj.is_a?(String) && File.exist?(obj))
|
|
170
92
|
end
|
|
171
93
|
end
|
|
172
94
|
|
|
@@ -180,14 +102,5 @@ module Telegem
|
|
|
180
102
|
end
|
|
181
103
|
|
|
182
104
|
class NetworkError < APIError; end
|
|
183
|
-
|
|
184
|
-
class RateLimitError < APIError
|
|
185
|
-
attr_reader :retry_after
|
|
186
|
-
|
|
187
|
-
def initialize(message, retry_after = 1)
|
|
188
|
-
super(message)
|
|
189
|
-
@retry_after = retry_after
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
105
|
end
|
|
193
106
|
end
|
data/lib/telegem.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: telegem
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- sick_phantom
|
|
@@ -198,7 +198,7 @@ metadata:
|
|
|
198
198
|
bug_tracker_uri: https://gitlab.com/ruby-telegem/telegem/-/issues
|
|
199
199
|
documentation_uri: https://gitlab.com/ruby-telegem/telegem/-/blob/main/README.md
|
|
200
200
|
rubygems_mfa_required: 'false'
|
|
201
|
-
post_install_message: "Thanks for installing Telegem 2.0.
|
|
201
|
+
post_install_message: "Thanks for installing Telegem 2.0.3!\n\nQuick start:\n bot
|
|
202
202
|
= Telegem.new(\"YOUR_TOKEN\")\n bot.on(:message) { |ctx| ctx.reply(\"Hello!\")
|
|
203
203
|
}\n bot.start_polling\n\nDocumentation: https://gitlab.com/ruby-telegem/telegem\nHappy
|
|
204
204
|
bot building! \U0001F916\n"
|