telegram-rails 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 32045c7d423551f7c28bf5cb2a2461e70f04cf07
4
+ data.tar.gz: ae807568c5f7806f718f4177a3bd52b2abb6b6d6
5
+ SHA512:
6
+ metadata.gz: d77da4d52528321a44a3815f188062f5ef935873c010a1afc869013043ad4af2247b6997fce9602e01f441fe89c5bfb9b866c91ffda4a31f49c723a22b1bb8ab
7
+ data.tar.gz: e773a1c9ab1dd94de058d7fb3e206bfb360c753f689c7fa88428f9987220f66dc2dd636636ebe963155c08876ae9f1398d35e10c23c3eb08e1caf43f6f0de289
data/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # Telegram::Rails
2
+
3
+ ## Work in progress
4
+
5
+ Rails integration for [`telegram-rabbit`](https://github.com/govorov/telegram-rabbit).
6
+
7
+ Gives you http-like routes and controllers. Allows you to write such a code:
8
+
9
+ ```
10
+ #routes.rb
11
+ Rails.application.routes.draw do
12
+
13
+ telegram 'main/start', to: 'telegram/message#start'
14
+ telegram 'main/stop', to: 'telegram/message#stop'
15
+ telegram 'main', to: 'telegram/message'
16
+
17
+ end
18
+
19
+ #message_controller.rb
20
+ class Telegram::MessageController < Telegram::Controller
21
+
22
+ def start
23
+ respond_with 'received /start'
24
+ end
25
+
26
+
27
+ def stop
28
+ respond_with 'received /stop'
29
+ end
30
+
31
+
32
+ def process
33
+ respond_with 'other commands'
34
+ end
35
+
36
+ end
37
+
38
+ ```
39
+
40
+ ## TODO
41
+
42
+ * Sessions
43
+ * Callbacks
44
+ * `rescue_from`
45
+ * `respond_to`
46
+ * ...and so on from vanilla rails controllers
47
+ * Documentation
48
+
49
+ ## License
50
+
51
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
52
+
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "telegram/rails"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,84 @@
1
+ require 'telegram/rails/action_dispatcher'
2
+
3
+
4
+ module Telegram
5
+ class ClientAdapter
6
+
7
+ class ApiProxy
8
+ def initialize adapter
9
+ @adapter = adapter
10
+ end
11
+
12
+ def method_missing command, *args
13
+ puts "call adapter with #{command}"
14
+ p args
15
+ @adapter.send_command command, *args
16
+ end
17
+ end
18
+
19
+
20
+ attr_accessor :connection
21
+ attr_accessor :queue_namespace
22
+ attr_accessor :options
23
+ attr_accessor :bot_name
24
+
25
+
26
+ def configure
27
+ yield self
28
+ self
29
+ end
30
+
31
+
32
+ def start
33
+ send_queue_name = "#{queue_prefix}.commands"
34
+ receive_queue_name = "#{queue_prefix}.messages"
35
+
36
+ @channel = connection.create_channel
37
+ @send_queue = @channel.queue send_queue_name
38
+ @receive_queue = @channel.queue receive_queue_name
39
+
40
+ @receive_queue.subscribe do |info,metadata,raw_data|
41
+ data = Marshal.load(raw_data)
42
+ @receive_callbacks.each do |callback|
43
+ callback.call(data)
44
+ end
45
+ end
46
+
47
+ @api_proxy = ApiProxy.new(self)
48
+ end
49
+
50
+
51
+ def on_message_received &block
52
+ @receive_callbacks ||= []
53
+ @receive_callbacks << block
54
+ end
55
+
56
+
57
+ def api
58
+ @api_proxy
59
+ end
60
+
61
+
62
+ def send_message payload
63
+ api.send_message payload
64
+ end
65
+
66
+
67
+ def send_command command, payload
68
+ raw_data = Marshal.dump(serialize_command(command,payload))
69
+ @channel.default_exchange.publish raw_data, routing_key: @send_queue.name
70
+ end
71
+
72
+
73
+ private
74
+
75
+ def serialize_command command, payload
76
+ {command: command, payload: payload}
77
+ end
78
+
79
+ def queue_prefix
80
+ "#{queue_namespace}.#{bot_name}"
81
+ end
82
+
83
+ end # ClientAdapter
84
+ end # Telegram
@@ -0,0 +1,102 @@
1
+ require 'telegram/utils/responder'
2
+ require 'telegram/utils/keyboard_builder'
3
+
4
+
5
+ module Telegram
6
+ class Controller
7
+
8
+ def bots= adapters
9
+ @bots = adapters
10
+ end
11
+
12
+
13
+ def bot_name= name
14
+ @bot_name = name
15
+ end
16
+
17
+
18
+ def message= payload
19
+ @message = payload
20
+ end
21
+
22
+
23
+ def explicit_response?
24
+ @explicit_response
25
+ end
26
+
27
+
28
+ private
29
+
30
+ def bot
31
+ @bots[@bot_name]
32
+ end
33
+
34
+
35
+ def bots
36
+ @bots
37
+ end
38
+
39
+
40
+ def request
41
+ @message
42
+ end
43
+
44
+
45
+ def send_message *args
46
+ bot.api.send_message *args
47
+ @explicit_response = true
48
+ end
49
+
50
+
51
+ def default_response
52
+ { chat_id: @message.chat.id }
53
+ end
54
+
55
+
56
+ def respond_with payload
57
+ response = payload.clone
58
+ # WIP угадывать тип, посмотреть какие есть типы ответа
59
+ unless response.is_a? Hash
60
+ response = {text: response.to_s}
61
+ end
62
+
63
+ # :keyboard => :reply_markup, call :keyboard
64
+ # :inline_keyboard => :reply_markup, call :inline_keyboard
65
+ if response.has_key? :keyboard
66
+ response[:reply_markup] = keyboard(response[:keyboard])
67
+ response.delete :keyboard
68
+ end
69
+
70
+ if response.has_key? :inline_keyboard
71
+ response[:reply_markup] = inline_keyboard(response[:inline_keyboard])
72
+ response.delete :inline_keyboard
73
+ end
74
+
75
+ if response.has_key?(:remove_keyboard) && response[:remove_keyboard]
76
+ response[:reply_markup] = remove_keyboard
77
+ response.delete :remove_keyboard
78
+ end
79
+
80
+ send_message default_response.merge(response)
81
+ end
82
+
83
+
84
+ keyboard_builder = Telegram::Utils::KeyboardBuilder
85
+
86
+ define_method :keyboard do |buttons|
87
+ keyboard_builder.keyboard buttons
88
+ end
89
+
90
+
91
+ define_method :inline_keyboard do |buttons|
92
+ keyboard_builder.inline_keyboard buttons
93
+ end
94
+
95
+
96
+ define_method :remove_keyboard do
97
+ res = keyboard_builder.remove_keyboard
98
+ end
99
+
100
+
101
+ end # Controller
102
+ end # Telegram
@@ -0,0 +1,6 @@
1
+ module Telegram
2
+ module Errors
3
+ class CommonError < StandardError
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ require 'telegram/errors/common_error'
2
+
3
+ module Telegram
4
+ module Errors
5
+ module Configuration
6
+ class TokenMissingError < Telegram::Errors::CommonError
7
+ def initialize name
8
+ super "No token were provided for bot \"#{name}\""
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ require 'telegram/errors/common_error'
2
+
3
+ module Telegram
4
+ module Errors
5
+ module Controller
6
+ class BlockNotGivenError < Telegram::Errors::CommonError
7
+ def initialize
8
+ super "Block not given"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ require 'telegram/errors/common_error'
2
+
3
+
4
+ module Telegram
5
+ module Errors
6
+ module Routing
7
+ class BadRouteError < Telegram::Errors::CommonError
8
+ def initialize route
9
+ super "Bad route \"#{route}\""
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'telegram/errors/common_error'
2
+
3
+ #WIP--
4
+ module Telegram
5
+ module Errors
6
+ module Routing
7
+ class BotNotFoundError < Telegram::Errors::CommonError
8
+ def initialize name
9
+ super "Bot \"#{name}\" was not found"
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,121 @@
1
+ require 'active_support/inflector'
2
+
3
+
4
+ module Telegram
5
+ module Rails
6
+ class ActionDispatcher
7
+
8
+ ROUTE_DELIMETER = "/"
9
+ ENDPOINT_DELIMETER = "#"
10
+ COMMAND_START_SYMBOL = "/"
11
+ COMMAND_ARGS_SEPARATOR = /\s+/
12
+ DEFAULT_ACTION_NAME = :process
13
+
14
+
15
+ def initialize adapters
16
+ @adapters = adapters
17
+ @routes = []
18
+ end
19
+
20
+
21
+ def register_route route_data
22
+ route = parse_route(route_data)
23
+ @routes << route
24
+ end
25
+
26
+
27
+ def dispatch_message bot_name, message
28
+ adapter = find_adapter_for bot_name
29
+ return unless adapter
30
+
31
+ command, args = extract_command_from message
32
+ route = find_route_for bot_name, command
33
+ return unless route
34
+
35
+ process_message message, with: route
36
+ end
37
+
38
+
39
+ private
40
+
41
+ def find_adapter_for name
42
+ @adapters[name]
43
+ end
44
+
45
+
46
+ def find_route_for bot_name, command
47
+ @routes.find do |route|
48
+ route_match? bot_name, command, route
49
+ end
50
+ end
51
+
52
+
53
+ def route_match? bot_name, command, route
54
+ bot_name == route[:bot_name] &&
55
+ (command == route[:command] || route[:command].nil?)
56
+ end
57
+
58
+
59
+ def process_message message, opts
60
+ route = opts[:with]
61
+ controller = route[:controller_class].new
62
+ controller.tap do |c|
63
+ c.bots = @adapters
64
+ c.bot_name = route[:bot_name]
65
+ c.message = message
66
+ end
67
+
68
+ begin
69
+ # WIP check explicit response...
70
+ controller.send route[:action_name]
71
+ rescue StandardError => e
72
+ puts "RESCUE FROM"
73
+ puts "RESCUE FROM"
74
+ puts "RESCUE FROM"
75
+ puts "RESCUE FROM"
76
+ #HERE rescue_from!!!
77
+ raise e
78
+ end
79
+ end
80
+
81
+
82
+ #TODO test coverage
83
+ def parse_route route_data
84
+ route_string = route_data[:route]
85
+ options = route_data[:options]
86
+
87
+ segments = route_string.split ROUTE_DELIMETER, 2
88
+ bot_name, command = segments
89
+
90
+ bot_name = bot_name.to_sym if bot_name
91
+ command = command.to_sym if command
92
+
93
+ endpoint = options[:to]
94
+ controller_name, action_name = endpoint.to_s.split ENDPOINT_DELIMETER, 2
95
+
96
+ controller_class = "#{controller_name}_controller".classify.constantize
97
+ action_name = action_name ? action_name.to_sym : DEFAULT_ACTION_NAME
98
+
99
+ {
100
+ bot_name: bot_name,
101
+ command: command,
102
+ controller_class: controller_class,
103
+ action_name: action_name,
104
+ }
105
+ end
106
+
107
+
108
+ # get command name from payload
109
+ def extract_command_from payload
110
+ command_str = payload.text
111
+ if command_str && command_str.starts_with?(COMMAND_START_SYMBOL)
112
+ command_str.slice!(0)
113
+ command,*args = command_str.split COMMAND_ARGS_SEPARATOR
114
+ return [command.to_sym, args] if command && command.length
115
+ end
116
+ return [nil,nil]
117
+ end
118
+
119
+ end # ActionDispatcher
120
+ end # Rails
121
+ end # Telegram
@@ -0,0 +1,75 @@
1
+ require 'bunny'
2
+ require 'active_support/notifications'
3
+
4
+ require 'telegram/rails/routes_helper'
5
+ require 'telegram/client_adapter'
6
+
7
+ require 'telegram/errors/configuration/token_missing_error'
8
+ require 'telegram/errors/routing/bot_not_found_error'
9
+ require 'telegram/controller'
10
+ require 'telegram/bot'
11
+
12
+
13
+ module Telegram
14
+ module Rails
15
+ class Railtie < ::Rails::Railtie
16
+
17
+ # add config section
18
+ config.telegram = ActiveSupport::OrderedOptions.new
19
+ notifications = ActiveSupport::Notifications
20
+
21
+ #add route helper
22
+ config.before_initialize do
23
+ ::ActionDispatch::Routing::Mapper.send(:include, Telegram::Rails::RoutesHelper)
24
+ end
25
+
26
+ initializer "telegram_rails.run_client_adapters" do |app|
27
+
28
+ @options ||= default_options.merge(app.config.telegram)
29
+ @adapters = {}
30
+ dispatcher = Telegram::Rails::ActionDispatcher.new @adapters
31
+
32
+ @connection = Bunny.new(get_option :bunny).start
33
+ at_exit { @connection.close }
34
+
35
+ #create adapter for each bot
36
+ get_option(:bots).each do |pair; name,options|
37
+ name, options = pair
38
+
39
+ adapter = Telegram::ClientAdapter.new.configure do |c|
40
+ c.bot_name = name
41
+ c.options = options
42
+ c.connection = @connection
43
+ c.queue_namespace = get_option(:queue_namespace)
44
+ end
45
+
46
+ adapter.on_message_received do |message|
47
+ #TODO logging
48
+ dispatcher.dispatch_message name, message
49
+ end
50
+
51
+ @adapters[name] = adapter
52
+ adapter.start
53
+ end
54
+
55
+ notifications.subscribe "telegram.register_route" do |name, started, finished, id, data|
56
+ dispatcher.register_route data
57
+ end
58
+
59
+ end # initializer
60
+
61
+
62
+ private
63
+
64
+ def get_option *args
65
+ (@options || {}).dig *args
66
+ end
67
+
68
+
69
+ def default_options
70
+ Hash.new
71
+ end
72
+
73
+ end # Railtie
74
+ end # Rails
75
+ end # Telegram
@@ -0,0 +1,11 @@
1
+ module Telegram
2
+ module Rails
3
+ module RoutesHelper
4
+
5
+ def telegram route, options
6
+ ActiveSupport::Notifications.instrument "telegram.register_route", route: route, options: options
7
+ end
8
+
9
+ end #RoutesHelper
10
+ end #Rails
11
+ end #Telegram
@@ -0,0 +1,5 @@
1
+ module Telegram
2
+ module Rails
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ require "telegram/rails/version"
2
+
3
+ module Telegram
4
+ module Rails
5
+ end
6
+ end
7
+
8
+ require "telegram/rails/railtie" if defined?(Rails)
@@ -0,0 +1,37 @@
1
+ require 'telegram/bot'
2
+
3
+ module Telegram
4
+ module Utils
5
+ module KeyboardBuilder
6
+ class << self
7
+
8
+ def keyboard buttons
9
+ btnClass = Telegram::Bot::Types::KeyboardButton
10
+ kbClass = Telegram::Bot::Types::ReplyKeyboardMarkup
11
+ build :keyboard, buttons, btnClass, kbClass
12
+ end
13
+
14
+
15
+ def inline_keyboard buttons
16
+ btnClass = Telegram::Bot::Types::InlineKeyboardButton
17
+ kbClass = Telegram::Bot::Types::InlineKeyboardMarkup
18
+ build :keyboard, buttons, btnClass, kbClass
19
+ end
20
+
21
+
22
+ def remove_keyboard
23
+ Telegram::Bot::Types::ReplyKeyboardRemove.new(remove_keyboard: true)
24
+ end
25
+
26
+
27
+ private
28
+ def build key, buttons, btnClass, kbClass
29
+ keyboard = buttons.map do |button|
30
+ btnClass.new button
31
+ end
32
+ kbClass.new({ key => keyboard })
33
+ end
34
+ end
35
+ end
36
+ end # Utils
37
+ end # Telegram
@@ -0,0 +1,117 @@
1
+ require 'active_support/inflector'
2
+ require 'telegram/errors/controller/block_not_given_error'
3
+ #WIP-- `ag byebug`
4
+ require 'byebug'
5
+
6
+ #WIP move to ...::Controller, продумать
7
+
8
+ module Telegram
9
+ module Utils
10
+ class Responder
11
+
12
+ class << self
13
+ private
14
+ def register_type type
15
+ instance_eval do
16
+ define_method type do |&block|
17
+ set_respond_to type, &block
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+
24
+ RESPONSE_TYPES = [
25
+ :from,
26
+ :date,
27
+ :chat,
28
+ :forward_from,
29
+ :forward_from_chat,
30
+ :forward_from_message_id,
31
+ :forward_date,
32
+ :reply_to_message,
33
+ :edit_date,
34
+ :text,
35
+ :entities,
36
+ :audio,
37
+ :document,
38
+ :game,
39
+ :photo,
40
+ :sticker,
41
+ :video,
42
+ :voice,
43
+ :caption,
44
+ :contact,
45
+ :location,
46
+ :venue,
47
+ :new_chat_member,
48
+ :left_chat_member,
49
+ :new_chat_title,
50
+ :new_chat_photo,
51
+ :delete_chat_photo,
52
+ :group_chat_created,
53
+ :supergroup_chat_created,
54
+ :channel_chat_created,
55
+ :migrate_to_chat_id,
56
+ :migrate_from_chat_id,
57
+ :pinned_message,
58
+ # Telegram::Bot::Types::ReplyKeyboardMarkup,
59
+ # Telegram::Bot::Types::ReplyKeyboardRemove,
60
+ # Telegram::Bot::Types::ForceReply,
61
+ # Telegram::Bot::Types::InlineKeyboardMarkup
62
+ ]
63
+
64
+
65
+ RESPONSE_TYPES.each do |type_const|
66
+ register_type type_const.to_s.underscore.to_sym
67
+ end
68
+
69
+
70
+ def current_message= message
71
+ @message = message
72
+ end
73
+
74
+
75
+ def current_message
76
+ @message
77
+ end
78
+
79
+
80
+ def clear_current_message
81
+ @message = nil
82
+ end
83
+
84
+
85
+ def any &block
86
+ set_respond_to :any, &block
87
+ end
88
+
89
+
90
+ #TEST
91
+ #match first not nil attribute
92
+ def set_respond_to type, &block
93
+ @stack ||= []
94
+ @stack.push type
95
+ if block && @block.nil?
96
+ # check if message matches stack
97
+ has_attr = @stack.find do |format|
98
+ format == :any || !current_message.send(format).nil?
99
+ end
100
+
101
+ if has_attr
102
+ @block = block
103
+ end
104
+
105
+ @stack.clear
106
+ end
107
+
108
+ end
109
+
110
+
111
+ def block
112
+ @block or raise Telegram::Errors::Controller::BlockNotGivenError
113
+ end
114
+
115
+ end
116
+ end
117
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: telegram-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Stanislav E. Govorov
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-04-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: telegram-bot-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: wisper
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bunny
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.14'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.14'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '10.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description:
112
+ email:
113
+ - govorov.st@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - README.md
119
+ - bin/console
120
+ - bin/setup
121
+ - lib/telegram/client_adapter.rb
122
+ - lib/telegram/controller.rb
123
+ - lib/telegram/errors/common_error.rb
124
+ - lib/telegram/errors/configuration/token_missing_error.rb
125
+ - lib/telegram/errors/controller/block_not_given_error.rb
126
+ - lib/telegram/errors/routing/bad_route_error.rb
127
+ - lib/telegram/errors/routing/bot_not_found_error.rb
128
+ - lib/telegram/rails.rb
129
+ - lib/telegram/rails/action_dispatcher.rb
130
+ - lib/telegram/rails/railtie.rb
131
+ - lib/telegram/rails/routes_helper.rb
132
+ - lib/telegram/rails/version.rb
133
+ - lib/telegram/utils/keyboard_builder.rb
134
+ - lib/telegram/utils/responder.rb
135
+ homepage:
136
+ licenses:
137
+ - MIT
138
+ metadata: {}
139
+ post_install_message:
140
+ rdoc_options: []
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ requirements: []
154
+ rubyforge_project:
155
+ rubygems_version: 2.6.11
156
+ signing_key:
157
+ specification_version: 4
158
+ summary: Rails integration for telegram-bot-rabbit
159
+ test_files: []