kybus-bot 0.5.1 → 0.8.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: fcb4039ffd0fa38cadb57ba4a6a0813d5c105590677f1e6f6a7ef85fa6ee2365
4
- data.tar.gz: abf1c8941afd74565c25e012b3eec8e94e17d1e0a42a83b2bc20be1eceac0192
3
+ metadata.gz: 7751ec07a20b41b400f7d49dbc5dcb8b4951a3dd07a4ea32f0cccefb9985336e
4
+ data.tar.gz: 1806738e2740b0d626b19a11ae843503fb5171516ef80a64d644ab70c3520dc1
5
5
  SHA512:
6
- metadata.gz: f1e09cd5437c55dbfc6a38df6c3f8ff1383f6f2974538e3ec2ebd380ea38db0e12cd9ce8ba82b87de15bd1200fef0d610ab1e81ee34c644e5fd064f564a31bd7
7
- data.tar.gz: 159c13cb384b3168647e572544cdb96098a4d11b8ae4ed7c1143ba562fd0c52eccdf9295729f97e1614ef44d020681bd9615dc064522664114a3c211d9319566
6
+ metadata.gz: deabacf971edc2c6b8dbe52736ba5c1bcb6a95aa1bc4253bef5b13de7d37b10068111c618aa5f05f171c0bfb721a546e4a4a3f66781a6773a4c318c644338a3a
7
+ data.tar.gz: e8b73239aa929d94a85cc831eb8515411a76e6f19fbb1a5d6d3fff7b2157130f328de70e1b0f27e08c8f5af1a5696c6d9da52c56ef6e371edf252bfea18cf4ee
@@ -11,12 +11,38 @@ module Kybus
11
11
  # Wraps a debugging message inside a class.
12
12
  class DebugMessage < Kybus::Bot::Message
13
13
  # It receives a string with the raw text and the id of the channel
14
- attr_reader :attachment
14
+ attr_reader :attachment, :message_id
15
+
16
+ class DebugFile
17
+ def initialize(path)
18
+ @path = path
19
+ end
20
+
21
+ def to_json(obj)
22
+ to_h.to_json(obj)
23
+ end
24
+
25
+ def file_name
26
+ @path
27
+ end
28
+
29
+ def download
30
+ File.read(@path)
31
+ end
32
+
33
+ def to_h
34
+ { path: @path }
35
+ end
36
+ end
15
37
 
16
38
  def initialize(text, channel, attachment = nil)
39
+ super()
17
40
  @text = text
18
41
  @channel = channel
19
42
  @attachment = attachment
43
+ @@message_id ||= 0
44
+ @@message_id += 1
45
+ @message_id = @@message_id + 1
20
46
  end
21
47
 
22
48
  # Returns the channel id
@@ -36,6 +62,14 @@ module Kybus
36
62
  def has_attachment?
37
63
  !!attachment
38
64
  end
65
+
66
+ def reply?
67
+ @reply
68
+ end
69
+
70
+ def is_private?
71
+ true
72
+ end
39
73
  end
40
74
 
41
75
  # This class simulates a message chat with a user.
@@ -66,7 +100,7 @@ module Kybus
66
100
  DebugMessage.new(@pending_messages.shift, @name)
67
101
  end
68
102
 
69
- def send_data(message, attachment)
103
+ def send_data(message, _attachment)
70
104
  return unless @echo
71
105
 
72
106
  puts "Sending message to channel: #{@name}"
@@ -79,6 +113,7 @@ module Kybus
79
113
  def answer(message, attachment = nil)
80
114
  send_data(message, attachment)
81
115
  @state = :open
116
+ DebugMessage.new(message, @name)
82
117
  end
83
118
  end
84
119
 
@@ -92,6 +127,8 @@ module Kybus
92
127
  end
93
128
  end
94
129
 
130
+ attr_accessor :last_message
131
+
95
132
  # It receives a hash with the configurations:
96
133
  # - name: the name of the channel
97
134
  # - channels a key value, where the key is a name and the value the
@@ -111,12 +148,8 @@ module Kybus
111
148
  loop do
112
149
  raise NoMoreMessageException if @channels.values.all?(&:empty?)
113
150
 
114
- msg = @channels.values.find(&:open?)
115
- return msg.read_message if msg
116
-
117
- # :nocov: #
118
- sleep(1)
119
- # :nocov: #
151
+ open_channel = @channels.values.find(&:open?)
152
+ return @last_message = open_channel.read_message if open_channel
120
153
  end
121
154
  end
122
155
 
@@ -131,7 +164,7 @@ module Kybus
131
164
  end
132
165
 
133
166
  # interface for sending video
134
- def send_video(channel_name, video_url)
167
+ def send_video(channel_name, video_url, _caption = nil)
135
168
  channel(channel_name).answer("VIDEO: #{video_url}")
136
169
  end
137
170
 
@@ -141,10 +174,35 @@ module Kybus
141
174
  end
142
175
 
143
176
  # interface for sending image
144
- def send_image(channel_name, image_url)
177
+ def send_image(channel_name, image_url, _caption = nil)
145
178
  channel(channel_name).answer("IMG: #{image_url}")
