pechkin 0.0.3 → 0.0.4

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: 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: