pechkin 0.0.3 → 0.0.4

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: 2fd4c9f29fc1cdab78ad9ed5d17bc91d639aaf3a07f1c8f1b2a5bd05ab5caed9
4
- data.tar.gz: 14355bfc12a1115b9fb7d233f91c974fd6d0ac698a344668dc24a9e6d7b83306
3
+ metadata.gz: 27d78c857bcd762e9b36cbaa234120e6caa91b67604344f1602e0e64bcffe7c0
4
+ data.tar.gz: 1bfcf6b1b346efd49f02f47995f561825b8bdffdf8dd193a586c37d30855d9ad
5
5
  SHA512:
6
- metadata.gz: ca47776e42575d2c4bd78a106f5e83de71f70f373de6585937b9d02329e95fb9795e8375a8582b5795ee74a328363fc0abcf44205ada5a8b85bd02ca17866d45
7
- data.tar.gz: 81af7a2be13345042b6e3a8846f170317b3b373f59bb49450ebaa648f2e3afe26382c913d4ae29f31c5529582344f302b28129478901e6437d587e5d6eee09d3
6
+ metadata.gz: cea8fa824f2bbcf23f75612d528fbab474c9ac1ad9e0c860301100e5e44d030e137f2d2456438ac7a42c220c03d06406462c2bf0f886575bf72ec970898cffd2
7
+ data.tar.gz: 5bd402593bca10b7a3b92d88e217a06847539f1b90e2225f2c4643b1c6f18db86c3826ae50f7dcc2eb447a01d6969d68d7ad1e73608b5f3cc64aab43df9d36c4
@@ -1,4 +1,5 @@
1
1
  require 'rack'
2
+ require 'logger'
2
3
 
3
4
  require_relative 'pechkin/cli'
4
5
  require_relative 'pechkin/api'
@@ -9,7 +10,12 @@ module Pechkin # :nodoc:
9
10
  def run
10
11
  options = CLI.parse(ARGV)
11
12
  configuration = Config.new(options.config_file)
