te_bot 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cf6752512a52e78b548544788d5a92b93d5024c6a2c4f51e94c214515162b7b2
4
- data.tar.gz: 070aac9bbc7ba3b362e4a4c7b2b69bb5bd8640dd78ee8e99bc9ecc7b27f2528f
3
+ metadata.gz: 6fa39962791458ebf9b8cd56bc4de36445e2fc5bbcdef2f360e12963cf970fc0
4
+ data.tar.gz: d774066a9e4d7a2608371de89444a16e8a9b7cd52842fa7e38bb9406b5f1a9f4
5
5
  SHA512:
6
- metadata.gz: f9bef1be0f891861390692b4ba0ebb3c50f0ce9eeb07d3d686c21510f488a47eba422dbbcdafda0273be661ceb62c96a3c365641789392310b05fd04e971cb88
7
- data.tar.gz: eeec9a81680b40c8c7e9ced4813e772f473892df59c0820526b1fe16800d3926c6c715eca85546e4ad261021417b7edd3424de0c3c18b2b7e752f9d7a34b7650
6
+ metadata.gz: 5d9afb6cb164d7811dd2459313f703e0c84b639b5194f521ae7938d2a0474af011fcd7ae1cc5054b009d67717a7cec0da0da4053f591fc9599c43120246933ee
7
+ data.tar.gz: 7006934fa7a9652e3acc61a37bd80de279a2662d36aee1f0638a433e7a64a2fa3140e93850ed58b1a3a59f2d413589409cef2b4512d0ce18acf693b4f2735752
data/CHANGELOG.md CHANGED
@@ -12,8 +12,15 @@
12
12
  - Change the implementation message replier from `reply(conn, message_string)` to `conn.reply text: message_string`.
13
13
  - Add support for other message types such as audio, video, animation, markdown, and document
14
14
 
15
- ## [Unreleased]
15
+ ## [Released]
16
16
 
17
17
  ## [0.3.0] - 2022-07-02
18
18
 
19
- - Support for the handler to return response direcly by returning rack array or hash.
19
+ - Support for the handler to return response direcly by returning rack array or hash.
20
+
21
+
22
+ ## [Unreleased]
23
+
24
+ ## [0.3.1] - 2022-07-03
25
+
26
+ - Support for helpers with `helpers` macro
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- te_bot (0.3.0)
4
+ te_bot (0.4.0)
5
5
  faraday (~> 2.3)
6
6
  rack (~> 2.2)
7
7
 
@@ -14,10 +14,10 @@ GEM
14
14
  byebug (11.1.3)
15
15
  crack (0.4.5)
16
16
  rexml
17
- faraday (2.3.0)
18
- faraday-net_http (~> 2.0)
17
+ faraday (2.5.2)
18
+ faraday-net_http (>= 2.0, < 3.1)
19
19
  ruby2_keywords (>= 0.0.4)
20
- faraday-net_http (2.0.3)
20
+ faraday-net_http (3.0.0)
21
21
  hashdiff (1.0.1)
22
22
  minitest (5.16.1)
23
23
  parallel (1.22.1)
data/README.md CHANGED
@@ -10,7 +10,7 @@ This gem is used to handle telegram webhook and sending message with telegram bo
10
10
 
11
11
  Install the gem and add to the application's Gemfile
12
12
 
13
- gem 'te_bot', '~> 0.3.0'
13
+ gem 'te_bot'
14
14
 
15
15
  Then run
16
16
 
@@ -33,12 +33,12 @@ require "te_bot/sender_options"
33
33
  class MyWebhookApp < TeBot::Court
34
34
  access_token ENV["YOUR_BOT_ACCESS_TOKEN"]
35
35
 
36
- command("/start") do |conn|
37
- conn.reply text: "Welcome aboard my friend!"
36
+ command("/start") do
37
+ reply text: "Welcome aboard my friend!"
38
38
  end
39
39
 
40
- command("/today") do |conn|
41
- conn.reply text: Time.now.to_s
40
+ command("/today") do
41
+ reply text: Time.now.to_s
42
42
  end
