social 0.0.11 → 0.3.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 +7 -0
- data/README.md +72 -40
- data/lib/social.rb +65 -30
- data/lib/social/balance.rb +1 -14
- data/lib/social/config/ok.rb +16 -18
- data/lib/social/config/vk.rb +15 -17
- data/lib/social/determinant.rb +4 -0
- data/lib/social/determinant/request_param.rb +56 -0
- data/lib/social/determinant/social_prefix.rb +81 -0
- data/lib/social/env.rb +21 -15
- data/lib/social/network.rb +9 -1
- data/lib/social/network/base.rb +60 -9
- data/lib/social/network/graph.rb +1 -40
- data/lib/social/network/graph/ok.rb +1 -5
- data/lib/social/network/graph/ok/base.rb +50 -56
- data/lib/social/network/graph/ok/notification.rb +9 -15
- data/lib/social/network/graph/ok/user.rb +61 -67
- data/lib/social/network/graph/tail.rb +14 -20
- data/lib/social/network/graph/vk.rb +1 -5
- data/lib/social/network/graph/vk/base.rb +27 -33
- data/lib/social/network/graph/vk/notification.rb +11 -17
- data/lib/social/network/graph/vk/user.rb +55 -61
- data/lib/social/network/ok.rb +9 -17
- data/lib/social/network/stub.rb +2 -7
- data/lib/social/network/vk.rb +9 -17
- data/lib/social/version.rb +1 -1
- data/social.gemspec +1 -0
- data/spec/lib/social/ok_api_spec.rb +8 -8
- data/spec/lib/social/vk_api_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -4
- metadata +80 -48
- data/lib/social/auth.rb +0 -4
- data/lib/social/auth/controller.rb +0 -144
- data/lib/social/builder.rb +0 -22
- data/lib/social/cache.rb +0 -26
- data/lib/social/helper.rb +0 -4
- data/lib/social/helper/controller.rb +0 -43
- data/lib/social/helper/model.rb +0 -61
- data/lib/social/network/params.rb +0 -31
- data/lib/social/provider.rb +0 -42
@@ -0,0 +1,81 @@
|
|
1
|
+
class Social::Determinant
|
2
|
+
|
3
|
+
# Класс Rack::Builder'a обеспечивающий
|
4
|
+
# работу подхода social-prefix
|
5
|
+
#
|
6
|
+
# Этот подход заключается в том, что если на сервер
|
7
|
+
# приходит запрос вида /<SOCIAL_PREFIX>/*, где
|
8
|
+
# SOCIAL_PREFIX может принимать значения типа vk, odkl
|
9
|
+
# и п.р.
|
10
|
+
#
|
11
|
+
# Этот подход выполняет 2 задачи
|
12
|
+
#
|
13
|
+
# 1) Обеспечивает содержание в URL для Одноклассников слова odkl
|
14
|
+
# для показа аватаров пользователей, без добавления лишних роутов
|
15
|
+
# в приложение.
|
16
|
+
# 2) Обеспечивает выбор и определение используемой социальной сети
|
17
|
+
# без добавления этой логики в приложение
|
18
|
+
class SocialPrefix < self
|
19
|
+
|
20
|
+
# Класс провайдерa для обеспечения
|
21
|
+
# social-prefix, принимает
|
22
|
+
# prefix от builder'a и подмешивает
|
23
|
+
# social_env в параметры запроса
|
24
|
+
class Provider
|
25
|
+
|
26
|
+
# @param [String]
|
27
|
+
# @return [Class]
|
28
|
+
def self.build(prefix)
|
29
|
+
|
30
|
+
klass = Class.new do
|
31
|
+
|
32
|
+
class << self
|
33
|
+
attr_accessor :prefix
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize(app)
|
37
|
+
@app = app
|
38
|
+
end
|
39
|
+
|
40
|
+
def call(env)
|
41
|
+
request = Rack::Request.new(env)
|
42
|
+
prefix = self.class.prefix
|
43
|
+
type = Social.type_by_prefix(prefix)
|
44
|
+
id = Social.id_by_type(type)
|
45
|
+
|
46
|
+
request.GET['social_env'] = {
|
47
|
+
'prefix' => prefix, 'type' => type, 'id' => id
|
48
|
+
}
|
49
|
+
|
50
|
+
@app.call(request.env)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
klass.prefix = prefix
|
56
|
+
klass
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.produce(app)
|
62
|
+
new do
|
63
|
+
|
64
|
+
map '/' do
|
65
|
+
run app
|
66
|
+
end
|
67
|
+
|
68
|
+
Social.type_prefixes.each_with_index do |prefix, index|
|
69
|
+
|
70
|
+
map '/' + prefix do
|
71
|
+
use Provider.build(prefix)
|
72
|
+
run app
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
data/lib/social/env.rb
CHANGED
@@ -4,29 +4,35 @@ module Social
|
|
4
4
|
include Singleton
|
5
5
|
attr_accessor :id, :type, :prefix
|
6
6
|
|
7
|
+
# Класс объекта определяющего соц.окружения по
|
8
|
+
# параметрам запроса
|
7
9
|
class << self
|
8
10
|
|
9
|
-
def init(
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
instance.
|
14
|
-
instance.type = env[:type]
|
15
|
-
instance.prefix = env[:prefix]
|
11
|
+
def init(social_type)
|
12
|
+
instance.type = social_type
|
13
|
+
instance.id = Social.id_by_type(social_type)
|
14
|
+
instance.prefix = Social.prefix_by_type(social_type)
|
15
|
+
instance.instance_variable_set(:"@inited", true)
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
|
18
|
+
def init_by_params(params)
|
19
|
+
unless social_type = Social.request_social_type(params)
|
20
|
+
raise "Can't find social env in params #{params.inspect}"
|
21
|
+
else
|
22
|
+
init(social_type)
|
23
|
+
end
|
20
24
|
end
|
21
25
|
|
22
|
-
|
23
|
-
instance.type
|
24
|
-
end
|
26
|
+
delegate :id, :type, :prefix, :inited?, to: :instance
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize
|
31
|
+
@inited = false
|
32
|
+
end
|
29
33
|
|
34
|
+
def inited?
|
35
|
+
@inited
|
30
36
|
end
|
31
37
|
|
32
38
|
end
|
data/lib/social/network.rb
CHANGED
data/lib/social/network/base.rb
CHANGED
@@ -1,14 +1,65 @@
|
|
1
|
-
|
2
|
-
module Network
|
3
|
-
module Base
|
1
|
+
class Social::Network::Base
|
4
2
|
|
5
|
-
|
6
|
-
include Social::Network::Params
|
3
|
+
include Singleton
|
7
4
|
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
attr_reader :graph
|
6
|
+
|
7
|
+
def method_missing(name, *args)
|
8
|
+
return @graph[name] if @graph && @graph[name]
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(root, list, params = nil)
|
13
|
+
init_params(params)
|
14
|
+
init_graph_for(root, list)
|
15
|
+
end
|
16
|
+
|
17
|
+
def params
|
18
|
+
@params
|
19
|
+
end
|
20
|
+
|
21
|
+
def params!(params)
|
22
|
+
@params = params
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def param(key)
|
27
|
+
@params[key]
|
28
|
+
end
|
29
|
+
|
30
|
+
def param!(key, value)
|
31
|
+
@params[key] = value
|
32
|
+
self
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
|
37
|
+
def init_params(params)
|
38
|
+
@params = params.is_a?(Hash) ? params : {}
|
39
|
+
end
|
40
|
+
|
41
|
+
def init_graph_for(graph_name, graphs)
|
42
|
+
|
43
|
+
graph_root = Social::Network::Graph.const_get(graph_name.to_s.classify)
|
44
|
+
|
45
|
+
generated_graphs = graphs.map do |space|
|
46
|
+
|
47
|
+
namespace = space.to_s.classify
|
48
|
+
|
49
|
+
begin
|
50
|
+
graph_root.const_get(namespace) # try load
|
51
|
+
|
52
|
+
graph_tail = graph_root.const_get(namespace).new
|
53
|
+
graph_tail.root = self
|
54
|
+
|
55
|
+
[space, graph_tail]
|
56
|
+
rescue NameError
|
57
|
+
nil
|
11
58
|
end
|
59
|
+
|
12
60
|
end
|
13
|
-
|
61
|
+
|
62
|
+
@graph = Hash[generated_graphs.compact]
|
63
|
+
end
|
64
|
+
|
14
65
|
end
|
data/lib/social/network/graph.rb
CHANGED
@@ -1,41 +1,2 @@
|
|
1
|
-
module Social
|
2
|
-
module Network
|
3
|
-
module Graph
|
4
|
-
|
5
|
-
attr_reader :graph
|
6
|
-
|
7
|
-
def method_missing(name, *args)
|
8
|
-
return @graph[name] if @graph && @graph[name]
|
9
|
-
super
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
protected
|
14
|
-
|
15
|
-
def init_graph_for(graph_name, graphs)
|
16
|
-
|
17
|
-
graph_root = Social::Network::Graph.const_get(graph_name.to_s.classify)
|
18
|
-
|
19
|
-
generated_graphs = graphs.map do |space|
|
20
|
-
|
21
|
-
namespace = space.to_s.classify
|
22
|
-
|
23
|
-
begin
|
24
|
-
graph_root.const_get(namespace) # try load
|
25
|
-
|
26
|
-
graph_tail = graph_root.const_get(namespace).new
|
27
|
-
graph_tail.root = self
|
28
|
-
|
29
|
-
[space, graph_tail]
|
30
|
-
rescue NameError
|
31
|
-
nil
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
@graph = Hash[generated_graphs.compact]
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
end
|
1
|
+
module Social::Network::Graph
|
41
2
|
end
|
@@ -25,67 +25,61 @@ module Rack
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
module Social
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
include Social::Network::Graph::Tail
|
35
|
-
include Social::Config::Ok
|
28
|
+
module Social::Network::Graph::Ok
|
29
|
+
class Base
|
30
|
+
|
31
|
+
include Social::Network::Graph::Tail
|
32
|
+
include Social::Config::Ok
|
36
33
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
def http_query(query)
|
47
|
-
result = []
|
48
|
-
url = URI.parse(config['api_server'])
|
49
|
-
retries = 0
|
50
|
-
result = Net::HTTP.start(url.host, url.port) { |http|
|
51
|
-
http.read_timeout = 10
|
52
|
-
http.get(query)
|
53
|
-
}
|
54
|
-
rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
|
55
|
-
retries += 1
|
56
|
-
retry if retries < 3
|
57
|
-
ensure
|
58
|
-
result
|
59
|
-
end
|
34
|
+
def normalize_msg(msg)
|
35
|
+
[ ['&nbps;', ' '],
|
36
|
+
['—', '-'],
|
37
|
+
['&', ''],
|
38
|
+
['%', '']
|
39
|
+
].each { |rep| msg.gsub!(*rep) }
|
40
|
+
msg
|
41
|
+
end
|
60
42
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
43
|
+
def http_query(query)
|
44
|
+
result = []
|
45
|
+
url = URI.parse(config['api_server'])
|
46
|
+
retries = 0
|
47
|
+
result = Net::HTTP.start(url.host, url.port) { |http|
|
48
|
+
http.read_timeout = 10
|
49
|
+
http.get(query)
|
50
|
+
}
|
51
|
+
rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
|
52
|
+
retries += 1
|
53
|
+
retry if retries < 3
|
54
|
+
ensure
|
55
|
+
result
|
56
|
+
end
|
74
57
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
58
|
+
def deliver(params)
|
59
|
+
result = []
|
60
|
+
request_params = build_request_params(params)
|
61
|
+
query = "/fb.do?#{Rack::Utils.universal_build(request_params)}"
|
62
|
+
result = self.http_query(query)
|
63
|
+
rescue => e
|
64
|
+
puts "====== Send problem"
|
65
|
+
puts params.inspect
|
66
|
+
puts e.to_s
|
67
|
+
puts e.backtrace
|
68
|
+
ensure
|
69
|
+
result
|
70
|
+
end
|
79
71
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
params
|
85
|
-
end
|
72
|
+
def build_sig(params, key)
|
73
|
+
params_to_sign_string = params.keys.inject([]) {|m,e| m << "#{e}=#{params[e]}"}.sort.join
|
74
|
+
Digest::MD5.hexdigest(params_to_sign_string + key)
|
75
|
+
end
|
86
76
|
|
87
|
-
|
88
|
-
|
77
|
+
def build_request_params(params = {})
|
78
|
+
params.merge!({ :format => "JSON", :application_key => config[:application_key]})
|
79
|
+
key = params.delete(:session_secret_key) || config[:secret_key]
|
80
|
+
params[:sig] = build_sig(params, key)
|
81
|
+
params
|
89
82
|
end
|
83
|
+
|
90
84
|
end
|
91
85
|
end
|
@@ -1,18 +1,12 @@
|
|
1
|
-
module Social
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
return result unless block_given?
|
11
|
-
yield(result) if block_given?
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
1
|
+
module Social::Network::Graph::Ok
|
2
|
+
class Notification < Base
|
3
|
+
|
4
|
+
def send(options = {})
|
5
|
+
result = deliver('method' => 'notifications.sendSimple', 'text' => options[:message], 'uid' => options[:uids])
|
6
|
+
|
7
|
+
return result unless block_given?
|
8
|
+
yield(result) if block_given?
|
16
9
|
end
|
10
|
+
|
17
11
|
end
|
18
12
|
end
|
@@ -1,78 +1,72 @@
|
|
1
|
-
module Social
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
FIELDS = 'uid,first_name,last_name,gender,birthday,pic_1,pic_2,pic_3,pic_4,url_profile,location,current_location,age,url_profile,current_status'
|
8
|
-
|
9
|
-
def get_info(*args)
|
1
|
+
module Social::Network::Graph::Ok
|
2
|
+
class User < Base
|
3
|
+
|
4
|
+
FIELDS = 'uid,first_name,last_name,gender,birthday,pic_1,pic_2,pic_3,pic_4,url_profile,location,current_location,age,url_profile,current_status'
|
5
|
+
|
6
|
+
def get_info(*args)
|
10
7
|
|
11
|
-
|
8
|
+
args.pop if args.last.nil?
|
12
9
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
10
|
+
if args.last.kind_of?(Hash)
|
11
|
+
options = args.pop #.with_indefferend_access
|
12
|
+
secret = options[:secret]
|
13
|
+
fields = options[:fields]
|
14
|
+
|
15
|
+
fields = fields.join(',') if fields.kind_of?(Array)
|
16
|
+
|
17
|
+
if fields
|
18
|
+
avalible_fields = FIELDS.split(',')
|
19
|
+
fields = fields.split(',').select { |field|
|
20
|
+
avalible_fields.include?(field)
|
21
|
+
}.sort.join(',')
|
22
|
+
fields = nil if fields.empty?
|
23
|
+
end
|
24
|
+
end
|
28
25
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
26
|
+
uids = Array.wrap(args)
|
27
|
+
params = { "method" => 'users.getInfo', "fields" => (fields || FIELDS),
|
28
|
+
:uids => uids.join(",") }
|
29
|
+
params[:session_secret_key] = secret if secret
|
33
30
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
31
|
+
code, response = self.deliver(params)
|
32
|
+
result = response.present? ? JSON.load(response) : { 'error_msg' => 'Empty response' }
|
33
|
+
result = result.is_a?(Hash) && result['error_msg'] ? [] : result
|
34
|
+
|
35
|
+
return result unless block_given?
|
36
|
+
yield(result) if block_given?
|
37
|
+
end
|
38
|
+
|
39
|
+
def get_friends(uid, secret = nil)
|
40
|
+
params = { "method" => 'friends.get', :uid => uid, :session_secret_key => secret }
|
41
|
+
response = self.send(:deliver, params)
|
42
|
+
|
43
|
+
result = (response.present? && response != true) ? ActiveSupport::JSON.decode(response.body) : []
|
44
|
+
result = (result.is_a?(Hash) && result['error_msg']) ? [] : result # if returned failure
|
48
45
|
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
return result unless block_given?
|
47
|
+
yield(result) if block_given?
|
48
|
+
end
|
52
49
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
50
|
+
def get_friends_profiles(uid, secret = nil, options = nil)
|
51
|
+
friend_uids = get_friends_uids(uid, secret)
|
52
|
+
friend_profiles = friend_uids.map { |uid| get_info(uid, secret, options) }.flatten.compact
|
53
|
+
|
54
|
+
return friend_profiles unless block_given?
|
55
|
+
yield(friend_profiles) if block_given?
|
56
|
+
end
|
60
57
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
58
|
+
def charge_off_balance(uid, balance)
|
59
|
+
return [] unless block_given?
|
60
|
+
yield([]) if block_given?
|
61
|
+
end
|
65
62
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
alias :get_friends_uids :get_friends
|
72
|
-
alias :get_friends_info :get_friends_profiles
|
73
|
-
|
74
|
-
end
|
75
|
-
end
|
63
|
+
def balance(uid)
|
64
|
+
return nil unless block_given?
|
65
|
+
yield(nil) if block_given?
|
76
66
|
end
|
67
|
+
|
68
|
+
alias :get_friends_uids :get_friends
|
69
|
+
alias :get_friends_info :get_friends_profiles
|
70
|
+
|
77
71
|
end
|
78
72
|
end
|