146
179
  end
147
180
 
181
+ # interface for sending image
182
+ def send_document(channel_name, doc_url)
183
+ channel(channel_name).answer("DOC: #{doc_url}")
184
+ end
185
+
186
+ def file_builder(data)
187
+ case data
188
+ when DebugMessage::DebugFile
189
+ data
190
+ when Hash
191
+ DebugMessage::DebugFile.new(data[:path])
192
+ end
193
+ end
194
+
195
+ include Kybus::Logger
196
+
197
+ def message_builder(msg)
198
+ log_info('Building message object', msg:, msg_class: msg.class.name)
199
+ msg
200
+ end
201
+
202
+ def mention(user)
203
+ "@#{user}"
204
+ end
205
+
148
206
  # changes echo config
149
207
  def echo=(toogle)
150
208
  @channels.each { |_, channel| channel.echo = toogle }
@@ -11,6 +11,7 @@ module Kybus
11
11
  class DiscordMessage < Kybus::Bot::Message
12
12
  # It receives a string with the raw text and the id of the channel
13
13
  def initialize(msg)
14
+ super
14
15
  @message = msg
15
16
  end
16
17
 
@@ -45,6 +46,9 @@ module Kybus
45
46
  # This adapter is intended to be used on unit tests and development.
46
47
  class Discord
47
48
  include ::Kybus::Logger
49
+
50
+ attr_reader :last_message, :client
51
+
48
52
  # It receives a hash with the configurations:
49
53
  # - name: the name of the channel
50
54
  # - channels a key value, where the key is a name and the value the
@@ -60,8 +64,6 @@ module Kybus
60
64
  @client.run(:async)
61
65
  end
62
66
 
63
- attr_reader :client
64
-
65
67
  def mention(id)
66
68
  "<@!#{id}>"
67
69
  end
@@ -70,17 +72,15 @@ module Kybus
70
72
  def read_message
71
73
  # take the first message from the first open message,
72
74
  loop do
73
- if @pool.empty?
74
- sleep(0.1)
75
- else
76
- break
77
- end
75
+ break unless @pool.empty?
76
+
77
+ sleep(0.1)
78
78
  end
79
- DiscordMessage.new(@pool.shift)
79
+ @last_message = DiscordMessage.new(@pool.shift)
80
80
  end
81
81
 
82
82
  # interface for sending messages
83
- def send_message(channel_name, contents)
83
+ def send_message(channel_name, contents, _caption = nil)
84
84
  puts "#{channel_name} => #{contents}" if @config['debug']
85
85
  channel = @client.channel(channel_name)
86
86
  if channel
@@ -1,100 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'telegram/bot'
4
+ require 'faraday'
5
+ require_relative 'telegram_file'
6
+ require_relative 'telegram_message'
4
7
 
5
8
  module Kybus
6
9
  module Bot
7
- # :nodoc: #
8
10
  module Adapter
9
- # :nodoc: #
10
- # Wraps a debugging message inside a class.
11
- class TelegramMessage < Kybus::Bot::Message
12
- # It receives a string with the raw text and the id of the channel
13
- def initialize(message)
14
- @message = message
15
- end
16
-
17
- def reply?
18
- !!@message.reply_to_message
19
- end
20
-
21
- def replied_message
22
- TelegramMessage.new(@message.reply_to_message)
23
- end
24
-
25
- # Returns the channel id
26
- def channel_id
27
- @message.chat.id
28
- end
29
-
30
- # Returns the message contents
31
- def raw_message
32
- @message.to_s
33
- end
34
-
35
- def is_private?
36
- @message.chat.type == 'private'
37
- end
38
-
39
- def has_attachment?
40
- !!@message.document
41
- end
42
-
43
- def attachment
44
- @message.document
45
- end
46
-
47
- def user
48
- @message.from.id
49
- end
50
- end
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
-
94
11
  ##
95
12
  # This adapter is intended to be used on unit tests and development.
96
13
  class Telegram
97
14
  include ::Kybus::Logger
15
+
16
+ attr_reader :last_message
17
+
98
18
  # It receives a hash with the configurations:
99
19
  # - name: the name of the channel
100
20
  # - channels a key value, where the key is a name and the value the
@@ -113,10 +33,12 @@ module Kybus
113
33
  @client.listen do |message|
114
34
  log_info('Received message', message: message.to_h,
115
35
  from: message.from.to_h)
116
- return TelegramMessage.new(message)
36
+ return @last_message = TelegramMessage.new(message)
117
37
  end
118
38
  rescue ::Telegram::Bot::Exceptions::ResponseError => e
39
+ # :nocov:
119
40
  log_error('An error ocurred while calling to Telegram API', e)
41
+ # :nocov:
120
42
  end
121
43
  end
122
44
 
@@ -124,39 +46,44 @@ module Kybus
124
46
  "[user](tg://user?id=#{id})"
125
47
  end
126
48
 
127
-
128
49
  # interface for sending messages
129
50
  def send_message(channel_name, contents)
130
51
  puts "#{channel_name} => #{contents}" if @config['debug']
131
52
  @client.api.send_message(chat_id: channel_name, text: contents)