43
43
  end
44
44
  ```
@@ -63,7 +63,7 @@ To run the app we can use rackup
63
63
  For more detailed information about rack please visit [Rack Repository](https://github.com/rack/rack).
64
64
 
65
65
  Now, our `MyWebhookApp` class is ready to handle some commands from telegram bot which are `/start` and `/today`.
66
- The command aslo support argument that will be passed to the `#command` block as `conn.params`. To pass arguments, we can simply type `/today city:Jakarta limit:10`. The argument will be parsed as a Hash with string key => `{"city" => "Jakarta", "limit" => "10"}`. While the parameter `conn` is the message object which contains the full message including the chat_id to repy to.
66
+ The command aslo support argument that will be passed in the instance method `params`. To pass arguments, we can simply type `/today city:Jakarta limit:10`. The argument will be parsed as a Hash with string key => `{"city" => "Jakarta", "limit" => "10"}`.
67
67
 
68
68
  To add a default handler for non existing command we can use the `#default_command` macro.
69
69
 
@@ -71,21 +71,23 @@ To add a default handler for non existing command we can use the `#default_comma
71
71
  # app.rb
72
72
 
73
73
  class MyWebhookApp < TeBot::Court
74
- default_command do |conn|
75
- conn.reply text: "Sorry, Comand not found. Try another command. or type /help"
74
+ default_command do
75
+ reply text: "Sorry, Comand not found. Try another command. or type /help"
76
76
  end
77
77
  end
78
78
  ```
79
79
 
