vk_cozy 0.2 → 0.3.8

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: 258b9457cabc9453353250a7f51db038240ef43bb1b93b68ba4128fdfb59031d
4
- data.tar.gz: c35f4cbf0564408024d238ca505f28b076fdb57b40dddfcb338707b7847d82fc
3
+ metadata.gz: 88f8d21019678635297581f40f48e83e71cc79bfe2db701cd3c6b6815df8c5d0
4
+ data.tar.gz: 2a3e5cfce38ec22b4d20f36b3f50e6c2d5b508a09e854186c5aeb90fa858ff80
5
5
  SHA512:
6
- metadata.gz: 8fe4888bcb9db9859ac768c5ec0ba3e5c70d2adc38a3513e535254daf942c09708e9cb461a1161099d0ed9b5470d76b9863593fccdd82856ed1361333fb3681b
7
- data.tar.gz: 0dde51243767756401df2988a07befaa65e6df3ef0dfb9e11b4e3ab58a09ea15c16ddcc70d2ab6cbb6171ac196b02349a00a52a6c568d7235c6faff10bbb1e4d
6
+ metadata.gz: b02bf27e35dd324d7497ff0d2bd7f4a952b313cb94fc897c3e190b510881d870efe4e17c1c912dcdf5a596aaf2842608d94d44f6b6432c8cbae7778cb38340e9
7
+ data.tar.gz: f2b9dbac5adb7488dcf8db32189ab9d80c514ed8acefc20782ba9ded4275ea6214c8023747e0d5dee8bef70f9bdb804911a31c58f856d8ffce100a4d2160401e
data/Gemfile CHANGED
@@ -2,4 +2,8 @@
2
2
 
3
3
  source 'http://rubygems.org'
4
4
 
5
+ gem 'hash_dot', '~> 2.5'
6
+ gem 'inum', '~> 5.2'
7
+ gem 'ruby-enum', '~> 0.9.0'
8
+
5
9
  gemspec
@@ -4,47 +4,46 @@ require 'net/http'
4
4
  require "resolv-replace"
5
5
 
6
6
  class Api
7
- attr_accessor :access_token, :version
7
+ attr_accessor :access_token, :version
8
8
 
9
- SCHEME = 'https'
10
- HOST = 'api.vk.com'
11
- PATH = '/method/'
12
- PORT = 443
9
+ SCHEME = 'https'
10
+ HOST = 'api.vk.com'
11
+ PATH = '/method/'
12
+ PORT = 443
13
13
 
14
- def initialize(access_token, version=5.92)
15
- @access_token = access_token
16
- @version = version
17
- end
14
+ def initialize(access_token, version=5.92)
15
+ @access_token = access_token
16
+ @version = version
17
+ end
18
18
 
19
- def request_thr(method_vk, data)
20
- thr = Thread.new {
21
- request(method_vk, data)
22
- }
23
- thr.run
24
- # thr.value
25
- end
19
+ def request_thr(method_vk, data)
20
+ thr = Thread.new {
21
+ request(method_vk, data)
22
+ }
23
+ thr.run
24
+ end
26
25
 
27
- def request(method_vk, data)
28
- data = data.to_hash
29
- data = data.merge(v: version)
30
- data = data.merge(access_token: access_token)
31
- data.each do |argument, value|
32
- data[argument] = value.join(',') if value.is_a?(Array)
33
- end
34
- http_response = Net::HTTP.post_form(url_for_method(method_vk), data).body
35
- # return unless http_response.present?
36
- json_response = JSON.parse(http_response)
37
- if json_response['error']
38
- raise json_response['error']['error_msg']
39
- end
40
- json_response
41
- end
26
+ def request(method_vk, data)
27
+ data = data.to_hash
28
+ data = data.merge(v: version)
29
+ data = data.merge(access_token: access_token)
30
+ data.each do |argument, value|
31
+ data[argument] = value.join(',') if value.is_a?(Array)
32
+ end
33
+ http_response = Net::HTTP.post_form(url_for_method(method_vk), data).body
34
+ # return unless http_response.present?
35
+ json_response = JSON.parse(http_response)
36
+ if json_response['error']
37
+ raise json_response['error']['error_msg']
38
+ end
39
+ json_response
40
+ end
42
41
 