132
- rescue ::Telegram::Bot::Exceptions::ResponseError => err
133
- return if err[:error_code] == '403'
53
+ # :nocov:
54
+ rescue ::Telegram::Bot::Exceptions::ResponseError => e
55
+ return if e[:error_code] == '403'
134
56
  end
57
+ # :nocov:
135
58
 
136
59
  # interface for sending video
137
- def send_video(channel_name, video_url)
138
- file = Faraday::UploadIO.new(video_url, 'video/mp4')
139
- @client.api.send_video(chat_id: channel_name, audio: file)
60
+ def send_video(channel_name, video_url, comment = nil)
61
+ file = Faraday::FilePart.new(video_url, 'video/mp4')
62
+ @client.api.send_video(chat_id: channel_name, video: file, caption: comment)
140
63
  end
141
64
 
142
65
  # interface for sending uadio
143
66
  def send_audio(channel_name, audio_url)
144
- file = Faraday::UploadIO.new(audio_url, 'audio/mp3')
67
+ file = Faraday::FilePart.new(audio_url, 'audio/mp3')
145
68
  @client.api.send_audio(chat_id: channel_name, audio: file)
146
69
  end
147
70
 
148
71
  # interface for sending image
149
- def send_image(channel_name, image_url)
150
- file = Faraday::UploadIO.new(image_url, 'image/jpeg')
151
- @client.api.send_photo(chat_id: channel_name, photo: file)
72
+ def send_image(channel_name, image_url, comment = nil)
73
+ file = Faraday::FilePart.new(image_url, 'image/jpeg')
74
+ @client.api.send_photo(chat_id: channel_name, photo: file, caption: comment)
152
75
  end
153
76
 
154
77
  # interface for sending document
155
78
  def send_document(channel_name, image_url)
156
- file = Faraday::UploadIO.new(image_url, 'application/octect-stream')
79
+ file = Faraday::FilePart.new(image_url, 'application/octect-stream')
157
80
  @client.api.send_document(chat_id: channel_name, document: file)
158
81
  end
159
82
 
83
+ def message_builder(raw_message)
84
+ TelegramMessage.new(raw_message)
85
+ end
86
+
160
87
  def file_builder(file)
161
88
  TelegramFile.new(file)
162
89
  end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'telegram/bot'
4
+ require 'faraday'
5
+
6
+ module Kybus
7
+ module Bot
8
+ # :nodoc: #
9
+ module Adapter
10
+ class TelegramFile
11
+ extend Kybus::DRY::ResourceInjector
12
+ attr_reader :id
13
+
14
+ def initialize(message)
15
+ @id = case message
16
+ when String
17
+ message
18
+ when Hash
19
+ message['id'] || message[:id]
20
+ when TelegramFile
21
+ message.id
22
+ else
23
+ message.file_id
24
+ end
25
+ end
26
+
27
+ def to_h
28
+ {
29
+ provide: 'telegram',
30
+ id: @id
31
+ }
32
+ end
33
+
34
+ def cli
35
+ @cli ||= TelegramFile.resource(:cli)
36
+ end
37
+
38
+ def meta
39
+ @meta ||= cli.api.get_file(file_id: @id)
40
+ end
41
+
42
+ def original_name
43
+ meta.dig('result', 'file_name')
44
+ end
45
+
46
+ def file_name
47
+ original_name
48
+ end
49
+
50
+ def download
51
+ token = cli.api.token
52
+ file_path = meta.dig('result', 'file_path')
53
+ path = "https://api.telegram.org/file/bot#{token}/#{file_path}"
54
+ Faraday.get(path).body
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'telegram/bot'
4
+ require 'faraday'
5
+
6
+ module Kybus
7
+ module Bot
8
+ # :nodoc: #
9
+ module Adapter
10
+ # :nodoc: #
11
+ # Wraps a debugging message inside a class.
12
+ class TelegramMessage < Kybus::Bot::Message
13
+ # It receives a string with the raw text and the id of the channel
14
+ def initialize(message)
15
+ super()
16
+ @message = message
17
+ end
18
+
19
+ def reply?
20
+ @message.respond_to?(:reply_to_message) && @message.reply_to_message
21
+ end
22
+
23
+ def replied_message
24
+ TelegramMessage.new(@message.reply_to_message)
25
+ end
26
+
27
+ # Returns the channel id
28
+ def channel_id
29
+ @message.chat.id
30
+ end
31
+
32
+ def message_id
33
+ @message.respond_to?(:message_id) ? @message.message_id : @message['result']['message_id']
34
+ end
35
+
36
+ # Returns the message contents
37
+ def raw_message
38
+ @message.to_s
39
+ end
40
+
41
+ def is_private?
42
+ @message.chat.type == 'private'
43
+ end
44
+
45
+ def has_attachment?
46
+ !!attachment
47
+ end
48
+
49
+ def attachment
50
+ (@message.respond_to?(:document) && @message&.document) ||
51
+ (@message.respond_to?(:photo) && @message.photo&.last) ||
52
+ (@message.respond_to?(:audio) && @message&.audio)
53
+ end
54
+
55
+ def user
56
+ @message.from.id
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end