social 0.0.1

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.
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