1
0
зеркало из https://github.com/glebtv/telegram-bot.git synced 2026-09-04 02:05:52 +03:00

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

...

28 Коммитов

Автор SHA1 Сообщение Дата
Max Melentiev
544d392346 v0.16.1 2023-12-18 21:09:36 +00:00
Max Melentiev
d048f42c6c Merge pull request #225 from mario-amazing/master
Fix rails 7.1 broadcast error
2023-12-18 20:58:13 +00:00
mario_amazing
f54b36d9b7 Fix rails 7.1 broadcast error 2023-12-18 18:29:04 +03:00
Max Melentiev
cd2d3d8d87 v0.16.0 2023-11-09 21:33:24 -08:00
Max Melentiev
ee666f0e90 Merge pull request #207 from telegram-bot-rb/webhook_request
Add UpdatesController#webhook_request
2023-11-09 21:27:39 -08:00
Max Melentiev
759b125d82 Merge branch 'master' into webhook_request 2023-11-09 21:16:12 -08:00
Max Melentiev
21ca16f613 Merge pull request #209 from anko20094/added-chat-join-request-to-payload-types
Added chat_join_request to PAYLOAD_TYPES + update API
2023-11-09 21:14:23 -08:00
Max Melentiev
7cfceb7439 Update CHANGELOG.md 2023-11-09 21:01:07 -08:00
Max Melentiev
29603e5b60 Update .gitignore 2023-11-09 21:00:36 -08:00
Max Melentiev
5822eff988 Merge branch 'master' into added-chat-join-request-to-payload-types 2023-11-09 20:59:43 -08:00
Max Melentiev
cbe7186c44 Add UpdatesController#webhook_request 2023-11-09 20:56:45 -08:00
Max Melentiev
ca20bb0533 Merge pull request #221 from epergo/ep/fix-pipeline
Update testing matrix
2023-11-05 06:50:16 -08:00
Eloy Pérez
6f8565fbd5 Update testing matrix 2023-11-05 10:23:40 +01:00
Max Melentiev
a16928267a Merge pull request #217 from epergo/ep/rails-7-1
Allow installation in Rails 7.1
2023-10-28 07:59:03 +01:00
Eloy Pérez
83bc13bac6 Allow installation in Rails 7.1 2023-10-27 19:43:17 +02:00
Max Melentiev
1e1814a26d Merge pull request #213 from Nmerey/add-login-url-method
Add new commands available at API 6.8
2023-08-28 11:56:39 +01:00
Nmerey
ae9a6a501d Add new methods available at API 6.8 2023-08-28 14:51:15 +06:00
Danyil Shkoropad
74c2c28ab5 Added chat_join_request to PAYLOAD_TYPES + update API 2023-06-28 23:54:47 +03:00
Max Melentiev
af85966939 Fix status badge 2023-06-28 21:23:43 +01:00
Max Melentiev
5145c31d73 Merge pull request #210 from telegram-bot-rb/gh-actions
Move to github actions from travis-ci
2023-06-28 21:15:26 +01:00
Max Melentiev
cbb3a85757 Move to github actions from travis-ci 2023-06-28 20:55:51 +01:00
Max Melentiev
f0c5222c8f Merge pull request #206 from marckohlbrugge/master
Add commands upto Bot API 6.6
2023-04-16 19:18:51 +01:00
Marc Köhlbrugge
b4e5b056e0 Add commands upto Bot API 6.6 2023-04-06 23:11:31 +08:00
Max Melentiev
be74094c90 Merge pull request #200 from ceritium/patch-1
Fix typo on comment
2023-02-13 08:47:48 +01:00
Jose Galisteo
e53c31b79f Fix typo on comment 2023-02-11 14:56:39 +01:00
Max Melentiev
b40e4b432d Merge pull request #198 from telegram-bot-rb/nested_files
Add support for editMessageMedia similar to sendMediaGroup
2023-01-14 13:18:38 +00:00
Max Melentiev
ef5ec81386 Add support for editMessageMedia similar to sendMediaGroup 2023-01-13 20:33:30 +00:00
Max Melentiev
7d8a19d3c8 Pass action parameter to RequestBodyFormatter 2022-03-13 21:39:55 +00:00
34 изменённых файлов: 264 добавлений и 118 удалений

