зеркало из
https://github.com/glebtv/telegram-bot.git
synced 2026-09-07 19:35:52 +03:00
Remove botan.io support
https://github.com/botanio/sdk#this-service-will-be-shut-down-on-25th-may-2018
Этот коммит содержится в:
@@ -1,5 +1,8 @@
|
|||||||
# Unreleased
|
# Unreleased
|
||||||
|
|
||||||
|
- Remove botan.io support. It's already shut down, so it should not be a braking change.
|
||||||
|
https://github.com/botanio/sdk#this-service-will-be-shut-down-on-25th-may-2018
|
||||||
|
|
||||||
# 0.14.0
|
# 0.14.0
|
||||||
|
|
||||||
- Make integration & controller specs consistent.
|
- Make integration & controller specs consistent.
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ module Telegram
|
|||||||
end
|
end
|
||||||
|
|
||||||
autoload :Async, 'telegram/bot/async'
|
autoload :Async, 'telegram/bot/async'
|
||||||
autoload :Botan, 'telegram/bot/botan'
|
|
||||||
autoload :Client, 'telegram/bot/client'
|
autoload :Client, 'telegram/bot/client'
|
||||||
autoload :ClientStub, 'telegram/bot/client_stub'
|
autoload :ClientStub, 'telegram/bot/client_stub'
|
||||||
autoload :DebugClient, 'telegram/bot/debug_client'
|
autoload :DebugClient, 'telegram/bot/debug_client'
|
||||||
|
|||||||
@@ -1,20 +1,15 @@
|
|||||||
module Telegram
|
module Telegram
|
||||||
module Bot
|
module Bot
|
||||||
# Telegram & Botan clients can perform requests in async way with
|
# Telegram clients can perform requests in async way with
|
||||||
# any job adapter (ActiveJob by default). Using Rails you don't need any
|
# any job adapter (ActiveJob by default). Using Rails you don't need any
|
||||||
# additional configuration. However you may want to enable async requests
|
# additional configuration. However you may want to enable async requests
|
||||||
# by default with `async: true` in `secrets.yml`. Botan client doesn't inherit
|
# by default with `async: true` in `secrets.yml`.
|
||||||
# async setting from client and must be configured separately.
|
|
||||||
#
|
#
|
||||||
# telegram:
|
# telegram:
|
||||||
# bots:
|
# bots:
|
||||||
# chat_async:
|
# chat_async:
|
||||||
# token: secret
|
# token: secret
|
||||||
# async: true # enable async mode for client
|
# async: true # enable async mode for client
|
||||||
# botan: botan_token # in this way botan will not be async
|
|
||||||
# botan: # in this way - it's in async mode
|
|
||||||
# token: botan_token
|
|
||||||
# async: true
|
|
||||||
#
|
#
|
||||||
# Without Rails To start using async requests
|
# Without Rails To start using async requests
|
||||||
# initialize client with `id` kwarg and make sure the client is
|
# initialize client with `id` kwarg and make sure the client is
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
module Telegram
|
|
||||||
module Bot
|
|
||||||
class Botan
|
|
||||||
TRACK_URI = 'https://api.botan.io/track'.freeze
|
|
||||||
|
|
||||||
autoload :ClientHelpers, 'telegram/bot/botan/client_helpers'
|
|
||||||
autoload :ControllerHelpers, 'telegram/bot/botan/controller_helpers'
|
|
||||||
class Error < Bot::Error; end
|
|
||||||
|
|
||||||
extend Initializers
|
|
||||||
prepend Async
|
|
||||||
include DebugClient
|
|
||||||
|
|
||||||
class << self
|
|
||||||
def by_id(id)
|
|
||||||
Telegram.botans[id]
|
|
||||||
end
|
|
||||||
|
|
||||||
def prepare_async_args(method, uri, query = {}, body = nil)
|
|
||||||
[method.to_s, uri.to_s, Async.prepare_hash(query), body]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
attr_reader :client, :token
|
|
||||||
|
|
||||||
def initialize(token = nil, **options)
|
|
||||||
@client = HTTPClient.new
|
|
||||||
@token = token || options[:token]
|
|
||||||
end
|
|
||||||
|
|
||||||
def track(event, uid, payload = {})
|
|
||||||
request(:post, TRACK_URI, {name: event, uid: uid}, payload.to_json)
|
|
||||||
end
|
|
||||||
|
|
||||||
def request(method, uri, query = {}, body = nil)
|
|
||||||
res = http_request(method, uri, query.merge(token: token), body)
|
|
||||||
status = res.status
|
|
||||||
return JSON.parse(res.body) if status < 300
|
|
||||||
result = JSON.parse(res.body) rescue nil # rubocop:disable RescueModifier
|
|
||||||
err_msg = "#{res.reason}: #{result && result['info'] || '-'}"
|
|
||||||
raise Error, err_msg
|
|
||||||
end
|
|
||||||
|
|
||||||
def http_request(method, uri, query, body)
|
|
||||||
client.request(method, uri, query, body)
|
|
||||||
end
|
|
||||||
|
|
||||||
def inspect
|
|
||||||
"#<#{self.class.name}##{object_id}(#{@id})>"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
module Telegram
|
|
||||||
module Bot
|
|
||||||
class Botan
|
|
||||||
# Helpers for botan.io metrics.
|
|
||||||
module ClientHelpers
|
|
||||||
attr_reader :botan
|
|
||||||
|
|
||||||
def initialize(*, botan: nil, **options)
|
|
||||||
super
|
|
||||||
@botan = Botan.wrap(botan, id: id) if botan
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
module Telegram
|
|
||||||
module Bot
|
|
||||||
class Botan
|
|
||||||
# Helpers for botan.io metrics.
|
|
||||||
module ControllerHelpers
|
|
||||||
class MissingFrom < Error; end
|
|
||||||
|
|
||||||
protected
|
|
||||||
|
|
||||||
def botan
|
|
||||||
@botan ||= bot.try!(:botan)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Track custom event for user taken from `from` field:
|
|
||||||
#
|
|
||||||
# botan_track :my_event, {data: :val}
|
|
||||||
#
|
|
||||||
def botan_track(event, data = {})
|
|
||||||
raise MissingFrom, 'Can not track without user' unless from
|
|
||||||
botan.try! { |x| x.track(event, from['id'], data) }
|
|
||||||
end
|
|
||||||
|
|
||||||
# Track current action and payload for current user. Best used with `before_action`:
|
|
||||||
#
|
|
||||||
# before_action :botan_track_action
|
|
||||||
#
|
|
||||||
def botan_track_action
|
|
||||||
botan_track(action_name, payload)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -9,7 +9,6 @@ module Telegram
|
|||||||
autoload :TypedResponse, 'telegram/bot/client/typed_response'
|
autoload :TypedResponse, 'telegram/bot/client/typed_response'
|
||||||
extend Initializers
|
extend Initializers
|
||||||
prepend Async
|
prepend Async
|
||||||
prepend Botan::ClientHelpers
|
|
||||||
include DebugClient
|
include DebugClient
|
||||||
|
|
||||||
require 'telegram/bot/client/api_helper'
|
require 'telegram/bot/client/api_helper'
|
||||||
|
|||||||
@@ -40,11 +40,6 @@ module Telegram
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Hash of botan clients made from #bots.
|
|
||||||
def botans
|
|
||||||
@botans ||= bots.map { |k, v| [k, v.botan] }.to_h
|
|
||||||
end
|
|
||||||
|
|
||||||
# Returns config for .bots method. By default uses `telegram['bots']` section
|
# Returns config for .bots method. By default uses `telegram['bots']` section
|
||||||
# from `secrets.yml` merging `telegram['bot']` at `:default` key.
|
# from `secrets.yml` merging `telegram['bot']` at `:default` key.
|
||||||
#
|
#
|
||||||
@@ -69,7 +64,6 @@ module Telegram
|
|||||||
@bots = nil
|
@bots = nil
|
||||||
@bot = nil
|
@bot = nil
|
||||||
@bots_config = nil
|
@bots_config = nil
|
||||||
@botans = nil
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
RSpec.describe Telegram::Bot::Client do
|
|
||||||
let(:instance) { described_class.new(*client_args) }
|
|
||||||
let(:token) { 'token' }
|
|
||||||
let(:botan_token) { double(:botan_token) }
|
|
||||||
let(:client_id) { 'client_id' }
|
|
||||||
let(:client_args) { [token] }
|
|
||||||
|
|
||||||
describe '#botan' do
|
|
||||||
subject { instance.botan }
|
|
||||||
it { should eq nil }
|
|
||||||
|
|
||||||
context 'when botan token is set' do
|
|
||||||
let(:client_args) { [token, id: client_id, async: Class.new, botan: botan_token] }
|
|
||||||
it { should be_instance_of Telegram::Bot::Botan }
|
|
||||||
its(:token) { should eq botan_token }
|
|
||||||
its(:id) { should eq client_id }
|
|
||||||
|
|
||||||
it 'doesnt inherit async from client' do
|
|
||||||
expect(instance.async).to be
|
|
||||||
expect(subject.async).to_not be
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when botan is configured with hash' do
|
|
||||||
let(:client_args) { [token, id: client_id, async: Class.new, botan: botan_config] }
|
|
||||||
let(:botan_config) { {token: botan_token, async: Class.new} }
|
|
||||||
it { should be_instance_of Telegram::Bot::Botan }
|
|
||||||
its(:token) { should eq botan_token }
|
|
||||||
its(:id) { should eq client_id }
|
|
||||||
its(:async) { should eq botan_config[:async] }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
RSpec.describe Telegram::Bot::Botan::ControllerHelpers do
|
|
||||||
include_context 'telegram/bot/updates_controller'
|
|
||||||
let(:controller_class) do
|
|
||||||
described_class = self.described_class
|
|
||||||
Class.new(Telegram::Bot::UpdatesController) do
|
|
||||||
include described_class
|
|
||||||
end
|
|
||||||
end
|
|
||||||
let(:botan) { double(:botan) }
|
|
||||||
let(:result) { double(:result) }
|
|
||||||
let(:payload) { {from: {id: user_id}} }
|
|
||||||
let(:payload_type) { :message }
|
|
||||||
let(:user_id) { double(:user_id) }
|
|
||||||
before { allow(bot).to receive(:botan) { botan } }
|
|
||||||
|
|
||||||
shared_examples 'basic tracking' do
|
|
||||||
context 'when botan is not configured' do
|
|
||||||
let(:botan) {}
|
|
||||||
it { should eq nil }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when `from` is empty' do
|
|
||||||
let(:payload) { {text: 'test'} }
|
|
||||||
it { expect { subject }.to raise_error described_class::MissingFrom }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#botan_track' do
|
|
||||||
subject { controller.send(:botan_track, event, data) }
|
|
||||||
let(:event) { double(:event) }
|
|
||||||
let(:data) { double(:data) }
|
|
||||||
|
|
||||||
it 'calls botan#track' do
|
|
||||||
expect(botan).to receive(:track).with(event, user_id, data) { result }
|
|
||||||
should eq result
|
|
||||||
end
|
|
||||||
|
|
||||||
include_examples 'basic tracking'
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#botan_track_action' do
|
|
||||||
subject { controller.send(:botan_track_action) }
|
|
||||||
let(:action_name) { double(:action_name) }
|
|
||||||
|
|
||||||
it 'calls botan#track with current action and payload' do
|
|
||||||
expect(controller).to receive(:action_name) { action_name }
|
|
||||||
expect(botan).to receive(:track).
|
|
||||||
with(action_name, user_id, deep_stringify(payload)) { result }
|
|
||||||
should eq result
|
|
||||||
end
|
|
||||||
|
|
||||||
include_examples 'basic tracking'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
RSpec.describe Telegram::Bot::Botan do
|
|
||||||
let(:instance) { described_class.new 'token' }
|
|
||||||
let(:token) { 'token' }
|
|
||||||
|
|
||||||
include_examples 'initializers', :botans
|
|
||||||
it_behaves_like 'async', request_args: -> { [double(:method), double(:url)] }
|
|
||||||
|
|
||||||
describe '.new' do
|
|
||||||
subject { described_class.new(*args) }
|
|
||||||
|
|
||||||
context 'when usual args are given' do
|
|
||||||
let(:args) { ['secret'] }
|
|
||||||
its(:token) { should eq args[0] }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when options are given' do
|
|
||||||
let(:args) { [token: 'secret'] }
|
|
||||||
its(:token) { should eq args[0][:token] }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '.prepare_async_args' do
|
|
||||||
subject { described_class.prepare_async_args(*input) }
|
|
||||||
let(:input) { [:post, :uri, {a: 1, b: :sym, 'd' => 'str'}, 'body'] }
|
|
||||||
it { should eq ['post', 'uri', {a: 1, b: 'sym', 'd' => 'str'}, 'body'] }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
RSpec.describe Telegram::Bot::Client do
|
RSpec.describe Telegram::Bot::Client do
|
||||||
let(:instance) { described_class.new 'token' }
|
let(:instance) { described_class.new 'token' }
|
||||||
let(:token) { 'token' }
|
let(:token) { 'token' }
|
||||||
let(:botan_token) { double(:botan_token) }
|
|
||||||
|
|
||||||
include_examples 'initializers'
|
include_examples 'initializers'
|
||||||
it_behaves_like 'async', request_args: -> { [double(:action), {body: :content}] }
|
it_behaves_like 'async', request_args: -> { [double(:action), {body: :content}] }
|
||||||
|
|||||||
@@ -11,12 +11,10 @@ RSpec.describe Telegram::Bot::ConfigMethods do
|
|||||||
chat: {
|
chat: {
|
||||||
token: 'chat_token',
|
token: 'chat_token',
|
||||||
username: 'Chat',
|
username: 'Chat',
|
||||||
botan: 'chat_botan_token',
|
|
||||||
},
|
},
|
||||||
other_chat: {
|
other_chat: {
|
||||||
'token' => 'other_chat_token',
|
'token' => 'other_chat_token',
|
||||||
'username' => 'OtherChat',
|
'username' => 'OtherChat',
|
||||||
'botan' => 'other_chat_botan_token',
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
@@ -43,7 +41,6 @@ RSpec.describe Telegram::Bot::ConfigMethods do
|
|||||||
its(:id) { should eq :chat }
|
its(:id) { should eq :chat }
|
||||||
its(:token) { should eq config[:chat][:token] }
|
its(:token) { should eq config[:chat][:token] }
|
||||||
its(:username) { should eq config[:chat][:username] }
|
its(:username) { should eq config[:chat][:username] }
|
||||||
its('botan.token') { should eq config[:chat][:botan] }
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'configured by hash with stringified keys' do
|
context 'configured by hash with stringified keys' do
|
||||||
@@ -51,18 +48,6 @@ RSpec.describe Telegram::Bot::ConfigMethods do
|
|||||||
its(:id) { should eq :other_chat }
|
its(:id) { should eq :other_chat }
|
||||||
its(:token) { should eq config[:other_chat]['token'] }
|
its(:token) { should eq config[:other_chat]['token'] }
|
||||||
its(:username) { should eq config[:other_chat]['username'] }
|
its(:username) { should eq config[:other_chat]['username'] }
|
||||||
its('botan.token') { should eq config[:other_chat]['botan'] }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe '#botans' do
|
|
||||||
subject { registry.botans }
|
|
||||||
it do
|
|
||||||
should eq(
|
|
||||||
default: nil,
|
|
||||||
chat: registry.bots[:chat].botan,
|
|
||||||
other_chat: registry.bots[:other_chat].botan,
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user