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 +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
|