43
- def url_for_method(method_vk)
44
- URI.parse("#{SCHEME}://#{HOST}#{PATH}#{method_vk}")
45
- end
42
+ def url_for_method(method_vk)
43
+ URI.parse("#{SCHEME}://#{HOST}#{PATH}#{method_vk}")
44
+ end
46
45
 
47
- def method_missing name, **kwargs
48
- return request(name.to_s.sub('_', '.'), kwargs)['response']
49
- end
46
+ def method_missing name, **kwargs
47
+ return request(name.to_s.sub('_', '.'), kwargs)['response']
48
+ end
50
49
  end
data/lib/vk_cozy/bot.rb CHANGED
@@ -2,54 +2,66 @@ require_relative 'types/events/bot_events'
2
2
  require_relative 'dispatch/views/bot/event'
3
3
  require_relative 'framework/labeler/bot'
4
4
  require_relative 'polling/bot_polling'
5
+ require_relative 'dev/keyboard/keyboard'
5
6
 
6
7
  module VkCozy
7
- class Bot
8
- attr_reader :api
9
-
10
- CLASS_BY_EVENT_TYPE = {
11
- BotEventType::MESSAGE_NEW => BotMessageEvent,
12
- BotEventType::MESSAGE_REPLY => BotMessageEvent,
13
- BotEventType::MESSAGE_EDIT => BotMessageEvent
14
- }
15
-
16
- DEFAULT_EVENT_CLASS = BotEvent
17
-
18
- def initialize(access_token, version=5.92, api=nil)
19
- @access_token = access_token
20
- if api.nil?
21
- @api = Api.new(access_token, version)
22
- else
23
- @api = api
24
- end
25
- @polling = VkCozy::BotPolling.new(@api)
26
- @labeler = VkCozy::BotLabeler.new(@api)
27
- end
28
-
29
- def on
30
- return @labeler
31
- end
32
-
33
- def run_polling
34
- @polling.listen do |event|
35
- for event_raw in event['updates']
36
- begin
37
- @labeler.filter(parse_event(event_raw))
38
- rescue Exception => e
39
- raise e
40
- end
41
- end
42
- end
43
- end
44
-
45
- private
46
-
47
- def parse_event(event_raw)
48
- event_class = CLASS_BY_EVENT_TYPE.fetch(
49
- event_raw['type'],
50
- DEFAULT_EVENT_CLASS
51
- )
52
- return event_class.new(@api, event_raw)
53
- end
54
- end
8
+ class Bot
9
+ attr_reader :api
10
+
11
+ CLASS_BY_EVENT_TYPE = {
12
+ BotEventType::MESSAGE_NEW => BotMessageEvent,
13
+ BotEventType::MESSAGE_REPLY => BotMessageEvent,
14
+ BotEventType::MESSAGE_EDIT => BotMessageEvent
15
+ }
16
+
17
+ DEFAULT_EVENT_CLASS = BotEvent
18
+
19
+ def initialize(access_token, version=5.92)
20
+ @access_token = access_token
21
+ @api = Api.new(access_token, version)
22
+
23
+ @polling = VkCozy::BotPolling.new(@api)
24
+ @labeler = VkCozy::BotLabeler.new(@api)
25
+ end
26
+
27
+ def on
28
+ return @labeler
29
+ end
30
+
31
+ def on_startup
32
+ puts 'Run polling'
33
+ end
34
+
35
+ def run_polling(startup=nil)
36
+ if startup.nil?
37
+ on_startup
38
+ elsif startup.is_a?(Proc)
39
+ startup.call
40
+ else
41
+ startup
42
+ end
43
+ @polling.listen do |event|
44
+ for event_raw in event['updates']
45
+ begin
46
+ event_raw = parse_event(event_raw)
47
+ if @labeler.filter(event_raw)
48
+ next
49
+ end
50
+ rescue Exception => e
51
+ raise e
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ def parse_event(event_raw)
60
+ event_class = CLASS_BY_EVENT_TYPE.fetch(
61
+ event_raw['type'],
62
+ DEFAULT_EVENT_CLASS
63
+ )
64
+ return event_class.new(@api, event_raw)
65
+ end
66
+ end
55
67
  end
