pechkin 0.1.3 → 0.2.0

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: 3e695894f50c29133f8399871c1dc8f1c8bdb9a489771ffe79c8bff0e8dc2afa
4
- data.tar.gz: bf863d530c1169f1416e8d267fc7a81543e5b4d70d254c3fe969c366f914f601
3
+ metadata.gz: b4d225464fc987cff4a7df181e175e4756c60ccc9982582d7906b4f85b194f3d
4
+ data.tar.gz: 5ca5b0e4c4aacf29e38a51a12217494539f5ef4a31f1eedaf799fc0170f9eb40
5
5
  SHA512:
6
- metadata.gz: bf403faa6d076ff2773e4dbfcedd80e364a396c873d5b23f2835883267e582e0d57306f93aee5556c1c7134f863101f61552b90efab632e5d75ea637aa630385
7
- data.tar.gz: 1960f894872b5112156aa893b9a38869f7ccc455ebe9104cf1f3bfe371c97035e54667dde86c7cb4d238802248d763f5550f0cd6a1ae6b510076748100493848
6
+ metadata.gz: f23b61d62cc9fbf3df9d4e578080147f9de3717f8e924d71329778674dcfa21a0bccd46b45e32d33c9ac30eb515d82b9cceeca2af34da1dea210414f20e6d8b3
7
+ data.tar.gz: ddc485f1678e2a4d4b6ab61f655dbaf69e7fbeb5e1dcc1ae338f2b039f6f77c4cdad6d7d1bfb828c7087c128d09a47e93cb40eb17b7c9a2aba455bef1ff5cdde
@@ -7,6 +7,7 @@ require_relative 'pechkin/connector'
7
7
  require_relative 'pechkin/channel'
8
8
  require_relative 'pechkin/api'
9
9
  require_relative 'pechkin/config'
10
+ require_relative 'pechkin/substitute'
10
11
 
11
12
  module Pechkin # :nodoc:
12
13
  class << self
@@ -16,6 +16,9 @@ module Pechkin # :nodoc:
16
16
  def create_chanels(chanels, bots)
17
17
  chanels.each do |chanel_name, chanel_desc|
18
18
  bot = bots[chanel_desc['bot']]
19
+
20
+ raise "'#{chanel_desc['bot']}' not found." unless bot
21
+
19
22
  connector = create_connector(bot, chanel_name)
20
23
 
21
24
  chat_ids = chanel_desc['chat_ids']
@@ -57,7 +60,6 @@ module Pechkin # :nodoc:
57
60
  end
58
61
  post message_name do
59
62
  template = message_desc['template']
60
- opts = message_desc['options'] || {}
61
63
  # Some services will send json, but without correct content-type, then
62
64
  # params will be parsed weirdely. So we try parse request body as json
63
65
  params = ensure_json(request.body.read, params)
@@ -67,7 +69,7 @@ module Pechkin # :nodoc:
67
69
  # received parameters.
68
70
  params = (message_desc['variables'] || {}).merge(params)
69
71
 
70
- channel.send_message(template, params, opts)
72
+ channel.send_message(template, params, message_desc)
71
73
  end
72
74
  # rubocop:enable Metrics/AbcSize
73
75
  end
@@ -10,15 +10,40 @@ module Pechkin
10
10
  @logger = ::Logger.new(STDOUT)
11
11
  end
12
12
 
13
- def send_message(message, data, options)
14
- text = Message.new(data).render(message)
13
+ def send_message(message, data, message_desc)
14
+ text = message.nil? ? '' : Message.new(data).render(message)
15
+
16
+ message_desc = substitute(data, message_desc)
17
+
15
18
  logger.warn 'Resulting text is empty' if text.empty?
16
- results = @channel_list.map { |id| @connector.send_message(id, text, options) }
19
+ results = @channel_list.map do |id|
20
+ @connector.send_message(id, text, message_desc)
21
+ end
22
+
17
23
  process_results(message, results)
18
24
  end
19
25
 
20
26
  private
21
27
 
