social 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/.gitignore +4 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +22 -0
  5. data/README.md +78 -0
  6. data/Rakefile +3 -0
  7. data/lib/social.rb +124 -0
  8. data/lib/social/auth.rb +4 -0
  9. data/lib/social/auth/controller.rb +144 -0
  10. data/lib/social/balance.rb +40 -0
  11. data/lib/social/builder.rb +22 -0
  12. data/lib/social/cache.rb +26 -0
  13. data/lib/social/config.rb +52 -0
  14. data/lib/social/config/ok.rb +12 -0
  15. data/lib/social/config/vk.rb +13 -0
  16. data/lib/social/env.rb +34 -0
  17. data/lib/social/helper.rb +4 -0
  18. data/lib/social/helper/controller.rb +43 -0
  19. data/lib/social/helper/model.rb +61 -0
  20. data/lib/social/network.rb +4 -0
  21. data/lib/social/network/base.rb +14 -0
  22. data/lib/social/network/graph.rb +41 -0
  23. data/lib/social/network/graph/ok.rb +6 -0
  24. data/lib/social/network/graph/ok/base.rb +57 -0
  25. data/lib/social/network/graph/ok/notification.rb +18 -0
  26. data/lib/social/network/graph/ok/user.rb +49 -0
  27. data/lib/social/network/graph/tail.rb +23 -0
  28. data/lib/social/network/graph/vk.rb +6 -0
  29. data/lib/social/network/graph/vk/base.rb +37 -0
  30. data/lib/social/network/graph/vk/notification.rb +21 -0
  31. data/lib/social/network/graph/vk/user.rb +62 -0
  32. data/lib/social/network/ok.rb +21 -0
  33. data/lib/social/network/params.rb +31 -0
  34. data/lib/social/network/stub.rb +9 -0
  35. data/lib/social/network/vk.rb +21 -0
  36. data/lib/social/networks.rb +29 -0
  37. data/lib/social/provider.rb +42 -0
  38. data/lib/social/version.rb +3 -0
  39. data/social.gemspec +30 -0
  40. data/spec/lib/social_spec.rb +12 -0
  41. data/spec/spec_helper.rb +17 -0
  42. metadata +157 -0
