woopra_tracker 1.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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/woopra_tracker.rb +171 -0
  3. metadata +45 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 499be4a96f28f6b8bfa636b65c052ced7e9cfeeb
4
+ data.tar.gz: c5eaafed993e102530dc3598c33cff92db6e53cb
5
+ SHA512:
6
+ metadata.gz: 42a2017e75c480a310deb296319cfa4b392fad24001a96b1b7f317edcfd5e9cdbcd68cae2a2ae3d18e59a9b62f01fa51825b4c041222cd0e8ea2c96c9e2978cb
7
+ data.tar.gz: 8f3cd3f8e48d9cdf0dd53e1262bc1ce90725f5f6293cb4d5fac35c88c0cafe5d3fe22af6aebcefdde3e7b18d23d5a127b0040dca99039b8bc7913e6cda6e1572
@@ -0,0 +1,171 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'json'
3
+ require 'net/http'
4
+ require 'open-uri'
5
+
6
+ module WoopraRailsSDK
7
+ class WoopraTracker
8
+ @@SDK_ID = "rails"
9
+ @@default_config = {
10
+ domain: "",
11
+ cookie_name: "wooTracker",
12
+ cookie_domain: "",
13
+ cookie_path: "/",
14
+ ping: true,
15
+ ping_interval: 12000,
16
+ idle_timeout: 300000,
17
+ download_tracking: true,
18
+ outgoing_tracking: true,
19
+ download_pause: 200,
20
+ outgoing_pause: 400,
21
+ ignore_query_url: true,
22
+ hide_campaign: false,
23
+ ip_address: "",
24
+ cookie_value: "",
25
+ }
26
+ def initialize(request)
27
+ @request = request
28
+ @current_config = @@default_config
29
+ @custom_config = {app: @@SDK_ID}
30
+ @user = {}
31
+ @events = []
32
+ @user_up_to_date = true
33
+ @has_pushed = false
34
+ @current_config[:domain] = @request.host
35
+ @current_config[:cookie_domain] = @request.host
36
+ @current_config[:ip_address] = get_client_ip
37
+ @current_config[:cookie_value] = @request.cookies["cookie_name"] || random_cookie
38
+ return self
39
+ end
40
+
41
+ def config(data)
42
+ data.each do |key, value|
43
+ if @@default_config.has_key?(key)
44
+ @current_config[key] = value
45
+ if key != :ip_address && key != :cookie_value
46
+ @custom_config[key] = value
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ def identify(user)
53
+ @user = user
54
+ @user_up_to_date = false
55
+ return self
56
+ end
57
+
58
+ def track(event_name = nil, event_data = nil, back_end_tracking = false)
59
+ if back_end_tracking
60
+ woopra_http_request(true, [event_name, event_data])
61
+ else
62
+ @events << [event_name, event_data]
63
+ end
64
+ return self
65
+ end
66
+
67
+ def push(back_end_tracking = false)
68
+ if not @user_up_to_date
69
+ if back_end_tracking
70
+ woopra_http_request(false)
71
+ else
72
+ has_pushed = true
73
+ end
74
+ end
75
+ end
76
+
77
+ def js_code
78
+ code = "\n" + '<!-- Woopra code starts here -->'.html_safe + "\n"
79
+ code += '<script>'.html_safe + "\n"
80
+ code += ' (function(){'.html_safe + "\n"
81
+ code += ' var t,i,e,n=window,o=document,a=arguments,s="script",r=["config","track","identify","visit","push","call"],c=function(){var t,i=this;for(i._e=[],t=0;r.length>t;t++)(function(t){i[t]=function(){return i._e.push([t].concat(Array.prototype.slice.call(arguments,0))),i}})(r[t])};for(n._w=n._w||{},t=0;a.length>t;t++)n._w[a[t]]=n[a[t]]=n[a[t]]||new c;i=o.createElement(s),i.async=1,i.src="//static.woopra.com/js/w.js",e=o.getElementsByTagName(s)[0],e.parentNode.insertBefore(i,e)'.html_safe + "\n"
82
+ code += ' })("woopra");'.html_safe + "\n"
83
+ if @custom_config.length != 0
84
+ code += " woopra.config(".html_safe + @custom_config.to_json.html_safe + ");".html_safe + "\n"
85
+ end
86
+ if not @user_up_to_date
87
+ code += " woopra.identify(".html_safe + @user.to_json.html_safe + ");".html_safe + "\n"
88
+ end
89
+ for event in @events
90
+ if event[0] == nil
91
+ code += " woopra.track();".html_safe + "\n"
92
+ else
93
+ code += " woopra.track('".html_safe + event[0].html_safe + "', ".html_safe + event[1].to_json.html_safe + ");".html_safe + "\n"
94
+ end
95
+ end
96
+ if @has_pushed
97
+ code += " woopra.push();".html_safe + "\n"
98
+ end
99
+ code += "</script>".html_safe + "\n"
100
+ code += "<!-- Woopra code ends here -->".html_safe + "\n"
101
+ return code.html_safe
102
+ end
103
+
104
+ def set_woopra_cookie(cookies)
105
+ cookies[@current_config[:cookie_name]] = @current_config[:cookie_value]
106
+ end
107
+
108
+ private
109
+
110
+ def woopra_http_request(is_tracking, event = nil)
111
+ base_url = "www.woopra.com"
112
+ get_params = {}
113
+
114
+ # Configuration
115
+ get_params["host"] = @current_config[:domain].to_s
116
+ get_params["cookie"] = @current_config[:cookie_value].to_s
117
+ get_params["ip"] = @current_config[:ip_address].to_s
118
+ get_params["timeout"] = @current_config[:idle_timeout].to_s
119
+
120
+ # Identification
121
+ @user.each do |key, value|
122
+ get_params["cv_" + key.to_s] = value.to_s
123
+ end
124
+
125
+ if not is_tracking
126
+ url = "/track/identify/?"
127
+ get_params.each do |key, value|
128
+ url += URI::encode(key) + "=" + URI::encode(value) + "&"
129
+ end
130
+ url = url[0..-1] + "&app=" + @@SDK_ID
131
+ else
132
+ if event == nil
133
+ get_params["ce_name"] = "pv"
134
+ get_params["ce_url"] = @request.url.to_s
135
+ else
136
+ get_params["ce_name"] = event[0].to_s
137
+ event[1].each do |key, value|
138
+ get_params["ce_" + key.to_s] = value.to_s
139
+ end
140
+ end
141
+ url = "/track/ce/?"
142
+ get_params.each do |key, value|
143
+ url += URI::encode(key) + "=" + URI::encode(value) + "&"
144
+ end
145
+ url = url[0..-1] + "&app=" + @@SDK_ID
146
+ end
147
+ http = Net::HTTP.new(base_url)
148
+ user_agent = @request.env['HTTP_USER_AGENT']
149
+ if not user_agent.nil?
150
+ req = Net::HTTP::Get.new(url, {'User-Agent' => user_agent})
151
+ else
152
+ req = Net::HTTP::Get.new(url)
153
+ end
154
+ response = http.request(req)
155
+ end
156
+
157
+ def random_cookie
158
+ o = [('0'..'9'), ('A'..'Z')].map { |i| i.to_a }.flatten
159
+ return (0...12).map{ o[rand(o.length)] }.join
160
+ end
161
+
162
+ def get_client_ip
163
+ if not @request.env['HTTP_X_FORWARDED_FOR'].nil?
164
+ return @request.env['HTTP_X_FORWARDED_FOR'].split(",")[0].strip
165
+ else
166
+ return @request.remote_ip
167
+ end
168
+ end
169
+
170
+ end
171
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: woopra_tracker
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ platform: ruby
6
+ authors:
7
+ - Antoine Chkaiban
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-20 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Realtime Customer Insight
14
+ email:
15
+ - support@woopra.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/woopra_tracker.rb
21
+ homepage: https://www.woopra.com
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 2.2.1
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: Woopra Rails SDK
45
+ test_files: []