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.
- checksums.yaml +4 -4
- data/lib/core/bot.rb +38 -27
- data/lib/telegem.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1fb8c1bced00447821d2b879718c2ab162cea8ff348970307d620ca31b106df7
|
|
4
|
+
data.tar.gz: 48034a23e5079b3335bac812bb8a2643478a628e25eee322af6aa16927cbeb41
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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