telegem 0.1.6 → 0.2.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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/core/bot.rb +38 -27
  3. data/lib/telegem.rb +1 -1
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ca0f4841ae7f22222a39ad5a3664843a908f522ac988cf9da42367b8edaa31e2
4
- data.tar.gz: dd000aa5a145b4912bedc5b4e5eaf071a9fb6198a30279b43edf81492dab160e
3
+ metadata.gz: 1fb8c1bced00447821d2b879718c2ab162cea8ff348970307d620ca31b106df7
4
+ data.tar.gz: 48034a23e5079b3335bac812bb8a2643478a628e25eee322af6aa16927cbeb41
5
5
  SHA512:
6
- metadata.gz: 5cff4090a99a1d98996b25303e80ca516e415d383cbe123657a9606aeddf6fa3b211891ad568c0bfff85d1fd6b3865a61416ab3e9f03862c86603fb8aac79437
7
- data.tar.gz: 3fcb8b5de79185dc660833dd2ae20ecdac3034633f84e14a770c29df408631ff310ca3349e7383333eb8ec2cee5cd001df6b918451144e4e93a8051e75ad2486
6
+ metadata.gz: dab8827b4606a40ea10f882b774a400c9c32685461b4147a1879987009b4d77ed9efd83571c15923915cdd40e61848533db2c09e74cc3535c00df8bcb1f78ebc
7
+ data.tar.gz: a5e90efd58279b2cb47b04a7933e42b9281f4e8aba197f12783339984c9b238a85e0f3a34faf75b3fe71137efd9941da4ffa5405b8c76da632fcea62b395d7c5
data/lib/core/bot.rb CHANGED
@@ -22,9 +22,10 @@ module Telegem
22
22
  @session_store = options[:session_store] || Session::MemoryStore.new
23
23
  @concurrency = options[:concurrency] || 10
24
24
  @semaphore = Async::Semaphore.new(@concurrency)
25
+ @polling_task = nil
26
+ @running = false
25
27
  end
26
28
 
27
- # DSL Methods
28
29
  def command(name, **options, &block)
29
30
  pattern = /^\/#{Regexp.escape(name)}(?:@\w+)?(?:\s+(.+))?$/i
30
31
 
@@ -59,35 +60,42 @@ module Telegem
59
60
  @scenes[id] = Scene.new(id, &block)
60
61
  end
61
62
 
62
- # Async Polling
63
63
  def start_polling(**options)
64
- Async do |parent|
64
+ return @polling_task if @running
65
+
66
+ @polling_task = Async do |parent|
67
+ @running = true
65
68
  @logger.info "Starting async polling..."
66
69
  offset = nil
67
70
 
68
- loop do
69
- updates = await fetch_updates(offset, **options)
70
-
71
- # Process updates concurrently with limits
72
- updates.each do |update|
73
- parent.async do |child|
74
- @semaphore.async do
75
- await process_update(update)
71
+ begin
72
+ loop do
73
+ updates_task = fetch_updates(offset, **options)
74
+ updates = updates_task.wait
75
+
76
+ updates.each do |update|
77
+ parent.async do |child|
78
+ @semaphore.async do
79
+ process_update(update)
80
+ end
76
81
  end
77
82
  end
78
- end
79
83
 
80
- offset = updates.last&.update_id.to_i + 1 if updates.any?
84
+ offset = updates.last&.update_id.to_i + 1 if updates.any?
85
+ end
86
+ rescue => e
87
+ handle_error(e)
88
+ raise
89
+ ensure
90
+ @running = false
81
91
  end
82
- rescue => e
83
- handle_error(e)
84
- raise
85
92
  end
93
+
94
+ @polling_task
86
95
  end
87
96
 
88
- # Webhook Support
89
97
  def webhook(app = nil, &block)
90
- require 'telegem/webhook'
98
+ require_relative '../../webhook/server'
91
99
 
92
100
  if block_given?
93
101
  Webhook::Server.new(self, &block)
@@ -117,7 +125,6 @@ module Telegem
117
125
  end
118
126
  end
119
127
 
120
- # Core Processing
121
128
  def process(update_data)
122
129
  Async do
123
130
  update = Types::Update.new(update_data)
@@ -127,10 +134,21 @@ module Telegem
127
134
 
128
135
  def shutdown
129
136
  @logger.info "Shutting down..."
137
+
138
+ if @polling_task && @polling_task.running?
139
+ @polling_task.stop
140
+ @polling_task = nil
141
+ end
142
+
130
143
  @api.close
144
+ @running = false
131
145
  @logger.info "Bot stopped"
132
146
  end
133
147
 
148
+ def running?
149
+ @running
150
+ end
151
+
134
152
  private
135
153
 
136
154
  def fetch_updates(offset, timeout: 30, limit: 100, allowed_updates: nil)
@@ -169,7 +187,6 @@ module Telegem
169
187
  def build_middleware_chain
170
188
  chain = Composer.new
171
189
 
172
- # Add user middleware
173
190
  @middleware.each do |middleware_class, args, block|
174
191
  if middleware_class.respond_to?(:new)
175
192
  middleware = middleware_class.new(*args, &block)
@@ -179,7 +196,6 @@ module Telegem
179
196
  end
180
197
  end
181
198
 
182
- # Add session middleware if not already added
183
199
  unless @middleware.any? { |m, _, _| m.is_a?(Session::Middleware) }
184
200
  chain.use(Session::Middleware.new(@session_store))
185
201
  end
@@ -196,7 +212,7 @@ module Telegem
196
212
  if matches_filters?(ctx, handler[:filters])
197
213
  result = handler[:handler].call(ctx)
198
214
  result = await(result) if result.is_a?(Async::Task)
199
- break # First matching handler wins
215
+ break
200
216
  end
201
217
  end
202
218
  end
@@ -251,11 +267,6 @@ module Telegem
251
267
  ctx.chat.type == type.to_s
252
268
  end
253
269
 
254
- def webhook_server(**options)
255
- require_relative '../webhook/server'
256
- Webhook::Server.new(self, **options)
257
- end
258
-
259
270
  def matches_command_filter(ctx, command_name)
260
271
  return false unless ctx.message&.command?
261
272
  ctx.message.command_name == command_name.to_s
data/lib/telegem.rb CHANGED
@@ -6,7 +6,7 @@ require 'logger'
6
6
  require 'json'
7
7
 
8
8
  module Telegem
9
- VERSION = '0.1.6'.freeze
9
+ VERSION = '0.2.0'.freeze
10
10
 
11
11
  # Define module structure
12
12
  module API; end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: telegem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phantom