28
+ def substitute(data, message_desc)
29
+ substitute_recursive(Substitute.new(data), message_desc)
30
+ end
31
+
32
+ def substitute_recursive(substitutions, object)
33
+ case object
34
+ when String
35
+ substitutions.process(object)
36
+ when Array
37
+ object.map { |o| substitute_recursive(substitutions, o) }
38
+ when Hash
39
+ r = {}
40
+ object.each { |k, v| r[k] = substitute_recursive(substitutions, v) }
41
+ r
42
+ else
43
+ object
44
+ end
45
+ end
46
+
22
47
  def process_results(message, results)
23
48
  success, error = results.partition { |_chat, code, _body| code < 400 }
24
49
  error.each do |chat, code, body|
@@ -7,9 +7,10 @@ require 'cgi'
7
7
  module Pechkin
8
8
  # Base connector
9
9
  class Connector
10
- def send_message(chat, message, options); end
10
+ def send_message(chat, message, message_desc); end
11
11
 
12
12
  def post_data(url, data, headers: {})
13
+ puts data.inspect
13
14
  uri = URI.parse(url)
14
15
  headers = { 'Content-Type' => 'application/json' }.merge(headers)
15
16
  http = Net::HTTP.new(uri.host, uri.port)
@@ -27,8 +28,8 @@ module Pechkin
27
28
  @bot_token = bot_token
28
29
  end
29
30
 
30
- def send_message(chat_id, message, options = {})
31
- options = { markup: 'HTML' }.update(options)
31
+ def send_message(chat_id, message, message_desc)
32
+ options = { parse_mode: message_desc['telegram_parse_mode'] || 'HTML' }
32
33
  params = options.update(chat_id: chat_id, text: message)
33
34
 
34
35
  response = post_data(method_url('sendMessage'), params)
@@ -47,12 +48,17 @@ module Pechkin
47
48
  @headers = { 'Authorization' => "Bearer #{bot_token}" }
48
49
  end
49
50
 
50
- def send_message(chat, message, options)
51
+ def send_message(chat, message, message_desc)
51
52
  text = CGI.unescape_html(message)
52
53
 
53
- return [chat, 'not sent: empty', ''] if text.strip.empty?
54
+ attachments = message_desc['slack_attachments'] || {}
55
+
56
+ if text.strip.empty? && attachments.empty?
57
+ return [chat, 400, 'not sent: empty']
58
+ end
59
+
60
+ params = { channel: chat, text: text, attachments: attachments }
54
61
 
55
- params = options.update(channel: chat, text: text)
56
62
  url = 'https://slack.com/api/chat.postMessage'
57
63
  response = post_data(url, params, headers: @headers)
58
64
 
@@ -0,0 +1,24 @@
1
+ module Pechkin # :nodoc:
2
+ # Replaces ${:varname:} patterns inside strings. All posible substitutions are
3
+ # provided through constructor.
4
+ #
5
+ # Complex templating and text fromatting (like float numbers formatting) is
6
+ # not a goal. We do not aim to implement new templating engine here. Just
7
+ # simple stuff.
8
+ class Substitute
9
+ # @param substitutions [Hash] hash of possible substitutions for replacement
10
+ def initialize(substitutions)
11
+ @substitutions = substitutions
12
+ end
13
+
14
+ def process(string)
15
+ string.gsub(/\$\{([A-Za-z0-9_]+)\}/) do |m|
16
+ key = m[2..-2]
17
+
18
+ value = @substitutions[key] || @substitutions[key.to_sym]
19
+
20
+ (value || m).to_s
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,7 +1,7 @@
1
1
  module Pechkin
2
2
  # Keeps actual version
3
3
  module Version
4
- VERSION = [0, 1, 3].freeze
4
+ VERSION = [0, 2, 0].freeze
5
5
  class << self
6
6
  def version_string
7
7
  VERSION.join('.')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pechkin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Arkhanhelsky
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-16 00:00:00.000000000 Z
11
+ date: 2019-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape
@@ -53,6 +53,7 @@ files:
53
53
  - lib/pechkin/config.rb
54
54
  - lib/pechkin/connector.rb
55
55
  - lib/pechkin/message.rb
56
+ - lib/pechkin/substitute.rb
56
57
  - lib/pechkin/version.rb
57
58
  homepage: https://github.com/iarkhanhelsky/pechkin
58
59
  licenses: