kybus-bot 0.4.4 → 0.5.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
  SHA256:
3
- metadata.gz: 770ceb23f2b040686b9337adb8a5687c2b28dba0c076eb46fdb821ba15bcb938
4
- data.tar.gz: 2e0a3b827a4390f00d03b6717994b9df5b2bbc284a76cf154e4bc189d8279f9e
3
+ metadata.gz: fcb4039ffd0fa38cadb57ba4a6a0813d5c105590677f1e6f6a7ef85fa6ee2365
4
+ data.tar.gz: abf1c8941afd74565c25e012b3eec8e94e17d1e0a42a83b2bc20be1eceac0192
5
5
  SHA512:
6
- metadata.gz: '08c94625e9e4b288bc3f07bd827fffba932af381af77b8a142825dd254229c6a66f0c31c00444b7056f782cff2e123263bb636708a099e8102754ad9fe431933'
7
- data.tar.gz: d1a311b425287b4de3e6ead3409b4bb1183dccc6614bb66758168f120144e91dc5bf523378862e098b924fa7bc0cffd344a32477fa0f0abe546835d83cf07b31
6
+ metadata.gz: f1e09cd5437c55dbfc6a38df6c3f8ff1383f6f2974538e3ec2ebd380ea38db0e12cd9ce8ba82b87de15bd1200fef0d610ab1e81ee34c644e5fd064f564a31bd7
7
+ data.tar.gz: 159c13cb384b3168647e572544cdb96098a4d11b8ae4ed7c1143ba562fd0c52eccdf9295729f97e1614ef44d020681bd9615dc064522664114a3c211d9319566
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'base'
4
+ require_relative '../message'
5
+
3
6
  module Kybus
4
7
  module Bot
5
8
  # :nodoc: #
@@ -8,9 +11,12 @@ module Kybus
8
11
  # Wraps a debugging message inside a class.
9
12
  class DebugMessage < Kybus::Bot::Message
10
13
  # It receives a string with the raw text and the id of the channel
11
- def initialize(text, channel)
14
+ attr_reader :attachment
15
+
16
+ def initialize(text, channel, attachment = nil)
12
17
  @text = text
13
18
  @channel = channel
19
+ @attachment = attachment
14
20
  end
15
21
 
16
22
  # Returns the channel id
@@ -22,6 +28,14 @@ module Kybus
22
28
  def raw_message
23
29
  @text
24
30
  end
31
+
32
+ def user
33
+ channel_id
34
+ end
35
+
36
+ def has_attachment?
37
+ !!attachment
38
+ end
25
39
  end
26
40
 
27
41
  # This class simulates a message chat with a user.
@@ -52,7 +66,7 @@ module Kybus
52
66
  DebugMessage.new(@pending_messages.shift, @name)
53
67
  end
54
68
 
55
- def send_data(message)
69
+ def send_data(message, attachment)
56
70
  return unless @echo
57
71
 
58
72
  puts "Sending message to channel: #{@name}"
@@ -62,8 +76,8 @@ module Kybus
62
76
  attr_writer :echo
63
77
 
64
78
  # receives the answer from the bot
65
- def answer(message)
66
- send_data(message)
79
+ def answer(message, attachment = nil)
80
+ send_data(message, attachment)
67
81
  @state = :open
68
82
  end
69
83
  end
@@ -112,8 +126,8 @@ module Kybus
112
126
  end
113
127
 
114
128
  # interface for sending messages
115
- def send_message(channel_name, contents)
116
- channel(channel_name).answer(contents)
129
+ def send_message(channel_name, contents, attachment = nil)
130
+ channel(channel_name).answer(contents, attachment)
117
131
  end
118
132
 
119
133
  # interface for sending video
@@ -36,11 +36,61 @@ module Kybus
36
36
  @message.chat.type == 'private'
37
37
  end
38
38
 
39
+ def has_attachment?
40
+ !!@message.document
41
+ end
42
+
43
+ def attachment
44
+ @message.document
45
+ end
46
+
39
47
  def user
40
48
  @message.from.id
41
49
  end
42
50
  end
43
51
 
52
+ class TelegramFile
53
+ extend Kybus::DRY::ResourceInjector
54
+ attr_reader :id
55
+ def initialize(message)
56
+ if message.is_a?(String)
57
+ @id = message
58
+ elsif message.is_a?(Hash)
59
+ @id = message['id'] || message[:id]
60
+ elsif message.is_a?(TelegramFile)
61
+ @id = message.id
62
+ else
63
+ @id = message.file_id
64
+ end
65
+ end
66
+
67
+ def to_h
68
+ {
69
+ provide: 'telegram',
70
+ id: @id
71
+ }
72
+ end
73
+
74
+ def cli
75
+ @cli ||= TelegramFile.resource(:cli)
76
+ end
77
+
78
+ def meta
79
+ @meta ||= cli.api.get_file(file_id: @id)
80
+ end
81
+
82
+ def original_name
83
+ meta.dig('result', 'file_name')
84
+ end
85
+
86
+ def download
87
+ token = cli.api.token
88
+ file_path = meta.dig('result', 'file_path')
89
+ path = "https://api.telegram.org/file/bot#{token}/#{file_path}"
90
+ Faraday.get(path).body
91
+ end
92
+ end
93
+
44
94
  ##
45
95
  # This adapter is intended to be used on unit tests and development.
46
96
  class Telegram
@@ -53,6 +103,7 @@ module Kybus
53
103
  def initialize(configs)
54
104
  @config = configs
55
105
  @client = ::Telegram::Bot::Client.new(@config['token'])
106
+ TelegramFile.register(:cli, @client)
56
107
  end
