vk_longpoll_bot 0.0.2 → 0.1.0

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: ab59094826eca3cea219fd579f9a63d291b0343238e7d88b4b9bb7da846c6e0f
4
- data.tar.gz: d42e7c1f0a992b8a351a0e9d0c1ca8420f8d606c2bcb07a873b51cae1baaf328
3
+ metadata.gz: f6b0cfc136c4a32241d516da8a4a93ddca2233cfbe78110585191c891d7f7f37
4
+ data.tar.gz: ea9f81876c642fd066bfce3eb548b28979812f5296cfa52106db311f519db628
5
5
  SHA512:
6
- metadata.gz: 10bcf660164a69e17770bd8c759dd203ffd151bca8a414345f5d48a332281995302e8d683e763a59c670a68df19b1d46dc5a60ecf9eb44b31baba7d44621ee5b
7
- data.tar.gz: 477feb6290788606b9ad0703a9e3afede488db7e855643aad1494ef3aae08d7511d0c6520607f916de2deb9d6643a12fdf42cdf62db702a242539ca960e9cd51
6
+ metadata.gz: d7338044936b97bceb6f0d293f9d81b4f39634a268ae336177eb4c44c2bb43defcbf976e0b467edee2f12f12be5df1a662789737e7b1a1750e0ff124e1201209
7
+ data.tar.gz: 1943ef424b8aa3c9c0836aa1f3a56f663f89bd5b026cd38a816a3db6154175c7ebec82da48a360eb819bff702c0def6582822f6b753eb6306f18eaa801c08282
@@ -0,0 +1,8 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.5.5
7
+ before_install: gem install bundler -v 2.0.2
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in vk_longpoll_bot.gemspec
4
+ gemspec
5
+
6
+ gem "json", "~> 2.2"
@@ -0,0 +1,25 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ vk_longpoll_bot (0.1.0)
5
+ json (~> 2.2.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ json (2.2.0)
11
+ minitest (5.12.0)
12
+ rake (10.5.0)
13
+
14
+ PLATFORMS
15
+ x64-mingw32
16
+
17
+ DEPENDENCIES
18
+ bundler (~> 2.0)
19
+ json (~> 2.2)
20
+ minitest (~> 5.0)
21
+ rake (~> 10.0)
22
+ vk_longpoll_bot!
23
+
24
+ BUNDLED WITH
25
+ 2.0.2
data/README.md CHANGED
@@ -1,5 +1,37 @@
1
- # vk-longpoll-bot-rb
2
- Ruby library to create VK longpoll bot
3
-
4
- ## Usage
5
- See examples in *example/*
1
+ # VkLongpollBot
2
+
3
+ This small gem provides interface to work with VK API and create simple longpoll bot for group.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'vk_longpoll_bot'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install vk_longpoll_bot
20
+
21
+ ## Usage
22
+
23
+ You can find usage examples in `example` folder.
24
+
25
+ ## Development
26
+
27
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
28
+
29
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
30
+
31
+ ## Contributing
32
+
33
+ Bug reports and pull requests are welcome on GitHub at https://github.com/fizvlad/vk-longpoll-bot-rb.
34
+
35
+ ## License
36
+
37
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -1,24 +1,10 @@
1
- GEM_NAME = "vk_longpoll_bot"
2
-
3
- desc "Build gem file"
4
- task :build do
5
- puts `gem build #{GEM_NAME}.gemspec`
6
- end
7
-
8
- desc "Uninstall gem"
9
- task :uninstall do
10
- puts `gem uninstall #{GEM_NAME}`
11
- end
12
-
13
- desc "Build and install gem"
14
- task :install_local => :build do
15
- puts `gem install ./#{GEM_NAME}-*.gem`
16
- end
17
-
18
- desc "Setup SSL certificate"
19
- task :setup_ssl do
20
- print "Path to SSL certificate (leave empty if there is no troubles with SSL):"
21
- ssl_cert_path = STDIN.gets.chomp
22
- puts
23
- ENV["SSL_CERT_FILE"] = ssl_cert_path
24
- end
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "vk_longpoll_bot"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,42 @@
1
+ $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
2
+
3
+ require "vk_music" # See https://rubygems.org/gems/vk_music
4
+
5
+ require "vk_longpoll_bot"
6
+ include VkLongpollBot
7
+
8
+ bot = Bot.new(ARGV[0], ARGV[1])
9
+
10
+ bot.on_start { puts "Starting bot." }
11
+ bot.on_finish { puts "Finishing bot." }
12
+
13
+ bot.on(subtype: "message_new") do |event|
14
+ next unless event["attachments"] && event["body"].chomp == "id"
15
+ reply = []
16
+ event["attachments"].each do |att|
17
+ if att["type"] == "audio"
18
+ audio = VkMusic::Audio.new(
19
+ artist: att["audio"]["artist"],
20
+ id: att["audio"]["id"],
21
+ owner_id: att["audio"]["owner_id"],
22
+ title: att["audio"]["title"],
23
+ url: att["audio"]["url"],
24
+ duration: att["audio"]["duration"]
25
+ )
26
+
27
+ puts audio
28
+ reply << "#{audio.owner_id}_#{audio.id}"
29
+ end
30
+ end
31
+
32
+ bot.send_message(event["user_id"], reply.join("\n")) unless reply.empty?
33
+ end
34
+
35
+ bot.on(subtype: "message_new") do |event|
36
+ if event["body"].chomp == "stop"
37
+ bot.send_message(event["user_id"], "Shutting down")
38
+ bot.stop
39
+ end
40
+ end
41
+
42
+ bot.run
@@ -0,0 +1,29 @@
1
+ $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
2
+
3
+ require "vk_longpoll_bot"
4
+ include VkLongpollBot
5
+
6
+ bot = Bot.new(ARGV[0], ARGV[1])
7
+
8
+ bot.on_start { puts "Starting bot." }
9
+ bot.on_finish { puts "Finishing bot." }
10
+
11
+ bot.on(subtype: "message_typing_state") do |event|
12
+ puts "#{event["from_id"]} is typing message"
13
+ end
14
+
15
+ bot.on(subtype: "message_new") do |event|
16
+ puts "Got message from #{event["user_id"]}: #{event["body"]}"
17
+ bot.send_message(event["user_id"], "I got your message")
18
+
19
+ if event["attachments"]
20
+ puts "And it got attachments! #{event["attachments"]}"
21
+ end
22
+
23
+ if event["body"].chomp == "stop"
24
+ bot.send_message(event["user_id"], "Shutting down")
25
+ bot.stop
26
+ end
27
+ end
28
+
29
+ bot.run
@@ -0,0 +1,37 @@
1
+ $LOAD_PATH.unshift File.expand_path("../../lib", __dir__)
2
+
3
+ require "vk_longpoll_bot"
4
+ include VkLongpollBot
5
+
6
+ PREFIX = ">"
7
+
8
+ bot = Bot.new(ARGV[0], ARGV[1], api_version: "5.74")
9
+
10
+ bot.on_start do
11
+ puts "Starting bot."
12
+ bot.enable_online
13
+ end
14
+ bot.on_finish do
15
+ puts "Finishing bot."
16
+ bot.disable_online
17
+ end
18
+
19
+ bot.on(subtype: "message_new") do |event|
20
+ puts "Got message from #{event["user_id"]}: #{event["body"].chomp}"
21
+ next unless event["body"].start_with?(PREFIX)
22
+ command = event["body"].chomp.sub(PREFIX, "")
23
+
24
+ case command
25
+ when "help"
26
+ bot.send_message(event["user_id"], "Available commands: \n* help - show this message\n* answer - answer message\n* exit, stop - shut down")
27
+ when "answer"
28
+ bot.send_message(event["user_id"], "Answering")
29
+ when "exit", "stop"
30
+ bot.send_message(event["user_id"], "Shutting down")
31
+ bot.stop
32
+ else
33
+ bot.send_message(event["user_id"], "Unknwon command")
34
+ end
35
+ end
36
+
37
+ bot.run
@@ -1,6 +1,11 @@
1
- require_relative "vk_longpoll_bot/utility.rb"
2
- require_relative "vk_longpoll_bot/constants.rb"
3
- require_relative "vk_longpoll_bot/exceptions.rb"
4
- require_relative "vk_longpoll_bot/request.rb"
5
- require_relative "vk_longpoll_bot/bot.rb"
6
- require_relative "vk_longpoll_bot/events.rb"
1
+ require "vk_longpoll_bot/utility"
2
+ require "vk_longpoll_bot/constants"
3
+ require "vk_longpoll_bot/exceptions"
4
+ require "vk_longpoll_bot/request"
5
+ require "vk_longpoll_bot/bot"
6
+ require "vk_longpoll_bot/events"
7
+ require "vk_longpoll_bot/version"
8
+
9
+ ##
10
+ # Main module.
11
+ module VkLongpollBot; end
@@ -1,96 +1,139 @@
1
1
  module VkLongpollBot
2
2
 
3
+ ##
3
4
  # Main class, which contains all the methods of bot.
4
5
  class Bot
5
6
 
6
- # Every bot stores id of group it operates and hash of event listeners.
7
- attr_reader :id, :event_listeners
7
+ ##
8
+ # @return [Integer] group ID.
9
+ attr_reader :id
10
+
11
+ ##
12
+ # @return [Hash<Symbol, Array<EventListener>>] hash with listeners for each of event type.
13
+ attr_reader :event_listeners
8
14
 
9
- # Initialize bot. This method don't run longpoll.
15
+ ##
16
+ # Initialize bot. This method don't start longpoll session.
17
+ #
18
+ # @param access_token [String] group access token.
19
+ # @param group_id [Integer] group of associated ID.
20
+ # @param options [Hash]
10
21
  #
11
- # <tt>options</tt> hash can contain following keys:
12
- # * <tt>:api_version</tt> - version of api to use
13
- # * <tt>:longpoll_wait</tt> - longpoll requests timeout
14
- def initialize(access_token, id, options = {})
22
+ # @option options [Gem::Version, String] api_version (VK_API_URL_BASE) version of VK API.
23
+ # @option options [Integer] longpoll_wait longpoll (LONGPOLL_STANDART_WAIT) requests timeout.
24
+ def initialize(access_token, group_id, options = {})
15
25
  @event_listeners = Hash.new { |hash, key| hash[key] = Array.new }
16
26
  @on_start = []
17
27
  @on_finish = []
18
28
 
19
- @access_token = access_token
20
- @id = id
29
+ @access_token = access_token.to_s
30
+ @id = group_id.to_i
21
31
 
22
32
  @api_version = options[:api_version] || VK_API_CURRENT_VERSION
23
33
  @longpoll_wait = options[:longpoll_wait] || LONGPOLL_STANDART_WAIT
24
34
 
25
35
  @longpoll = {}
26
-
27
- # TODO
28
36
  end
29
37
 
30
- # =========================================================================
31
- # SOME API METHODS
32
- # =========================================================================
38
+ ##
39
+ # @! group API methods
33
40
 
34
- # Call for api method with given parameters.
41
+ ##
42
+ # Call for API method.
43
+ #
44
+ # @param method_name ["String"] name of requested method. See https://vk.com/dev/methods
45
+ #
46
+ # @return [Hash]
35
47
  def api(method_name, parameters = {})
36
48
  Request.api(method_name, parameters, @access_token, @api_version)
37
49
  end
38
50
 
39
- # Send message to <tt>target</tt> with provided <tt>content</tt>.
40
- def send_message(target, content)
51
+ ##
52
+ # Send text message.
53
+ #
54
+ # @param target [Integer] ID of receiver.
55
+ # @param content [String] text of message.
56
+ # @param options [Hash] additional options which must be sent with request.
57
+ # Options +user_id+, +message+ and +random_id+ will be overwritten
58
+ #
59
+ # @return [Hash]
60
+ def send_message(target, content, options = {})
41
61
  target_id = target.to_i
42
- random_id = Utility.random_id(target_id)
43
- api("messages.send", user_id: target_id, message: content, random_id: random_id)
62
+ forced_options = {
63
+ user_id: target_id,
64
+ message: content,
65
+ random_id: Utility.random_id(target_id)
66
+ }
67
+ api("messages.send", options.merge(forced_options))
44
68
  end
45
69
 
70
+ ##
46
71
  # Enable group online status
47
- def enable_online(gid = @id)
72
+ #
73
+ # @return [nil]
74
+ def enable_online
48
75
  begin
49
- api("groups.enableOnline", group_id: gid)
76
+ api("groups.enableOnline", group_id: @id)
50
77
  rescue
51
78
  # Online is already enabled
52
79
  end
80
+ nil
53
81
  end
54
82
 
83
+ ##
55
84
  # Disable group online status
56
- def disable_online(gid = @id)
85
+ #
86
+ # @return [nil]
87
+ def disable_online
57
88
  begin
58
- api("groups.disableOnline", group_id: gid)
89
+ api("groups.disableOnline", group_id: @id)
59
90
  rescue
60
91
  # Online is already disabled
61
92
  end
93
+ nil
62
94
  end
63
95
 
64
- # TODO: Which methods are also addable here?
65
-
66
- # =========================================================================
67
- # EVENTS
68
- # =========================================================================
96
+ ##
97
+ # @!endgroup
98
+
99
+ ##
100
+ # @!group Events
69
101
 
70
- # Add event listener.
102
+ ##
103
+ # Add new event listener.
104
+ #
105
+ # @param options [Hash]
106
+ #
107
+ # @option options [String] subtype
108
+ #
109
+ # @yieldparam event [Event]
71
110
  #
72
- # <tt>attributes</tt> hash can contain following keys:
73
- # * <tt>:subtype</tt> - event subtype. All of event types and subtypes are stated in Events::TYPES
74
- def on(attributes, &block)
75
- raise ArgumentError.new("Got subtype #{attributes[:subtype]} of class #{attributes[:subtype].class}") unless String === attributes[:subtype] && Events.valid_subtype?(attributes[:subtype])
76
- @event_listeners[attributes[:subtype]] << Events::EventListener.new(attributes, &block)
111
+ # @return [nil]
112
+ def on(options, &block)
113
+ raise ArgumentError.new("Got subtype #{options[:subtype]} of class #{options[:subtype].class}") unless String === options[:subtype] && Events.valid_subtype?(options[:subtype])
114
+ @event_listeners[options[:subtype]] << Events::EventListener.new(options, &block)
115
+ nil
77
116
  end
78
117
 
118
+ ##
79
119
  # Add code to be executed right after bot starts.
80
120
  def on_start(&block)
81
121
  @on_start << block
82
122
  end
83
123
 
124
+ ##
84
125
  # Add code to be executed right after bot finishes.
85
126
  def on_finish(&block)
86
127
  @on_finish << block
87
128
  end
129
+
130
+ ##
131
+ # @!endgroup
88
132
 
89
- # =========================================================================
90
- # RUNNING AND STOPPING BOT
91
- # =========================================================================
92
-
93
- # Start bot. This methods freeze current thread until <tt>stop</tt> called.
133
+ ##
134
+ # Start bot. This methods freeze current thread until {Bot#stop} method is called.
135
+ #
136
+ # @return [void]
94
137
  def run
95
138
  @on_start.each(&:call)
96
139
 
@@ -100,18 +143,16 @@ module VkLongpollBot
100
143
  @on_finish.each(&:call)
101
144
  end
102
145
 
146
+ ##
103
147
  # Stop bot.
148
+ #
149
+ # @return [void]
104
150
  def stop
105
151
  @finish_flag = true
106
152
  end
107
153
 
108
- # =========================================================================
109
- private
110
- # =========================================================================
111
154
 
112
- # =========================================================================
113
- # LONGPOLL
114
- # =========================================================================
155
+ private
115
156
 
116
157
  # Request longpoll data.
117
158
  def init_longpoll
@@ -121,14 +162,13 @@ module VkLongpollBot
121
162
  @longpoll[:ts] = lp["ts"]
122
163
  end
123
164
 
124
- # Start longpoll. Requires <tt>init_longpoll</tt> to be run first.
165
+ # Start longpoll. Requires +init_longpoll+ to be run first.
125
166
  def run_longpoll
126
167
  @finish_flag = false # Setting up flag for loop
127
168
 
128
169
  until @finish_flag
129
- response = Request.longpoll(@longpoll[:server], @longpoll[:key], @longpoll[:ts], @longpoll_wait) # TODO
170
+ response = Request.longpoll(@longpoll[:server], @longpoll[:key], @longpoll[:ts], @longpoll_wait)
130
171
  if response["failed"]
131
- # Error happened
132
172
  Utility.warn "Longpoll failed with code #{response["failed"]}. This must be solvable. Keep running..."
133
173
  case response["failed"]
134
174
  when 1
@@ -150,10 +190,6 @@ module VkLongpollBot
150
190
  end
151
191
  end
152
192
  end
153
-
154
- # =========================================================================
155
- # EVENTS
156
- # =========================================================================
157
193
 
158
194
  # Handle update from longpoll.
159
195
  def update_handler(update)
@@ -1,12 +1,15 @@
1
1
  module VkLongpollBot
2
2
 
3
+ ##
3
4
  # Base of URL to API.
4
5
  VK_API_URL_BASE = "https://api.vk.com"
5
6
 
7
+ ##
6
8
  # It's recommended to use last version of VK API.
7
9
  VK_API_CURRENT_VERSION = Gem::Version.new("5.101")
8
10
 
11
+ ##
9
12
  # Longpoll requests timeout.
10
13
  LONGPOLL_STANDART_WAIT = 25
11
14
 
12
- end
15
+ end
@@ -1,14 +1,16 @@
1
1
  module VkLongpollBot
2
2
 
3
+ ##
3
4
  # Everything related to longpoll events.
4
5
  module Events
5
6
 
6
- # All the types and subtypes of events
7
+ ##
8
+ # All the types and subtypes of events.
7
9
  TYPES = {
8
10
  message: %w{message_new message_reply message_edit message_typing_state message_allow message_deny},
9
11
  photo: %w{photo_new photo_comment_new photo_comment_edit photo_comment_restore photo_comment_delete},
10
12
  audio: %w{audio_new},
11
- video: %w{video_new video_comment_new video_comment_restore video_comment_delete},
13
+ video: %w{video_new video_comment_new video_comment_edit video_comment_restore video_comment_delete},
12
14
  wall: %w{wall_post_new wall_repost wall_reply_new wall_reply_edit wall_reply_restore wall_reply_delete},
13
15
  board: %w{board_post_new board_post_edit board_post_restore board_post_delete},
14
16
  market: %w{market_comment_new market_comment_edit market_comment_restore market_comment_delete},
@@ -19,16 +21,41 @@ module VkLongpollBot
19
21
  app: %w{app_payload}
20
22
  }
21
23
 
24
+ ##
25
+ # Check whether subtype is correct.
26
+ #
27
+ # @param subtype [String]
22
28
  def self.valid_subtype?(subtype)
23
29
  TYPES.values.any? { |arr| arr.include?(subtype) }
24
30
  end
25
31
 
26
- # Class containing data recieved from longpoll. Provides easy update to it's data.
32
+ ##
33
+ # Class containing data received from longpoll. Provides easy access to it's data.
27
34
  class Event
28
35
 
29
- attr_reader :subtype, :group_id, :data, :bot
36
+ ##
37
+ # @return [String] subtype of event.
38
+ attr_reader :subtype
39
+
40
+ ##
41
+ # @return [Integer] ID of group which received event.
42
+ attr_reader :group_id
43
+
44
+ ##
45
+ # @return [Hash] hash with updates data.
46
+ attr_reader :data
47
+
48
+ ##
49
+ # @return [Bot] longpoll bot which received event.
50
+ attr_reader :bot
30
51
 
31
- # Initialize from fields of update json and bot which got this event.
52
+ ##
53
+ # New event. Initialize from fields of update json and bot which got this event.
54
+ #
55
+ # @param subtype [String]
56
+ # @param data [Hash] +update+ array entry.
57
+ # @param group_id [Integer]
58
+ # @param bot [Bot]
32
59
  def initialize(subtype, data, group_id, bot)
33
60
  @subtype = subtype.to_s
34
61
  @data = data
@@ -36,37 +63,61 @@ module VkLongpollBot
36
63
  @bot = bot
37
64
  end
38
65
 
66
+ ##
39
67
  # Provides access to fields of update data.
68
+ #
69
+ # @param arg [String] hash key.
70
+ #
71
+ # @return [Object]
40
72
  def [](arg)
41
73
  @data[arg.to_s]
42
74
  end
43
-
44
- # TODO
45
75
 
46
76
  end
47
77
 
48
78
  # NOTE: It might be better to create separate class for each event but there's lot of them and they don't have good hierarchy.
49
79
 
80
+ ##
50
81
  # Class containing block to run on some event.
51
82
  class EventListener
52
83
 
84
+ ##
85
+ # @return [String] subtype of this listener.
53
86
  attr_reader :subtype
54
87
 
55
- def initialize(attributes, &block)
56
- @subtype = attributes[:subtype]
88
+ ##
89
+ # Initialize new listener
90
+ #
91
+ # @param options[Hash]
92
+ #
93
+ # @option options [String] subtype
94
+ #
95
+ # @yieldparam event [Event]
96
+ def initialize(options, &block)
97
+ @subtype = options[:subtype]
57
98
  @block = block
58
-
59
- # TODO
60
99
  end
61
100
 
101
+ ##
102
+ # Calls block with given event as argument.
103
+ #
104
+ # @param event [Event]
105
+ #
106
+ # @return [void]
62
107
  def call(event)
63
108
  @block.call(event)
64
109
  end
65
110
 
66
- # TODO
67
-
68
111
  end
69
112
 
70
113
  end
71
114
 
72
- end
115
+ ##
116
+ # Alias for {Events::Event} class
117
+ Event = Events::Event
118
+
119
+ ##
120
+ # Alias for {Events::EventListener} class
121
+ EventListener = Events::EventListener
122
+
123
+ end
@@ -1,8 +1,10 @@
1
1
  module VkLongpollBot
2
2
 
3
+ ##
3
4
  # Custom exceptions.
4
5
  module Exceptions
5
6
 
7
+ ##
6
8
  # All of the error codes descriptions. Source: https://vk.com/dev/errors
7
9
  CODES = {
8
10
  1 => "Произошла неизвестная ошибка.",
@@ -54,35 +56,48 @@ module VkLongpollBot
54
56
  940 => "Слишком много постов в сообщении."
55
57
  }
56
58
 
59
+ ##
57
60
  # Something wrong with response from vk.com.
58
61
  class ResponseError < RuntimeError
59
62
  end
60
63
 
64
+ ##
61
65
  # API error. Must have some code and description.
62
66
  class APIError < ResponseError
63
67
 
64
68
  attr_reader :error
65
69
 
70
+ ##
71
+ # Create new instance.
72
+ #
73
+ # @param error [Hash] response hash which contains "error" key.
66
74
  def initialize(error)
67
75
  @error = error["error"]
68
76
  super("#{code}: #{included_message}")
69
77
  end
70
78
 
79
+ ##
80
+ # @return [Integer]
71
81
  def code
72
82
  @error["error_code"]
73
83
  end
74
84
 
85
+ ##
86
+ # @return [String] attached error description.
75
87
  def included_message
76
88
  @error["error_msg"]
77
89
  end
78
90
 
91
+ ##
92
+ # @return [String] error description from API documentation.
79
93
  def description
80
94
  CODES[code]
81
95
  end
82
96
 
83
97
  end
84
98
 
85
- # Something wrong in longpoll response.
99
+ ##
100
+ # Something wrong with longpoll response.
86
101
  class LongpollError < ResponseError
87
102
  end
88
103
 
@@ -3,16 +3,30 @@ require "json"
3
3
 
4
4
  module VkLongpollBot
5
5
 
6
- # Some functions to send HTTP requests
6
+ ##
7
+ # Some functions to send HTTP requests.
7
8
  module Request
8
9
 
9
- # Regular HTTP request to given URI.
10
+ ##
11
+ # Regular GET HTTP request to given URI.
12
+ #
13
+ # @param url [String]
14
+ #
15
+ # @return [String]
10
16
  def self.to(url)
11
17
  uri = URI(url.to_s)
12
18
  Net::HTTP.get(uri)
13
19
  end
14
20
 
15
- # Request to api.
21
+ ##
22
+ # GET request to VK API.
23
+ #
24
+ # @param method_name [String, Symbol]
25
+ # @param parameters [Hash]
26
+ # @param access_token [String]
27
+ # @param v [Gem::Version, String] VK API version.
28
+ #
29
+ # @return [Hash]
16
30
  def self.api(method_name, parameters, access_token, v = VK_API_CURRENT_VERSION)
17
31
  response = JSON.parse self.to("#{VK_API_URL_BASE}/method/#{method_name}?access_token=#{access_token}&v=#{v.to_s}&#{URI.encode_www_form(parameters)}")
18
32
  if response["response"]
@@ -24,11 +38,19 @@ module VkLongpollBot
24
38
  end
25
39
  end
26
40
 
27
- # Request to longpoll server.
41
+ ##
42
+ # GET request to longpoll server.
43
+ #
44
+ # @param server [String] server address.
45
+ # @param key [String] secret session key.
46
+ # @param ts [Integer] index of last event.
47
+ # @param wait [Integer] size of request timeout in seconds.
48
+ #
49
+ # @return [Hash] hash with timestamp of last event and array of updates.
28
50
  def self.longpoll(server, key, ts, wait = LONGPOLL_STANDART_WAIT)
29
51
  JSON.parse self.to("#{server}?act=a_check&key=#{key}&ts=#{ts}&wait=#{wait}")
30
52
  end
31
53
 
32
54
  end
33
55
 
34
- end
56
+ end
@@ -1,9 +1,11 @@
1
1
  module VkLongpollBot
2
2
 
3
- # Module with some utility methods.
3
+ ##
4
+ # Some utility methods.
4
5
  module Utility
5
6
 
6
- # Log warning.
7
+ ##
8
+ # Log warning message.
7
9
  def self.warn(msg)
8
10
  if defined?(Warning.warn)
9
11
  Warning.warn msg
@@ -12,7 +14,14 @@ module VkLongpollBot
12
14
  end
13
15
  end
14
16
 
15
- # Generate <tt>random_id</tt> for message.
17
+ ##
18
+ # Generate +random_id+ for message.
19
+ #
20
+ # This method generates random numerical ID based on current time, receiver ID and random salt.
21
+ #
22
+ # @param target_id [Integer] ID of message receiver.
23
+ #
24
+ # @return [Integer]
16
25
  def self.random_id(target_id)
17
26
  (rand(1000) * target_id * Time.now.to_f * 1000).to_i % 2**32
18
27
  end
@@ -0,0 +1,7 @@
1
+ module VkLongpollBot
2
+
3
+ ##
4
+ # Library version.
5
+ VERSION = "0.1.0"
6
+
7
+ end
@@ -1,16 +1,36 @@
1
- Gem::Specification.new do |s|
2
- s.name = "vk_longpoll_bot"
3
- s.summary = "Provides interface to create simple VK longpoll bot"
4
- s.description = "Library to work with VK API and create simple longpoll bot for group."
5
- s.version = "0.0.2"
6
- s.author = "Kuznetsov Vladislav"
7
- s.email = "fizvlad@mail.ru"
8
- s.homepage = "https://github.com/fizvlad/vk-longpoll-bot-rb"
9
- s.platform = Gem::Platform::RUBY
10
- s.required_ruby_version = ">=2.3.1"
11
- s.files = Dir[ "lib/**/**", "example/**/**", "LICENSE", "Rakefile", "README.md", "vk_longpoll_bot.gemspec" ]
12
- s.license = "MIT"
13
-
14
- s.add_runtime_dependency "rake", "~>12.3"
15
- s.add_runtime_dependency "json", "~>2.2"
16
- end
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "vk_longpoll_bot/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "vk_longpoll_bot"
7
+ spec.version = VkLongpollBot::VERSION
8
+ spec.authors = ["Fizvlad"]
9
+ spec.email = ["fizvlad@mail.ru"]
10
+
11
+ spec.summary = "Provides interface to create simple VK longpoll bot"
12
+ spec.description = "Library to work with VK API and create simple longpoll bot for group."
13
+ spec.homepage = "https://github.com/fizvlad/vk-longpoll-bot-rb"
14
+ spec.license = "MIT"
15
+
16
+ spec.required_ruby_version = ">=2.3.1"
17
+
18
+ spec.metadata["homepage_uri"] = spec.homepage
19
+ spec.metadata["source_code_uri"] = "https://github.com/fizvlad/vk-longpoll-bot-rb"
20
+ spec.metadata["changelog_uri"] = "https://github.com/fizvlad/vk-longpoll-bot-rb/releases"
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
25
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ end
27
+ spec.bindir = "exe"
28
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ["lib"]
30
+
31
+ spec.add_runtime_dependency "json", "~> 2.2.0"
32
+
33
+ spec.add_development_dependency "bundler", "~> 2.0"
34
+ spec.add_development_dependency "rake", "~> 10.0"
35
+ spec.add_development_dependency "minitest", "~> 5.0"
36
+ end
metadata CHANGED
@@ -1,52 +1,90 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vk_longpoll_bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
- - Kuznetsov Vladislav
7
+ - Fizvlad
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2019-07-20 00:00:00.000000000 Z
11
+ date: 2019-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rake
14
+ name: json
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '12.3'
19
+ version: 2.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '12.3'
26
+ version: 2.2.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: json
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.2'
34
- type: :runtime
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.0'
62
+ type: :development
35
63
  prerelease: false
36
64
  version_requirements: !ruby/object:Gem::Requirement
37
65
  requirements:
38
66
  - - "~>"
39
67
  - !ruby/object:Gem::Version
40
- version: '2.2'
68
+ version: '5.0'
41
69
  description: Library to work with VK API and create simple longpoll bot for group.
42
- email: fizvlad@mail.ru
70
+ email:
71
+ - fizvlad@mail.ru
43
72
  executables: []
44
73
  extensions: []
45
74
  extra_rdoc_files: []
46
75
  files:
76
+ - ".gitignore"
77
+ - ".travis.yml"
78
+ - Gemfile
79
+ - Gemfile.lock
47
80
  - LICENSE
48
81
  - README.md
49
82
  - Rakefile
83
+ - bin/console
84
+ - bin/setup
85
+ - examples/audio_bot/main.rb
86
+ - examples/chat_bot/main.rb
87
+ - examples/command_bot/main.rb
50
88
  - lib/vk_longpoll_bot.rb
51
89
  - lib/vk_longpoll_bot/bot.rb
52
90
  - lib/vk_longpoll_bot/constants.rb
@@ -54,11 +92,15 @@ files:
54
92
  - lib/vk_longpoll_bot/exceptions.rb
55
93
  - lib/vk_longpoll_bot/request.rb
56
94
  - lib/vk_longpoll_bot/utility.rb
95
+ - lib/vk_longpoll_bot/version.rb
57
96
  - vk_longpoll_bot.gemspec
58
97
  homepage: https://github.com/fizvlad/vk-longpoll-bot-rb
59
98
  licenses:
60
99
  - MIT
61
- metadata: {}
100
+ metadata:
101
+ homepage_uri: https://github.com/fizvlad/vk-longpoll-bot-rb
102
+ source_code_uri: https://github.com/fizvlad/vk-longpoll-bot-rb
103
+ changelog_uri: https://github.com/fizvlad/vk-longpoll-bot-rb/releases
62
104
  post_install_message:
63
105
  rdoc_options: []
64
106
  require_paths:
@@ -74,8 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
116
  - !ruby/object:Gem::Version
75
117
  version: '0'
76
118
  requirements: []
77
- rubyforge_project:
78
- rubygems_version: 2.7.6.2
119
+ rubygems_version: 3.0.4
79
120
  signing_key:
80
121
  specification_version: 4
81
122
  summary: Provides interface to create simple VK longpoll bot