@@ -0,0 +1,26 @@
1
+ module Social
2
+ class Cache
3
+
4
+ def initialize(driver)
5
+ @driver = driver
6
+ end
7
+
8
+ def read(key)
9
+ driver.read(key) if driver.respond_to? :read
10
+ end
11
+
12
+ def write(key, data)
13
+ driver.write(key, data) if driver.respond_to? :write
14
+ end
15
+
16
+ def fetch(key, &block)
17
+ return nil if block_gived?
18
+ unless data = read(key)
19
+ data = block.call
20
+ end
21
+
22
+ data
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,52 @@
1
+ module Social
2
+ module Config
3
+
4
+ @@network_name = nil
5
+
6
+ def self.included(network)
7
+ network.send(:include, InstanceMethods)
8
+ @@network_name = network.name.split('::').last.downcase
9
+ end
10
+
11
+ module InstanceMethods
12
+
13
+ def network_name
14
+ @@network_name
15
+ end
16
+
17
+ def network
18
+ @network
19
+ end
20
+
21
+ def config
22
+ @config_data ||= load_config_file
23
+ end
24
+
25
+ def config_file_path=(new_path)
26
+ @config_file_path = new_path
27
+ @config = load_config_file if @config_data
28
+ end
29
+
30
+ def config_root=(new_root)
31
+ @config_root = new_root
32
+ end
33
+
34
+ def config_root
35
+ @config_root ||= File.join(Rails.root, 'config') if defined?(Rails)
36
+ @config_root ||= ENV['SOCIAL_CONFIG_ROOT']
37
+ @config_root ||= File.join('.', 'config')
38
+ end
39
+
40
+ def config_file_path
41
+ @config_file_path ||= ENV['SOCIAL_CONFIG_PATH']
42
+ @config_file_path ||= File.joint(self.config_root, 'social.yml')
43
+ end
44
+
45
+ def load_config_file
46
+ YAML.load_file(config_file_path).with_indifferent_access
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,12 @@
1
+ module Social
2
+ module Config
3
+ module Ok
4
+ include Social::Config
5
+
6
+ def config
7
+ env = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
8
+ super['ok'][]
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module Social
2
+ module Config
3
+ module Vk
4
+ include Social::Config
5
+
6
+ def config
7
+ env = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
8
+ super['vk'][env.to_s]
9
+
10
+ end
11
+ end
12
+ end
13
+ end
data/lib/social/env.rb ADDED
@@ -0,0 +1,34 @@
1
+ module Social
2
+ class Env
3
+
4
+ include Singleton
5
+ attr_accessor :id, :type, :prefix
6
+
7
+ class << self
8
+
9
+ def init(params)
10
+ raise "Cant find social env in params #{params.inspect}" unless params[:social_env]
11
+
12
+ env = params[:social_env]
13
+ instance.id = env[:id]
14
+ instance.type = env[:type]
15
+ instance.prefix = env[:prefix]
16
+ end
17
+
18
+ def id
19
+ instance.id
20
+ end
21
+
22
+ def type
23
+ instance.type
24
+ end
25
+
26
+ def prefix
27
+ instance.prefix
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,4 @@
1
+ module Social
2
+ module Helper
3
+ end
4
+ end
@@ -0,0 +1,43 @@
1
+ # Add helper methods for Social in base controller class
2
+ module Social
3
+ module Helper
4
+ module Controller
5
+
6
+ def self.included(base)
7
+ base.instance_eval do
8
+ helper_method :current_social_type, :current_social_type_id, :current_social_prefix
9
+ before_filter :init_social_env
10
+ end
11
+ end
12
+
13
+ # Helper, returned social type id from request
14
+ # (controller, view).current_social_type_id
15
+ def current_social_type_id
16
+ @current_social_type_id ||= params[:soc_id]
17
+ end
18
+
19
+ # Helper, returned social type from request
20
+ # (controller, view).current_social_type
21
+ def current_social_type
22
+ @current_social_type ||= params[:soc_type]
23
+ end
24
+
25
+ # Helper, returned social type prefix from request
26
+ # (controller, view).current_social_type_prefix
27
+ def current_social_prefix
28
+ @current_social_prefix ||= params[:soc_prefix]
29
+ end
30
+
31
+ protected
32
+
33
+ def init_social_env
34
+ #Social.current_id = params[:soc_id]
35
+ #Social.current_type = params[:soc_type]
36
+ #Social.current_prefix = params[:soc_prefix]
37
+
38
+ Social::Env.init(params)
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,61 @@
1
+ # Add helper methods for Social in user model class (Active record)
2
+ module Social
3
+ module Helper
4
+ module Model
5
+
6
+ def self.included(base)
7
+ base.instance_eval do
8
+ attr_accessor :auth_params
9
+ end
10
+ end
11
+
12
+ # Alias for model.current_social_type
13
+ # model.current_provider String
14
+ # @params social_type_id = nil
15
+ def current_provider(social_type_id = nil)
16
+ current_social_type(social_type_id)
17
+ end
18
+
19
+ # Return current social type or social type by social_type_id
20
+ # model.current_social_type String
21
+ # @params social_type_id = nil
22
+ def current_social_type(social_type_id = nil)
23
+ if social_type_id
24
+ @current_provider = Social.type_by_id(social_type_id)
25
+ elsif auth_params && auth_params[:social_type]
26
+ @current_provider = auth_params[:social_type]
27
+ else
28
+ @current_provider = Social::Env.type
29
+ end
30
+
31
+ @current_provider
32
+ end
33
+
34
+ # Return current social type id
35
+ # model.current_social_type String
36
+ def current_social_type_id()
37
+ unless @current_social_type_id
38
+ @current_social_type_id = Social::Env.id
39
+ end
40
+
41
+ @current_social_type_id
42
+ end
43
+
44
+ # Make standart hash (for js) from model data
45
+ # model.to_hash hash
46
+ # @params params = {}
47
+ def to_hash(params = {})
48
+ {
49
+ :id => id,
50
+ :first_name => first_name,
51
+ :last_name => last_name,
52
+ :uid => social_references.last.uid,
53
+ :name => "#{first_name} #{last_name}",
54
+ :gender => (male? ? 'male' : 'female'),
55
+ :birthday => birthdate
56
+ }
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,4 @@
1
+ module Social
2
+ module Network
3
+ end
4
+ end
@@ -0,0 +1,14 @@
1
+ module Social
2
+ module Network
3
+ module Base
4
+
5
+ include Social::Network::Graph
6
+ include Social::Network::Params
7
+
8
+ def initialize(root, list, params = nil)
9
+ init_params(params)
10
+ init_graph_for(root, list)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,41 @@
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
41
+ end
@@ -0,0 +1,6 @@
1
+ module Social
2
+ module Network
3
+ class Ok
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,57 @@
1
+ module Social
2
+ module Network
3
+ module Graph
4
+ module Ok
5
+ class Base
6
+
7
+ include Social::Network::Graph::Tail
8
+ include Social::Config::Ok
9
+
10
+ def normalize_msg(msg)
11
+ [ ['&nbps;', ' '],
12
+ ['&mdash;', '-'],
13
+ ['&', ''],
14
+ ['%', '']
15
+ ].each { |rep| msg.gsub!(*rep) }
16
+ msg
17
+ end
18
+
19
+ def deliver(params)
20
+ url = URI.parse(config['api_server'])
21
+ retries = 0
22
+ begin
23
+ res = Net::HTTP.start(url.host, url.port) { |http|
24
+ http.read_timeout = 10
25
+ request_params = build_request_params(params)
26
+ http.get("/fb.do?#{Rack::Utils.universal_build(request_params)}")
27
+ }
28
+ rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
29
+ retries += 1
30
+ retry if retries < 3
31
+ end
32
+
33
+ rescue => e
34
+ #Rails.logger.warn "Send problem"
35
+ #Rails.logger.warn params.inspect
36
+ #Rails.logger.warn e.inspect
37
+ ensure
38
+ res
39
+ end
40
+
41
+ def build_sig(params, key)
42
+ params_to_sign_string = params.keys.inject([]) {|m,e| m << "#{e}=#{params[e]}"}.sort.join
43
+ Digest::MD5.hexdigest(params_to_sign_string + key)
44
+ end
45
+
46
+ def build_request_params(params = {})
47
+ params.merge!({ :format => "JSON", :application_key => config[:application_key]})
48
+ key = params.delete(:session_secret_key) || config[:secret_key]
49
+ params[:sig] = build_sig(params, key)
50
+ params
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,18 @@
1
+ module Social
2
+ module Network
3
+ module Graph
4
+ module Ok
5
+ class Notification < Social::Network::Graph::Ok::Base
6
+
7
+ def send(options = {})
8
+ result = deliver('method' => 'notifications.sendSimple', 'text' => options[:message], 'uid' => options[:uids])
9
+
10
+ return result unless block_given?
11
+ yield(result) if block_given?
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,49 @@
1
+ module Social
2
+ module Network
3
+ module Graph
4
+ module Ok
5
+ class User < Social::Network::Graph::Ok::Base
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(uids, secret = nil, options = nil)
10
+ fields = Array.wrap(options.try(:[], :fields)).join(',')
11
+ fields = fields.present? ? fields : FIELDS
12
+
13
+ params = { "method" => 'users.getInfo', "fields" => fields,
14
+ :uids => Array.wrap(uids).join(","), :session_secret_key => secret }
15
+ response = self.send(:deliver, params)
16
+ result = response.present? ? ActiveSupport::JSON.decode(response.body) : []
17
+ result = result.is_a?(Hash) && result['error_msg'] ? nil : result
18
+
19
+ return result unless block_given?
20
+ yield(result) if block_given?
21
+ end
22
+
23
+ def get_friends(uid, secret = nil)
24
+ params = { "method" => 'friends.get', :uid => uid, :session_secret_key => secret }
25
+ response = self.send(:deliver, params)
26
+
27
+ result = (response.present? && response != true) ? ActiveSupport::JSON.decode(response.body) : []
28
+ result = (result.is_a?(Hash) && result['error_msg']) ? [] : result # if returned failure
29
+
30
+ return result unless block_given?
31
+ yield(result) if block_given?
32
+ end
33
+
34
+ def get_friends_profiles(uid, secret = nil, options = nil)
35
+ friend_uids = get_friends_uids(uid, secret)
36
+ friend_profiles = friend_uids.map { |uid| get_info(uid, secret, options) }.flatten.compact
37
+
38
+ return friend_profiles unless block_given?
39
+ yield(friend_profiles) if block_given?
40
+ end
41
+
42
+ alias :get_friends_uids :get_friends
43
+ alias :get_friends_info :get_friends_profiles
44
+
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end