43
.github/workflows/ci.yml поставляемый Обычный файл
Просмотреть файл

@@ -0,0 +1,43 @@
name: Lint & Test
on: [push, pull_request]
jobs:
# lint:
# runs-on: ubuntu-latest
# steps:
# - uses: actions/checkout@v3
# - uses: ruby/setup-ruby@v1
# with:
# ruby-version: '3.0'
# bundler-cache: true
# - run: bundle exec rubocop
test:
runs-on: ubuntu-latest
strategy:
matrix:
ruby:
- '2.7'
gemfile:
- gemfiles/rails_61.gemfile
- gemfiles/rails_60.gemfile
- gemfiles/rails_52.gemfile
- gemfiles/rails_51.gemfile
include:
# ruby 3.x
- ruby: '3.2'
gemfile: gemfiles/rails_71.gemfile
- ruby: '3.0'
gemfile: gemfiles/rails_61.gemfile
- ruby: '3.0'
gemfile: gemfiles/rails_60.gemfile
env:
BUNDLE_GEMFILE: ${{ github.workspace }}/${{ matrix.gemfile }}
steps:
- uses: actions/checkout@v3
- uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}
bundler-cache: true
- run: bundle exec rake spec

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

@@ -1,30 +0,0 @@
os: linux
dist: xenial
language: ruby
cache: bundler
rvm:
- 2.6
- 2.5
gemfile:
- gemfiles/rails_61.gemfile
- gemfiles/rails_60.gemfile
- gemfiles/rails_52.gemfile
jobs:
include:
# ruby 3.x
- rvm: 3.0
gemfile: gemfiles/rails_61.gemfile
- rvm: 3.0
gemfile: gemfiles/rails_60.gemfile
# old rails
- rvm: 2.5
gemfile: gemfiles/rails_51.gemfile
- rvm: 2.5
gemfile: gemfiles/rails_50.gemfile
- rvm: 2.5
gemfile: gemfiles/rails_42.gemfile
# old rubies
- rvm: 2.4
gemfile: gemfiles/rails_52.gemfile
notifications:
email: false

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

@@ -1,3 +1,8 @@
appraise 'rails-71' do
gem 'actionpack', '~> 7.1.0'
gem 'railties', '~> 7.1.0'
end
appraise 'rails-70' do appraise 'rails-70' do
gem 'actionpack', '~> 7.0.0' gem 'actionpack', '~> 7.0.0'
gem 'railties', '~> 7.0.0' gem 'railties', '~> 7.0.0'
@@ -22,13 +27,3 @@ appraise 'rails-51' do
gem 'actionpack', '~> 5.1.0' gem 'actionpack', '~> 5.1.0'
gem 'railties', '~> 5.1.0' gem 'railties', '~> 5.1.0'
end end
appraise 'rails-50' do
gem 'actionpack', '~> 5.0.0'
gem 'railties', '~> 5.0.0'
end
appraise 'rails-42' do
gem 'actionpack', '~> 4.2.0'
gem 'railties', '~> 4.2.0'
end

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

@@ -1,6 +1,21 @@
# Unreleased # Unreleased
# 0.15.5 # 0.16.1
- Fix logger in poller mode in rails 7.1
# 0.16.0
- Add `UpdatesController#webhook_request` that is set to `ActionDispatch::Request`
in webhook mode.
- Update to Bot API 6.8
- Added `chat_join_request` to PAYLOAD_TYPES
# 0.15.7
- Add support for editMessageMedia similar to sendMediaGroup.
# 0.15.6
- Rails 7.0 support. - Rails 7.0 support.
- Fix sending File objects in nested objects in sendMediaGroup. - Fix sending File objects in nested objects in sendMediaGroup.

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