@@ -0,0 +1,72 @@
1
+ module Keyboard
2
+ class BaseAction
3
+ attr_reader :type
4
+
5
+ def get_data
6
+ instance_variables.each_with_object({}) do |k, h|
7
+ var = instance_variable_get("#{k}")
8
+ if not var.nil?
9
+ h[k.to_s.gsub('@', '')] = var
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ class Text < BaseAction
16
+ def initialize(label, payload: nil)
17
+ @type = 'text'
18
+
19
+ @label = label
20
+ @payload = payload
21
+ end
22
+ end
23
+
24
+ class OpenLink < BaseAction
25
+ def initialize(label, link, payload: nil)
26
+ @type = 'open_link'
27
+
28
+ @label = label
29
+ @link = link
30
+ @payload = payload
31
+ end
32
+ end
33
+
34
+ class Location < BaseAction
35
+ def initialize(payload: nil)
36
+ @type = 'location'
37
+
38
+ @payload = payload
39
+ end
40
+ end
41
+
42
+ class VkPay < BaseAction
43
+ def initialize(payload: nil, hash: nil)
44
+ @type = 'vkpay'
45
+
46
+ @payload = payload
47
+ @hash = hash
48
+ end
49
+ end
50
+
51
+ class VkApps < BaseAction
52
+ def initialize(app_id, owner_id, payload: nil, label: nil, hash: nil)
53
+ @type = 'open_app'
54
+
55
+ @app_id = app_id
56
+ @owner_id = owner_id
57
+ @payload = payload
58
+ @label = label
59
+ @hash = hash
60
+ end
61
+ end
62
+
63
+
64
+ class Callback < BaseAction
65
+ def initialize(label, payload)
66
+ @type = 'callback'
67
+
68
+ @label = label
69
+ @payload = payload
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,34 @@
1
+ module Keyboard
2
+ class KeyboardButton
3
+ def initialize(action, color: nil, data: nil)
4
+ @action = action
5
+ @color = color
6
+ @data = data
7
+ end
8
+
9
+ def self.from_typed(action, color: nil)
10
+ return self.new(action, color: color, data: nil)
11
+ end
12
+
13
+ def self.from_hash(data)
14
+ color = data.key('color')
15
+ keyboard_data = {'action' => data}
16
+ if color.nil?
17
+ keyboard_data['action'].delete('color')
18
+ keyboard_data['color'] = color
19
+ end
20
+ return self.new(self.action, self.color, keyboard_data)
21
+ end
22
+
23
+ def get_data
24
+ if not @data.nil?
25
+ return @data
26
+ end
27
+ data = {'action' => @action.get_data()}
28
+ if ['text', 'callback'].include?(@action.type) and not @color.nil?
29
+ data['color'] = @color
30
+ end
31
+ return data
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,10 @@
1
+ module Keyboard
2
+ class Color
3
+ include Ruby::Enum
4
+
5
+ define :PRIMARY, 'primary'
6
+ define :SECONDARY, 'secondary'
7
+ define :NEGATIVE, 'negative'
8
+ define :POSITIVE, 'positive'
9
+ end
10
+ end
@@ -0,0 +1,48 @@
1
+ require_relative 'action'
2
+ require_relative 'button'
3
+ require_relative 'color'
4
+
5
+ module Keyboard
6
+ class Keyboard
7
+ def initialize(one_time: false, inline: false)
8
+ @one_time = one_time
9
+ @inline = inline
10
+ @buttons = []
11
+ end
12
+
13
+ def row()
14
+ @buttons << []
15
+ return self
16
+ end
17
+
18
+ def add(action, color=nil)
19
+ if @buttons.length == 0
20
+ row()
21
+ end
22
+ button = KeyboardButton.from_typed(action, color: color)
23
+ @buttons[-1] << button
24
+ return self
25
+ end
26
+
27
+ def get_json()
28
+ _buttons = []
29
+ for row in @buttons
30
+ buttons = []
31
+ for button in row
32
+ buttons << button.get_data()
33
+ end
34
+ _buttons << buttons
35
+ end
36
+ data = {
37
+ 'one_time' => @one_time,
38
+ 'inline' => @inline,
39
+ 'buttons' => _buttons
40
+ }
41
+ return data
42
+ end
43
+
44
+ def to_s
45
+ return JSON.generate(get_json())
46
+ end
47
+ end
48
+ end
@@ -1,67 +1,75 @@
1
1
  module VkCozy
