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 +4 -4
- data/lib/pechkin.rb +7 -1
- data/lib/pechkin/api.rb +40 -16
- data/lib/pechkin/telegram.rb +26 -5
- data/lib/pechkin/version.rb +1 -1
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27d78c857bcd762e9b36cbaa234120e6caa91b67604344f1602e0e64bcffe7c0
|
4
|
+
data.tar.gz: 1bfcf6b1b346efd49f02f47995f561825b8bdffdf8dd193a586c37d30855d9ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cea8fa824f2bbcf23f75612d528fbab474c9ac1ad9e0c860301100e5e44d030e137f2d2456438ac7a42c220c03d06406462c2bf0f886575bf72ec970898cffd2
|
7
|
+
data.tar.gz: 5bd402593bca10b7a3b92d88e217a06847539f1b90e2225f2c4643b1c6f18db86c3826ae50f7dcc2eb447a01d6969d68d7ad1e73608b5f3cc64aab43df9d36c4
|
data/lib/pechkin.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/pechkin/api.rb
CHANGED
@@ -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
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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
|
-
|
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
|
data/lib/pechkin/telegram.rb
CHANGED
@@ -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
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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
|
data/lib/pechkin/version.rb
CHANGED
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.
|
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-
|
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
|
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
|
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.
|
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.
|
40
|
+
version: '1.5'
|
41
41
|
description:
|
42
42
|
email: ilya.arkhanhelsky at gmail.com
|
43
43
|
executables:
|