telegem 2.0.1 → 2.0.2
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 +55 -113
- 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: 5b3073c1e51978c6c7a09bc9ef4e28a0d262b15b23be16d6a81c9c69d11ef9dd
|
|
4
|
+
data.tar.gz: a4850c9a75a3009bf55c9aa587ab61e2a9fbf75f1d210762e103c64d5c044a7e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e259c050dd7d42564dc53e82266e7becc2089d7bf72ab14b1c85c7189215f36a543bc1c0ee6b677277cafc9661ac35057e4c2110260ad198397d49623a8c4cf7
|
|
7
|
+
data.tar.gz: c30b8f65dacb91c98d78a01ff359896f85d79295ca466667c8c60c5ea995fa82d8d28127c44b5490f64573524f3a9820dfe8b96ccc7a54a571d9a7e77377ce9d
|
data/lib/api/client.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# lib/api/client.rb -
|
|
1
|
+
# lib/api/client.rb - WORKING VERSION
|
|
2
2
|
require 'httpx'
|
|
3
3
|
require 'json'
|
|
4
4
|
|
|
@@ -7,32 +7,24 @@ 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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
17
|
+
@http = HTTPX.with(
|
|
18
|
+
timeout: {
|
|
19
|
+
connect_timeout: 10,
|
|
20
|
+
write_timeout: 10,
|
|
21
|
+
read_timeout: timeout
|
|
22
|
+
},
|
|
23
|
+
headers: {
|
|
24
|
+
'Content-Type' => 'application/json',
|
|
25
|
+
'User-Agent' => "Telegem/#{Telegem::VERSION}"
|
|
26
|
+
}
|
|
27
|
+
)
|
|
36
28
|
|
|
37
29
|
ObjectSpace.define_finalizer(self, proc { close })
|
|
38
30
|
end
|
|
@@ -40,43 +32,35 @@ module Telegem
|
|
|
40
32
|
def call(method, params = {})
|
|
41
33
|
url = "#{BASE_URL}/bot#{@token}/#{method}"
|
|
42
34
|
|
|
43
|
-
@logger.debug("
|
|
35
|
+
@logger.debug("API: #{method}") if @logger
|
|
44
36
|
|
|
45
37
|
@http.post(url, json: params.compact)
|
|
46
|
-
.then(&method(:handle_response_async))
|
|
47
|
-
.on_error(&method(:handle_error_async))
|
|
48
38
|
end
|
|
49
39
|
|
|
50
|
-
def call!(method, params = {}
|
|
51
|
-
timeout ||= @http.options.timeout[:read_timeout]
|
|
52
|
-
|
|
40
|
+
def call!(method, params = {})
|
|
53
41
|
request = call(method, params)
|
|
42
|
+
request.wait
|
|
54
43
|
|
|
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"
|
|
44
|
+
if request.error
|
|
45
|
+
handle_error(request.error)
|
|
46
|
+
return nil
|
|
67
47
|
end
|
|
48
|
+
|
|
49
|
+
handle_response(request.response)
|
|
68
50
|
end
|
|
69
51
|
|
|
70
52
|
def upload(method, params)
|
|
71
53
|
url = "#{BASE_URL}/bot#{@token}/#{method}"
|
|
72
54
|
|
|
73
|
-
form =
|
|
74
|
-
|
|
75
|
-
|
|
55
|
+
form = params.map do |key, value|
|
|
56
|
+
if file_object?(value)
|
|
57
|
+
[key.to_s, HTTPX::FormData::File.new(value)]
|
|
58
|
+
else
|
|
59
|
+
[key.to_s, value.to_s]
|
|
60
|
+
end
|
|
61
|
+
end
|
|
76
62
|
|
|
77
63
|
@http.post(url, form: form)
|
|
78
|
-
.then(&method(:handle_response_async))
|
|
79
|
-
.on_error(&method(:handle_error_async))
|
|
80
64
|
end
|
|
81
65
|
|
|
82
66
|
def get_updates(offset: nil, timeout: 30, limit: 100, allowed_updates: nil)
|
|
@@ -93,80 +77,47 @@ module Telegem
|
|
|
93
77
|
|
|
94
78
|
private
|
|
95
79
|
|
|
96
|
-
def
|
|
97
|
-
|
|
80
|
+
def handle_response(response)
|
|
81
|
+
return nil unless response
|
|
98
82
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
|
83
|
+
if response.status != 200
|
|
84
|
+
raise APIError, "HTTP #{response.status}"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
begin
|
|
88
|
+
json = response.json
|
|
89
|
+
rescue JSON::ParserError
|
|
90
|
+
raise APIError, "Invalid JSON response"
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
unless json
|
|
94
|
+
raise APIError, "Empty response"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
if json['ok']
|
|
98
|
+
json['result']
|
|
120
99
|
else
|
|
121
|
-
|
|
100
|
+
raise APIError.new(json['description'], json['error_code'])
|
|
122
101
|
end
|
|
123
102
|
end
|
|
124
103
|
|
|
125
|
-
def
|
|
104
|
+
def handle_error(error)
|
|
126
105
|
case error
|
|
127
106
|
when HTTPX::TimeoutError
|
|
128
|
-
@logger.error("
|
|
129
|
-
raise NetworkError, "
|
|
107
|
+
@logger.error("Timeout: #{error.message}") if @logger
|
|
108
|
+
raise NetworkError, "Request timeout"
|
|
130
109
|
when HTTPX::ConnectionError
|
|
131
|
-
@logger.error("
|
|
132
|
-
raise NetworkError, "Connection failed
|
|
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
|
|
110
|
+
@logger.error("Connection error: #{error.message}") if @logger
|
|
111
|
+
raise NetworkError, "Connection failed"
|
|
139
112
|
else
|
|
140
|
-
@logger.error("
|
|
113
|
+
@logger.error("Error: #{error.class}: #{error.message}") if @logger
|
|
141
114
|
raise APIError, error.message
|
|
142
115
|
end
|
|
143
116
|
end
|
|
144
117
|
|
|
145
|
-
def build_multipart_form(params)
|
|
146
|
-
params.map do |key, value|
|
|
147
|
-
if file_object?(value)
|
|
148
|
-
[key.to_s, HTTPX::FormData::File.new(value)]
|
|
149
|
-
else
|
|
150
|
-
[key.to_s, value.to_s]
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
end
|
|
154
|
-
|
|
155
118
|
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
|
|
119
|
+
obj.is_a?(File) || obj.is_a?(StringIO) || obj.is_a?(Tempfile) ||
|
|
120
|
+
(obj.is_a?(String) && File.exist?(obj))
|
|
170
121
|
end
|
|
171
122
|
end
|
|
172
123
|
|
|
@@ -180,14 +131,5 @@ module Telegem
|
|
|
180
131
|
end
|
|
181
132
|
|
|
182
133
|
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
134
|
end
|
|
193
135
|
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.2
|
|
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.2!\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"
|