vk_cozy 0.1 → 0.3.6

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: 84172a36d37fa7b748679799a2baedad22b63e88f03a59ede5742e0d44731221
4
- data.tar.gz: d5370aa9ca6b774890ebeb52006102d1d28e5aa6f2acbd38c67bbdcbd9bcab18
3
+ metadata.gz: 3ff934ed3de889cad7691093027e24648bd20cbc8bfcc7302c0fbcc53a34e79e
4
+ data.tar.gz: e824e451aa36108fb9b5fee80c7e0c289aefc65cb9c0afb65e23e9d371c79421
5
5
  SHA512:
6
- metadata.gz: 9fcd0cf360e2f41524459621f8e1f388a2bb037629218ccd7274d5946e3a3cf805237302b092d4f3c4b1a084526c2057dbefb781c4485e2b876c1da6759f996e
7
- data.tar.gz: e89c98542748a160e64ab434873e3330f9a8124f981f2d56b2b003795d9d4994f10dacb1a1a404c65f9b75561b73f26e3aca4770a4857832288b4a6499c6aad2
6
+ metadata.gz: f7b7b564065b60f8e789e56c82ed9da73600650a05c7a71bc9057d966e04262ecf683d24c2304e7570c284e94209b37fb5166c5ea94ac3e13e094e344c759510
7
+ data.tar.gz: b076661eaab47055f6e7ee4f705892dbbc1c1f02d9069858b06c42361cae86a38139639a61072a33736eab2f7e4a524b4b2cfa3e5d9b511d37b8e3d94279a7cc
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
@@ -0,0 +1,49 @@
1
+ require 'json'
2
+ require 'uri'
3
+ require 'net/http'
4
+ require "resolv-replace"
5
+
6
+ class Api
7
+ attr_accessor :access_token, :version
8
+
9
+ SCHEME = 'https'
10
+ HOST = 'api.vk.com'
11
+ PATH = '/method/'
12
+ PORT = 443
13
+
14
+ def initialize(access_token, version=5.92)
15
+ @access_token = access_token
16
+ @version = version
17
+ end
18
+
19
+ def request_thr(method_vk, data)
20
+ thr = Thread.new {
21
+ request(method_vk, data)
22
+ }
23
+ thr.run
24
+ end
25
+
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
41
+
42
+ def url_for_method(method_vk)
43
+ URI.parse("#{SCHEME}://#{HOST}#{PATH}#{method_vk}")
44
+ end
45
+
46
+ def method_missing name, **kwargs
47
+ return request(name.to_s.sub('_', '.'), kwargs)['response']
48
+ end
49
+ end
@@ -0,0 +1,67 @@
1
+ require_relative 'types/events/bot_events'
2
+ require_relative 'dispatch/views/bot/event'
3
+ require_relative 'framework/labeler/bot'
4
+ require_relative 'polling/bot_polling'
5
+ require_relative 'dev/keyboard/keyboard'
6
+
7
+ module VkCozy
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
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
@@ -0,0 +1,67 @@
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
7
+
8
+ @type = event_raw['type']
9
+ @t = @type
10
+
11
+ @object = event_raw['object'].to_dot
12
+ @obj = @object
13
+
14
+ @message = @obj['message']
15
+
16
+ @client_info = @obj['client_info']
17
+
18
+ @group_id = @raw['group_id']
19
+
20
+ end
21
+
22
+ def [] key
23
+ instance_variable_get("@#{key}")
24
+ end
25
+
26
+ def to_s
27
+ "BotEvent(#{@raw.to_s})"
28
+ end
29
+ end
30
+
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
38
+
39
+
40
+ peer_id = @raw['object']['peer_id']
41
+ if peer_id.nil?
42
+ peer_id = @raw['object']['message']['peer_id']
43
+ end
44
+
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
54
+
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
62
+
63
+ def to_s
64
+ "BotMessageEvent(#{@raw.to_s})"
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,81 @@
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
7
+
8
+ def initialize(api, raw_event)
9
+ @api = api
10
+ @raw = raw_event
11
+
12
+ @from_user = false
13
+ @from_chat = false
14
+ @from_group = false
15
+ @from_me = false
16
+ @to_me = false
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
24
+
25
+ if VkCozy::PARSE_PEER_ID_EVENTS.include?(@type)
26
+ parse_peer_id()
27
+ end
28
+
29
+ if VkCozy::PARSE_MESSAGE_FLAGS_EVENTS
30
+ parse_message()
31
+ end
32
+ end
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
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
47
+
48
+ private
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
55
+
56
+ def parse_peer_id
57
+ if @peer_id < 0
58
+ @from_group = true
59
+ @group_id = peer_id
60
+
61
+ elsif @peer_id > 2e9
62
+ @from_chat = true
63
+ @chat_id = @peer_id-2e9
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
+
73
+ end
74
+
75
+ def parse_message
76
+ if @type == UserEventType::MESSAGE_NEW
77
+
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,39 @@
1
+ module VkCozy
2
+ class BotLabeler
3
+ attr_reader :api
4
+
5
+ def initialize(api)
6
+ @api = api
7
+ @rules = []
8
+ end
9
+
10
+ def filter(event)
11
+ for i in @rules
12
+ f = i[:filter]
13
+ check = f.check_bot(event)
14
+ if check
15
+ if check.is_a?(Symbol)
16
+ check = [Symbol]
17
+ elsif check.is_a?(Array)
18
+ i[:func].call(event, *check)
19
+ elsif check.is_a?(Hash)
20
+ i[:func].call(event, **check)
21
+ else
22
+ i[:func].call(event)
23
+ end
24
+ return true
25
+ end
26
+ end
27
+ end
28
+
29
+ def message_handler(filter, func)
30
+ if func.is_a?(Symbol)
31
+ func = method(func)
32
+ end
33
+ @rules << {
34
+ :func => func,
35
+ :filter => filter
36
+ }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,84 @@
1
+ module VkCozy
2
+ class BaseFilter
3
+ def check_user(event) # Method check for user-bot
4
+ raise 'Method check_user not implemented'
5
+ end
6
+
7
+ def check_bot(event) # Method check for group-bot
8
+ raise 'Method check_bot not implemented'
9
+ end
10
+ end
11
+
12
+ class YaScan < VkCozy::BaseFilter
13
+ def initialize(pattern, flags: Regexp::IGNORECASE)
14
+ @flags = flags
15
+ @pattern = valid_pattern(pattern) # Pattern example: my name is <name>
16
+ end
17
+
18
+ def valid_pattern(pattern)
19
+ arguments = pattern.scan(/<([\w_]*)>/).flatten
20
+ for i in arguments
21
+ pattern = pattern.sub("<#{i}>", "(?<#{i}>.*)")
22
+ end
23
+ return Regexp.new(pattern, @flags)
24
+ end
25
+
26
+ def check_text(text) # Text example: my name is Volk
27
+ text_match = @pattern.match(text)
28
+ if text_match.nil?
29
+ return false
30
+ end
31
+ return Hash[ text_match.names.zip( text_match.captures ) ] # Return: {'name' => 'Volk'}
32
+ end
33
+
34
+ def check_bot(event)
35
+ if event.type == VkCozy::BotEventType::MESSAGE_NEW
36
+ check_text(event.message.text)
37
+ end
38
+ end
39
+
40
+ def check_user(event)
41
+ if event.type == VkCozy::UserEventType::MESSAGE_NEW
42
+ if event.from_me
43
+ return false
44
+ end
45
+ check_text(event.text)
46
+ end
47
+ end
48
+ end
49
+
50
+ class Text < BaseFilter
51
+ def initialize(regex, **kwargs)
52
+ @regex = regex
53
+ @raw = kwargs
54
+ end
55
+
56
+ def check_user(event)
57
+ if event.type == VkCozy::UserEventType::MESSAGE_NEW
58
+
59
+ if event.from_me
60
+ return false
61
+ end
62
+ if event.text == @regex
63
+ return true
64
+ else
65
+ return false
66
+ end
67
+ else
68
+ return false
69
+ end
70
+ end
71
+
72
+ def check_bot(event)
73
+ if event.type == VkCozy::BotEventType::MESSAGE_NEW
74
+ if event.message.text == @regex
75
+ return true
76
+ else
77
+ return false
78
+ end
79
+ else
80
+ return false
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,40 @@
1
+ module VkCozy
2
+ class UserLabeler
3
+ attr_reader :api
4
+
5
+ def initialize(api)
6
+ @api = api
7
+ @rules = []
8
+ end
9
+
10
+ def filter(event_raw)
11
+ event = VkCozy::UserEvent.new(@api, event_raw)
12
+ for i in @rules
13
+ f = i[:filter]
14
+ check = f.check_user(event)
15
+ if check
16
+ if check.is_a?(Symbol)
17
+ check = [Symbol]
18
+ elsif check.is_a?(Array)
19
+ i[:func].call(event, *check)
20
+ elsif check.is_a?(Hash)
21
+ i[:func].call(event, **check)
22
+ else
23
+ i[:func].call(event)
24
+ end
25
+ return true
26
+ end
27
+ end
28
+ end
29
+
30
+ def message_handler(filter, func)
31
+ if func.is_a?(Symbol)
32
+ func = method(func)
33
+ end
34
+ @rules << {
35
+ :func => func,
36
+ :filter => filter
37
+ }
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,38 @@
1
+ module VkCozy
2
+ class BotPolling
3
+ def initialize(api, group_id=nil, wait=25, rps_delay=0)
4
+ @api = api
5
+ if group_id.nil?
6
+ @group_id = @api.request('groups.getById', {})['response'][0]['id']
7
+ else
8
+ @group_id = group_id
9
+ end
10
+
11
+ @rps_delay = rps_delay
12
+ @stop = false
13
+ end
14
+
15
+ def get_server
16
+ return @api.request('groups.getLongPollServer', {:group_id => @group_id})['response']
17
+ end
18
+
19
+ def get_event(server)
20
+ uri = URI.parse('%s?act=a_check&key=%s&ts=%s&wait=%s&rps_delay=%s' % [server['server'], server['key'], server['ts'], @wait, @rps_delay])
21
+ http_response = Net::HTTP.get(uri)
22
+ return JSON.parse(http_response)
23
+ end
24
+
25
+ def listen
26
+ server = get_server
27
+ until @stop do
28
+ event = get_event(server)
29
+ if not event['ts']
30
+ server = get_server
31
+ next
32
+ end
33
+ server['ts'] = event['ts']
34
+ yield event
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ module VkCozy
2
+ class UserPolling
3
+ def initialize(api=nil, user_id=nil, mode=234, wait=25, rps_delay=0, error_handler=nil)
4
+ @api = api
5
+ if user_id.nil?
6
+ @user_id = @api.request('users.get', {})['response'][0]['id']
7
+ else
8
+ @user_id = user_id
9
+ end
10
+ @mode = mode
11
+ @wait = wait
12
+ @rps_delay = rps_delay
13
+ @stop = false
14
+ end
15
+
16
+ def get_event(server)
17
+ uri = URI.parse('https://%s?act=a_check&key=%s&ts=%s&wait=%s&mode=%s&rps_delay=%s&version=%s' % [server['server'], server['key'], server['ts'], @wait, @mode, @rps_delay, 3])
18
+ http_response = Net::HTTP.get(uri)
19
+ return JSON.parse(http_response)
20
+ end
21
+
22
+ def get_server
23
+ return @api.request('messages.getLongPollServer', {})['response']
24
+ end
25
+
26
+ def listen
27
+ server = get_server
28
+ until @stop do
29
+ event = get_event(server)
30
+ if not event['ts']
31
+ server = get_server
32
+ next
33
+ end
34
+ server['ts'] = event['ts']
35
+ yield event
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,73 @@
1
+ module VkCozy
2
+ class BotEventType
3
+ include Ruby::Enum
4
+
5
+ define :MESSAGE_NEW, 'message_new'
6
+ define :MESSAGE_REPLY, 'message_reply'
7
+ define :MESSAGE_EDIT, 'message_edit'
8
+ define :MESSAGE_EVENT, 'message_event'
9
+
10
+ define :MESSAGE_TYPING_STATE, 'message_typing_state'
11
+
12
+ define :MESSAGE_ALLOW, 'message_allow'
13
+
14
+ define :MESSAGE_DENY, 'message_deny'
15
+
16
+ define :PHOTO_NEW, 'photo_new'
17
+
18
+ define :PHOTO_COMMENT_NEW, 'photo_comment_new'
19
+ define :PHOTO_COMMENT_EDIT, 'photo_comment_edit'
20
+ define :PHOTO_COMMENT_RESTORE, 'photo_comment_restore'
21
+
22
+ define :PHOTO_COMMENT_DELETE, 'photo_comment_delete'
23
+
24
+ define :AUDIO_NEW, 'audio_new'
25
+
26
+ define :VIDEO_NEW, 'video_new'
27
+
28
+ define :VIDEO_COMMENT_NEW, 'video_comment_new'
29
+ define :VIDEO_COMMENT_EDIT, 'video_comment_edit'
30
+ define :VIDEO_COMMENT_RESTORE, 'video_comment_restore'
31
+
32
+ define :VIDEO_COMMENT_DELETE, 'video_comment_delete'
33
+
34
+ define :WALL_POST_NEW, 'wall_post_new'
35
+ define :WALL_REPOST, 'wall_repost'
36
+
37
+ define :WALL_REPLY_NEW, 'wall_reply_new'
38
+ define :WALL_REPLY_EDIT, 'wall_reply_edit'
39
+ define :WALL_REPLY_RESTORE, 'wall_reply_restore'
40
+
41
+ define :WALL_REPLY_DELETE, 'wall_reply_delete'
42
+
43
+ define :BOARD_POST_NEW, 'board_post_new'
44
+ define :BOARD_POST_EDIT, 'board_post_edit'
45
+ define :BOARD_POST_RESTORE, 'board_post_restore'
46
+
47
+ define :BOARD_POST_DELETE, 'board_post_delete'
48
+
49
+ define :MARKET_COMMENT_NEW, 'market_comment_new'
50
+ define :MARKET_COMMENT_EDIT, 'market_comment_edit'
51
+ define :MARKET_COMMENT_RESTORE, 'market_comment_restore'
52
+
53
+ define :MARKET_COMMENT_DELETE, 'market_comment_delete'
54
+
55
+ define :GROUP_LEAVE, 'group_leave'
56
+
57
+ define :GROUP_JOIN, 'group_join'
58
+
59
+ define :USER_BLOCK, 'user_block'
60
+
61
+ define :USER_UNBLOCK, 'user_unblock'
62
+
63
+ define :POLL_VOTE_NEW, 'poll_vote_new'
64
+
65
+ define :GROUP_OFFICERS_EDIT, 'group_officers_edit'
66
+
67
+ define :GROUP_CHANGE_SETTINGS, 'group_change_settings'
68
+
69
+ define :GROUP_CHANGE_PHOTO, 'group_change_photo'
70
+
71
+ define :VKPAY_TRANSACTION, 'vkpay_transaction'
72
+ end
73
+ end
@@ -0,0 +1,67 @@
1
+ module VkCozy
2
+ class UserEventType < Inum::Base
3
+ define :UNDEFINED_EVENT, -1
4
+
5
+ define :REPLACE_MESSAGE_FLAGS, 1
6
+ define :INSTALL_MESSAGE_FLAGS, 2
7
+ define :RESET_MESSAGE_FLAGS, 3
8
+
9
+ define :MESSAGE_NEW, 4
10
+ define :MESSAGE_EDIT, 5
11
+ define :IN_READ, 6
12
+ define :OUT_READ, 7
13
+ define :FRIEND_ONLINE, 8
14
+ define :FRIEND_OFFLINE, 9
15
+ define :RESET_DIALOG_FLAGS, 10
16
+ define :REPLACE_DIALOG_FLAGS, 11
17
+ define :INSTALL_DIALOG_FLAGS, 12
18
+ define :MESSAGES_DELETE, 13
19
+ define :MESSAGES_RESTORE, 14
20
+
21
+ define :MESSAGE_CHANGE, 18
22
+ define :CLEAR_MESSAGE_CACHE, 19
23
+
24
+ define :CHANGE_MAJOR_ID, 20
25
+ define :CHANGE_MINOR_ID, 21
26
+
27
+ define :CHAT_EDIT, 51
28
+ define :CHAT_INFO_EDIT, 52
29
+ define :DIALOG_TYPING_STATE, 61
30
+
31
+ define :CHAT_TYPING_STATE, 62
32
+ define :USERS_TYPING_STATE, 63
33
+ define :CHAT_VOICE_MESSAGE_STATES, 64
34
+ define :PHOTO_UPLOAD_STATE, 65
35
+ define :VIDEO_UPLOAD_STATE, 66
36
+ define :FILE_UPLOAD_STAE, 67
37
+
38
+ define :CALL, 70
39
+ define :COUNTER, 80
40
+ define :USER_INVISIBLE_CHANGE, 81
41
+ define :NOTIFICATIONS_SETTINGS_CHANGED, 114
42
+ define :CHAT_CALL, 115
43
+ define :CALLBACK_BUTTON_REPLY, 119
44
+ end
45
+
46
+ MESSAGE_EXTRA_FIELDS = [
47
+ 'peer_id', 'timestamp', 'text', 'extra_values', 'attachments', 'random_id'
48
+ ]
49
+ MSGID = 'message_id'
50
+ EVENT_ATTRS_MAPPING = {
51
+ VkCozy::UserEventType::REPLACE_MESSAGE_FLAGS => [MSGID, 'flags'] + MESSAGE_EXTRA_FIELDS,
52
+ VkCozy::UserEventType::INSTALL_MESSAGE_FLAGS => [MSGID, 'mask'] + MESSAGE_EXTRA_FIELDS,
53
+ VkCozy::UserEventType::RESET_MESSAGE_FLAGS => [MSGID, 'mask'] + MESSAGE_EXTRA_FIELDS,
54
+ VkCozy::UserEventType::MESSAGE_NEW => [MSGID, 'flags'] + MESSAGE_EXTRA_FIELDS,
55
+ VkCozy::UserEventType::MESSAGE_EDIT => [MSGID, 'mask'] + MESSAGE_EXTRA_FIELDS,
56
+ VkCozy::UserEventType::IN_READ => ['peer_id', 'local_id'],
57
+ VkCozy::UserEventType::OUT_READ => ['peer_id', 'local_id'],
58
+ VkCozy::UserEventType::FRIEND_ONLINE => ['user_id', 'extra', 'timestamp'],
59
+ VkCozy::UserEventType::FRIEND_OFFLINE => ['user_id', 'flags', 'timestamp'],
60
+ VkCozy::UserEventType::DIALOG_TYPING_STATE => ['user_id', 'flags']
61
+ }
62
+ PARSE_PEER_ID_EVENTS = EVENT_ATTRS_MAPPING.map{|k, v| if v.include?('peer_id') then k end}.select{ |i| not i.nil? }
63
+ PARSE_MESSAGE_FLAGS_EVENTS = [
64
+ VkCozy::UserEventType::REPLACE_MESSAGE_FLAGS,
65
+ VkCozy::UserEventType::MESSAGE_NEW
66
+ ]
67
+ end
@@ -0,0 +1,48 @@
1
+ require_relative 'types/events/user_events'
2
+ require_relative 'dispatch/views/user/event'
3
+ require_relative 'framework/labeler/user'
4
+ require_relative 'polling/user_polling'
5
+
6
+ module VkCozy
7
+ class User
8
+ attr_reader :api
9
+
10
+ def initialize(access_token, version=5.92)
11
+ @access_token = access_token
12
+ @api = Api.new(access_token, version)
13
+
14
+ @polling = VkCozy::UserPolling.new(@api)
15
+ @labeler = VkCozy::UserLabeler.new(@api)
16
+ end
17
+
18
+ def on
19
+ return @labeler
20
+ end
21
+
22
+ def on_startup
23
+ puts 'Run polling'
24
+ end
25
+
26
+ def run_polling(startup=nil)
27
+ if startup.nil?
28
+ on_startup
29
+ elsif startup.is_a?(Proc)
30
+ startup.call
31
+ else
32
+ startup
33
+ end
34
+
35
+ @polling.listen do |event|
36
+ for update in event['updates']
37
+ begin
38
+ if @labeler.filter(update)
39
+ next
40
+ end
41
+ rescue Exception => e
42
+ raise e
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
data/lib/vk_cozy.rb CHANGED
@@ -5,4 +5,4 @@ require 'hash_dot'
5
5
  require_relative 'vk_cozy/api/api'