2
- class BotEvent
3
- attr_reader :api, :raw, :t, :type, :obj, :object, :client_info, :message, :group_id
4
- def initialize(api, event_raw)
5
- @api = api
6
- @raw = event_raw
2
+ class BotEvent
3
+ attr_reader :api, :raw, :t, :type, :obj, :object, :client_info, :message, :group_id
4
+ def initialize(api, event_raw)
5
+ @api = api
6
+ @raw = event_raw
7
7
 
8
- @type = event_raw['type']
9
- @t = @type
8
+ @type = event_raw['type']
9
+ @t = @type
10
10
 
11
- @object = event_raw['object'].to_dot
12
- @obj = @object
11
+ @object = event_raw['object'].to_dot
12
+ @obj = @object
13
13
 
14
- @message = @obj['message']
14
+ @message = @obj['message']
15
15
 
16
- @client_info = @obj['client_info']
16
+ @client_info = @obj['client_info']
17
17
 
18
- @group_id = @raw['group_id']
19
-
20
- end
18
+ @group_id = @raw['group_id']
19
+
20
+ end
21
21
 
22
- def [] key
23
- instance_variable_get("@#{key}")
24
- end
22
+ def answer(text)
23
+ return @api.messages_send(
24
+ peer_id: @obj.peer_id,
25
+ message: text,
26
+ random_id: 0
27
+ )
28
+ end
25
29
 
26
- def to_s
27
- "BotEvent(#{@raw.to_s})"
28
- end
29
- end
30
+ def [] key
31
+ instance_variable_get("@#{key}")
32
+ end
30
33
 
31
- class BotMessageEvent < BotEvent
32
- attr_reader :from_user, :from_chat, :from_group, :chat_id
33
- def initialize(api, event_raw)
34
- super(api, event_raw)
35
- @from_user = false
36
- @from_chat = false
37
- @from_group = false
34
+ def to_s
35
+ "BotEvent(#{@raw.to_s})"
36
+ end
37
+ end
38
38
 
39
+ class BotMessageEvent < BotEvent
40
+ attr_reader :from_user, :from_chat, :from_group, :chat_id
41
+ def initialize(api, event_raw)
42
+ super(api, event_raw)
43
+ @from_user = false
44
+ @from_chat = false
45
+ @from_group = false
39
46
 
40
- peer_id = @raw['object']['peer_id']
41
- if peer_id.nil?
42
- peer_id = @raw['object']['message']['peer_id']
43
- end
44
47
 
45
- if peer_id < 0
46
- @from_group = true
47
- elsif peer_id < 2e9
48
- @from_user = true
49
- else
50
- from_user = true
51
- @chat_id = peer_id - 2e9
52
- end
53
- end
48
+ peer_id = @raw['object']['peer_id']
49
+ if peer_id.nil?
50
+ peer_id = @raw['object']['message']['peer_id']
51
+ end
54
52
 
55
- def answer(text)
56
- return @api.messages_send(
57
- peer_id: @message.peer_id,
58
- message: text,
59
- random_id: 0
60
- )
61
- end
53
+ if peer_id < 0
54
+ @from_group = true
55
+ elsif peer_id < 2e9
56
+ @from_user = true
57
+ else
58
+ from_user = true
59
+ @chat_id = peer_id - 2e9
60
+ end
61
+ end
62
62
 
63
- def to_s
64
- "BotMessageEvent(#{@raw.to_s})"
65
- end
66
- end
63
+ def answer(text)
64
+ return @api.messages_send(
65
+ peer_id: @message.peer_id,
66
+ message: text,
67
+ random_id: 0
68
+ )
69
+ end
70
+
71
+ def to_s
72
+ "BotMessageEvent(#{@raw.to_s})"
73
+ end
74
+ end
67
75
  end
@@ -1,80 +1,81 @@
1
1
  module VkCozy
2
- class UserEvent
3
- attr_accessor :api, :raw, :type,
4
- :from_user, :from_chat, :from_group, :from_me, :to_me,
5
- :attachments, :message_data,
6
- :message_id, :timestamp, :text, :peer_id, :flags, :extra, :extra_values, :type_id
2
+ class UserEvent
3
+ attr_accessor :api, :raw, :type,
4
+ :from_user, :from_chat, :from_group, :from_me, :to_me,
5
+ :attachments, :message_data,
6
+ :message_id, :timestamp, :text, :peer_id, :flags, :extra, :extra_values, :type_id
7
7
 