@@ -4,13 +4,13 @@ gemspec
group :development do group :development do
gem 'appraisal', '~> 2.2' gem 'appraisal', '~> 2.2'
gem 'pry', '~> 0.13.1' gem 'pry', '~> 0.14.1'
gem 'pry-byebug', '~> 3.9.0' gem 'pry-byebug', '~> 3.10.1'
gem 'sdoc', '~> 2.0.3' gem 'sdoc', '~> 2.0.3'
gem 'telegram-bot-types', '~> 0.6.3' gem 'telegram-bot-types', '~> 0.6.3'
gem 'rspec', '~> 3.10.0' gem 'rspec', '~> 3.12.0'
gem 'rspec-its', '~> 1.3.0' gem 'rspec-its', '~> 1.3.0'
gem 'rspec-rails', '~> 4.0.2' gem 'rspec-rails', '~> 4.0.2'

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

@@ -2,7 +2,7 @@
[![Gem Version](https://badge.fury.io/rb/telegram-bot.svg)](http://badge.fury.io/rb/telegram-bot) [![Gem Version](https://badge.fury.io/rb/telegram-bot.svg)](http://badge.fury.io/rb/telegram-bot)
[![Code Climate](https://codeclimate.com/github/telegram-bot-rb/telegram-bot/badges/gpa.svg)](https://codeclimate.com/github/telegram-bot-rb/telegram-bot) [![Code Climate](https://codeclimate.com/github/telegram-bot-rb/telegram-bot/badges/gpa.svg)](https://codeclimate.com/github/telegram-bot-rb/telegram-bot)
[![Build Status](https://travis-ci.com/telegram-bot-rb/telegram-bot.svg)](https://travis-ci.com/telegram-bot-rb/telegram-bot) [![Lint & Test](https://github.com/telegram-bot-rb/telegram-bot/actions/workflows/ci.yml/badge.svg)](https://github.com/telegram-bot-rb/telegram-bot/actions/workflows/ci.yml)
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).
@@ -430,6 +430,10 @@ There are several options to run it automatically:
- Use `Telegram::Bot::Middleware` with rack ([example in wiki](https://github.com/telegram-bot-rb/telegram-bot/wiki/Not-rails-application)). - Use `Telegram::Bot::Middleware` with rack ([example in wiki](https://github.com/telegram-bot-rb/telegram-bot/wiki/Not-rails-application)).
- Use poller (described in the next section). - Use poller (described in the next section).
When controller runs in webhook mode `Telegram::Bot::Middleware` passes
`ActionDispatch::Request` object to the `.dispatch` method.
It's available via `#webhook_request` controller method.
To run action without update (ex., send notifications from jobs), To run action without update (ex., send notifications from jobs),
you can call `#process` directly. In this case controller can be initialized you can call `#process` directly. In this case controller can be initialized
with `:from` and/or `:chat` options instead of `update` object: with `:from` and/or `:chat` options instead of `update` object:

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

@@ -1,21 +0,0 @@
# This file was generated by Appraisal
source "https://rubygems.org"
gem "actionpack", "~> 5.0.0"
gem "railties", "~> 5.0.0"
group :development do
gem "appraisal", "~> 2.2"
gem "pry", "~> 0.13.1"
gem "pry-byebug", "~> 3.9.0"
gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.10.0"
gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1"
gem "coveralls", "~> 0.8.23", require: false
end
gemspec path: "../"

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

@@ -7,11 +7,11 @@ gem "railties", "~> 5.1.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "pry", "~> 0.13.1" gem "pry", "~> 0.14.1"
gem "pry-byebug", "~> 3.9.0" gem "pry-byebug", "~> 3.10.1"
gem "sdoc", "~> 2.0.3" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3" gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.10.0" gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1" gem "rubocop", "~> 0.52.1"

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

@@ -7,11 +7,11 @@ gem "railties", "~> 5.2.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "pry", "~> 0.13.1" gem "pry", "~> 0.14.1"
gem "pry-byebug", "~> 3.9.0" gem "pry-byebug", "~> 3.10.1"
gem "sdoc", "~> 2.0.3" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3" gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.10.0" gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1" gem "rubocop", "~> 0.52.1"

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

@@ -7,11 +7,11 @@ gem "railties", "~> 6.0.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "pry", "~> 0.13.1" gem "pry", "~> 0.14.1"
gem "pry-byebug", "~> 3.9.0" gem "pry-byebug", "~> 3.10.1"
gem "sdoc", "~> 2.0.3" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3" gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.10.0" gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1" gem "rubocop", "~> 0.52.1"

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

@@ -7,11 +7,11 @@ gem "railties", "~> 6.1.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "pry", "~> 0.13.1" gem "pry", "~> 0.14.1"
gem "pry-byebug", "~> 3.9.0" gem "pry-byebug", "~> 3.10.1"
gem "sdoc", "~> 2.0.3" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3" gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.10.0" gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1" gem "rubocop", "~> 0.52.1"

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

@@ -7,11 +7,11 @@ gem "railties", "~> 7.0.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "pry", "~> 0.13.1" gem "pry", "~> 0.14.1"
gem "pry-byebug", "~> 3.9.0" gem "pry-byebug", "~> 3.10.1"
gem "sdoc", "~> 2.0.3" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3" gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.10.0" gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1" gem "rubocop", "~> 0.52.1"

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

@@ -2,16 +2,16 @@
source "https://rubygems.org" source "https://rubygems.org"
gem "actionpack", "~> 4.2.0" gem "actionpack", "~> 7.1.0"
gem "railties", "~> 4.2.0" gem "railties", "~> 7.1.0"
group :development do group :development do
gem "appraisal", "~> 2.2" gem "appraisal", "~> 2.2"
gem "pry", "~> 0.13.1" gem "pry", "~> 0.14.1"
gem "pry-byebug", "~> 3.9.0" gem "pry-byebug", "~> 3.10.1"
gem "sdoc", "~> 2.0.3" gem "sdoc", "~> 2.0.3"
gem "telegram-bot-types", "~> 0.6.3" gem "telegram-bot-types", "~> 0.6.3"
gem "rspec", "~> 3.10.0" gem "rspec", "~> 3.12.0"
gem "rspec-its", "~> 1.3.0" gem "rspec-its", "~> 1.3.0"
gem "rspec-rails", "~> 4.0.2" gem "rspec-rails", "~> 4.0.2"
gem "rubocop", "~> 0.52.1" gem "rubocop", "~> 0.52.1"

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

@@ -7,7 +7,11 @@ namespace :telegram do
Rake::Task['environment'].invoke Rake::Task['environment'].invoke
if ENV.fetch('LOG_TO_STDOUT') { Rails.env.development? }.present? if ENV.fetch('LOG_TO_STDOUT') { Rails.env.development? }.present?
console = ActiveSupport::Logger.new(STDERR) console = ActiveSupport::Logger.new(STDERR)
Rails.logger.extend ActiveSupport::Logger.broadcast console if ::Rails.logger.respond_to?(:broadcast_to)
::Rails.logger.broadcast_to(console)
else
Rails.logger.extend ActiveSupport::Logger.broadcast console
end
end end
Telegram::Bot::UpdatesPoller.start(ENV['BOT'].try!(:to_sym) || :default) Telegram::Bot::UpdatesPoller.start(ENV['BOT'].try!(:to_sym) || :default)
end end

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

@@ -37,7 +37,7 @@ module Telegram
end end
def prepare_async_args(action, body = {}) def prepare_async_args(action, body = {})
[action.to_s, Async.prepare_hash(RequestBodyFormatter.format(body))] [action.to_s, Async.prepare_hash(RequestBodyFormatter.format(body, action))]
end end
def error_for_response(response) def error_for_response(response)
@@ -63,7 +63,7 @@ module Telegram
end end
def request(action, body = {}) def request(action, body = {})
response = http_request("#{base_uri}#{action}", RequestBodyFormatter.format(body)) response = http_request("#{base_uri}#{action}", RequestBodyFormatter.format(body, action))
raise self.class.error_for_response(response) if response.status >= 300 raise self.class.error_for_response(response) if response.status >= 300
JSON.parse(response.body) JSON.parse(response.body)
end end

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

@@ -1,5 +1,5 @@
# Generated with bin/fetch-telegram-methods # Generated with bin/fetch-telegram-methods
# Bot API 5.7 # Bot API 6.8
getUpdates getUpdates
setWebhook setWebhook
@@ -21,8 +21,6 @@ sendVoice
sendVideoNote sendVideoNote
sendMediaGroup sendMediaGroup
sendLocation sendLocation
editMessageLiveLocation
stopMessageLiveLocation
sendVenue sendVenue
sendContact sendContact
sendPoll sendPoll
@@ -58,30 +56,64 @@ getChatMemberCount
getChatMember getChatMember
setChatStickerSet setChatStickerSet
deleteChatStickerSet deleteChatStickerSet
getForumTopicIconStickers
createForumTopic
editForumTopic
closeForumTopic
reopenForumTopic
deleteForumTopic
unpinAllForumTopicMessages
editGeneralForumTopic
closeGeneralForumTopic
reopenGeneralForumTopic
hideGeneralForumTopic
unhideGeneralForumTopic
unpinAllGeneralForumTopicMessages
answerCallbackQuery answerCallbackQuery
setMyCommands setMyCommands
deleteMyCommands deleteMyCommands
getMyCommands getMyCommands
setMyName
getMyName
setMyDescription
getMyDescription
setMyShortDescription
getMyShortDescription
setChatMenuButton
getChatMenuButton
setMyDefaultAdministratorRights
getMyDefaultAdministratorRights
editMessageText editMessageText
editMessageCaption editMessageCaption
editMessageMedia editMessageMedia
editMessageLiveLocation
stopMessageLiveLocation
editMessageReplyMarkup editMessageReplyMarkup
stopPoll stopPoll
deleteMessage deleteMessage
sendSticker sendSticker
getStickerSet getStickerSet
getCustomEmojiStickers
uploadStickerFile uploadStickerFile
createNewStickerSet createNewStickerSet
addStickerToSet addStickerToSet
setStickerPositionInSet setStickerPositionInSet
deleteStickerFromSet deleteStickerFromSet
setStickerSetThumb setStickerEmojiList
setStickerKeywords
setStickerMaskPosition
setStickerSetTitle
setStickerSetThumbnail
setCustomEmojiStickerSetThumbnail
deleteStickerSet
answerInlineQuery answerInlineQuery
answerWebAppQuery
sendInvoice sendInvoice
createInvoiceLink
answerShippingQuery answerShippingQuery
answerPreCheckoutQuery answerPreCheckoutQuery

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

@@ -11,8 +11,14 @@ module Telegram
def format(body, action) def format(body, action)
body = body.dup body = body.dup
if action.to_s == 'sendMediaGroup' case action.to_s
body = extract_files_from_array!(body, :media) when 'sendMediaGroup'
extract_files_from_array!(body, :media)
when 'editMessageMedia'
replace_field(body, :media) do |value|
files = {}
extract_files_from_hash(value, files).tap { body.merge!(files) }
end
end end
body.each do |key, val| body.each do |key, val|
body[key] = val.to_json if val.is_a?(Hash) || val.is_a?(Array) body[key] = val.to_json if val.is_a?(Hash) || val.is_a?(Array)
@@ -21,12 +27,19 @@ module Telegram
private private
def extract_files_from_array!(body, field_name) # Detects field by symbol or string name and replaces it with mapped value.
field_name = [field_name.to_sym, field_name.to_s].find { |x| body.key?(x) } def replace_field(hash, field_name)
return body unless field_name && body[field_name].is_a?(Array) field_name = [field_name.to_sym, field_name.to_s].find { |x| hash.key?(x) }
files = {} hash[field_name] = yield hash[field_name] if field_name
body[field_name] = body[field_name].map { |x| extract_files_from_hash(x, files) } end
body.merge!(files)
def extract_files_from_array!(hash, field_name)
replace_field(hash, field_name) do |value|
break value unless value.is_a?(Array)
files = {}
value.map { |x| extract_files_from_hash(x, files) }.
tap { hash.merge!(files) }
end
end end
# Replace File objects with `attach` URIs. File objects are added into `files` hash. # Replace File objects with `attach` URIs. File objects are added into `files` hash.

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

@@ -16,7 +16,7 @@ module Telegram
def call(env) def call(env)
request = ActionDispatch::Request.new(env) request = ActionDispatch::Request.new(env)
update = request.request_parameters update = request.request_parameters
controller.dispatch(bot, update) controller.dispatch(bot, update, request)
[200, {}, ['']] [200, {}, ['']]
end end

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

@@ -101,6 +101,7 @@ module Telegram
poll_answer poll_answer
my_chat_member my_chat_member
chat_member chat_member
chat_join_request
].freeze ].freeze
class << self class << self
@@ -117,21 +118,24 @@ module Telegram
end end
end end
attr_internal_reader :update, :bot, :payload, :payload_type attr_internal_reader :bot, :payload, :payload_type, :update, :webhook_request
delegate :username, to: :bot, prefix: true, allow_nil: true delegate :username, to: :bot, prefix: true, allow_nil: true
# Second argument can be either update object with hash access & string # `update` can be either update object with hash access & string
# keys or Hash with `:from` or `:chat` to override this values and assume # keys or Hash with `:from` or `:chat` to override this values and assume
# that update is nil. # that update is nil.
def initialize(bot = nil, update = nil) # ActionDispatch::Request object is passed in `webhook_request` when bot running
# in webhook mode.
def initialize(bot = nil, update = nil, webhook_request = nil)
if update.is_a?(Hash) && (update.key?(:from) || update.key?(:chat)) if update.is_a?(Hash) && (update.key?(:from) || update.key?(:chat))
options = update options = update
update = nil update = nil
end end
@_update = update
@_bot = bot @_bot = bot
@_update = update
@_chat, @_from = options && options.values_at(:chat, :from) @_chat, @_from = options && options.values_at(:chat, :from)
@_payload, @_payload_type = self.class.payload_from_update(update) @_payload, @_payload_type = self.class.payload_from_update(update)
@_webhook_request = webhook_request
end end
# Accessor to `'chat'` field of payload. Also tries `'chat'` in `'message'` # Accessor to `'chat'` field of payload. Also tries `'chat'` in `'message'`

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

@@ -11,7 +11,7 @@ module Telegram
# respond_with :message, text: 'Where are you?' # respond_with :message, text: 'Where are you?'
# end # end
# #
# def set_location_from_messge(city = nil, *) # def set_location_from_message(city = nil, *)
# # update # # update
# end # end
# #

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

@@ -13,8 +13,9 @@ RSpec.shared_context 'telegram/bot/updates_controller' do
x.extend Telegram::Bot::UpdatesController::Testing x.extend Telegram::Bot::UpdatesController::Testing
end end
end end
let(:controller_args) { [bot, deep_stringify(update)] } let(:controller_args) { [bot, deep_stringify(update), webhook_request] }
let(:update) { {payload_type => payload} } let(:update) { {payload_type => payload} }
let(:webhook_request) { nil }
let(:payload_type) { :some_type } let(:payload_type) { :some_type }
let(:payload) { double(:payload) } let(:payload) { double(:payload) }
let(:bot) { Telegram::Bot::ClientStub.new(bot_name) } let(:bot) { Telegram::Bot::ClientStub.new(bot_name) }
@@ -22,8 +23,8 @@ RSpec.shared_context 'telegram/bot/updates_controller' do
let(:session) { controller.send(:session) } let(:session) { controller.send(:session) }
# Process update. # Process update.
def dispatch(update = self.update, bot = self.bot) def dispatch(update = self.update, bot = self.bot, webhook_request = self.webhook_request)
controller.dispatch_again(bot, deep_stringify(update)) controller.dispatch_again(bot, deep_stringify(update), webhook_request)
end end
# Same as `.as_json` but mocks-friendly. # Same as `.as_json` but mocks-friendly.

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

@@ -5,9 +5,9 @@ module Telegram
IVARS_TO_KEEP = %i[@_session].freeze IVARS_TO_KEEP = %i[@_session].freeze
# Perform multiple dispatches on same instance. # Perform multiple dispatches on same instance.
def dispatch_again(bot = nil, update = nil) def dispatch_again(bot = nil, update = nil, webhook_request = nil)
recycle! recycle!
initialize(bot, update) initialize(bot, update, webhook_request)
dispatch dispatch
end end

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

@@ -4,7 +4,7 @@ module Telegram
# Include this module to type cast update to Virtus model # Include this module to type cast update to Virtus model
# using `telegram-bot-types` gem (install this gem first). # using `telegram-bot-types` gem (install this gem first).
module TypedUpdate module TypedUpdate
def initialize(bot = nil, update = nil) def initialize(bot = nil, update = nil, webhook_request = nil)
update = Types::Update.new(update) if update && !update.is_a?(Types::Update) update = Types::Update.new(update) if update && !update.is_a?(Types::Update)
super super
end end

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

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

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

@@ -10,4 +10,13 @@ RSpec.describe DefaultBotController, telegram_bot: :rails do
subject { -> { dispatch_command :load_session } } subject { -> { dispatch_command :load_session } }
it { should_not raise_error } it { should_not raise_error }
end end
describe '#dispatch' do
it 'provides webhook_request' do
expect(described_class).to receive(:dispatch).
with(bot, hash_including('message'), instance_of(ActionDispatch::Request)).
and_call_original
dispatch_message :test
end
end
end end

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

@@ -58,5 +58,35 @@ RSpec.describe Telegram::Bot::Client::RequestBodyFormatter do
it { should eq input } it { should eq input }
end end
end end
context 'with editMessageMedia action' do
let(:action) { :editMessageMedia }
let(:input) { {media: {a: file, b: 123}, x: 789} }
let(:file) { File.new(__FILE__) }
it 'extracts files to the top-level' do
should eq(
media: {a: 'attach://_file0', b: 123}.to_json,
x: 789,
'_file0' => file,
)
end
context 'and input has string keys' do
let(:input) { super().stringify_keys }
it 'extracts files to the top-level' do
should eq(
'media' => {a: 'attach://_file0', b: 123}.to_json,
'x' => 789,
'_file0' => file,
)
end
end
context 'without media' do
let(:input) { {a: 1, b: '2', c: nil} }
it { should eq input }
end
end
end end
end end

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

@@ -129,7 +129,8 @@ RSpec.describe Telegram::Bot::Client do
let(:body) { body_json.to_json } let(:body) { body_json.to_json }
let(:body_json) { {'param' => 'val', 'description' => 'some description'} } let(:body_json) { {'param' => 'val', 'description' => 'some description'} }
before do before do
expect(described_class).to receive(:prepare_body).with(request_body) { prepared_body } expect(Telegram::Bot::Client::RequestBodyFormatter).
to receive(:format).with(request_body, action) { prepared_body }
expect(instance).to receive(:http_request).with(url, prepared_body) { response } expect(instance).to receive(:http_request).with(url, prepared_body) { response }
end end
around { |ex| Telegram::Bot::ClientStub.stub_all!(false) { ex.run } } around { |ex| Telegram::Bot::ClientStub.stub_all!(false) { ex.run } }

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

@@ -24,7 +24,8 @@ RSpec.describe Telegram::Bot::Middleware do
end end
it 'calls dispatch on controller' do it 'calls dispatch on controller' do
expect(controller).to receive(:dispatch).with(bot, update) expect(controller).to receive(:dispatch).
with(bot, update, instance_of(ActionDispatch::Request))
subject subject
end end

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

@@ -2,4 +2,13 @@ require 'telegram/bot/rspec/integration/poller'
RSpec.describe 'Poller integration spec', telegram_bot: :poller do RSpec.describe 'Poller integration spec', telegram_bot: :poller do
include_examples 'shared integration examples' include_examples 'shared integration examples'
describe '#dispatch' do
it 'doesn`t provide webhook_request' do
expect(controller_class).to receive(:dispatch).
with(bot, hash_including('message')).
and_call_original
dispatch_message :test
end
end
end end

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

@@ -17,4 +17,13 @@ RSpec.describe 'Rack integration spec', telegram_bot: :rack do
ActionDispatch::ParamsParser.new(app) ActionDispatch::ParamsParser.new(app)
end end
end end
describe '#dispatch' do
it 'provides webhook_request' do
expect(controller_class).to receive(:dispatch).
with(bot, hash_including('message'), instance_of(ActionDispatch::Request)).
and_call_original
dispatch_message :test
end
end
end end

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

@@ -1,3 +1,5 @@
require 'action_dispatch'
RSpec.describe Telegram::Bot::UpdatesController::Testing do RSpec.describe Telegram::Bot::UpdatesController::Testing do
include_context 'telegram/bot/updates_controller' include_context 'telegram/bot/updates_controller'
let(:controller_class) do let(:controller_class) do
@@ -24,4 +26,27 @@ RSpec.describe Telegram::Bot::UpdatesController::Testing do
it { should_not change { controller.send(:session)[:key] }.from 'sval' } it { should_not change { controller.send(:session)[:key] }.from 'sval' }
end end
end end
describe '#dispatch' do
it 'doesn`t provide webhook_request' do
dispatch
expect(controller.webhook_request).to eq nil
end
context 'when webhook_request is set' do
let(:webhook_request) { ActionDispatch::Request.new({}) }
it 'passes it to controller' do
dispatch
expect(controller.webhook_request).to eq webhook_request
end
end
context 'when webhook_request is given' do
it 'passes it to controller' do
webhook_request = ::ActionDispatch::Request.new({})
dispatch(update, bot, webhook_request)
expect(controller.webhook_request).to eq webhook_request
end
end
end
end end

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

@@ -15,6 +15,7 @@ RSpec.describe Telegram::Bot::UpdatesController::TypedUpdate do
edited_channel_post edited_channel_post
my_chat_member my_chat_member
chat_member chat_member
chat_join_request
]). ]).
map { |x| [x, Telegram::Bot::Types.const_get(x.camelize)] }.to_h. map { |x| [x, Telegram::Bot::Types.const_get(x.camelize)] }.to_h.
merge( merge(

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

@@ -46,6 +46,7 @@ RSpec.describe Telegram::Bot::UpdatesController do
chosen_inline_result chosen_inline_result
callback_query callback_query
poll_answer poll_answer
chat_join_request
] ]
(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

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

@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
spec.required_ruby_version = '>= 2.4' spec.required_ruby_version = '>= 2.4'
spec.add_dependency 'actionpack', '>= 4.0', '< 7.1' spec.add_dependency 'actionpack', '>= 4.0', '< 7.2'
spec.add_dependency 'activesupport', '>= 4.0', '< 7.1' spec.add_dependency 'activesupport', '>= 4.0', '< 7.2'
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'