vk 0.0.4 → 0.6.5.53
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 +7 -0
- data/.gitignore +4 -0
- data/.travis.yml +5 -0
- data/Gemfile +5 -1
- data/README.markdown +38 -25
- data/Rakefile +3 -1
- data/bin/console +31 -0
- data/lib/vk.rb +42 -18
- data/lib/vk/access.rb +28 -0
- data/lib/vk/album.rb +30 -0
- data/lib/vk/audio.rb +73 -0
- data/lib/vk/audio/album.rb +9 -0
- data/lib/vk/audio/lyrics.rb +10 -0
- data/lib/vk/base.rb +70 -37
- data/lib/vk/city.rb +14 -4
- data/lib/vk/client.rb +104 -0
- data/lib/vk/client/oauth2.rb +43 -0
- data/lib/vk/country.rb +9 -4
- data/lib/vk/dsl.rb +20 -88
- data/lib/vk/dsl/audio.rb +51 -0
- data/lib/vk/dsl/database.rb +108 -0
- data/lib/vk/dsl/friends.rb +24 -0
- data/lib/vk/dsl/groups.rb +40 -0
- data/lib/vk/dsl/newsfeed.rb +137 -0
- data/lib/vk/dsl/photos.rb +36 -0
- data/lib/vk/dsl/users.rb +34 -0
- data/lib/vk/dsl/wall.rb +24 -0
- data/lib/vk/error.rb +18 -0
- data/lib/vk/exceptions.rb +10 -0
- data/lib/vk/group.rb +47 -0
- data/lib/vk/photo.rb +38 -0
- data/lib/vk/post.rb +6 -12
- data/lib/vk/post/wall.rb +3 -7
- data/lib/vk/prompt.rb +43 -0
- data/lib/vk/region.rb +15 -0
- data/lib/vk/result.rb +85 -0
- data/lib/vk/stats.rb +114 -0
- data/lib/vk/street.rb +17 -0
- data/lib/vk/user.rb +111 -28
- data/lib/vk/version.rb +2 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/vk/client_spec.rb +19 -0
- data/spec/vk_spec.rb +1 -1
- data/vk.gemspec +23 -14
- metadata +191 -30
- data/lib/vk/request.rb +0 -65
- data/spec/vk/request_spec.rb +0 -19
data/lib/vk/city.rb
CHANGED
@@ -2,17 +2,27 @@ require 'vk/base'
|
|
2
2
|
|
3
3
|
module Vk
|
4
4
|
class City < Base
|
5
|
-
self.
|
6
|
-
self.fields = [:cid, :name]
|
5
|
+
self.fields = [:id, :title, :important, :country_id, :region_id, :region, :area]
|
7
6
|
|
7
|
+
# @return [Vk::Country, nil]
|
8
|
+
def country
|
9
|
+
@country ||= Vk::Country.find(country_id) if country_id
|
10
|
+
end
|
11
|
+
|
12
|
+
# @return [Vk::Region, nil]
|
13
|
+
def region
|
14
|
+
@region ||= Vk::Region.find(region_id) if region_id
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [String]
|
8
18
|
def to_s
|
9
|
-
|
19
|
+
title.to_s
|
10
20
|
end
|
11
21
|
|
12
22
|
protected
|
13
23
|
|
14
24
|
def load_data(options = {})
|
15
|
-
@attributes = @attributes.merge(loader.
|
25
|
+
@attributes = @attributes.merge(loader.get_city_by_id(id)) if id
|
16
26
|
end
|
17
27
|
end
|
18
28
|
end
|
data/lib/vk/client.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'vk'
|
3
|
+
require 'vk/prompt'
|
4
|
+
|
5
|
+
require 'digest/md5'
|
6
|
+
require 'uri'
|
7
|
+
require 'net/http'
|
8
|
+
|
9
|
+
require 'active_support/core_ext/object/to_query'
|
10
|
+
require 'active_support/core_ext/object/blank'
|
11
|
+
require 'json'
|
12
|
+
|
13
|
+
module Vk
|
14
|
+
# Class for requesting vk.com api data
|
15
|
+
# @author Alexander Semyonov
|
16
|
+
class Client
|
17
|
+
include Vk::PromptExtension
|
18
|
+
|
19
|
+
SCHEME = 'https'
|
20
|
+
HOST = 'api.vk.com'
|
21
|
+
PATH = '/method/'
|
22
|
+
PORT = 443
|
23
|
+
|
24
|
+
# Generates auth_key for viewer
|
25
|
+
# @param [Fixnum, String] viewer_id viewer’s identifier
|
26
|
+
def self.auth_key(viewer_id)
|
27
|
+
Digest::MD5.hexdigest("#{Vk.app_id}_#{viewer_id}_#{Vk.app_secret}")
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.authenticated?(viewer_id, auth_key)
|
31
|
+
auth_key == self.auth_key(viewer_id)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.dsl!
|
35
|
+
require 'vk/dsl'
|
36
|
+
include Vk::DSL
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [Vk::Client]
|
40
|
+
def self.authenticated!
|
41
|
+
require 'vk/access'
|
42
|
+
return new(ENV['VK_ACCESS_TOKEN']) if ENV['VK_ACCESS_TOKEN']
|
43
|
+
require 'oauth2'
|
44
|
+
token = oauth_client.get_access_token # => OAuth2::AccessToken
|
45
|
+
fail 'No token discovered' unless token.try(:token)
|
46
|
+
prompt.say 'Please run following command now to prevent asking for codes again:'
|
47
|
+
prompt.say
|
48
|
+
prompt.say " export VK_ACCESS_TOKEN=#{token.token}"
|
49
|
+
prompt.say
|
50
|
+
Vk.client.access_token ||= token.token
|
51
|
+
ENV['VK_ACCESS_TOKEN'] ||= token.token
|
52
|
+
Vk.client
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [OAuth2::Client]
|
56
|
+
def self.oauth_client
|
57
|
+
require 'vk/client/oauth2'
|
58
|
+
@oauth_client ||= Vk::Client::OAuth2.new
|
59
|
+
end
|
60
|
+
|
61
|
+
# @param [#to_s] access_token
|
62
|
+
def initialize(access_token = ENV['VK_ACCESS_TOKEN'])
|
63
|
+
@access_token = access_token.to_s
|
64
|
+
end
|
65
|
+
|
66
|
+
def dsl!
|
67
|
+
self.class.dsl!
|
68
|
+
self
|
69
|
+
end
|
70
|
+
|
71
|
+
# @return [String]
|
72
|
+
attr_accessor :access_token
|
73
|
+
|
74
|
+
def request(method_name, data = {})
|
75
|
+
data = data.merge(app_id: Vk.app_id, v: Vk::VK_API)
|
76
|
+
data = data.merge(access_token: access_token) if access_token.present?
|
77
|
+
Vk.logger.info("vk.#{method_name}(#{data.inspect})")
|
78
|
+
http_response = Net::HTTP.post_form(url_for_method(method_name), data).body
|
79
|
+
return unless http_response.present?
|
80
|
+
json_response = JSON.parse(http_response)
|
81
|
+
if json_response['error']
|
82
|
+
Vk.logger.error(json_response['error']['error_msg'])
|
83
|
+
Vk.logger.debug(json_response)
|
84
|
+
raise Vk::Error.new(json_response)
|
85
|
+
end
|
86
|
+
Vk.logger.debug(json_response)
|
87
|
+
json_response['response']
|
88
|
+
end
|
89
|
+
|
90
|
+
# @param [URL::HTTP] method_name
|
91
|
+
def url_for_method(method_name)
|
92
|
+
URI.parse("#{SCHEME}://#{HOST}:#{PORT}#{PATH}#{method_name}")
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
def signature(data)
|
98
|
+
signature = data.keys.sort.inject('') do |result, key|
|
99
|
+
result << "#{key}=#{data[key]}"
|
100
|
+
end << Vk.app_secret
|
101
|
+
Digest::MD5.hexdigest(signature)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'vk'
|
2
|
+
require 'vk/prompt'
|
3
|
+
require 'oauth2'
|
4
|
+
|
5
|
+
module Vk
|
6
|
+
class Client
|
7
|
+
class OAuth2 < ::OAuth2::Client
|
8
|
+
DEFAULT_OAUTH_OPTIONS = {
|
9
|
+
site: 'https://api.vk.com',
|
10
|
+
authorize_url: 'https://oauth.vk.com/authorize',
|
11
|
+
token_url: 'https://oauth.vk.com/access_token'
|
12
|
+
}
|
13
|
+
|
14
|
+
include Vk::PromptExtension
|
15
|
+
|
16
|
+
def initialize(app_id = Vk.app_id, app_secret = Vk.app_secret, options = DEFAULT_OAUTH_OPTIONS)
|
17
|
+
super(app_id, app_secret, options)
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [String]
|
21
|
+
def get_auth_code
|
22
|
+
url = auth_code.authorize_url(
|
23
|
+
redirect_uri: 'https://oauth.vk.com/blank.html',
|
24
|
+
display: 'page',
|
25
|
+
scope: Vk::Access::SCOPES.values.inject(0, :+)
|
26
|
+
)
|
27
|
+
prompt.say 'Open a link and allow access:'
|
28
|
+
prompt.say
|
29
|
+
prompt.say " #{url}"
|
30
|
+
prompt.say
|
31
|
+
prompt.ask('Enter the code from the address of the opened page:')
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [OAuth2::AccessToken]
|
35
|
+
def get_access_token
|
36
|
+
auth_code.get_token(
|
37
|
+
get_auth_code,
|
38
|
+
redirect_uri: 'https://oauth.vk.com/blank.html'
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/vk/country.rb
CHANGED
@@ -2,17 +2,22 @@ require 'vk/base'
|
|
2
2
|
|
3
3
|
module Vk
|
4
4
|
class Country < Base
|
5
|
-
self.
|
6
|
-
self.fields = [:cid, :name]
|
5
|
+
self.fields = [:id, :title]
|
7
6
|
|
7
|
+
# @return [<Vk::Region>]
|
8
|
+
def regions
|
9
|
+
@regions ||= loader.get_regions(id).all
|
10
|
+
end
|
11
|
+
|
12
|
+
# @return [String]
|
8
13
|
def to_s
|
9
|
-
|
14
|
+
title.to_s
|
10
15
|
end
|
11
16
|
|
12
17
|
protected
|
13
18
|
|
14
19
|
def load_data(options = {})
|
15
|
-
@attributes = @attributes.merge(loader.
|
20
|
+
@attributes = @attributes.merge(loader.get_country_by_id(id))
|
16
21
|
end
|
17
22
|
end
|
18
23
|
end
|
data/lib/vk/dsl.rb
CHANGED
@@ -3,93 +3,25 @@ require 'vk'
|
|
3
3
|
|
4
4
|
module Vk
|
5
5
|
module DSL
|
6
|
-
# Have user installed app?
|
7
|
-
# @param [String] uid user’s identifier
|
8
|
-
# @return [Boolean] does user installed app
|
9
|
-
def app_user?(uid)
|
10
|
-
request('isAppUser', uid: uid) == '1'
|
11
|
-
end
|
12
|
-
|
13
|
-
# Profile information for provided uids or domain names
|
14
|
-
# @param [Array<String>] uids array of users’ identifiers in numbers or domain names
|
15
|
-
# @param [Hash] options the options to request profile information
|
16
|
-
# @option options [:uid, :first_name, :last_name, :nickname, :domain, :sex, :bdate, :birthdate, :city, :country, :timezone, :photo, :photo_medium, :photo_big, :has_mobile, :rate, :contacts, :education, :online] :fields ([:uid, :first_name, :last_name]) profile fields to requests
|
17
|
-
# @option options [:nom, :gen, :dat, :acc, :ins, :abl] :name_case (:nom) case of returned names
|
18
|
-
# @return [Array<Hash>] array of user profile data
|
19
|
-
def get_profiles(uids, options = {})
|
20
|
-
uids = Array(uids)
|
21
|
-
if uids.first.to_i == 0
|
22
|
-
options[:domains] = uids.join ','
|
23
|
-
else
|
24
|
-
options[:uids] = uids.join ','
|
25
|
-
end
|
26
|
-
options[:fields] = Array(options[:fields]).join(',') if options.key?(:fields)
|
27
|
-
request('getProfiles', options)
|
28
|
-
end
|
29
|
-
|
30
|
-
def get_profile(uid, options = {})
|
31
|
-
get_profiles(uid, options)[0]
|
32
|
-
end
|
33
|
-
|
34
|
-
## Identifiers of groups in which user participates
|
35
|
-
## @param [Integer] uid user’s identifier
|
36
|
-
## @return [Array] array of group identifiers
|
37
|
-
#def get_groups(uid)
|
38
|
-
#request('getGroups', uid: uid)
|
39
|
-
#end
|
40
|
-
|
41
|
-
# Cities’ names
|
42
|
-
# @param [Array<Fixnum>, Fixnum] cids cities identifiers
|
43
|
-
# @return [Array<Hash>] hash with city identifier and it’s name
|
44
|
-
def get_cities(cids)
|
45
|
-
cids = Array(cids).join(',')
|
46
|
-
request('getCities', cids: cids)
|
47
|
-
end
|
48
|
-
|
49
|
-
def get_city(cid)
|
50
|
-
get_cities(cid)[0]
|
51
|
-
end
|
52
|
-
|
53
|
-
# Countries’ names
|
54
|
-
# @param [Array<Fixnum>, Fixnum] cids cities identifiers
|
55
|
-
# @return [Array<Hash>] hash with city identifier and it’s name
|
56
|
-
def get_countries(cids)
|
57
|
-
cids = Array(cids).join(',')
|
58
|
-
request('getCountries', cids: cids)
|
59
|
-
end
|
60
|
-
|
61
|
-
def get_country(cid)
|
62
|
-
get_countries(cid)[0]
|
63
|
-
end
|
64
|
-
|
65
|
-
# Friends information
|
66
|
-
# @param [Fixnum] uid user identifier
|
67
|
-
# @param [Hash] options
|
68
|
-
# @option options [Array<String>] :fields ([:uid, :first_name, :last_name]) what fields to request
|
69
|
-
# @option options [Fixnum] :count how many friends to request
|
70
|
-
# @option options [Fixnum] :offset offset of friends to request
|
71
|
-
def get_friends(uid, options = {})
|
72
|
-
request('friends.get', options.merge(uid: uid))
|
73
|
-
end
|
74
|
-
|
75
|
-
# Statuses from user’s wall
|
76
|
-
# @param [Fixnum] uid user identifier
|
77
|
-
# @param [Hash] options
|
78
|
-
# @option options [Fixnum] :count how many statuses to request
|
79
|
-
# @option options [Fixnum] :offset offset of statuses to request
|
80
|
-
# @option options [:owner, :others, :all] :filter (:all) what kind of statuses to request
|
81
|
-
# @return [Array<Fixnum, *Hash>] count of statuses and each status in hash
|
82
|
-
def get_wall(uid, options = {})
|
83
|
-
options[:filter] ||= :all
|
84
|
-
request('wall.get', options.merge(owner_id: uid))
|
85
|
-
end
|
86
|
-
|
87
|
-
def get_wall_statuses(posts)
|
88
|
-
request('wall.getById', posts: posts)
|
89
|
-
end
|
90
|
-
|
91
|
-
def get_wall_status(id)
|
92
|
-
get_wall_statuses(id)[0]
|
93
|
-
end
|
94
6
|
end
|
95
7
|
end
|
8
|
+
|
9
|
+
require 'vk/dsl/audio'
|
10
|
+
require 'vk/dsl/database'
|
11
|
+
require 'vk/dsl/friends'
|
12
|
+
require 'vk/dsl/groups'
|
13
|
+
require 'vk/dsl/wall'
|
14
|
+
require 'vk/dsl/photos'
|
15
|
+
require 'vk/dsl/newsfeed'
|
16
|
+
require 'vk/dsl/users'
|
17
|
+
|
18
|
+
module Vk::DSL
|
19
|
+
include Audio
|
20
|
+
include Database
|
21
|
+
include Friends
|
22
|
+
include Groups
|
23
|
+
include Wall
|
24
|
+
include Photos
|
25
|
+
include Newsfeed
|
26
|
+
include Users
|
27
|
+
end
|
data/lib/vk/dsl/audio.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'vk/exceptions'
|
2
|
+
require 'vk/audio'
|
3
|
+
|
4
|
+
module Vk
|
5
|
+
module DSL
|
6
|
+
module Audio
|
7
|
+
AUDIO_SORT = {
|
8
|
+
popularity: 2,
|
9
|
+
duration: 1,
|
10
|
+
date: 0
|
11
|
+
}
|
12
|
+
|
13
|
+
# @param [Integer] owner_id user’s identifier
|
14
|
+
# @param [Hash] options
|
15
|
+
# @option options [Fixnum] :offset
|
16
|
+
# @option options [Fixnum] :count
|
17
|
+
def get_audios(owner_id, options = {})
|
18
|
+
fail NotImplementedError, ':need_user is not supported for audio.get method' if options.key?(:need_user)
|
19
|
+
Vk::Result.new('audio.get', Vk::Audio, options.merge(owner_id: owner_id))
|
20
|
+
end
|
21
|
+
|
22
|
+
# @param [Integer] owner_id user’s identifier
|
23
|
+
# @param [Hash] options
|
24
|
+
# @option options [Fixnum] :offset
|
25
|
+
# @option options [Fixnum] :count
|
26
|
+
def get_audio_albums(owner_id, options = {})
|
27
|
+
Vk::Result.new('audio.getAlbums', Vk::Audio::Album, options.merge(owner_id: owner_id))
|
28
|
+
end
|
29
|
+
|
30
|
+
# @param [Fixnum] lyrics_id
|
31
|
+
# @return [Vk::Audio::Lyrics]
|
32
|
+
def get_lyrics(lyrics_id)
|
33
|
+
Vk::Audio::Lyrics.new(request('audio.getLyrics', {lyrics_id: lyrics_id}))
|
34
|
+
end
|
35
|
+
|
36
|
+
# @param [String] q
|
37
|
+
# @param [Hash] options
|
38
|
+
# @option options [Fixnum] :offset
|
39
|
+
# @option options [Fixnum] :count
|
40
|
+
# @option options [Fixnum] :auto_complete
|
41
|
+
def search_lyrics(q, options = {})
|
42
|
+
options[:auto_complete] = !!options[:auto_complete] ? 1 : 0 if options.key?(:auto_complete)
|
43
|
+
options[:lyrics] = !!options[:lyrics] ? 1 : 0 if options.key?(:lyrics)
|
44
|
+
options[:performer_only] = !!options[:performer_only] ? 1 : 0 if options.key?(:performer_only)
|
45
|
+
options[:sort] = AUDIO_SORT[options[:sort]] if options[:sort].is_a?(Symbol)
|
46
|
+
options[:search_own] = !!options[:search_own] ? 1 : 0 if options.key?(:search_own)
|
47
|
+
Vk::Result.new('audio.search', Vk::Audio, options.merge(q: q))
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'vk/exceptions'
|
2
|
+
|
3
|
+
module Vk
|
4
|
+
module DSL
|
5
|
+
module Database
|
6
|
+
# @param [Hash] options
|
7
|
+
# @option options :need_all [Boolean, 1] load all countries
|
8
|
+
# @option options :code [<String>] country codes to load
|
9
|
+
# @option options :offset [Fixnum] offset for loaded countries
|
10
|
+
# @option options :count [Fixnum] (100) amount of countries to load
|
11
|
+
def get_countries(options = {})
|
12
|
+
options[:need_all] = 1 if options[:need_all]
|
13
|
+
options[:code] = options[:code].join(',') if options[:code]
|
14
|
+
Vk::Result.new('database.getCountries', Vk::Country, options)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Countries’ names
|
18
|
+
# @param [Array<Fixnum>, Fixnum] country_ids cities identifiers
|
19
|
+
# @return [Array<Vk::Country>] array of Vk::Country
|
20
|
+
def get_countries_by_id(country_ids)
|
21
|
+
require 'vk/country'
|
22
|
+
country_ids = Array(country_ids)
|
23
|
+
raise Vk::TooMuchArguments.new('database.getCountriesById', 'country_ids', 1000) if country_ids > 1000
|
24
|
+
request('database.getCountriesById', country_ids: country_ids.join(',')).map do |country|
|
25
|
+
Vk::Country.new(country)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# @param [String] country_id
|
30
|
+
# @return [Vk::Country]
|
31
|
+
def get_country_by_id(country_id)
|
32
|
+
get_countries_by_id(country_id).first
|
33
|
+
end
|
34
|
+
|
35
|
+
alias get_country get_country_by_id
|
36
|
+
|
37
|
+
# @param [Hash] options
|
38
|
+
# @option options :country_id [<String>] required attribute. Country identifier
|
39
|
+
# @option options :q [String] search query
|
40
|
+
# @option options :offset [Fixnum] offset for loaded countries
|
41
|
+
# @option options :count [Fixnum] (100) amount of countries to load
|
42
|
+
# @return [Vk::Result<Vk::Region>]
|
43
|
+
def get_regions(country_id, options = {})
|
44
|
+
if country_id.is_a?(:hash)
|
45
|
+
country_id = options.delete(:country_id) do
|
46
|
+
raise 'No country_id attribute given for database.getRegions'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
require 'vk/region'
|
50
|
+
options[:code] = options[:code].join(',') if options[:code]
|
51
|
+
Vk::Result.new('database.getRegions', Vk::Region, options, country_id: country_id)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Countries’ names
|
55
|
+
# @param [Array<Fixnum>, Fixnum] street_ids cities identifiers
|
56
|
+
# @return [Array<Vk::Country>] array of Vk::Country
|
57
|
+
def get_streets_by_id(street_ids)
|
58
|
+
require 'vk/street'
|
59
|
+
street_ids = Array(street_ids)
|
60
|
+
raise Vk::TooMuchArguments.new('database.getCountriesById', 'street_ids', 1000) if street_ids > 1000
|
61
|
+
request('database.getCountriesById', street_ids: street_ids.join(',')).map do |street|
|
62
|
+
Vk::Street.new(street)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# @param [Fixnum] street_id
|
67
|
+
def get_street_by_id(street_id)
|
68
|
+
get_streets_by_id(street_id).first
|
69
|
+
end
|
70
|
+
|
71
|
+
alias get_street get_street_by_id
|
72
|
+
|
73
|
+
# Cities’ names
|
74
|
+
# @param [Array<Fixnum>, Fixnum] city_ids cities identifiers
|
75
|
+
# @return [Array<Hash>] hash with city identifier and it’s name
|
76
|
+
def get_cities_by_id(city_ids)
|
77
|
+
require 'vk/city'
|
78
|
+
city_ids = Array(city_ids)
|
79
|
+
raise Vk::TooMuchArguments.new('database.getCitiesById', 'city_ids', 1000) if city_ids > 1000
|
80
|
+
request('database.getCitiesById', city_ids: city_ids.join(',')).map do |city|
|
81
|
+
Vk::City.new(city)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# @return [Vk::City]
|
86
|
+
def get_city_by_id(cid)
|
87
|
+
get_cities_by_id(cid).first
|
88
|
+
end
|
89
|
+
|
90
|
+
alias get_city get_city_by_id
|
91
|
+
|
92
|
+
# @param [Hash] options
|
93
|
+
# @option options :country_id [<String>] required attribute. Country identifier
|
94
|
+
# @option options :region_id [<String>] optional attribute. Region identifier
|
95
|
+
# @option options :q [String] search query
|
96
|
+
# @option options :offset [Fixnum] offset for loaded countries
|
97
|
+
# @option options :count [Fixnum] (100) amount of countries to load
|
98
|
+
def get_cities(options = {})
|
99
|
+
require 'vk/city'
|
100
|
+
raise 'No country_id attribute given for database.getRegions' unless options[:country_id]
|
101
|
+
options[:code] = options[:code].join(',') if options[:code]
|
102
|
+
Vk::Result.new('database.getCities', Vk::City, options,
|
103
|
+
country_id: options[:country_id],
|
104
|
+
region_id: options[:region_id])
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|