telegram-bot 0.12.0 → 0.12.1

Sign up to get free protection for your applications and to get access to all the features.
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