6
6
  require_relative 'vk_cozy/bot'
7
7
  require_relative 'vk_cozy/user'
8
- require_relative 'vk_cozy\framework\labeler\filters\filters'
8
+ require_relative 'vk_cozy/framework/labeler/filters/filters'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vk_cozy
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danil Konenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-10 00:00:00.000000000 Z
11
+ date: 2022-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: inum
@@ -60,7 +60,23 @@ extra_rdoc_files: []
60
60
  files:
61
61
  - Gemfile
62
62
  - lib/vk_cozy.rb
63
- homepage: https://rubygems.org/gems/hola
63
+ - lib/vk_cozy/api/api.rb
64
+ - lib/vk_cozy/bot.rb
65
+ - lib/vk_cozy/dev/keyboard/action.rb
66
+ - lib/vk_cozy/dev/keyboard/button.rb
67
+ - lib/vk_cozy/dev/keyboard/color.rb
68
+ - lib/vk_cozy/dev/keyboard/keyboard.rb
69
+ - lib/vk_cozy/dispatch/views/bot/event.rb
70
+ - lib/vk_cozy/dispatch/views/user/event.rb
71
+ - lib/vk_cozy/framework/labeler/bot.rb
72
+ - lib/vk_cozy/framework/labeler/filters/filters.rb
73
+ - lib/vk_cozy/framework/labeler/user.rb
74
+ - lib/vk_cozy/polling/bot_polling.rb
75
+ - lib/vk_cozy/polling/user_polling.rb
76
+ - lib/vk_cozy/types/events/bot_events.rb
77
+ - lib/vk_cozy/types/events/user_events.rb
78
+ - lib/vk_cozy/user.rb
79
+ homepage: https://github.com/VkCozy/vk_cozy
64
80
  licenses:
65
81
  - MIT
66
82
  metadata: {}