зеркало из
https://github.com/glebtv/telegram-bot.git
synced 2026-09-03 17:55:52 +03:00
Сравнить коммиты
29 Коммитов
| Автор | SHA1 | Дата | |
|---|---|---|---|
|
|
8494c7df0c | ||
|
|
a2659e00c2 | ||
|
|
e43c611d9d | ||
|
|
b84c48bc1d | ||
|
|
43cd096a21 | ||
|
|
903e14a3e5 | ||
|
|
da31cd148a | ||
|
|
552f3b3353 | ||
|
|
e5f93f608b | ||
|
|
7e823b4354 | ||
|
|
ca4ea9e6cb | ||
|
|
68ec0257bd | ||
|
|
b50bd30137 | ||
|
|
80362da270 | ||
|
|
294d762785 | ||
|
|
1cb3265371 | ||
|
|
c44529725f | ||
|
|
fa43561765 | ||
|
|
cea856c928 | ||
|
|
5a93c1efc6 | ||
|
|
38ee303912 | ||
|
|
380d13f65a | ||
|
|
20427499c3 | ||
|
|
8936a7a96c | ||
|
|
e2e32e041a | ||
|
|
543258fa11 | ||
|
|
4bf5956b41 | ||
|
|
8b6dc60aaa | ||
|
|
b6bef94081 |
21
.travis.yml
21
.travis.yml
@@ -1,34 +1,31 @@
|
|||||||
language: ruby
|
language: ruby
|
||||||
cache: bundler
|
cache: bundler
|
||||||
rvm:
|
rvm:
|
||||||
|
- 2.6
|
||||||
- 2.5
|
- 2.5
|
||||||
- 2.4
|
|
||||||
gemfile:
|
gemfile:
|
||||||
|
- gemfiles/rails_60.gemfile
|
||||||
- gemfiles/rails_52.gemfile
|
- gemfiles/rails_52.gemfile
|
||||||
- gemfiles/rails_51.gemfile
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
# old rails
|
# old rails
|
||||||
|
- rvm: 2.5
|
||||||
|
gemfile: gemfiles/rails_51.gemfile
|
||||||
- rvm: 2.5
|
- rvm: 2.5
|
||||||
gemfile: gemfiles/rails_50.gemfile
|
gemfile: gemfiles/rails_50.gemfile
|
||||||
- rvm: 2.5
|
- rvm: 2.5
|
||||||
gemfile: gemfiles/rails_42.gemfile
|
gemfile: gemfiles/rails_42.gemfile
|
||||||
# old rubies
|
# old rubies
|
||||||
|
- rvm: 2.4
|
||||||
|
gemfile: gemfiles/rails_52.gemfile
|
||||||
- rvm: 2.3
|
- rvm: 2.3
|
||||||
gemfile: gemfiles/rails_52.gemfile
|
gemfile: gemfiles/rails_52.gemfile
|
||||||
# future rails
|
# future rails
|
||||||
- rvm: 2.5
|
- rvm: 2.5
|
||||||
gemfile: gemfiles/rails_60.gemfile
|
gemfile: gemfiles/rails_61.gemfile
|
||||||
# Allow rails 6 to fail while master branch is used
|
# Allow rails 6.1 to fail while master branch is used
|
||||||
allow_failures:
|
allow_failures:
|
||||||
- rvm: 2.5
|
- rvm: 2.5
|
||||||
gemfile: gemfiles/rails_60.gemfile
|
gemfile: gemfiles/rails_61.gemfile
|
||||||
notifications:
|
notifications:
|
||||||
email: false
|
email: false
|
||||||
|
|
||||||
# for 2.5.0 until 2.5.1 is released:
|
|
||||||
# https://github.com/travis-ci/travis-ci/issues/8978
|
|
||||||
# https://github.com/travis-ci/travis-ci/issues/8969#issuecomment-354135622
|
|
||||||
before_install:
|
|
||||||
- gem update --system
|
|
||||||
- gem install bundler
|
|
||||||
|
|||||||
27
Appraisals
27
Appraisals
@@ -1,26 +1,31 @@
|
|||||||
appraise 'rails-60' do
|
appraise 'rails-61' do
|
||||||
git 'https://github.com/rails/rails.git' do
|
git 'https://github.com/rails/rails.git' do
|
||||||
gem 'actionpack', '~> 6.0.0.alpha'
|
gem 'actionpack', '~> 6.1.0.alpha'
|
||||||
gem 'railties', '~> 6.0.0.alpha'
|
gem 'railties', '~> 6.1.0.alpha'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
appraise 'rails-60' do
|
||||||
|
gem 'actionpack', '~> 6.0.0'
|
||||||
|
gem 'railties', '~> 6.0.0'
|
||||||
|
end
|
||||||
|
|
||||||
appraise 'rails-52' do
|
appraise 'rails-52' do
|
||||||
gem 'actionpack', '~> 5.2.0.beta2'
|
gem 'actionpack', '~> 5.2.0'
|
||||||
gem 'railties', '~> 5.2.0.beta2'
|
gem 'railties', '~> 5.2.0'
|
||||||
end
|
end
|
||||||
|
|
||||||
appraise 'rails-51' do
|
appraise 'rails-51' do
|
||||||
gem 'actionpack', '~> 5.1'
|
gem 'actionpack', '~> 5.1.0'
|
||||||
gem 'railties', '~> 5.1'
|
gem 'railties', '~> 5.1.0'
|
||||||
end
|
end
|
||||||
|
|
||||||
appraise 'rails-50' do
|
appraise 'rails-50' do
|
||||||
gem 'actionpack', '~> 5.0'
|
gem 'actionpack', '~> 5.0.0'
|
||||||
gem 'railties', '~> 5.0'
|
gem 'railties', '~> 5.0.0'
|
||||||
end
|
end
|
||||||
|
|
||||||
appraise 'rails-42' do
|
appraise 'rails-42' do
|
||||||
gem 'actionpack', '~> 4.2'
|
gem 'actionpack', '~> 4.2.0'
|
||||||
gem 'railties', '~> 4.2'
|
gem 'railties', '~> 4.2.0'
|
||||||
end
|
end
|
||||||
|
|||||||
21
CHANGELOG.md
21
CHANGELOG.md
@@ -1,5 +1,26 @@
|
|||||||
# Unreleased
|
# Unreleased
|
||||||
|
|
||||||
|
# 0.14.4
|
||||||
|
|
||||||
|
- Update to Bot API 4.7
|
||||||
|
|
||||||
|
# 0.14.3
|
||||||
|
|
||||||
|
- Rails 6.0 support.
|
||||||
|
- Update to Bot API 4.4.
|
||||||
|
|
||||||
|
# 0.14.2
|
||||||
|
|
||||||
|
- Add reply helpers: `answer_pre_checkout_query`, `answer_shipping_query`.
|
||||||
|
- Update to Bot API 4.3.
|
||||||
|
|
||||||
|
# 0.14.1
|
||||||
|
|
||||||
|
- Read config from secrets when credentials don't provide it in rails >= 5.2.
|
||||||
|
- 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
|
||||||
|
- Update to Bot API 4.1.
|
||||||
|
|
||||||
# 0.14.0
|
# 0.14.0
|
||||||
|
|
||||||
- Make integration & controller specs consistent.
|
- Make integration & controller specs consistent.
|
||||||
|
|||||||
2
Gemfile
2
Gemfile
@@ -8,7 +8,7 @@ group :development do
|
|||||||
gem 'pry-byebug', '~> 3.2.0'
|
gem 'pry-byebug', '~> 3.2.0'
|
||||||
gem 'sdoc', '~> 0.4.1'
|
gem 'sdoc', '~> 0.4.1'
|
||||||
|
|
||||||
gem 'telegram-bot-types', '~> 0.6.0'
|
gem 'telegram-bot-types', '~> 0.6.2'
|
||||||
|
|
||||||
gem 'rspec', '~> 3.5.0'
|
gem 'rspec', '~> 3.5.0'
|
||||||
gem 'rspec-its', '~> 1.1.0'
|
gem 'rspec-its', '~> 1.1.0'
|
||||||
|
|||||||
89
README.md
89
README.md
@@ -4,7 +4,7 @@
|
|||||||
[](https://codeclimate.com/github/telegram-bot-rb/telegram-bot)
|
[](https://codeclimate.com/github/telegram-bot-rb/telegram-bot)
|
||||||
[](https://travis-ci.org/telegram-bot-rb/telegram-bot)
|
[](https://travis-ci.org/telegram-bot-rb/telegram-bot)
|
||||||
|
|
||||||
__Breaking changes in v0.14!__ See [upgrading guide](https://github.com/telegram-bot-rb/telegram-bot/wiki/Upgrading-to-0.14).
|
__Breaking changes in v0.14!__ See [upgrade guide](https://github.com/telegram-bot-rb/telegram-bot/wiki/Upgrading-to-0.14).
|
||||||
|
|
||||||
Tools for developing Telegram bots. Best used with Rails, but can be used in
|
Tools for developing Telegram bots. Best used with Rails, but can be used in
|
||||||
[standalone app](https://github.com/telegram-bot-rb/telegram-bot/wiki/Not-rails-application).
|
[standalone app](https://github.com/telegram-bot-rb/telegram-bot/wiki/Not-rails-application).
|
||||||
@@ -19,7 +19,7 @@ Package contains:
|
|||||||
- Middleware and routes helpers for production env.
|
- Middleware and routes helpers for production env.
|
||||||
- Poller with automatic source-reloader for development env.
|
- Poller with automatic source-reloader for development env.
|
||||||
- Rake tasks to update webhook urls.
|
- Rake tasks to update webhook urls.
|
||||||
- __[Async mode](#async-mode)__ for Telegram and/or Botan API.
|
- __[Async mode](#async-mode)__.
|
||||||
Let the queue adapter handle network errors!
|
Let the queue adapter handle network errors!
|
||||||
|
|
||||||
Here is sample [telegram_bot_app](https://github.com/telegram-bot-rb/telegram_bot_app)
|
Here is sample [telegram_bot_app](https://github.com/telegram-bot-rb/telegram_bot_app)
|
||||||
@@ -55,9 +55,28 @@ require 'telegram/bot'
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
While clients can be instantiated explicitly, there is `Telegram.bots_config=` method
|
||||||
|
to configure app-wide clients, which are accessible via `Telegram.bots`.
|
||||||
|
It accepts hash of `{bot_id: bot_config}`, and there is special id `:default`
|
||||||
|
which is used for `Telegram.bot`.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Telegram.bots_config = {
|
||||||
|
default: DEFAULT_BOT_TOKEN,
|
||||||
|
chat: {token: CHAT_BOT_TOKEN, username: 'chatbot'},
|
||||||
|
}
|
||||||
|
|
||||||
|
Telegram.bot.get_updates
|
||||||
|
Telegram.bot == Telegram.bots[:default] # true
|
||||||
|
Telegram.bots[:chat].send_message(...)
|
||||||
|
```
|
||||||
|
|
||||||
### Configuration in Rails app
|
### Configuration in Rails app
|
||||||
|
|
||||||
Add `telegram` section into `secrets.yml`:
|
In Rails app `Telegram.bots_config` is read from `secrets.yml` automatically
|
||||||
|
from `telegram` section:
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
development:
|
development:
|
||||||
@@ -79,6 +98,17 @@ development:
|
|||||||
username: ChatBot
|
username: ChatBot
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For Rails >= 5.2 `Telegram::Bot` searches for config first in credentials and then in secrets.
|
||||||
|
To use credentials as config store, add telegram section to credentials instead of secrets using
|
||||||
|
`rails credentials:edit`. In this case be aware of that [Rails < 6.0 may not load
|
||||||
|
credentials in dev environment by default](https://github.com/telegram-bot-rb/telegram-bot/issues/74#issuecomment-384205609).
|
||||||
|
In Rails >= 6.0 run `rails credentials:edit --environment development` to configure bot
|
||||||
|
in each environment.
|
||||||
|
|
||||||
|
I suggest not using Rails 5.2 credentials because it can lead to leakage of sensitive data
|
||||||
|
and it's more difficult to use in multiple environments. See
|
||||||
|
[secure_credentials](https://github.com/printercu/secure_credentials) gem for better option.
|
||||||
|
|
||||||
From now clients will be accessible with `Telegram.bots[:chat]` or `Telegram.bots[:auction]`.
|
From now clients will be accessible with `Telegram.bots[:chat]` or `Telegram.bots[:auction]`.
|
||||||
Single bot can be accessed with `Telegram.bot` or `Telegram.bots[:default]`.
|
Single bot can be accessed with `Telegram.bot` or `Telegram.bots[:default]`.
|
||||||
|
|
||||||
@@ -201,12 +231,14 @@ def reply_with(type, params); end
|
|||||||
def answer_inline_query(results, params = {}); end
|
def answer_inline_query(results, params = {}); end
|
||||||
def answer_callback_query(text, params = {}); end
|
def answer_callback_query(text, params = {}); end
|
||||||
def edit_message(type, params = {}); end
|
def edit_message(type, params = {}); end
|
||||||
|
def answer_pre_checkout_query(ok, params = {}); end
|
||||||
|
def answer_shipping_query(ok, params = {}); end
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Optional typecasting
|
#### Optional typecasting
|
||||||
|
|
||||||
You can enable typecasting of `update` with `telegram-bot-types` by including
|
You can enable typecasting of `update` with `telegram-bot-types` by including
|
||||||
`Telegram::Bot::UpdatesPoller::TypedUpdate`:
|
`Telegram::Bot::UpdatesController::TypedUpdate`:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
class Telegram::WebhookController < Telegram::Bot::UpdatesController
|
class Telegram::WebhookController < Telegram::Bot::UpdatesController
|
||||||
@@ -443,10 +475,11 @@ RSpec.describe TelegramWebhooksController, telegram_bot: :rails do
|
|||||||
# dispatch_command(cmd, *args)
|
# dispatch_command(cmd, *args)
|
||||||
|
|
||||||
# Available matchers can be found in Telegram::Bot::RSpec::ClientMatchers.
|
# Available matchers can be found in Telegram::Bot::RSpec::ClientMatchers.
|
||||||
it 'shows usage of basic matchers'
|
it 'shows usage of basic matchers' do
|
||||||
# The most basic one is #make_telegram_request(bot, endpoint, params_matcher)
|
# The most basic one is #make_telegram_request(bot, action).
|
||||||
expect { dispatch_command(:start) }.
|
# It works similar to `receive` matcher and supports chaining `.with(args).exactly(n).times`.
|
||||||
to make_telegram_request(bot, :sendMessage, hash_including(text: 'msg text'))
|
expect { dispatch_command(:start) }.to make_telegram_request(bot, :sendMessage).
|
||||||
|
with(hash_including(text: 'msg text'))
|
||||||
|
|
||||||
# There are some shortcuts for dispatching basic updates and testing responses.
|
# There are some shortcuts for dispatching basic updates and testing responses.
|
||||||
expect { dispatch_message('Hi') }.to send_telegram_message(bot, /msg regexp/, some: :option)
|
expect { dispatch_message('Hi') }.to send_telegram_message(bot, /msg regexp/, some: :option)
|
||||||
@@ -494,48 +527,12 @@ While webhooks-mode is prefered, poller still can be used in production.
|
|||||||
See [comparison and examples](https://github.com/telegram-bot-rb/telegram-bot/wiki/Deployment)
|
See [comparison and examples](https://github.com/telegram-bot-rb/telegram-bot/wiki/Deployment)
|
||||||
for details.
|
for details.
|
||||||
|
|
||||||
### Botan.io metrics
|
|
||||||
|
|
||||||
Initialize with `bot = Telegram::Bot::Client.new(token, botan: 'botan token')`
|
|
||||||
or just add `botan` key in `secrets.yml`:
|
|
||||||
|
|
||||||
```yml
|
|
||||||
telegram:
|
|
||||||
bot:
|
|
||||||
token: bot_token
|
|
||||||
botan: botan_token
|
|
||||||
```
|
|
||||||
|
|
||||||
Access to Botan client with `bot.botan`.
|
|
||||||
Use `bot.botan.track(event, uid, payload)` to track events.
|
|
||||||
|
|
||||||
There are some helpers for controllers in `Telegram::Bot::Botan::ControllerHelpers`:
|
|
||||||
|
|
||||||
```ruby
|
|
||||||
class Telegram::WebhookController < Telegram::Bot::UpdatesController
|
|
||||||
include Telegram::Bot::Botan::ControllerHelpers
|
|
||||||
|
|
||||||
# This will track with event: action_name & data: payload
|
|
||||||
before_action :botan_track_action
|
|
||||||
|
|
||||||
def smth(*)
|
|
||||||
# This will track event for current user only when botan is configured.
|
|
||||||
botan_track :my_event, custom_data
|
|
||||||
|
|
||||||
# or get access directly to botan client:
|
|
||||||
botan.track(...)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
There is no stubbing for botan clients, so don't set botan token in tests.
|
|
||||||
|
|
||||||
### Async mode
|
### Async mode
|
||||||
|
|
||||||
There is built in support for async requests using ActiveJob. Without Rails
|
There is built in support for async requests using ActiveJob. Without Rails
|
||||||
you can implement your own worker class to handle such requests. This allows:
|
you can implement your own worker class to handle such requests. This allows:
|
||||||
|
|
||||||
- Process updates very fast, without waiting for telegram and botan responses.
|
- Process updates very fast, without waiting for telegram responses.
|
||||||
- Handle and retry network and other errors with queue adapter.
|
- Handle and retry network and other errors with queue adapter.
|
||||||
- ???
|
- ???
|
||||||
|
|
||||||
@@ -543,7 +540,7 @@ Instead of performing request instantly client serializes it, pushes to queue,
|
|||||||
and immediately return control back. The job is then fetched with a worker
|
and immediately return control back. The job is then fetched with a worker
|
||||||
and real API request is performed. And this all is absolutely transparent for the app.
|
and real API request is performed. And this all is absolutely transparent for the app.
|
||||||
|
|
||||||
To enable this mode add `async: true` to bot's and botan's config.
|
To enable this mode add `async: true` to bot's config.
|
||||||
For more information and custom configuration check out
|
For more information and custom configuration check out
|
||||||
[docs](http://www.rubydoc.info/github/telegram-bot-rb/telegram-bot/master/Telegram/Bot/Async) or
|
[docs](http://www.rubydoc.info/github/telegram-bot-rb/telegram-bot/master/Telegram/Bot/Async) or
|
||||||
[source](https://github.com/telegram-bot-rb/telegram-bot/blob/master/lib/telegram/bot/async.rb).
|
[source](https://github.com/telegram-bot-rb/telegram-bot/blob/master/lib/telegram/bot/async.rb).
|
||||||
|
|||||||
@@ -2,15 +2,15 @@
|
|||||||
|
|
||||||
source "https://rubygems.org"
|
source "https://rubygems.org"
|
||||||
|
|
||||||
gem "actionpack", "~> 4.2"
|
gem "actionpack", "~> 4.2.0"
|
||||||
gem "railties", "~> 4.2"
|
gem "railties", "~> 4.2.0"
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem "appraisal", "~> 2.2"
|
gem "appraisal", "~> 2.2"
|
||||||
gem "pry", "~> 0.10.1"
|
gem "pry", "~> 0.10.1"
|
||||||
gem "pry-byebug", "~> 3.2.0"
|
gem "pry-byebug", "~> 3.2.0"
|
||||||
gem "sdoc", "~> 0.4.1"
|
gem "sdoc", "~> 0.4.1"
|
||||||
gem "telegram-bot-types", "~> 0.6.0"
|
gem "telegram-bot-types", "~> 0.6.2"
|
||||||
gem "rspec", "~> 3.5.0"
|
gem "rspec", "~> 3.5.0"
|
||||||
gem "rspec-its", "~> 1.1.0"
|
gem "rspec-its", "~> 1.1.0"
|
||||||
gem "rspec-rails", "~> 3.5.0"
|
gem "rspec-rails", "~> 3.5.0"
|
||||||
|
|||||||
@@ -2,15 +2,15 @@
|
|||||||
|
|
||||||
source "https://rubygems.org"
|
source "https://rubygems.org"
|
||||||
|
|
||||||
gem "actionpack", "~> 5.0"
|
gem "actionpack", "~> 5.0.0"
|
||||||
gem "railties", "~> 5.0"
|
gem "railties", "~> 5.0.0"
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem "appraisal", "~> 2.2"
|
gem "appraisal", "~> 2.2"
|
||||||
gem "pry", "~> 0.10.1"
|
gem "pry", "~> 0.10.1"
|
||||||
gem "pry-byebug", "~> 3.2.0"
|
gem "pry-byebug", "~> 3.2.0"
|
||||||
gem "sdoc", "~> 0.4.1"
|
gem "sdoc", "~> 0.4.1"
|
||||||
gem "telegram-bot-types", "~> 0.6.0"
|
gem "telegram-bot-types", "~> 0.6.2"
|
||||||
gem "rspec", "~> 3.5.0"
|
gem "rspec", "~> 3.5.0"
|
||||||
gem "rspec-its", "~> 1.1.0"
|
gem "rspec-its", "~> 1.1.0"
|
||||||
gem "rspec-rails", "~> 3.5.0"
|
gem "rspec-rails", "~> 3.5.0"
|
||||||
|
|||||||
@@ -2,15 +2,15 @@
|
|||||||
|
|
||||||
source "https://rubygems.org"
|
source "https://rubygems.org"
|
||||||
|
|
||||||
gem "actionpack", "~> 5.1"
|
gem "actionpack", "~> 5.1.0"
|
||||||
gem "railties", "~> 5.1"
|
gem "railties", "~> 5.1.0"
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem "appraisal", "~> 2.2"
|
gem "appraisal", "~> 2.2"
|
||||||
gem "pry", "~> 0.10.1"
|
gem "pry", "~> 0.10.1"
|
||||||
gem "pry-byebug", "~> 3.2.0"
|
gem "pry-byebug", "~> 3.2.0"
|
||||||
gem "sdoc", "~> 0.4.1"
|
gem "sdoc", "~> 0.4.1"
|
||||||
gem "telegram-bot-types", "~> 0.6.0"
|
gem "telegram-bot-types", "~> 0.6.2"
|
||||||
gem "rspec", "~> 3.5.0"
|
gem "rspec", "~> 3.5.0"
|
||||||
gem "rspec-its", "~> 1.1.0"
|
gem "rspec-its", "~> 1.1.0"
|
||||||
gem "rspec-rails", "~> 3.5.0"
|
gem "rspec-rails", "~> 3.5.0"
|
||||||
|
|||||||
@@ -2,15 +2,15 @@
|
|||||||
|
|
||||||
source "https://rubygems.org"
|
source "https://rubygems.org"
|
||||||
|
|
||||||
gem "actionpack", "~> 5.2.0.beta2"
|
gem "actionpack", "~> 5.2.0"
|
||||||
gem "railties", "~> 5.2.0.beta2"
|
gem "railties", "~> 5.2.0"
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem "appraisal", "~> 2.2"
|
gem "appraisal", "~> 2.2"
|
||||||
gem "pry", "~> 0.10.1"
|
gem "pry", "~> 0.10.1"
|
||||||
gem "pry-byebug", "~> 3.2.0"
|
gem "pry-byebug", "~> 3.2.0"
|
||||||
gem "sdoc", "~> 0.4.1"
|
gem "sdoc", "~> 0.4.1"
|
||||||
gem "telegram-bot-types", "~> 0.6.0"
|
gem "telegram-bot-types", "~> 0.6.2"
|
||||||
gem "rspec", "~> 3.5.0"
|
gem "rspec", "~> 3.5.0"
|
||||||
gem "rspec-its", "~> 1.1.0"
|
gem "rspec-its", "~> 1.1.0"
|
||||||
gem "rspec-rails", "~> 3.5.0"
|
gem "rspec-rails", "~> 3.5.0"
|
||||||
|
|||||||
@@ -2,17 +2,15 @@
|
|||||||
|
|
||||||
source "https://rubygems.org"
|
source "https://rubygems.org"
|
||||||
|
|
||||||
git "https://github.com/rails/rails.git" do
|
gem "actionpack", "~> 6.0.0"
|
||||||
gem "actionpack", "~> 6.0.0.alpha"
|
gem "railties", "~> 6.0.0"
|
||||||
gem "railties", "~> 6.0.0.alpha"
|
|
||||||
end
|
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem "appraisal", "~> 2.2"
|
gem "appraisal", "~> 2.2"
|
||||||
gem "pry", "~> 0.10.1"
|
gem "pry", "~> 0.10.1"
|
||||||
gem "pry-byebug", "~> 3.2.0"
|
gem "pry-byebug", "~> 3.2.0"
|
||||||
gem "sdoc", "~> 0.4.1"
|
gem "sdoc", "~> 0.4.1"
|
||||||
gem "telegram-bot-types", "~> 0.6.0"
|
gem "telegram-bot-types", "~> 0.6.2"
|
||||||
gem "rspec", "~> 3.5.0"
|
gem "rspec", "~> 3.5.0"
|
||||||
gem "rspec-its", "~> 1.1.0"
|
gem "rspec-its", "~> 1.1.0"
|
||||||
gem "rspec-rails", "~> 3.5.0"
|
gem "rspec-rails", "~> 3.5.0"
|
||||||
|
|||||||
23
gemfiles/rails_61.gemfile
Обычный файл
23
gemfiles/rails_61.gemfile
Обычный файл
@@ -0,0 +1,23 @@
|
|||||||
|
# This file was generated by Appraisal
|
||||||
|
|
||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
git "https://github.com/rails/rails.git" do
|
||||||
|
gem "actionpack", "~> 6.1.0.alpha"
|
||||||
|
gem "railties", "~> 6.1.0.alpha"
|
||||||
|
end
|
||||||
|
|
||||||
|
group :development do
|
||||||
|
gem "appraisal", "~> 2.2"
|
||||||
|
gem "pry", "~> 0.10.1"
|
||||||
|
gem "pry-byebug", "~> 3.2.0"
|
||||||
|
gem "sdoc", "~> 0.4.1"
|
||||||
|
gem "telegram-bot-types", "~> 0.6.2"
|
||||||
|
gem "rspec", "~> 3.5.0"
|
||||||
|
gem "rspec-its", "~> 1.1.0"
|
||||||
|
gem "rspec-rails", "~> 3.5.0"
|
||||||
|
gem "rubocop", "~> 0.52.1"
|
||||||
|
gem "coveralls", "~> 0.8.2", require: false
|
||||||
|
end
|
||||||
|
|
||||||
|
gemspec path: "../"
|
||||||
@@ -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,28 +1,23 @@
|
|||||||
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
|
||||||
# accessible via `Teletgram.bots[id]` in job worker. Or just use
|
# accessible via `Teletgram.bots[id]` in job worker. Or just use
|
||||||
# `Telegram.bots_config=` for configuration.
|
# `Telegram.bots_config=` for configuration.
|
||||||
#
|
#
|
||||||
# Being in async mode `#request` enqueues job instead to perform
|
# Being in async mode `#request` enqueues job to perform
|
||||||
# http request instead of performing it directly.
|
# http request instead of performing it immediately.
|
||||||
# Async behavior is controlled with `#async=` writer
|
# Async behavior is controlled with `#async=` writer
|
||||||
# and can be enabled/disabled for the block with `#async`:
|
# and can be enabled/disabled for the block with `#async`:
|
||||||
#
|
#
|
||||||
@@ -34,7 +29,7 @@ module Telegram
|
|||||||
# while `#async(val, &block)` is thread-safe.
|
# while `#async(val, &block)` is thread-safe.
|
||||||
#
|
#
|
||||||
# It can be set with custom job class or classname. By default it defines
|
# It can be set with custom job class or classname. By default it defines
|
||||||
# job classes for every client class, inherited from ApplicationRecord, which
|
# job classes inherited from ApplicationJob, which
|
||||||
# can be accessed via `.default_async_job`. You can integrate it with any
|
# can be accessed via `.default_async_job`. You can integrate it with any
|
||||||
# other job provider by defining a class with `.perform_later(bot_id, *args)`
|
# other job provider by defining a class with `.perform_later(bot_id, *args)`
|
||||||
# method. See Async::Job for implemetation.
|
# method. See Async::Job for implemetation.
|
||||||
|
|||||||
@@ -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'
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Generated with bin/fetch-telegram-methods
|
# Generated with bin/fetch-telegram-methods
|
||||||
# Bot API 3.5.
|
# Bot API 4.7
|
||||||
|
|
||||||
getUpdates
|
getUpdates
|
||||||
setWebhook
|
setWebhook
|
||||||
@@ -13,6 +13,7 @@ sendPhoto
|
|||||||
sendAudio
|
sendAudio
|
||||||
sendDocument
|
sendDocument
|
||||||
sendVideo
|
sendVideo
|
||||||
|
sendAnimation
|
||||||
sendVoice
|
sendVoice
|
||||||
sendVideoNote
|
sendVideoNote
|
||||||
sendMediaGroup
|
sendMediaGroup
|
||||||
@@ -21,6 +22,8 @@ editMessageLiveLocation
|
|||||||
stopMessageLiveLocation
|
stopMessageLiveLocation
|
||||||
sendVenue
|
sendVenue
|
||||||
sendContact
|
sendContact
|
||||||
|
sendPoll
|
||||||
|
sendDice
|
||||||
sendChatAction
|
sendChatAction
|
||||||
getUserProfilePhotos
|
getUserProfilePhotos
|
||||||
getFile
|
getFile
|
||||||
@@ -28,6 +31,8 @@ kickChatMember
|
|||||||
unbanChatMember
|
unbanChatMember
|
||||||
restrictChatMember
|
restrictChatMember
|
||||||
promoteChatMember
|
promoteChatMember
|
||||||
|
setChatAdministratorCustomTitle
|
||||||
|
setChatPermissions
|
||||||
exportChatInviteLink
|
exportChatInviteLink
|
||||||
setChatPhoto
|
setChatPhoto
|
||||||
deleteChatPhoto
|
deleteChatPhoto
|
||||||
@@ -43,10 +48,14 @@ getChatMember
|
|||||||
setChatStickerSet
|
setChatStickerSet
|
||||||
deleteChatStickerSet
|
deleteChatStickerSet
|
||||||
answerCallbackQuery
|
answerCallbackQuery
|
||||||
|
setMyCommands
|
||||||
|
getMyCommands
|
||||||
|
|
||||||
editMessageText
|
editMessageText
|
||||||
editMessageCaption
|
editMessageCaption
|
||||||
|
editMessageMedia
|
||||||
editMessageReplyMarkup
|
editMessageReplyMarkup
|
||||||
|
stopPoll
|
||||||
deleteMessage
|
deleteMessage
|
||||||
|
|
||||||
sendSticker
|
sendSticker
|
||||||
@@ -56,6 +65,7 @@ createNewStickerSet
|
|||||||
addStickerToSet
|
addStickerToSet
|
||||||
setStickerPositionInSet
|
setStickerPositionInSet
|
||||||
deleteStickerFromSet
|
deleteStickerFromSet
|
||||||
|
setStickerSetThumb
|
||||||
|
|
||||||
answerInlineQuery
|
answerInlineQuery
|
||||||
|
|
||||||
@@ -63,6 +73,8 @@ sendInvoice
|
|||||||
answerShippingQuery
|
answerShippingQuery
|
||||||
answerPreCheckoutQuery
|
answerPreCheckoutQuery
|
||||||
|
|
||||||
|
setPassportDataErrors
|
||||||
|
|
||||||
sendGame
|
sendGame
|
||||||
setGameScore
|
setGameScore
|
||||||
getGameHighScores
|
getGameHighScores
|
||||||
|
|||||||
@@ -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.
|
||||||
#
|
#
|
||||||
@@ -53,10 +48,12 @@ module Telegram
|
|||||||
@bots_config ||=
|
@bots_config ||=
|
||||||
if defined?(Rails.application)
|
if defined?(Rails.application)
|
||||||
app = Rails.application
|
app = Rails.application
|
||||||
store = app.respond_to?(:credentials) ? app.credentials : app.secrets
|
store = app.credentials[:telegram] if app.respond_to?(:credentials)
|
||||||
secrets = store.fetch(:telegram, {}).with_indifferent_access
|
store ||= app.secrets[:telegram] if app.respond_to?(:secrets)
|
||||||
secrets.fetch(:bots, {}).symbolize_keys.tap do |config|
|
store ||= {}
|
||||||
default = secrets[:bot]
|
store = store.with_indifferent_access
|
||||||
|
store.fetch(:bots, {}).symbolize_keys.tap do |config|
|
||||||
|
default = store[:bot]
|
||||||
config[:default] = default if default
|
config[:default] = default if default
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -69,7 +66,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
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ module Telegram
|
|||||||
module Bot
|
module Bot
|
||||||
# Base class to create update processors. With callbacks, session and helpers.
|
# Base class to create update processors. With callbacks, session and helpers.
|
||||||
#
|
#
|
||||||
# Define public methods for each command and they will be called when
|
# Public methods ending with `!` handle messages with commands.
|
||||||
# update has this command. Message is automatically parsed and
|
# Message text is automatically parsed into method arguments.
|
||||||
# words are passed as method arguments. Be sure to use default values and
|
# Be sure to use default values and
|
||||||
# splat arguments in every action method to not get errors, when user
|
# splat arguments in every action method to not get errors, when user
|
||||||
# sends command without necessary args / with extra args.
|
# sends command without necessary args / with extra args.
|
||||||
#
|
#
|
||||||
# def start(token = nil, *)
|
# def start!(token = nil, *)
|
||||||
# if token
|
# if token
|
||||||
# # ...
|
# # ...
|
||||||
# else
|
# else
|
||||||
@@ -21,25 +21,21 @@ module Telegram
|
|||||||
# end
|
# end
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# def help(*)
|
# def help!(*)
|
||||||
# respond_with :message, text:
|
# respond_with :message, text:
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# To process plain text messages (without commands) or other updates just
|
# To process plain text messages (without commands) or other updates just
|
||||||
# define public method with name of payload type. They will receive payload
|
# define public method with name of payload type.
|
||||||
# as an argument.
|
# By default they receive payload as an argument, but some of them are called
|
||||||
|
# with more usefuk args:
|
||||||
#
|
#
|
||||||
# def message(message)
|
# def message(message)
|
||||||
# respond_with :message, text: "Echo: #{message['text']}"
|
# respond_with :message, text: "Echo: #{message['text']}"
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# def inline_query(query)
|
# def inline_query(query, offset)
|
||||||
# answer_inline_query results_for_query(query), is_personal: true
|
# answer_inline_query results_for_query(query, offset), is_personal: true
|
||||||
# end
|
|
||||||
#
|
|
||||||
# # To process conflicting commands (`/message args`) just use `on_` prefix:
|
|
||||||
# def on_message(*args)
|
|
||||||
# # ...
|
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
# To process update run:
|
# To process update run:
|
||||||
@@ -101,6 +97,8 @@ module Telegram
|
|||||||
callback_query
|
callback_query
|
||||||
shipping_query
|
shipping_query
|
||||||
pre_checkout_query
|
pre_checkout_query
|
||||||
|
poll
|
||||||
|
poll_answer
|
||||||
].freeze
|
].freeze
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
@@ -152,7 +150,7 @@ module Telegram
|
|||||||
# Accessor to `'from'` field of payload. Can be overriden with `from` option
|
# Accessor to `'from'` field of payload. Can be overriden with `from` option
|
||||||
# for #initialize.
|
# for #initialize.
|
||||||
def from
|
def from
|
||||||
@_from ||= payload && payload['from']
|
@_from ||= payload.is_a?(Hash) ? payload['from'] : payload.try(:from)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Processes current update.
|
# Processes current update.
|
||||||
@@ -210,6 +208,10 @@ module Telegram
|
|||||||
[payload_type, [payload['data']]]
|
[payload_type, [payload['data']]]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def action_for_poll_answer
|
||||||
|
[payload_type, [payload['poll_id'], payload['option_ids']]]
|
||||||
|
end
|
||||||
|
|
||||||
# Silently ignore unsupported messages to not fail when user crafts
|
# Silently ignore unsupported messages to not fail when user crafts
|
||||||
# an update with usupported command, callback query context, etc.
|
# an update with usupported command, callback query context, etc.
|
||||||
def action_missing(action, *_args)
|
def action_missing(action, *_args)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ module Telegram
|
|||||||
respond_with(type, params)
|
respond_with(type, params)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Same as reply_with, but for inline queries.
|
# Same as respond_with, but for inline queries.
|
||||||
def answer_inline_query(results, params = {})
|
def answer_inline_query(results, params = {})
|
||||||
params = params.merge(
|
params = params.merge(
|
||||||
inline_query_id: payload['id'],
|
inline_query_id: payload['id'],
|
||||||
@@ -30,7 +30,7 @@ module Telegram
|
|||||||
bot.answer_inline_query(params)
|
bot.answer_inline_query(params)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Same as reply_with, but for callback queries.
|
# Same as respond_with, but for callback queries.
|
||||||
def answer_callback_query(text, params = {})
|
def answer_callback_query(text, params = {})
|
||||||
params = params.merge(
|
params = params.merge(
|
||||||
callback_query_id: payload['id'],
|
callback_query_id: payload['id'],
|
||||||
@@ -39,6 +39,23 @@ module Telegram
|
|||||||
bot.answer_callback_query(params)
|
bot.answer_callback_query(params)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Same as respond_with, but for pre checkout queries.
|
||||||
|
def answer_pre_checkout_query(ok, params = {})
|
||||||
|
params = params.merge(
|
||||||
|
pre_checkout_query_id: payload['id'],
|
||||||
|
ok: ok,
|
||||||
|
)
|
||||||
|
bot.answer_pre_checkout_query(params)
|
||||||
|
end
|
||||||
|
|
||||||
|
def answer_shipping_query(ok, params = {})
|
||||||
|
params = params.merge(
|
||||||
|
shipping_query_id: payload['id'],
|
||||||
|
ok: ok,
|
||||||
|
)
|
||||||
|
bot.answer_shipping_query(params)
|
||||||
|
end
|
||||||
|
|
||||||
# Edit message from callback query.
|
# Edit message from callback query.
|
||||||
def edit_message(type, params = {})
|
def edit_message(type, params = {})
|
||||||
params =
|
params =
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
module Telegram
|
module Telegram
|
||||||
module Bot
|
module Bot
|
||||||
VERSION = '0.14.0'.freeze
|
VERSION = '0.14.4'.freeze
|
||||||
|
|
||||||
def self.gem_version
|
def self.gem_version
|
||||||
Gem::Version.new VERSION
|
Gem::Version.new VERSION
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
@@ -76,13 +61,14 @@ RSpec.describe Telegram::Bot::ConfigMethods do
|
|||||||
it { should eq({}) }
|
it { should eq({}) }
|
||||||
|
|
||||||
context 'in rails environment' do
|
context 'in rails environment' do
|
||||||
before { stub_const('Rails', double(application: double(secrets: secrets))) }
|
before { stub_const('Rails', double(application: double(app_stub))) }
|
||||||
|
let(:app_stub) { {secrets: secrets} }
|
||||||
let(:secrets) { {} }
|
let(:secrets) { {} }
|
||||||
it { should eq({}) }
|
it { should eq({}) }
|
||||||
|
|
||||||
context 'when there is telegram section in secrets' do
|
context 'when there is telegram section in secrets' do
|
||||||
let(:secrets) { {telegram: config.stringify_keys} }
|
let(:secrets) { {telegram: secrets_config} }
|
||||||
let(:config) do
|
let(:secrets_config) do
|
||||||
{
|
{
|
||||||
bot: double(:bot_config),
|
bot: double(:bot_config),
|
||||||
bots: {
|
bots: {
|
||||||
@@ -91,13 +77,21 @@ RSpec.describe Telegram::Bot::ConfigMethods do
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
it { should include default: config[:bot] }
|
it { should include default: secrets_config[:bot] }
|
||||||
it { should include config[:bots] }
|
it { should include secrets_config[:bots] }
|
||||||
|
|
||||||
context 'on rails >5.1 (deep symbolized keys)' do
|
context 'on rails >5.1 (deep symbolized keys)' do
|
||||||
let(:secrets) { {telegram: config.deep_symbolize_keys} }
|
let(:secrets) { super().deep_symbolize_keys }
|
||||||
it { should include default: config[:bot] }
|
it { should include default: secrets_config[:bot] }
|
||||||
it { should include config[:bots] }
|
it { should include secrets_config[:bots] }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'and credentials (>= 5.2)' do
|
||||||
|
let(:app_stub) { super().merge(credentials: credentials) }
|
||||||
|
let(:credentials) { {telegram: credentials_config} }
|
||||||
|
let(:credentials_config) { {bot: double(:credentials_bot_config)} }
|
||||||
|
it { should include default: credentials_config[:bot] }
|
||||||
|
it { should_not include secrets[:bots] }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -26,6 +26,12 @@ RSpec.describe Telegram::Bot::UpdatesController do
|
|||||||
it { should eq [payload_type, payload.values_at(:data)] }
|
it { should eq [payload_type, payload.values_at(:data)] }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when payload is poll_answer' do
|
||||||
|
let(:payload_type) { 'poll_answer' }
|
||||||
|
let(:payload) { stub_payload(:poll_id, :user, :option_ids) }
|
||||||
|
it { should eq [payload_type, payload.values_at(:poll_id, :option_ids)] }
|
||||||
|
end
|
||||||
|
|
||||||
context 'when payload is not supported' do
|
context 'when payload is not supported' do
|
||||||
let(:payload_type) { '_unsupported_' }
|
let(:payload_type) { '_unsupported_' }
|
||||||
it { should eq [:unsupported_payload_type, []] }
|
it { should eq [:unsupported_payload_type, []] }
|
||||||
@@ -39,6 +45,7 @@ RSpec.describe Telegram::Bot::UpdatesController do
|
|||||||
inline_query
|
inline_query
|
||||||
chosen_inline_result
|
chosen_inline_result
|
||||||
callback_query
|
callback_query
|
||||||
|
poll_answer
|
||||||
]
|
]
|
||||||
(described_class::PAYLOAD_TYPES - custom_payload_types).each do |type|
|
(described_class::PAYLOAD_TYPES - custom_payload_types).each do |type|
|
||||||
context "when payload is #{type}" do
|
context "when payload is #{type}" do
|
||||||
|
|||||||
@@ -22,10 +22,10 @@ Gem::Specification.new do |spec|
|
|||||||
|
|
||||||
spec.required_ruby_version = '~> 2.0'
|
spec.required_ruby_version = '~> 2.0'
|
||||||
|
|
||||||
spec.add_dependency 'actionpack', '>= 4.0', '< 6.0'
|
spec.add_dependency 'actionpack', '>= 4.0', '< 6.1'
|
||||||
spec.add_dependency 'activesupport', '>= 4.0', '< 6.0'
|
spec.add_dependency 'activesupport', '>= 4.0', '< 6.1'
|
||||||
spec.add_dependency 'httpclient', '~> 2.7'
|
spec.add_dependency 'httpclient', '~> 2.7'
|
||||||
|
|
||||||
spec.add_development_dependency 'bundler', '~> 1.16'
|
spec.add_development_dependency 'bundler', '> 1.16'
|
||||||
spec.add_development_dependency 'rake', '~> 10.0'
|
spec.add_development_dependency 'rake', '~> 13.0'
|
||||||
end
|
end
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user