1
0
зеркало из https://github.com/glebtv/telegram-bot.git synced 2026-08-28 15:26:18 +03:00

Сравнить коммиты

..

3 Коммитов

Автор SHA1 Сообщение Дата
Max Melentiev
62475965e9 v0.6.0 2016-03-25 00:16:05 +03:00
Max Melentiev
d7a20a745c StaleChat error 2016-03-25 00:14:47 +03:00
Max Melentiev
1963533e33 Encode arrays as json in requests 2016-03-24 23:57:14 +03:00
7 изменённых файлов: 56 добавлений и 7 удалений

Просмотреть файл

@@ -1,3 +1,8 @@
# 0.6.0
- StaleChat error.
- Encode arrays as json in request body.
# 0.5.0
- MessageContext.

Просмотреть файл

@@ -89,6 +89,9 @@ bot.extend Telegram::Bot::Client::TypedResponse
bot.get_me.class # => Telegram::Bot::Types::User
```
Any API request error will raise `Telegram::Bot::Error` with description in its message.
Special `Telegram::Bot::StaleChat` is raised when bot can't post messages to the chat anymore.
### Controller
```ruby

Просмотреть файл

@@ -7,6 +7,25 @@ module Telegram
class Error < StandardError; end
class NotFound < Error; end
# Error class for events when chat is not available anymore for bot.
# While Telegram has same error codes for different messages and there is no
# official docs for this error codes it uses `description` to
# check response.
class StaleChat < Error
DESCRIPTIONS = [
'bot was kicked',
"can't write to",
'group chat is deactivated',
].freeze
class << self
def match_response?(response)
description = response['description'].to_s
DESCRIPTIONS.any? { |x| description[x] }
end
end
end
autoload :Client, 'telegram/bot/client'
autoload :ClientStub, 'telegram/bot/client_stub'
autoload :Middleware, 'telegram/bot/middleware'

Просмотреть файл

@@ -34,8 +34,9 @@ module Telegram
# Encodes nested hashes as json.
def prepare_body(body)
body = body.dup
body.each do |k, val|
body[k] = val.to_json if val.is_a?(Hash)
body[k] = val.to_json if val.is_a?(Hash) || val.is_a?(Array)
end
end
end
@@ -67,14 +68,17 @@ module Telegram
client.debug_dev = nil
end
def request(action, body = {})
def request(action, body = {}) # rubocop:disable PerceivedComplexity
res = http_request("#{base_uri}#{action}", self.class.prepare_body(body))
status = res.status
return JSON.parse(res.body) if 300 > status
result = JSON.parse(res.body) rescue nil # rubocop:disable RescueModifier
err_msg = "#{res.reason}: #{result && result['description'] || '-'}"
# NotFound is raised only for valid responses from Telegram
raise NotFound, err_msg if 404 == status && result
if result
# NotFound is raised only for valid responses from Telegram
raise NotFound, err_msg if 404 == status
raise StaleChat, err_msg if StaleChat.match_response?(result)
end
raise Error, err_msg
end

Просмотреть файл

@@ -1,6 +1,6 @@
module Telegram
module Bot
VERSION = '0.5.0'.freeze
VERSION = '0.6.0'.freeze
def self.gem_version
Gem::Version.new VERSION

Просмотреть файл

@@ -60,7 +60,7 @@ RSpec.describe Telegram::Bot::Client do
subject { described_class.prepare_body(input) }
context 'when plain hash is given' do
let(:input) { {a: 1, b: '2', c: [1, 2]} }
let(:input) { {a: 1, b: '2', c: nil} }
it { should eq input }
end
@@ -69,7 +69,7 @@ RSpec.describe Telegram::Bot::Client do
it 'encodes nested hashes to json' do
expected = input.dup
%i(d e).each { |x| expected[x] = expected[x].to_json }
%i(c d e).each { |x| expected[x] = expected[x].to_json }
should eq expected
end
end

Просмотреть файл

@@ -2,4 +2,22 @@ RSpec.describe Telegram::Bot do
it 'has a version number' do
expect(described_class::VERSION).not_to be nil
end
describe described_class::StaleChat do
describe '.match_response?' do
subject { ->(val) { described_class.match_response?(val) } }
it 'returns true for specific errors' do
expect(subject.call({})).to eq false
expect(subject.call('description' => 'test')).to eq false
expect(subject.call('description' => 'Error: bot was kicked from')).to eq true
expect(subject.call(
'description' => "Forbidden: can't write to private chat with deleted user"
)).to eq true
expect(subject.call(
'description' => 'Bad request: group chat is deactivated'
)).to eq true
end
end
end
end