12
- Rack::Server.start(app: Pechkin.create(configuration),
13
+ log_dir = options.log_dir
14
+ app = Pechkin.create(configuration)
15
+ if log_dir
16
+ app.logger = ::Logger.new(File.join(log_dir, 'pechkin.log'), 'daily')
17
+ end
18
+ Rack::Server.start(app: app,
13
19
  Port: options.port || configuration.port,
14
20
  pid: options.pid_file)
15
21
  end
@@ -18,6 +18,7 @@ module Pechkin # :nodoc:
18
18
  bot_token = bots[chanel_desc['bot']]
19
19
  chat_ids = chanel_desc['chat_ids']
20
20
  bot = Telegram::Chanel.new(bot_token, chat_ids)
21
+ bot.logger = logger
21
22
  resource chanel_name do
22
23
  create_chanel(bot, chanel_desc)
23
24
  end
@@ -26,18 +27,36 @@ module Pechkin # :nodoc:
26
27
 
27
28
  def create_chanel(bot, chanel_desc)
28
29
  chanel_desc['messages'].each do |message_name, message_desc|
29
- post message_name do
30
- template = message_desc['template']
31
- opts = { markup: 'HTML' }.update(message_desc['options'] || {})
32
- # Some services will send json, but without correct content-type, then
33
- # params will be parsed weirdely. So we try parse request body as json
34
- params = ensure_json(request.body.read, params)
35
- # If message description contains any variables will merge them with
36
- # received parameters.
37
- params = message_desc['variables'].merge(params) if message_desc.key?('variables')
38
- bot.send_message(template, params, opts)
30
+ generate_endpoint(bot, message_name, message_desc)
31
+ end
32
+ end
33
+
34
+ # rubocop:disable Metrics/AbcSize
35
+ def generate_endpoint(bot, message_name, message_desc)
36
+ params do
37
+ # TODO: Can't extract this code to method because this block is
38
+ # evaluated in separate scope
39
+ (message_desc['filters'] || []).each do |field, filter|
40
+ filter.match(%r{^/(.*)/$}) do |m|
41
+ requires field.to_sym, type: String, regexp: Regexp.new(m[1])
42
+ end
39
43
  end
40
44
  end
45
+ post message_name do
46
+ template = message_desc['template']
47
+ opts = { markup: 'HTML' }.update(message_desc['options'] || {})
48
+ # Some services will send json, but without correct content-type, then
49
+ # params will be parsed weirdely. So we try parse request body as json
50
+ params = ensure_json(request.body.read, params)
51
+ logger.info "Received message #{params.to_json}"
52
+ logger.info "Will render template file #{template}"
53
+ # If message description contains any variables will merge them with
54
+ # received parameters.
55
+ params = (message_desc['variables'] || {}).merge(params)
56
+
57
+ bot.send_message(template, params, opts)
58
+ end
59
+ # rubocop:enable Metrics/AbcSize
41
60
  end
42
61
  end
43
62
 
@@ -52,16 +71,21 @@ module Pechkin # :nodoc:
52
71
  rescue JSON::JSONError => _error
53
72
  params
54
73
  end
74
+
75
+ def logger
76
+ PechkinAPI.logger
77
+ end
78
+ end
79
+
80
+ # Base class for all pechkin apps
81
+ class PechkinAPI < Grape::API
82
+ extend Generator
83
+ helpers Helpers
55
84
  end
56
85
 
57
86
  class << self
58
87
  def create(config)
59
- klazz = Class.new(Grape::API) do
60
- extend Generator
61
- helpers Helpers
62
- end
63
-
64
- klazz.configure(config)
88
+ Class.new(PechkinAPI).configure(config)
65
89
  end
66
90
  end
67
91
  end
@@ -12,19 +12,28 @@ module Pechkin
12
12
  end
13
13
  # Creates object which can send messages to assigned chanels
14
14
  class Chanel
15
+ attr_accessor :logger
16
+
15
17
  def initialize(bot_token, chat_ids)
16
18
  @bot_token = bot_token
17
19
  @chat_ids = chat_ids
18
20
  @chat_ids = [chat_ids] unless chat_ids.is_a?(Array)
21
+ @logger = ::Logger.new(STDOUT)
19
22
  end
20
23
 
21
24
  def send_message(message, data, options)
22
25
  text = Message.new(data).render(message)
23
- @chat_ids.map do |chat|
24
- params = options.update(text: text, chat_id: chat)
25
- response = send_data('sendMessage', params)
26
- [response.code, response.body]
27
- end
26
+ logger.warn 'Resulting text is empty' if text.empty?
27
+ results = @chat_ids.map { |id| send_message_to_id(id, text, options) }
28
+ process_results(message, results)
29
+ end
30
+
31
+ private
32
+
33
+ def send_message_to_id(chat_id, text, options)
34
+ params = options.update(text: text, chat_id: chat_id)
35
+ response = send_data('sendMessage', params)
36
+ [chat_id, response.code.to_i, response.body]
28
37
  end
29
38
 
30
39
  def send_data(method, data = {})
@@ -32,6 +41,18 @@ module Pechkin
32
41
  Net::HTTP.post_form(url, data)
33
42
  end
34
43
 
44
+ def process_results(message, results)
45
+ success, error = results.partition { |_chat, code, _body| code < 400 }
46
+ error.each do |chat, code, body|
47
+ logger.error "#{message} => #{chat}[HTTP #{code}]: #{body}"
48
+ end
49
+
50
+ {
51
+ successful: success.map(&:first),
52
+ errors: error
53
+ }
54
+ end
55
+
35
56
  def method_url(method)
36
57
  "https://api.telegram.org/bot#{@bot_token}/#{method}"
37
58
  end
@@ -1,7 +1,7 @@
1
1
  module Pechkin
2
2
  # Keeps actual version
3
3
  module Version
4
- VERSION = [0, 0, 3].freeze
4
+ VERSION = [0, 0, 4].freeze
5
5
  class << self
6
6
  def version_string
7
7
  VERSION.join('.')
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pechkin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Arkhanhelsky
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-06 00:00:00.000000000 Z
11
+ date: 2018-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.2
19
+ version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.0.2
26
+ version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rack
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.3.0
33
+ version: '1.5'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.3.0
40
+ version: '1.5'
41
41
  description:
42
42
  email: ilya.arkhanhelsky at gmail.com
43
43
  executables: