telegram-bot 0.12.0 → 0.12.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 21e86ff6949e2e4f60350c86344291f603bafc8c
4
- data.tar.gz: 61478f30a26e0ae4e50c18fd34e2df250dba9fe3
3
+ metadata.gz: 68b890442fcebe77768635e83f83a3c17836fe1c
4
+ data.tar.gz: d63e9386c4bbed598c8708aedbea3c19e3dbc8f9
5
5
  SHA512:
6
- metadata.gz: f1eb9064cd9b8220b8d47f436422d2088cb03e44c35bec3590c59f8e26f79a36e049f36b5761bcbf73854bb168f38c0201ce6bd5253c590049f201be5aa4dcae
7
- data.tar.gz: e405a0acf8966a581f6efc65b893a5746ff614382ccfa32d051ec3c60d78f9a83be4756f25b62178118251659d1c58d4704a2c48c05c3a6ddb5d2a0fca2b77ac
6
+ metadata.gz: 0346c315cba86a652b0ab3914129ba426568790c5d18962b233cb60ef96b5c943562dec8cbaf348fe55d8b4592c7043987e30787707830d21791064be0d588a9
7
+ data.tar.gz: 6d643748c150f11087e29ed73e61cf979746d876461582055748dafa2aec2f4ffe5d9f52048158f2005e9c1e8c41abf6481feb88b09ac7c98549576ead446f50
@@ -1,5 +1,12 @@
1
1
  # Unreleased
2
2
 
3
+ # 0.12.1
4
+
5
+ - Fix `set_webhook` rake task for async bots with self-issued certificates.
6
+ - Make `#session` raise error when store is not configured,
7
+ don't use Rails.cache as fallback for session_store.
8
+ - Allow use different sessions for MessageContext.
9
+
3
10
  # 0.12.0
4
11
 
5
12
  - New API methods and payload types (up to Bot API 3.2).
data/README.md CHANGED
@@ -24,7 +24,7 @@ Here is sample [telegram_bot_app](https://github.com/telegram-bot-rb/telegram_bo
24
24
  with session, keyboards and inline queries.
25
25
  Run it on your local machine in 1 minute!
26
26
 
27
- And here is [app teamplate](https://github.com/telegram-bot-rb/rails_template)
27
+ And here is [app template](https://github.com/telegram-bot-rb/rails_template)
28
28
  to generate clean app in seconds.
29
29
 
30
30
  Examples and cookbook in [wiki](https://github.com/telegram-bot-rb/telegram-bot/wiki).
@@ -199,12 +199,33 @@ end
199
199
 
200
200
  #### Session
201
201
 
202
- There is support for sessions using `ActiveSupport::Cache` stores.
202
+ This API is very close to ActiveController's session API, but works different
203
+ under the hood. Cookies can not be used to store session id or
204
+ whole session (like CookieStore does). So it uses key-value store and `session_key`
205
+ method to build identifier from update.
206
+
207
+ Store can be one of numerous `ActiveSupport::Cache` stores.
208
+ While `:file_store` is suitable for development and single-server deployments
209
+ without heavy load, it doesn't scale well. Key-value databases with persistance
210
+ like Redis are more appropriate for production use.
203
211
 
204
212
  ```ruby
205
- # configure store in env files:
213
+ # In rails app store can be configured in env files:
206
214
  config.telegram_updates_controller.session_store = :redis_store, {expires_in: 1.month}
207
215
 
216
+ # In other app it can be done for all controllers with:
217
+ Telegram::Bot::UpdatesController.session_store = :redis_store, {expires_in: 1.month}
218
+ # or for specific one:
219
+ OneOfUpdatesController.session_store = :redis_store, {expires_in: 1.month}
220
+ ```
221
+
222
+ Default session id is made from bot's username and `(from || chat)['id']`.
223
+ It means that session will be the same for updates from user in every chat,
224
+ and different for every user in the same group chat.
225
+ To change this behavior you can override `session_key` method, or even
226
+ define multiple sessions in single controller. For details see `Session` module.
227
+
228
+ ```ruby
208
229
  class Telegram::WebhookController < Telegram::Bot::UpdatesController
209
230
  include Telegram::Bot::UpdatesController::Session
210
231
  # or just shortcut:
@@ -222,12 +243,16 @@ class Telegram::WebhookController < Telegram::Bot::UpdatesController
222
243
  end
223
244
 
224
245
  private
225
- # By default it uses bot's username and user's id as a session key.
226
- # Chat's id is used only when `from` field is empty.
227
- # Override `session_key` method to change this behavior.
246
+
247
+ # In this case session will persist for user only in specific chat.
248
+ # Same user in other chat will have different session.
228
249
  def session_key
229
- # In this case session will persist for user only in specific chat:
230
- "#{bot.username}:#{chat['id']}:#{from['id']}"
250
+ "#{bot.username}:#{chat['id']}:#{from['id']}" if chat && from
251
+ end
252
+
253
+ # This session will be the same for all updates in chat.
254
+ def chat_session
255
+ @_chat_session ||= self.class.build_session(chat && "#{bot.username}:#{chat['id']}")
231
256
  end
232
257
  end
233
258
  ```
@@ -21,7 +21,7 @@ namespace :telegram do
21
21
  route_name = Telegram::Bot::RoutesHelper.route_name_for_bot(bot)
22
22
  url = routes.send("#{route_name}_url")
23
23
  puts "Setting webhook for #{key}..."
24
- bot.set_webhook(url: url, certificate: cert)
24
+ bot.async(false) { bot.set_webhook(url: url, certificate: cert) }
25
25
  end
26
26
  end
27
27
  end
@@ -18,7 +18,7 @@ module Telegram
18
18
 
19
19
  ActiveSupport.on_load('telegram.bot.updates_controller') do
20
20
  self.logger = options.logger || Rails.logger
21
- self.session_store = options.session_store || Rails.cache
21
+ self.session_store = options.session_store if options.session_store
22
22
  end
23
23
  end
24
24
 
@@ -7,14 +7,11 @@ module Telegram
7
7
 
8
8
  include Session
9
9
 
10
- included do
11
- # As we use before_action context is cleared anyway,
12
- # no matter we used it or not.
13
- singleton_class.send :attr_reader, :context_handlers, :context_to_action
14
- @context_handlers = {}
15
- end
16
-
17
10
  module ClassMethods
11
+ def context_handlers
12
+ @_context_handlers ||= {}
13
+ end
14
+
18
15
  # Registers handler for context.
19
16
  #
20
17
  # context_handler :rename do |*|
@@ -39,6 +36,8 @@ module Telegram
39
36
  context_handlers[context] = action || context
40
37
  end
41
38
 
39
+ attr_reader :context_to_action
40
+
42
41
  # Use it to use context value as action name for all contexts
43
42
  # which miss handlers.
44
43
  # For security reasons it supports only action methods and will
@@ -59,10 +58,16 @@ module Telegram
59
58
  # according to previous request.
60
59
  attr_reader :context
61
60
 
61
+ # Controller may have multiple sessions, let it be possible
62
+ # to select session for message context.
63
+ def message_context_session
64
+ session
65
+ end
66
+
62
67
  # Fetches context and finds handler for it. If message has new command,
63
68
  # it has higher priority than contextual action.
64
69
  def action_for_message
65
- val = session.delete(:context)
70
+ val = message_context_session.delete(:context)
66
71
  @context = val && val.to_sym
67
72
  super || context && begin
68
73
  handler = handler_for_context
@@ -72,7 +77,7 @@ module Telegram
72
77
 
73
78
  # Save context for the next request.
74
79
  def save_context(context)
75
- session[:context] = context
80
+ message_context_session[:context] = context
76
81
  end
77
82
 
78
83
  def handler_for_context
@@ -8,19 +8,26 @@ module Telegram
8
8
  module Session
9
9
  extend ActiveSupport::Concern
10
10
 
11
+ module ClassMethods
12
+ # Builds session with given key and optional store (default to session_store).
13
+ # This way it's easier to define multiple custom sessions,
14
+ # ex. one for group chat and one for user.
15
+ def build_session(key, store = session_store)
16
+ raise 'session_store is not configured' unless store
17
+ key ? SessionHash.new(store, key) : NullSessionHash.new
18
+ end
19
+ end
20
+
11
21
  def process_action(*)
12
22
  super
13
23
  ensure
14
- session.commit
24
+ session.commit if @_session
15
25
  end
16
26
 
17
27
  protected
18
28
 
19
29
  def session
20
- @_session ||= begin
21
- key = session_key
22
- key ? SessionHash.new(self.class.session_store, key) : NullSessionHash.new
23
- end
30
+ @_session ||= self.class.build_session(session_key)
24
31
  end
25
32
 
26
33
  def session_key
@@ -1,6 +1,6 @@
1
1
  module Telegram
2
2
  module Bot
3
- VERSION = '0.12.0'.freeze
3
+ VERSION = '0.12.1'.freeze
4
4
 
5
5
  def self.gem_version
6
6
  Gem::Version.new VERSION
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: telegram-bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Max Melentiev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-08-11 00:00:00.000000000 Z
11
+ date: 2017-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport