vk_cozy 0.2 → 0.3.8
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/Gemfile +4 -0
- data/lib/vk_cozy/api/api.rb +36 -37
- data/lib/vk_cozy/bot.rb +60 -48
- data/lib/vk_cozy/dev/keyboard/action.rb +72 -0
- data/lib/vk_cozy/dev/keyboard/button.rb +34 -0
- data/lib/vk_cozy/dev/keyboard/color.rb +10 -0
- data/lib/vk_cozy/dev/keyboard/keyboard.rb +48 -0
- data/lib/vk_cozy/dispatch/views/bot/event.rb +60 -52
- data/lib/vk_cozy/dispatch/views/user/event.rb +65 -64
- data/lib/vk_cozy/framework/labeler/bot.rb +74 -32
- data/lib/vk_cozy/framework/labeler/filters/filters.rb +88 -45
- data/lib/vk_cozy/framework/labeler/user.rb +34 -29
- data/lib/vk_cozy/polling/bot_polling.rb +32 -34
- data/lib/vk_cozy/polling/user_polling.rb +34 -34
- data/lib/vk_cozy/types/events/bot_events.rb +45 -45
- data/lib/vk_cozy/types/events/user_events.rb +57 -57
- data/lib/vk_cozy/user.rb +38 -27
- data/lib/vk_cozy.rb +1 -1
- metadata +10 -5
@@ -1,34 +1,76 @@
|
|
1
1
|
module VkCozy
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
2
|
+
|
3
|
+
class Bothandler
|
4
|
+
attr_reader :stop
|
5
|
+
|
6
|
+
def initialize(filter, func, stop: true)
|
7
|
+
@stop = stop
|
8
|
+
@filter = filter
|
9
|
+
@func = func
|
10
|
+
end
|
11
|
+
|
12
|
+
def check(event)
|
13
|
+
check_bot = @filter.check_bot(event)
|
14
|
+
if check_bot
|
15
|
+
if check_bot.is_a?(Symbol)
|
16
|
+
return true
|
17
|
+
elsif check_bot.is_a?(Hash)
|
18
|
+
@func.call(event, check_bot)
|
19
|
+
else
|
20
|
+
@func.call(event)
|
21
|
+
end
|
22
|
+
if @stop
|
23
|
+
return true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
class BotLabeler
|
31
|
+
attr_reader :api
|
32
|
+
|
33
|
+
def initialize(api)
|
34
|
+
@api = api
|
35
|
+
@handlers = {'*' => []} # * - обрабатывает события в не зависимости от их типа.
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_handlers(type)
|
39
|
+
if @handlers[type].nil?
|
40
|
+
return []
|
41
|
+
else
|
42
|
+
return @handlers[type]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def filter(event)
|
47
|
+
for handler in get_handlers(event.type) + @handlers['*']
|
48
|
+
if handler.check(event)
|
49
|
+
return true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_handler(filter, func, type: '*')
|
55
|
+
if func.is_a?(Symbol)
|
56
|
+
func = method(func)
|
57
|
+
end
|
58
|
+
if @handlers[type].nil?
|
59
|
+
@handlers[type] = []
|
60
|
+
end
|
61
|
+
@handlers[type] << Bothandler.new(filter, func)
|
62
|
+
end
|
63
|
+
|
64
|
+
def event_handler(filter, func)
|
65
|
+
add_handler(filter, func, type: 'message_event')
|
66
|
+
end
|
67
|
+
|
68
|
+
def message_handler(filter, func)
|
69
|
+
add_handler(filter, func, type: 'message_new')
|
70
|
+
end
|
71
|
+
|
72
|
+
def handler(filter, func)
|
73
|
+
add_handler(filter, func)
|
74
|
+
end
|
75
|
+
end
|
34
76
|
end
|
@@ -1,46 +1,89 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
1
|
+
module Filter
|
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 MockedFilter < BaseFilter
|
13
|
+
def check_bot(event)
|
14
|
+
return true
|
15
|
+
end
|
16
|
+
|
17
|
+
def user_bot(event)
|
18
|
+
return true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class YaScan < BaseFilter
|
23
|
+
def initialize(pattern, flags: Regexp::IGNORECASE)
|
24
|
+
@flags = flags
|
25
|
+
@pattern = valid_pattern(pattern) # Pattern example: my name is <name>
|
26
|
+
end
|
27
|
+
|
28
|
+
def valid_pattern(pattern)
|
29
|
+
arguments = pattern.scan(/<([\w_]*)>/).flatten
|
30
|
+
for i in arguments
|
31
|
+
pattern = pattern.sub("<#{i}>", "(?<#{i}>.*)")
|
32
|
+
end
|
33
|
+
return Regexp.new(pattern, @flags)
|
34
|
+
end
|
35
|
+
|
36
|
+
def check_text(text) # Text example: my name is Volk
|
37
|
+
text_match = @pattern.match(text)
|
38
|
+
if text_match.nil?
|
39
|
+
return false
|
40
|
+
end
|
41
|
+
return Hash[ text_match.names.zip( text_match.captures ) ] # Return: {'name' => 'Volk'}
|
42
|
+
end
|
43
|
+
|
44
|
+
def check_bot(event)
|
45
|
+
check_text(event.message.text)
|
46
|
+
end
|
47
|
+
|
48
|
+
def check_user(event)
|
49
|
+
if event.from_me
|
50
|
+
return false
|
51
|
+
end
|
52
|
+
check_text(event.text)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class Text < BaseFilter
|
57
|
+
def initialize(regex)
|
58
|
+
@regex = regex
|
59
|
+
end
|
60
|
+
|
61
|
+
def check_user(event)
|
62
|
+
if event.type == VkCozy::UserEventType::MESSAGE_NEW
|
63
|
+
|
64
|
+
if event.from_me
|
65
|
+
return false
|
66
|
+
end
|
67
|
+
if event.text == @regex
|
68
|
+
return true
|
69
|
+
else
|
70
|
+
return false
|
71
|
+
end
|
72
|
+
else
|
73
|
+
return false
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def check_bot(event)
|
78
|
+
if event.type == VkCozy::BotEventType::MESSAGE_NEW
|
79
|
+
if event.message.text == @regex
|
80
|
+
return true
|
81
|
+
else
|
82
|
+
return false
|
83
|
+
end
|
84
|
+
else
|
85
|
+
return false
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
46
89
|
end
|
@@ -1,35 +1,40 @@
|
|
1
1
|
module VkCozy
|
2
|
-
|
3
|
-
|
2
|
+
class UserLabeler
|
3
|
+
attr_reader :api
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
def initialize(api)
|
6
|
+
@api = api
|
7
|
+
@rules = []
|
8
|
+
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
24
29
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
34
39
|
end
|
35
40
|
end
|
@@ -1,40 +1,38 @@
|
|
1
1
|
module VkCozy
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
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
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
@rps_delay = rps_delay
|
12
|
+
@stop = false
|
13
|
+
end
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
def get_server
|
16
|
+
return @api.request('groups.getLongPollServer', {:group_id => @group_id})['response']
|
17
|
+
end
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
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
|
40
38
|
end
|
@@ -1,39 +1,39 @@
|
|
1
1
|
module VkCozy
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
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
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
def get_server
|
23
|
+
return @api.request('messages.getLongPollServer', {})['response']
|
24
|
+
end
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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
39
|
end
|
@@ -1,73 +1,73 @@
|
|
1
1
|
module VkCozy
|
2
|
-
|
3
|
-
|
2
|
+
class BotEventType
|
3
|
+
include Ruby::Enum
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
9
|
|
10
|
-
|
10
|
+
define :MESSAGE_TYPING_STATE, 'message_typing_state'
|
11
11
|
|
12
|
-
|
12
|
+
define :MESSAGE_ALLOW, 'message_allow'
|
13
13
|
|
14
|
-
|
14
|
+
define :MESSAGE_DENY, 'message_deny'
|
15
15
|
|
16
|
-
|
16
|
+
define :PHOTO_NEW, 'photo_new'
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
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
21
|
|
22
|
-
|
22
|
+
define :PHOTO_COMMENT_DELETE, 'photo_comment_delete'
|
23
23
|
|
24
|
-
|
24
|
+
define :AUDIO_NEW, 'audio_new'
|
25
25
|
|
26
|
-
|
26
|
+
define :VIDEO_NEW, 'video_new'
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
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
31
|
|
32
|
-
|
32
|
+
define :VIDEO_COMMENT_DELETE, 'video_comment_delete'
|
33
33
|
|
34
|
-
|
35
|
-
|
34
|
+
define :WALL_POST_NEW, 'wall_post_new'
|
35
|
+
define :WALL_REPOST, 'wall_repost'
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
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
40
|
|
41
|
-
|
41
|
+
define :WALL_REPLY_DELETE, 'wall_reply_delete'
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
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
46
|
|
47
|
-
|
47
|
+
define :BOARD_POST_DELETE, 'board_post_delete'
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
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
52
|
|
53
|
-
|
53
|
+
define :MARKET_COMMENT_DELETE, 'market_comment_delete'
|
54
54
|
|
55
|
-
|
55
|
+
define :GROUP_LEAVE, 'group_leave'
|
56
56
|
|
57
|
-
|
57
|
+
define :GROUP_JOIN, 'group_join'
|
58
58
|
|
59
|
-
|
59
|
+
define :USER_BLOCK, 'user_block'
|
60
60
|
|
61
|
-
|
61
|
+
define :USER_UNBLOCK, 'user_unblock'
|
62
62
|
|
63
|
-
|
63
|
+
define :POLL_VOTE_NEW, 'poll_vote_new'
|
64
64
|
|
65
|
-
|
65
|
+
define :GROUP_OFFICERS_EDIT, 'group_officers_edit'
|
66
66
|
|
67
|
-
|
67
|
+
define :GROUP_CHANGE_SETTINGS, 'group_change_settings'
|
68
68
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
69
|
+
define :GROUP_CHANGE_PHOTO, 'group_change_photo'
|
70
|
+
|
71
|
+
define :VKPAY_TRANSACTION, 'vkpay_transaction'
|
72
|
+
end
|
73
73
|
end
|