vk_cozy 0.3.1 → 0.3.9
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/lib/vk_cozy/bot.rb +3 -1
- 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 +8 -0
- data/lib/vk_cozy/framework/labeler/bot.rb +58 -19
- data/lib/vk_cozy/framework/labeler/filters/filters.rb +17 -12
- data/lib/vk_cozy/framework/labeler/user.rb +53 -19
- data/lib/vk_cozy/types/events/bot_events.rb +1 -1
- data/lib/vk_cozy/types/events/user_events.rb +11 -1
- data/lib/vk_cozy.rb +1 -1
- metadata +10 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f3e335ff0f9eb232d5a3f259a79592723ee5d5cb785bfb619cd4eb81be11f5a
|
4
|
+
data.tar.gz: 6c95df5ab9e7c6bd4ae7dd672786526bbfa4d8aa974ecea4cf564caa6859f627
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7305aa9a7a4da1fb754d4115d6087274e11e7139b56a4028cb557fbc9a98e89b5fc78aad0ab55522094cba6125c18a9865a72728b6509891e3324227b5a9cc3
|
7
|
+
data.tar.gz: e3b6b8a3ce259097d50c3fce526474f6564dae1c74c25803903b68759643b12a81669ffc6c5fd5ac6e89bbfc8ebbc1517632743f632434b95b36067ff9562905
|
data/lib/vk_cozy/bot.rb
CHANGED
@@ -2,6 +2,7 @@ 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
8
|
class Bot
|
@@ -42,7 +43,8 @@ module VkCozy
|
|
42
43
|
@polling.listen do |event|
|
43
44
|
for event_raw in event['updates']
|
44
45
|
begin
|
45
|
-
|
46
|
+
event_raw = parse_event(event_raw)
|
47
|
+
if @labeler.filter(event_raw)
|
46
48
|
next
|
47
49
|
end
|
48
50
|
rescue Exception => e
|
@@ -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,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,39 +1,78 @@
|
|
1
1
|
module VkCozy
|
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
|
+
|
2
30
|
class BotLabeler
|
3
31
|
attr_reader :api
|
4
32
|
|
5
33
|
def initialize(api)
|
6
34
|
@api = api
|
7
|
-
@
|
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
|
8
44
|
end
|
9
45
|
|
10
46
|
def filter(event)
|
11
|
-
for
|
12
|
-
|
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
|
47
|
+
for handler in get_handlers(event.type) + get_handlers('*')
|
48
|
+
if handler.check(event)
|
24
49
|
return true
|
25
50
|
end
|
26
51
|
end
|
27
52
|
end
|
28
53
|
|
29
|
-
def
|
54
|
+
def add_handler(filter, func, type: '*')
|
30
55
|
if func.is_a?(Symbol)
|
31
56
|
func = method(func)
|
32
57
|
end
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
58
|
+
|
59
|
+
if @handlers[type].nil?
|
60
|
+
@handlers[type] = []
|
61
|
+
end
|
62
|
+
|
63
|
+
@handlers[type] << Bothandler.new(filter, func)
|
64
|
+
end
|
65
|
+
|
66
|
+
def event_handler(filter, func)
|
67
|
+
add_handler(filter, func, type: 'message_event')
|
68
|
+
end
|
69
|
+
|
70
|
+
def message_handler(filter, func)
|
71
|
+
add_handler(filter, func, type: 'message_new')
|
72
|
+
end
|
73
|
+
|
74
|
+
def handler(filter, func)
|
75
|
+
add_handler(filter, func)
|
37
76
|
end
|
38
77
|
end
|
39
78
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module Filter
|
2
2
|
class BaseFilter
|
3
3
|
def check_user(event) # Method check for user-bot
|
4
4
|
raise 'Method check_user not implemented'
|
@@ -9,7 +9,17 @@ module VkCozy
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
class
|
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
|
13
23
|
def initialize(pattern, flags: Regexp::IGNORECASE)
|
14
24
|
@flags = flags
|
15
25
|
@pattern = valid_pattern(pattern) # Pattern example: my name is <name>
|
@@ -32,25 +42,20 @@ module VkCozy
|
|
32
42
|
end
|
33
43
|
|
34
44
|
def check_bot(event)
|
35
|
-
|
36
|
-
check_text(event.message.text)
|
37
|
-
end
|
45
|
+
check_text(event.message.text)
|
38
46
|
end
|
39
47
|
|
40
48
|
def check_user(event)
|
41
|
-
if event.
|
42
|
-
|
43
|
-
return false
|
44
|
-
end
|
45
|
-
check_text(event.text)
|
49
|
+
if event.from_me
|
50
|
+
return false
|
46
51
|
end
|
52
|
+
check_text(event.text)
|
47
53
|
end
|
48
54
|
end
|
49
55
|
|
50
56
|
class Text < BaseFilter
|
51
|
-
def initialize(regex
|
57
|
+
def initialize(regex)
|
52
58
|
@regex = regex
|
53
|
-
@raw = kwargs
|
54
59
|
end
|
55
60
|
|
56
61
|
def check_user(event)
|
@@ -1,40 +1,74 @@
|
|
1
1
|
module VkCozy
|
2
|
+
|
3
|
+
class UserHandler
|
4
|
+
def initialize(filter, func, stop: true)
|
5
|
+
@filter = filter
|
6
|
+
@func = func
|
7
|
+
@stop = stop
|
8
|
+
end
|
9
|
+
|
10
|
+
def check(event)
|
11
|
+
check_user = @filter.check_user(event)
|
12
|
+
if check_user
|
13
|
+
if check_user.is_a?(Symbol)
|
14
|
+
return true
|
15
|
+
elsif check_user.is_a?(Hash)
|
16
|
+
@func.call(event, check_user)
|
17
|
+
else
|
18
|
+
@func.call(event)
|
19
|
+
end
|
20
|
+
|
21
|
+
if @stop
|
22
|
+
return true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
2
28
|
class UserLabeler
|
3
29
|
attr_reader :api
|
4
30
|
|
5
31
|
def initialize(api)
|
6
32
|
@api = api
|
7
|
-
@
|
33
|
+
@handlers = {'*' => []}
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_handlers(type)
|
37
|
+
if @handlers[type].nil?
|
38
|
+
return []
|
39
|
+
else
|
40
|
+
return @handlers[type]
|
41
|
+
end
|
8
42
|
end
|
9
43
|
|
10
44
|
def filter(event_raw)
|
11
45
|
event = VkCozy::UserEvent.new(@api, event_raw)
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
46
|
+
puts event
|
47
|
+
for handler in get_handlers(event.type) + get_handlers('*')
|
48
|
+
if handler.check(event)
|
25
49
|
return true
|
26
50
|
end
|
27
51
|
end
|
28
52
|
end
|
29
53
|
|
30
|
-
def
|
54
|
+
def add_handler(filter, func, type: '*')
|
31
55
|
if func.is_a?(Symbol)
|
32
56
|
func = method(func)
|
33
57
|
end
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
58
|
+
|
59
|
+
if @handlers[type].nil?
|
60
|
+
@handlers[type] = []
|
61
|
+
end
|
62
|
+
|
63
|
+
@handlers[type] << UserHandler.new(filter, func)
|
64
|
+
end
|
65
|
+
|
66
|
+
def message_handler(filter, func)
|
67
|
+
add_handler(filter, func, type: VkCozy::UserEventType::MESSAGE_NEW)
|
68
|
+
end
|
69
|
+
|
70
|
+
def handler(filter, func)
|
71
|
+
add_handler(filter, func)
|
38
72
|
end
|
39
73
|
end
|
40
74
|
end
|
@@ -25,7 +25,7 @@ module VkCozy
|
|
25
25
|
|
26
26
|
define :VIDEO_NEW, 'video_new'
|
27
27
|
|
28
|
-
|
28
|
+
define :VIDEO_COMMENT_NEW, 'video_comment_new'
|
29
29
|
define :VIDEO_COMMENT_EDIT, 'video_comment_edit'
|
30
30
|
define :VIDEO_COMMENT_RESTORE, 'video_comment_restore'
|
31
31
|
|
@@ -53,12 +53,22 @@ module VkCozy
|
|
53
53
|
VkCozy::UserEventType::RESET_MESSAGE_FLAGS => [MSGID, 'mask'] + MESSAGE_EXTRA_FIELDS,
|
54
54
|
VkCozy::UserEventType::MESSAGE_NEW => [MSGID, 'flags'] + MESSAGE_EXTRA_FIELDS,
|
55
55
|
VkCozy::UserEventType::MESSAGE_EDIT => [MSGID, 'mask'] + MESSAGE_EXTRA_FIELDS,
|
56
|
+
|
56
57
|
VkCozy::UserEventType::IN_READ => ['peer_id', 'local_id'],
|
57
58
|
VkCozy::UserEventType::OUT_READ => ['peer_id', 'local_id'],
|
59
|
+
|
58
60
|
VkCozy::UserEventType::FRIEND_ONLINE => ['user_id', 'extra', 'timestamp'],
|
59
61
|
VkCozy::UserEventType::FRIEND_OFFLINE => ['user_id', 'flags', 'timestamp'],
|
60
|
-
|
62
|
+
|
63
|
+
VkCozy::UserEventType::CHAT_EDIT => ['chat_id', 'self'],
|
64
|
+
VkCozy::UserEventType::CHAT_INFO_EDIT => ['type_id', 'peer_id', 'info'],
|
65
|
+
|
66
|
+
VkCozy::UserEventType::DIALOG_TYPING_STATE => ['user_id', 'flags'],
|
67
|
+
VkCozy::UserEventType::CHAT_TYPING_STATE => ['user_id', 'chat_id'],
|
68
|
+
|
69
|
+
VkCozy::UserEventType::COUNTER => ['count']
|
61
70
|
}
|
71
|
+
|
62
72
|
PARSE_PEER_ID_EVENTS = EVENT_ATTRS_MAPPING.map{|k, v| if v.include?('peer_id') then k end}.select{ |i| not i.nil? }
|
63
73
|
PARSE_MESSAGE_FLAGS_EVENTS = [
|
64
74
|
VkCozy::UserEventType::REPLACE_MESSAGE_FLAGS,
|
data/lib/vk_cozy.rb
CHANGED
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.3.
|
4
|
+
version: 0.3.9
|
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-
|
11
|
+
date: 2022-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: inum
|
@@ -52,7 +52,8 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
-
description:
|
55
|
+
description: vk_cozy является фреймворком для vk api, имеет удобные хэндлеры и фильтры,
|
56
|
+
создан чтобы упростить разработку ботов для вк
|
56
57
|
email: googloldanil@gmail.com
|
57
58
|
executables: []
|
58
59
|
extensions: []
|
@@ -62,6 +63,10 @@ files:
|
|
62
63
|
- lib/vk_cozy.rb
|
63
64
|
- lib/vk_cozy/api/api.rb
|
64
65
|
- lib/vk_cozy/bot.rb
|
66
|
+
- lib/vk_cozy/dev/keyboard/action.rb
|
67
|
+
- lib/vk_cozy/dev/keyboard/button.rb
|
68
|
+
- lib/vk_cozy/dev/keyboard/color.rb
|
69
|
+
- lib/vk_cozy/dev/keyboard/keyboard.rb
|
65
70
|
- lib/vk_cozy/dispatch/views/bot/event.rb
|
66
71
|
- lib/vk_cozy/dispatch/views/user/event.rb
|
67
72
|
- lib/vk_cozy/framework/labeler/bot.rb
|
@@ -84,7 +89,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
84
89
|
requirements:
|
85
90
|
- - ">="
|
86
91
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
92
|
+
version: 2.7.0
|
88
93
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
94
|
requirements:
|
90
95
|
- - ">="
|
@@ -94,5 +99,5 @@ requirements: []
|
|
94
99
|
rubygems_version: 3.3.7
|
95
100
|
signing_key:
|
96
101
|
specification_version: 4
|
97
|
-
summary:
|
102
|
+
summary: vk_cozy framework for vk-api
|
98
103
|
test_files: []
|