vk_cozy 0.1 → 0.3.6

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