8
- def initialize(api, raw_event)
9
- @api = api
10
- @raw = raw_event
8
+ def initialize(api, raw_event)
9
+ @api = api
10
+ @raw = raw_event
11
11
 
12
- @from_user = false
13
- @from_chat = false
14
- @from_group = false
15
- @from_me = false
16
- @to_me = false
12
+ @from_user = false
13
+ @from_chat = false
14
+ @from_group = false
15
+ @from_me = false
16
+ @to_me = false
17
17
 
18
- begin
19
- @type = UserEventType.parse(@raw[0])
20
- list_to_attr(@raw[1, @raw.length], EVENT_ATTRS_MAPPING[@type])
21
- rescue StandardError => e
22
- @type = @raw[0]
23
- end
18
+ begin
19
+ @type = UserEventType.parse(@raw[0])
20
+ list_to_attr(@raw[1, @raw.length], EVENT_ATTRS_MAPPING[@type])
21
+ rescue StandardError => e
22
+ @type = @raw[0]
23
+ end
24
24
 
25
- if VkCozy::PARSE_PEER_ID_EVENTS.include?(@type)
26
- parse_peer_id()
27
- end
25
+ if VkCozy::PARSE_PEER_ID_EVENTS.include?(@type)
26
+ parse_peer_id()
27
+ end
28
28
 
29
- if VkCozy::PARSE_MESSAGE_FLAGS_EVENTS
30
- parse_message()
31
- end
32
- end
29
+ if VkCozy::PARSE_MESSAGE_FLAGS_EVENTS
30
+ parse_message()
31
+ end
32
+ end
33
33
 
34
- def to_s
35
- instance_variables.each_with_object({}) do |k, h|
36
- h[k] = instance_variable_get("#{k}")
37
- end.to_json
38
- end
34
+ def to_s
35
+ instance_variables.each_with_object({}) do |k, h|
36
+ h[k] = instance_variable_get("#{k}")
37
+ end.to_json
38
+ end
39
39
 
40
- def answer(text)
41
- return @api.messages_send(
42
- peer_id: @peer_id,
43
- message: text,
44
- random_id: 0
45
- )
46
- end
40
+ def answer(text)
41
+ return @api.messages_send(
42
+ peer_id: @peer_id,
43
+ message: text,
44
+ random_id: 0
45
+ )
46
+ end
47
47
 
48
- private
48
+ private
49
49
 
50
- def list_to_attr(raw, attrs)
51
- for i in (0..[raw.length, attrs.length].min)
52
- instance_variable_set("@#{attrs[i]}", raw[i]) if respond_to? "#{attrs[i]}="
53
- end
54
- end
50
+ def list_to_attr(raw, attrs)
51
+ for i in (0..[raw.length, attrs.length].min)
52
+ instance_variable_set("@#{attrs[i]}", raw[i]) if respond_to? "#{attrs[i]}="
53
+ end
54
+ end
55
55
 
56
- def parse_peer_id
57
- if @peer_id < 0
58
- @from_group = true
59
- @group_id = peer_id
56
+ def parse_peer_id
57
+ if @peer_id < 0
58
+ @from_group = true
59
+ @group_id = peer_id
60
60
 
61
- elsif @peer_id > 2e9
62
- @from_chat = true
63
- @chat_id = @peer_id-2e9
61
+ elsif @peer_id > 2e9
62
+ @from_chat = true
63
+ @chat_id = @peer_id-2e9
64
64
 
65
- if @extra_values and @extra_values.include?('from')
66
- @user_id = @extra_values['from'].to_i
67
- end
68
- else
69
- @from_user = true
70
- @user_id = @peer_id
71
- end
72
- end
65
+ if @extra_values and @extra_values.include?('from')
66
+ @user_id = @extra_values['from'].to_i
67
+ end
68
+ else
69
+ @from_user = true
70
+ @user_id = @peer_id
71
+ end
72
+
73
+ end
73
74
 
74
- def parse_message
75
- if @type == UserEventType::MESSAGE_NEW
75
+ def parse_message
76
+ if @type == UserEventType::MESSAGE_NEW
76
77
 
77
- end
78
- end
79
- end
78
+ end
79
+ end
80
+ end
80
81
  end