80
- Other type of messages are also supported by using this macros `text` for regular text message, `query`, `document`, `audio`, and `voice`. For more detail please check this [Telegram Docs](https://core.telegram.org/bots/webhooks#testing-your-bot-with-updates). These macros is only expecting `conn` as an argument.
80
+ All the messages are passed in the instance method `message`
81
+
82
+ Other type of messages are also supported by using this macros `text` for regular text message, `query`, `document`, `audio`, and `voice`. For more detail please check this [Telegram Docs](https://core.telegram.org/bots/webhooks#testing-your-bot-with-updates).
81
83
 
82
84
  ```rb
83
85
  # app.rb
84
86
 
85
87
  class MyWebhookApp < TeBot::Court
86
- text do |conn|
87
- message = do_some_fancy_stuff_here(conn)
88
- conn.reply text: message
88
+ text do
89
+ reply_message = do_some_fancy_stuff_here(message)
90
+ reply text: reply_message
89
91
  end
90
92
  end
91
93
  ```
@@ -95,8 +97,8 @@ And also we can define a macro for default action `#default_action` if the reque
95
97
  # app.rb
96
98
 
97
99
  class MyWebhookApp < TeBot::Court
98
- default_action do |conn|
99
- conn.reply text: "No, I can't talk like people. use command instead"
100
+ default_action do
101
+ reply text: "No, I can't talk like people. use command instead"
100
102
  end
101
103
  end
102
104
  ```
@@ -132,17 +134,74 @@ sender.send_message(chat_id, animation: { animation: url, caption: caption})
132
134
 
133
135
  ```
134
136
 
135
- For markdown telegram supports MArkdownV2 [refer to this](https://core.telegram.org/bots/api#markdownv2-style)
137
+ For markdown telegram supports MarkdownV2 [refer to this](https://core.telegram.org/bots/api#markdownv2-style)
136
138
  Please check the [documentation](https://core.telegram.org/bots/api#sendmessage) for more details.
137
139
 
140
+ ### Custom Handler
141
+
138
142
  Of course you can add more handler by extending the `TeBot::Wire` class
139
143
 
140
144
  ```ruby
141
145
  # in/your/custom_handler.rb
142
146
 
143
147
  TeBot::Wire.class_eval do
144
- sender :json do |conn, chat_id, message|
145
- conn.make_request("sendMessage", body: { chat_id: chat_id, json: message }.to_json)
148
+ sender :json do |chat_id, message|
149
+ make_request("sendMessage", body: { chat_id: chat_id, json: message }.to_json)
150
+ end
151
+ end
152
+ ```
153
+
154
+ ### Helpers
155
+
156
+ Using module
157
+ ```ruby
158
+ # request_helpers.rb
159
+
160
+ module RequestHelpers
161
+ def get_nearest_hospitals
162
+ # do some fancy stuff
163
+ end
164
+
165
+ def get_the_nearest_routes(hospitals)
166
+ # do some even fancier stuff
167
+ end
168
+
169
+ def render_markdown(routes)
170
+ # do something else
171
+ end
172
+ end
173
+
174
+ class MyWebhookApp < TeBot::Court
175
+ include RequestHelpers
176
+
177
+ #... the rest of the code
178
+ end
179
+
180
+ ```
181
+
182
+ Using instance methods
183
+ ```ruby
184
+
185
+ # app.rb
186
+
187
+ class MyWebhookApp < TeBot::Court
188
+ command("/findhospital") do
189
+ hospitals = get_nearest_hospitals(params)
190
+ routes = get_the_nearest_routes(hospitals)
191
+
192
+ reply markdown: render_markdown(routes)
193
+ end
194
+
195
+ def get_nearest_hospitals(data)
196
+ # do some fancy stuff
197
+ end
198
+
199
+ def get_the_nearest_routes(hospitals)
200
+ # do some even fancier stuff
201
+ end
202
+
203
+ def render_markdown(routes)
204
+ # do something else
146
205
  end
147
206
  end
148
207
  ```
data/lib/te_bot/cable.rb CHANGED
@@ -1,22 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TeBot
4
- class Cable
5
- attr_reader :message, :params
6
- def initialize(wire, message, params = {})
7
- @wire = wire
8
- @message = message
9
- @params = params
10
- end
11
-
4
+ module Cable
12
5
  def chat_id
13
- @message.data&.chat_id
6
+ message.data&.chat_id
14
7
  end
15
8
 
16
9
  def reply(**payload)
17
10
  return if chat_id.nil?
18
11
 
19
- @wire.send_message chat_id, **payload
12
+ wire.send_message chat_id, **payload
20
13
  end
21
14
  end
22
15
  end
data/lib/te_bot/court.rb CHANGED
@@ -5,6 +5,8 @@ require "json"
5
5
 
6
6
  module TeBot
7
7
  class Court
8
+ include TeBot::Cable
9
+
8
10
  class << self
9
11
  attr_reader :wire, :commands
10
12
 
@@ -43,6 +45,15 @@ module TeBot
43
45
  end
44
46
  end
45
47
 
48
+ attr_reader :params, :message, :wire
49
+
50
+ def initialize
51
+ @params = {}
52
+ @message = nil
53
+ @command = nil
54
+ @wire = self.class.wire
55
+ end
56
+
46
57
  def call(env)
47
58
  json_only(env) do |body|
48
59
  response = handle_request(body)
@@ -76,33 +87,34 @@ module TeBot
76
87
  end
77
88
 
78
89
  def handle_request(body)
79
- message = ::TeBot::Message.new(body)
90
+ @message = ::TeBot::Message.new(body)
91
+
92
+ @command, @params = @message.data&.content&.parse
80
93
 
81
- command, params = message.data&.content&.parse
82
- conn = ::TeBot::Cable.new(self.class.wire, message, params || {})
94
+ @params = params
83
95
 
84
- message.command do
85
- handler = self.class.commands[command]
96
+ @message.command do
97
+ handler = self.class.commands[@command]
86
98
  if handler.respond_to?(:call)
87
- handler.call(conn)
99
+ instance_eval(&handler)
88
100
  elsif self.class.default_command.respond_to?(:call)
89
- self.class.default_command.call(conn)
101
+ instance_eval(&self.class.default_command)
90
102
  end
91
103
  end
92
104
 
93
105
  ::TeBot::Message::GENERAL_MESSAGE_TYPES.each do |message_type|
94
- message.public_send(message_type) do
106
+ @message.public_send(message_type) do
95
107
  handler = self.class.message_handlers(message_type)
96
108
 
97
109
  next unless handler.respond_to?(:call)
98
- handler.call(conn)
110
+ instance_eval(&handler)
99
111
  end
100
112
  end
101
113
 
102
- if message.handler.respond_to?(:call)
103
- message.call
114
+ if @message.handler.respond_to?(:call)
115
+ instance_eval(&@message.handler)
104
116
  elsif self.class.default_action.respond_to?(:call)
105
- self.class.default_action.call(conn)
117
+ instance_eval(&self.class.default_action)
106
118
  end
107
119
  end
108
120
  end
@@ -2,36 +2,36 @@ require_relative "./wire"
2
2
  require "json"
3
3
 
4
4
  TeBot::Wire.class_eval do
5
- sender :text do |conn, chat_id, message|
6
- conn.make_request("sendMessage", body: {chat_id: chat_id, text: message}.to_json)
5
+ sender :text do |chat_id, message|
6
+ make_request("sendMessage", body: {chat_id: chat_id, text: message}.to_json)
7
7
  end
8
8
 
9
9
  # this is using MarkdownV2 https://core.telegram.org/bots/api#markdownv2-style
10
- sender :markdown do |conn, chat_id, message|
11
- conn.make_request("sendMessage", body: {chat_id: chat_id, text: message, parse_mode: "MarkdownV2"}.to_json)
10
+ sender :markdown do |chat_id, message|
11
+ make_request("sendMessage", body: {chat_id: chat_id, text: message, parse_mode: "MarkdownV2"}.to_json)
12
12
  end
13
13
 
14
- sender :photo do |conn, chat_id, message|
15
- conn.make_request("sendPhoto", body: message.merge({chat_id: chat_id}).to_json)
14
+ sender :photo do |chat_id, message|
15
+ make_request("sendPhoto", body: message.merge({chat_id: chat_id}).to_json)
16
16
  end
17
17
 
18
- sender :audio do |conn, chat_id, message|
19
- conn.make_request("sendAudio", body: message.merge({chat_id: chat_id}).to_json)
18
+ sender :audio do |chat_id, message|
19
+ make_request("sendAudio", body: message.merge({chat_id: chat_id}).to_json)
20
20
  end
21
21
 
22
- sender :document do |conn, chat_id, message|
23
- conn.make_request("sendDocument", body: message.merge({chat_id: chat_id}).to_json)
22
+ sender :document do |chat_id, message|
23
+ make_request("sendDocument", body: message.merge({chat_id: chat_id}).to_json)
24
24
  end
25
25
 
26
- sender :video do |conn, chat_id, message|
27
- conn.make_request("sendVideo", body: message.merge({chat_id: chat_id}).to_json)
26
+ sender :video do |chat_id, message|
27
+ make_request("sendVideo", body: message.merge({chat_id: chat_id}).to_json)
28
28
  end
29
29
 
30
- sender :animation do |conn, chat_id, message|
31
- conn.make_request("sendAnimation", body: message.merge({chat_id: chat_id}).to_json)
30
+ sender :animation do |chat_id, message|
31
+ make_request("sendAnimation", body: message.merge({chat_id: chat_id}).to_json)
32
32
  end
33
33
 
34
- sender :voice do |conn, chat_id, message|
35
- conn.make_request("sendVoice", body: message.merge({chat_id: chat_id}).to_json)
34
+ sender :voice do |chat_id, message|
35
+ make_request("sendVoice", body: message.merge({chat_id: chat_id}).to_json)
36
36
  end
37
37
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TeBot
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/te_bot/wire.rb CHANGED
@@ -43,7 +43,7 @@ module TeBot
43
43
 
44
44
  raise ArgumentError, "Message type invalid. sender :#{message_format} not defined" if handler.nil?
45
45
 
46
- return handler.call(self, chat_id, message) if handler.respond_to?(:call)
46
+ return instance_exec(chat_id, message, &handler) if handler.respond_to?(:call)
47
47
 
48
48
  public_send(handler, chat_id, message)
49
49
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: te_bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nawa Aripurna
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-02 00:00:00.000000000 Z
11
+ date: 2022-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack