gocarrot 0.0.3
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.
- data/lib/carrot.rb +180 -0
- metadata +46 -0
data/lib/carrot.rb
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
# Carrot -- Copyright (C) 2012 Carrot Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'base64'
|
16
|
+
require 'digest'
|
17
|
+
require 'json'
|
18
|
+
require 'net/http'
|
19
|
+
require 'cgi'
|
20
|
+
|
21
|
+
class Carrot
|
22
|
+
attr_accessor :app_id, :app_secret, :uuid, :hostname
|
23
|
+
|
24
|
+
# Create a new Carrot instance.
|
25
|
+
#
|
26
|
+
# @param app_id [String] Facebook Application Id for your application.
|
27
|
+
# @param app_secret [String] Carrot Application Secret for your application.
|
28
|
+
# @param udid [String] a per-user unique identifier. We suggest using email address or the Facebook 'third_party_id'. You may also specify `nil` and instead provide a value as you call methods.
|
29
|
+
# @param hostname [String] the hostname to use for Carrot API endpoints.
|
30
|
+
def initialize(app_id, app_secret, uuid = nil, hostname = 'gocarrot.com')
|
31
|
+
@app_id = app_id
|
32
|
+
@app_secret = app_secret
|
33
|
+
@uuid = uuid
|
34
|
+
@hostname = hostname
|
35
|
+
end
|
36
|
+
|
37
|
+
# Validate the active, or specified user.
|
38
|
+
#
|
39
|
+
# @param udid [String] a per-user unique identifier or `nil` for the value of {Carrot#uuid}. We suggest using email address or the Facebook 'third_party_id'.
|
40
|
+
#
|
41
|
+
# @return [Symbol] returns one of: `:authorized`, `:read_only`, `:not_created`, or `:unknown`
|
42
|
+
def validate_user(uuid = @uuid)
|
43
|
+
@uuid = uuid
|
44
|
+
http = Net::HTTP.new @hostname, 443
|
45
|
+
http.use_ssl = true
|
46
|
+
request = Net::HTTP::Get.new "/games/#{@app_id}/users.json?id=#{CGI::escape(uuid.to_s)}"
|
47
|
+
response = http.request(request)
|
48
|
+
case response
|
49
|
+
when Net::HTTPSuccess # User has fully-authorized app
|
50
|
+
return :authorized
|
51
|
+
when Net::HTTPUnauthorized # Read-only permissions
|
52
|
+
return :read_only
|
53
|
+
when Net::HTTPClientError # User has not been created
|
54
|
+
return :not_created
|
55
|
+
else
|
56
|
+
puts response.body
|
57
|
+
end
|
58
|
+
return :unknown
|
59
|
+
end
|
60
|
+
|
61
|
+
# Add a user to the Carrot service.
|
62
|
+
#
|
63
|
+
# @param access_token [String] the Facebook user access token for the user to add.
|
64
|
+
# @param udid [String] a per-user unique identifier or `nil` to use the value of {Carrot#uuid}. We suggest using email address or the Facebook 'third_party_id'.
|
65
|
+
#
|
66
|
+
# @return [Symbol] one of: `:authorized`, `:read_only`, `:not_authorized` or `:unknown`
|
67
|
+
def create_user(access_token, uuid = @uuid)
|
68
|
+
http = Net::HTTP.new @hostname, 443
|
69
|
+
http.use_ssl = true
|
70
|
+
|
71
|
+
request = Net::HTTP::Post.new "/games/#{@app_id}/users.json"
|
72
|
+
request.set_form_data({'access_token' => access_token, 'api_key' => @uuid})
|
73
|
+
response = http.request(request)
|
74
|
+
case response
|
75
|
+
when Net::HTTPSuccess # User created
|
76
|
+
return :authorized
|
77
|
+
when Net::HTTPUnauthorized # Read-only permissions
|
78
|
+
return :read_only
|
79
|
+
when Net::HTTPMethodNotAllowed # User has not authorized app
|
80
|
+
return :not_authorized
|
81
|
+
else
|
82
|
+
puts response.body
|
83
|
+
end
|
84
|
+
return :unknown
|
85
|
+
end
|
86
|
+
|
87
|
+
# Post an achievement to the Carrot service.
|
88
|
+
#
|
89
|
+
# @param achievement_id [String] the achievement identifier.
|
90
|
+
# @param udid [String, nil] a per-user unique identifier or `nil` to use the value of {Carrot#uuid}. We suggest using email address or the Facebook 'third_party_id'.
|
91
|
+
#
|
92
|
+
# @return [Symbol] one of: `:success`, `:read_only`, `:not_found`, `:not_authorized` or `:unknown`
|
93
|
+
def post_achievement(achievement_id, uuid = @uuid)
|
94
|
+
return post_signed_request("/me/achievements.json", {'api_key' => uuid, 'achievement_id' => achievement_id})
|
95
|
+
end
|
96
|
+
|
97
|
+
# Post a high score to the Carrot service.
|
98
|
+
#
|
99
|
+
# @param score [String, Integer] the high score value to post.
|
100
|
+
# @param leaderboard_id [String] the leaderboard identifier to which the score should be posted.
|
101
|
+
# @param udid [String] a per-user unique identifier or `nil` to use the value of {Carrot#uuid}. We suggest using email address or the Facebook 'third_party_id'.
|
102
|
+
#
|
103
|
+
# @return [Symbol] one of: `:success`, `:read_only`, `:not_found`, `:not_authorized` or `:unknown`
|
104
|
+
def post_highscore(score, leaderboard_id = "", uuid = @uuid)
|
105
|
+
return post_signed_request("/me/scores.json", {'api_key' => uuid, 'value' => score, 'leaderboard_id' => leaderboard_id})
|
106
|
+
end
|
107
|
+
|
108
|
+
# Post an Open Graph action to the Carrot service.
|
109
|
+
#
|
110
|
+
# If creating an object, you are required to include 'title', 'description', 'image_url' and
|
111
|
+
# 'object_type' in `object_properties`.
|
112
|
+
#
|
113
|
+
# @param action_id [String] Carrot action id.
|
114
|
+
# @param object_instance_id [String] the object instance id of the Carrot object type to create or post; use `nil` if you are creating a throw-away object.
|
115
|
+
# @param action_properties [Hash] the properties to be sent along with the Carrot action, or `nil`.
|
116
|
+
# @param object_properties [Hash] the properties for the new object, if creating an object, or `nil`.
|
117
|
+
# @param udid [String] a per-user unique identifier or `nil` to use the value of {Carrot#uuid}. We suggest using email address or the Facebook 'third_party_id'.
|
118
|
+
#
|
119
|
+
# @return [Symbol] one of: `:success`, `:read_only`, `:not_found`, `:not_authorized` or `:unknown`
|
120
|
+
def post_action(action_id, object_instance_id, action_properties = {}, object_properties = {}, uuid = @uuid)
|
121
|
+
payload = {
|
122
|
+
'api_key' => uuid,
|
123
|
+
'action_id' => action_id,
|
124
|
+
'action_properties' => JSON.generate(action_properties || {}),
|
125
|
+
'object_properties' => JSON.generate(object_properties || {})
|
126
|
+
}
|
127
|
+
payload.update({'object_instance_id' => object_instance_id}) if object_instance_id
|
128
|
+
return post_signed_request("/me/actions.json", payload)
|
129
|
+
end
|
130
|
+
|
131
|
+
# Post a 'Like' to the Carrot service.
|
132
|
+
#
|
133
|
+
# @param object_type [Symbol] one of: `:game`, `:publisher`, `:achievement`, or `:object`.
|
134
|
+
# @param object_id [String] if `:achievement` or `:object` is specified as `object_type` this is the identifier of the achievement or object.
|
135
|
+
# @param udid [String] a per-user unique identifier or `nil` to use the value of {Carrot#uuid}. We suggest using email address or the Facebook 'third_party_id'.
|
136
|
+
#
|
137
|
+
# @return [Symbol] one of: `:success`, `:read_only`, `:not_found`, `:not_authorized` or `:unknown`
|
138
|
+
def post_like(object_type, object_id = nil, uuid = @uuid)
|
139
|
+
payload = {
|
140
|
+
'api_key' => uuid,
|
141
|
+
'object' => "#{object_type}#{":#{object_id}" if object_id}"
|
142
|
+
}
|
143
|
+
return post_signed_request("/me/like.json", payload)
|
144
|
+
end
|
145
|
+
|
146
|
+
private
|
147
|
+
|
148
|
+
def post_signed_request(endpoint, payload, uuid = @uuid)
|
149
|
+
payload.update({
|
150
|
+
'game_id' => @app_id,
|
151
|
+
'request_date' => Time.now.to_i,
|
152
|
+
'request_id' => Digest::SHA1.hexdigest(Time.now.to_s)[8..16]
|
153
|
+
})
|
154
|
+
string_to_sign = "POST\n#{@hostname}\n#{endpoint}\n"
|
155
|
+
sig_keys = payload.keys.sort
|
156
|
+
string_to_sign += sig_keys.map { |k| "#{k}=#{payload[k]}" }.join('&')
|
157
|
+
signature = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new("sha256"), @app_secret, string_to_sign)).strip
|
158
|
+
payload.update({'sig' => signature})
|
159
|
+
|
160
|
+
http = Net::HTTP.new @hostname, 443
|
161
|
+
http.use_ssl = true
|
162
|
+
|
163
|
+
request = Net::HTTP::Post.new endpoint
|
164
|
+
request.set_form_data(payload)
|
165
|
+
response = http.request(request)
|
166
|
+
case response
|
167
|
+
when Net::HTTPSuccess # Success
|
168
|
+
return :success
|
169
|
+
when Net::HTTPUnauthorized # User has read-only permissions
|
170
|
+
return :read_only
|
171
|
+
when Net::HTTPNotFound # Resource not found
|
172
|
+
return :not_found
|
173
|
+
when Net::HTTPMethodNotAllowed # User has not authorized app
|
174
|
+
return :not_authorized
|
175
|
+
else
|
176
|
+
puts response.body
|
177
|
+
end
|
178
|
+
return :unknown
|
179
|
+
end
|
180
|
+
end
|
metadata
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gocarrot
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Pat Wilson
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-12-05 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Interface with your app on http://gocarrot.com
|
15
|
+
email: pat@gocarrot.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/carrot.rb
|
21
|
+
homepage: http://rubygems.org/gems/gocarrot
|
22
|
+
licenses: []
|
23
|
+
post_install_message:
|
24
|
+
rdoc_options: []
|
25
|
+
require_paths:
|
26
|
+
- lib
|
27
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 1.8.15
|
42
|
+
signing_key:
|
43
|
+
specification_version: 3
|
44
|
+
summary: Carrot
|
45
|
+
test_files: []
|
46
|
+
has_rdoc:
|