57
108
 
58
109
  # Interface for receiving message
@@ -99,6 +150,16 @@ module Kybus
99
150
  file = Faraday::UploadIO.new(image_url, 'image/jpeg')
100
151
  @client.api.send_photo(chat_id: channel_name, photo: file)
101
152
  end
153
+
154
+ # interface for sending document
155
+ def send_document(channel_name, image_url)
156
+ file = Faraday::UploadIO.new(image_url, 'application/octect-stream')
157
+ @client.api.send_document(chat_id: channel_name, document: file)
158
+ end
159
+
160
+ def file_builder(file)
161
+ TelegramFile.new(file)
162
+ end
102
163
  end
103
164
 
104
165
  register('telegram', Telegram)
@@ -41,6 +41,10 @@ module Kybus
41
41
  provider.send_audio(channel || current_channel, content)
42
42
  end
43
43
 
44
+ def send_document(content, channel = nil)
45
+ provider.send_document(channel || current_channel, content)
46
+ end
47
+
44
48
  # Configurations needed:
45
49
  # - pool_size: number of threads created in execution
46
50
  # - provider: a configuration for a thread provider.
@@ -100,6 +104,7 @@ module Kybus
100
104
  self.command = message.raw_message
101
105
  else
102
106
  add_param(message.raw_message)
107
+ add_file(message.attachment) if message.has_attachment?
103
108
  end
104
109
  if command_ready?
105
110
  run_command!
@@ -145,6 +150,25 @@ module Kybus
145
150
  current_params
146
151
  end
147
152
 
153
+ def add_file(file)
154
+ return if @state[:requested_param].nil?
155
+
156
+ log_debug('Received new file',
157
+ param: @state[:requested_param].to_sym,
158
+ file: file.to_h)
159
+
160
+ files[@state[:requested_param].to_sym] = provider.file_builder(file)
161
+ @state[:params][("_#{@state[:requested_param]}_filename").to_sym] = file.file_name
162
+ end
163
+
164
+ def files
165
+ @state[:files] ||= {}
166
+ end
167
+
168
+ def file(name)
169
+ (file = files[name]) && provider.file_builder(file)
170
+ end
171
+
148
172
  def mention(name)
149
173
  provider.mention(name)
150
174
  end
@@ -177,7 +201,8 @@ module Kybus
177
201
  log_debug('Message set as command', command: cmd)
178
202
 
179
203
  @state[:cmd] = cmd.split(' ').first
180
- @state[:params] = {}
204
+ @state[:params] = { }
205
+ @state[:files] = { }
181
206
  end
182
207
 
183
208
  # validates which is the following parameter required
@@ -212,18 +237,27 @@ module Kybus
212
237
  # Private implementation for load message
213
238
  def load_state(channel)
214
239
  data = @factory.get(channel)
215
- data[:params] = JSON.parse(data[:params], symbolize_names: true)
240
+ data[:params] = JSON.parse(data[:params] || '{}', symbolize_names: true)
241
+ data[:files] = JSON.parse(data[:files] || '{}', symbolize_names: true)
216
242
  data
217
243
  rescue Kybus::Storage::Exceptions::ObjectNotFound
218
244
  @factory.create(channel_id: channel, params: {}.to_json)
219
245
  end
220
246
 
247
+ def parse_state!
248
+ end
249
+
221
250
  # Saves the state into storage
222
251
  def save_state!
223
- json = @state[:params]
224
- @state[:params] = json.to_json
252
+ backup = @state.clone
253
+ %i[params files].each do |param|
254
+ @state[param] = @state[param].to_json
255
+ end
256
+
225
257
  @state.store
226
- @state[:params] = json
258
+ %i[params files].each do |param|
259
+ @state[param] = backup[param]
260
+ end
227
261
  end
228
262
 
229
263
  def session
@@ -11,6 +11,7 @@ module Kybus
11
11
  String :channel_id
12
12
  String :user
13
13
  String :params, text: true
14
+ String :files, text: true
14
15
  String :cmd
15
16
  String :requested_param
16
17
  end
@@ -0,0 +1,32 @@
1
+ require_relative 'base'
2
+ require_relative 'adapters/debug'
3
+
4
+ module Kybus
5
+ module Bot
6
+ class Base
7
+ CONFIG = {
8
+ 'name' => 'test',
9
+ 'state_repository' => {
10
+ 'name' => 'json',
11
+ 'storage' => 'storage'
12
+ },
13
+ 'pool_size' => 1,
14
+ 'provider' => {
15
+ 'name' => 'debug',
16
+ 'echo' => true,
17
+ 'channels' => { 'testing' => [] }
18
+ }
19
+ }.freeze
20
+
21
+ def self.make_test_bot
22
+ new(CONFIG)
23
+ end
24
+
25
+ def receives(msg, attachments = nil)
26
+ msg = ::Kybus::Bot::Adapter::DebugMessage.new(msg, 'testing', attachments)
27
+ @last_message = msg
28
+ process_message(msg)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Kybus
4
4
  module Bot
5
- VERSION = '0.4.4'
5
+ VERSION = '0.5.1'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kybus-bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gilberto Vargas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-24 00:00:00.000000000 Z
11
+ date: 2022-02-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kybus-core
@@ -222,6 +222,7 @@ files:
222
222
  - lib/kybus/bot/command_definition.rb
223
223
  - lib/kybus/bot/message.rb
224
224
  - lib/kybus/bot/migrator.rb
225
+ - lib/kybus/bot/test.rb
225
226
  - lib/kybus/bot/testing.rb
226
227
  - lib/kybus/bot/version.rb
227
228
  homepage: https://github.com/tachomex/kybus