Social Media Share Buttons & Social Sharing Icons - Version 2.5.0

Version Description

  • Fixed LinkedIn share to correct urls.
Download this release

Release Info

Developer socialdude
Plugin Icon 128x128 Social Media Share Buttons & Social Sharing Icons
Version 2.5.0
Comparing to
See all releases

Code changes from version 2.4.9 to 2.5.0

Files changed (56) hide show
  1. analyst/assets/css/customize.css +280 -280
  2. analyst/assets/index.php +2 -2
  3. analyst/assets/js/customize.js +29 -29
  4. analyst/autoload.php +40 -40
  5. analyst/index.php +2 -2
  6. analyst/main.php +36 -36
  7. analyst/sdk_resolver.php +79 -79
  8. analyst/src/Account/Account.php +584 -584
  9. analyst/src/Account/AccountData.php +176 -176
  10. analyst/src/Account/AccountDataFactory.php +125 -125
  11. analyst/src/Analyst.php +167 -167
  12. analyst/src/ApiRequestor.php +257 -257
  13. analyst/src/ApiResponse.php +44 -44
  14. analyst/src/Cache/DatabaseCache.php +127 -127
  15. analyst/src/Collector.php +217 -217
  16. analyst/src/Contracts/AnalystContract.php +12 -12
  17. analyst/src/Contracts/CacheContract.php +47 -47
  18. analyst/src/Contracts/HttpClientContract.php +25 -25
  19. analyst/src/Contracts/RequestContract.php +22 -22
  20. analyst/src/Contracts/RequestorContract.php +44 -44
  21. analyst/src/Contracts/TrackerContract.php +69 -69
  22. analyst/src/Core/AbstractFactory.php +27 -27
  23. analyst/src/Http/CurlHttpClient.php +102 -102
  24. analyst/src/Http/DummyHttpClient.php +33 -33
  25. analyst/src/Http/Requests/AbstractLoggerRequest.php +64 -64
  26. analyst/src/Http/Requests/ActivateRequest.php +42 -42
  27. analyst/src/Http/Requests/DeactivateRequest.php +64 -64
  28. analyst/src/Http/Requests/InstallRequest.php +38 -38
  29. analyst/src/Http/Requests/OptInRequest.php +42 -42
  30. analyst/src/Http/Requests/OptOutRequest.php +40 -40
  31. analyst/src/Http/Requests/UninstallRequest.php +36 -36
  32. analyst/src/Http/WordPressHttpClient.php +61 -61
  33. analyst/src/Mutator.php +103 -103
  34. analyst/src/Notices/Notice.php +121 -121
  35. analyst/src/Notices/NoticeFactory.php +130 -130
  36. analyst/src/helpers.php +84 -84
  37. analyst/templates/forms/deactivate.php +156 -156
  38. analyst/templates/forms/install.php +113 -113
  39. analyst/templates/notice.php +10 -10
  40. analyst/templates/optin.php +60 -60
  41. analyst/templates/optout.php +109 -109
  42. analyst/version.php +15 -15
  43. css/jquery-ui-1.10.4/jquery-ui.css +1177 -1177
  44. css/sfsi-admin-style.css +5305 -5305
  45. css/sfsi-style.css +3626 -3626
  46. helpers/common_helper.php +202 -202
  47. helpers/linkedin-api/linkedin-api.php +136 -136
  48. helpers/sfsi_OAuth.php +910 -910
  49. helpers/twitteroauth/src/TwitterOAuth.php +506 -506
  50. images/responsive-icon/Twitter.svg +3 -3
  51. images/responsive-icon/facebook.svg +3 -3
  52. images/share_icons/Pinterest_Save/en_US_save.svg +23 -23
  53. images/visit_icons/en_US_Follow.svg +16 -16
  54. images/visit_icons/en_US_Tweet.svg +18 -18
  55. images/visit_icons/en_US_save.svg +23 -23
  56. js/custom-admin.js +1352 -3486
analyst/assets/css/customize.css CHANGED
@@ -1,280 +1,280 @@
1
- .analyst-action-opt {
2
- cursor: pointer;
3
- }
4
-
5
- .analyst-modal {
6
- color: #000000;
7
- display: none;
8
- position: fixed;
9
- z-index: 1000;
10
- padding-top: 100px;
11
- left: 0;
12
- top: 0;
13
- width: 100%;
14
- height: 100%;
15
- overflow: auto;
16
- background-color: rgb(0,0,0);
17
- background-color: rgba(0,0,0,0.4);
18
- }
19
-
20
- .analyst-modal-content {
21
- font-family: Helvetica, serif;
22
- position: relative;
23
- background-color: #fefefe;
24
- margin: auto;
25
- padding: 35px 35px 20px;
26
- border: 1px solid #F2F2F2;
27
- width: 40%;
28
- box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);
29
- -webkit-animation-name: analyst-animatetop;
30
- -webkit-animation-duration: 0.4s;
31
- animation-name: analyst-animatetop;
32
- animation-duration: 0.4s
33
- }
34
-
35
- .analyst-btn-success {
36
- cursor: pointer;
37
- color: #ffffff;
38
- background-color: #00AF5E;
39
- border: none;
40
- width: 100%;
41
- font-size: 18px;
42
- padding: 8px;
43
- font-weight: bold;
44
- }
45
-
46
- .analyst-btn-grey {
47
- cursor: pointer;
48
- color: #2D2D2D;
49
- background-color: #D8D8D8;
50
- border: none;
51
- width: 100%;
52
- font-size: 18px;
53
- padding: 8px;
54
- font-weight: bold;
55
- }
56
-
57
- .analyst-btn-secondary-ghost {
58
- cursor: pointer;
59
- background: transparent;
60
- border: none;
61
- color: #898686;
62
- font-size: 18px;
63
- }
64
-
65
- .analyst-modal-def-top-padding {
66
- padding-top: 20px;
67
- }
68
-
69
- .analyst-modal-header {
70
- font-size: 20px;
71
- font-weight: bold;
72
- }
73
-
74
- /*INSTALL STYLES*/
75
- .analyst-install-footer {
76
- padding-top: 10px;
77
- text-align: center;
78
- }
79
-
80
- .analyst-install-image-block {
81
- width: 140px;
82
- }
83
-
84
- .analyst-install-image-block img {
85
- width: inherit;
86
- }
87
-
88
- .analyst-install-description-block {
89
- padding-left: 40px;
90
- padding-top: 5px
91
- }
92
-
93
- .analyst-install-description-text {
94
- font-size: 16px;
95
- color: #000000;
96
- }
97
-
98
- .analyst-install-permissions-list {
99
- list-style: disc inside;
100
- }
101
-
102
- .analyst-install-permissions-list li {
103
- padding-left: 15px;
104
- margin-bottom: 2px;
105
- }
106
-
107
- .analyst-install-footer span {
108
- color: #8a8787;
109
- padding-right: 10px;
110
- padding-left: 10px;
111
- }
112
-
113
- .analyst-install-footer span:not(:last-child) {
114
- border-right: 1px solid #8a8787;
115
- }
116
-
117
- /*INSTALL STYLES*/
118
-
119
- .reason-answer {
120
- padding: 7px;
121
- margin-left: 23px;
122
- border: 1px solid #F2F2F2;
123
- }
124
-
125
- .analyst-link {
126
- color: #00AF5E;
127
- text-decoration: none;
128
- }
129
-
130
- .analyst-action-text {
131
- cursor: pointer;
132
- }
133
-
134
- .analyst-action-text:hover {
135
- color: #9d9a9a;
136
- }
137
-
138
- .analyst-disable-modal-mask {
139
- width: 100%;
140
- height: 100%;
141
- opacity: 0.5;
142
- position: absolute;
143
- background: white;
144
- top: 0;
145
- left: 0;
146
- }
147
-
148
- .analyst-smile-image {
149
- vertical-align: middle;
150
- padding-bottom: 3px;
151
- width: 24px;
152
- }
153
-
154
- #analyst-deactivation-reasons li {
155
- padding-bottom: 3px;
156
- font-size: 16px;
157
- color: #000000;
158
- }
159
-
160
- @-webkit-keyframes analyst-animatetop {
161
- from {top:-300px; opacity:0}
162
- to {top:0; opacity:1}
163
- }
164
-
165
- @keyframes analyst-animatetop {
166
- from {top:-300px; opacity:0}
167
- to {top:0; opacity:1}
168
- }
169
-
170
- .analyst-modal-close {
171
- color: #48036F;
172
- font-size: 28px;
173
- font-weight: bold;
174
- top: 12px;
175
- position: absolute;
176
- right: 15px;
177
- }
178
-
179
- .analyst-modal-close:hover,
180
- .analyst-modal-close:focus {
181
- color: #000;
182
- text-decoration: none;
183
- cursor: pointer;
184
- }
185
-
186
- .analyst-modal-body {padding: 2px 16px;}
187
-
188
- .analyst-modal-footer {
189
- padding: 6px 16px;
190
- background-color: #FFE773;
191
- color: white;
192
- }
193
-
194
- #analyst-deactivate-modal .question-answer input, textarea {
195
- margin-top: 5px;
196
- width: 100%;
197
- }
198
-
199
- .analyst-btn-primary {
200
- cursor: pointer;
201
- border: none;
202
- display:inline-block;
203
- padding:0.7em 1.4em;
204
- margin:0 0.3em 0.3em 0;
205
- border-radius:0.15em;
206
- box-sizing: border-box;
207
- text-decoration:none;
208
- font-family:'Roboto',sans-serif;
209
- text-transform:uppercase;
210
- font-weight:400;
211
- color:#FFFFFF;
212
- background-color:#9F3ED5;
213
- box-shadow:inset 0 -0.6em 0 -0.35em rgba(0,0,0,0.17);
214
- text-align:center;
215
- position:relative;
216
- }
217
-
218
- .analyst-btn-primary:disabled {
219
- background-color: #AD66D5;
220
- cursor: not-allowed;
221
- }
222
-
223
- .analyst-btn-primary:active{
224
- top:0.1em;
225
- }
226
- @media all and (max-width:30em){
227
- .analyst-btn-primary {
228
- display:block;
229
- margin:0.4em auto;
230
- }
231
- }
232
-
233
- .analyst-btn-secondary {
234
- cursor: pointer;
235
- border: none;
236
- display:inline-block;
237
- padding:0.7em 1.4em;
238
- margin:0 0.3em 0.3em 0;
239
- border-radius:0.15em;
240
- box-sizing: border-box;
241
- text-decoration:none;
242
- font-family:'Roboto',sans-serif;
243
- text-transform:uppercase;
244
- font-weight:400;
245
- color:#FFFFFF;
246
- background-color:#6C8CD5;
247
- box-shadow:inset 0 -0.6em 0 -0.35em rgba(0,0,0,0.17);
248
- text-align:center;
249
- position:relative;
250
- }
251
-
252
- .analyst-btn-secondary:disabled {
253
- background-color: #6C8CD5;
254
- cursor: not-allowed;
255
- }
256
-
257
- .analyst-btn-secondary:active{
258
- top:0.1em;
259
- }
260
- @media all and (max-width:30em){
261
- .analyst-btn-secondary {
262
- display:block;
263
- margin:0.4em auto;
264
- }
265
- }
266
-
267
- .analyst-notice {
268
- padding-right: 38px;
269
- position: relative;
270
- margin-bottom: 30px !important;
271
- }
272
-
273
- .analyst-notice .analyst-plugin-name {
274
- background-color: #00000024;
275
- padding-left: 7px;
276
- padding-right: 7px;
277
- position: absolute;
278
- top: 100%;
279
- border-radius: 0 0 5px 5px;
280
- }
1
+ .analyst-action-opt {
2
+ cursor: pointer;
3
+ }
4
+
5
+ .analyst-modal {
6
+ color: #000000;
7
+ display: none;
8
+ position: fixed;
9
+ z-index: 1000;
10
+ padding-top: 100px;
11
+ left: 0;
12
+ top: 0;
13
+ width: 100%;
14
+ height: 100%;
15
+ overflow: auto;
16
+ background-color: rgb(0,0,0);
17
+ background-color: rgba(0,0,0,0.4);
18
+ }
19
+
20
+ .analyst-modal-content {
21
+ font-family: Helvetica, serif;
22
+ position: relative;
23
+ background-color: #fefefe;
24
+ margin: auto;
25
+ padding: 35px 35px 20px;
26
+ border: 1px solid #F2F2F2;
27
+ width: 40%;
28
+ box-shadow: 0 4px 8px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);
29
+ -webkit-animation-name: analyst-animatetop;
30
+ -webkit-animation-duration: 0.4s;
31
+ animation-name: analyst-animatetop;
32
+ animation-duration: 0.4s
33
+ }
34
+
35
+ .analyst-btn-success {
36
+ cursor: pointer;
37
+ color: #ffffff;
38
+ background-color: #00AF5E;
39
+ border: none;
40
+ width: 100%;
41
+ font-size: 18px;
42
+ padding: 8px;
43
+ font-weight: bold;
44
+ }
45
+
46
+ .analyst-btn-grey {
47
+ cursor: pointer;
48
+ color: #2D2D2D;
49
+ background-color: #D8D8D8;
50
+ border: none;
51
+ width: 100%;
52
+ font-size: 18px;
53
+ padding: 8px;
54
+ font-weight: bold;
55
+ }
56
+
57
+ .analyst-btn-secondary-ghost {
58
+ cursor: pointer;
59
+ background: transparent;
60
+ border: none;
61
+ color: #898686;
62
+ font-size: 18px;
63
+ }
64
+
65
+ .analyst-modal-def-top-padding {
66
+ padding-top: 20px;
67
+ }
68
+
69
+ .analyst-modal-header {
70
+ font-size: 20px;
71
+ font-weight: bold;
72
+ }
73
+
74
+ /*INSTALL STYLES*/
75
+ .analyst-install-footer {
76
+ padding-top: 10px;
77
+ text-align: center;
78
+ }
79
+
80
+ .analyst-install-image-block {
81
+ width: 140px;
82
+ }
83
+
84
+ .analyst-install-image-block img {
85
+ width: inherit;
86
+ }
87
+
88
+ .analyst-install-description-block {
89
+ padding-left: 40px;
90
+ padding-top: 5px
91
+ }
92
+
93
+ .analyst-install-description-text {
94
+ font-size: 16px;
95
+ color: #000000;
96
+ }
97
+
98
+ .analyst-install-permissions-list {
99
+ list-style: disc inside;
100
+ }
101
+
102
+ .analyst-install-permissions-list li {
103
+ padding-left: 15px;
104
+ margin-bottom: 2px;
105
+ }
106
+
107
+ .analyst-install-footer span {
108
+ color: #8a8787;
109
+ padding-right: 10px;
110
+ padding-left: 10px;
111
+ }
112
+
113
+ .analyst-install-footer span:not(:last-child) {
114
+ border-right: 1px solid #8a8787;
115
+ }
116
+
117
+ /*INSTALL STYLES*/
118
+
119
+ .reason-answer {
120
+ padding: 7px;
121
+ margin-left: 23px;
122
+ border: 1px solid #F2F2F2;
123
+ }
124
+
125
+ .analyst-link {
126
+ color: #00AF5E;
127
+ text-decoration: none;
128
+ }
129
+
130
+ .analyst-action-text {
131
+ cursor: pointer;
132
+ }
133
+
134
+ .analyst-action-text:hover {
135
+ color: #9d9a9a;
136
+ }
137
+
138
+ .analyst-disable-modal-mask {
139
+ width: 100%;
140
+ height: 100%;
141
+ opacity: 0.5;
142
+ position: absolute;
143
+ background: white;
144
+ top: 0;
145
+ left: 0;
146
+ }
147
+
148
+ .analyst-smile-image {
149
+ vertical-align: middle;
150
+ padding-bottom: 3px;
151
+ width: 24px;
152
+ }
153
+
154
+ #analyst-deactivation-reasons li {
155
+ padding-bottom: 3px;
156
+ font-size: 16px;
157
+ color: #000000;
158
+ }
159
+
160
+ @-webkit-keyframes analyst-animatetop {
161
+ from {top:-300px; opacity:0}
162
+ to {top:0; opacity:1}
163
+ }
164
+
165
+ @keyframes analyst-animatetop {
166
+ from {top:-300px; opacity:0}
167
+ to {top:0; opacity:1}
168
+ }
169
+
170
+ .analyst-modal-close {
171
+ color: #48036F;
172
+ font-size: 28px;
173
+ font-weight: bold;
174
+ top: 12px;
175
+ position: absolute;
176
+ right: 15px;
177
+ }
178
+
179
+ .analyst-modal-close:hover,
180
+ .analyst-modal-close:focus {
181
+ color: #000;
182
+ text-decoration: none;
183
+ cursor: pointer;
184
+ }
185
+
186
+ .analyst-modal-body {padding: 2px 16px;}
187
+
188
+ .analyst-modal-footer {
189
+ padding: 6px 16px;
190
+ background-color: #FFE773;
191
+ color: white;
192
+ }
193
+
194
+ #analyst-deactivate-modal .question-answer input, textarea {
195
+ margin-top: 5px;
196
+ width: 100%;
197
+ }
198
+
199
+ .analyst-btn-primary {
200
+ cursor: pointer;
201
+ border: none;
202
+ display:inline-block;
203
+ padding:0.7em 1.4em;
204
+ margin:0 0.3em 0.3em 0;
205
+ border-radius:0.15em;
206
+ box-sizing: border-box;
207
+ text-decoration:none;
208
+ font-family:'Roboto',sans-serif;
209
+ text-transform:uppercase;
210
+ font-weight:400;
211
+ color:#FFFFFF;
212
+ background-color:#9F3ED5;
213
+ box-shadow:inset 0 -0.6em 0 -0.35em rgba(0,0,0,0.17);
214
+ text-align:center;
215
+ position:relative;
216
+ }
217
+
218
+ .analyst-btn-primary:disabled {
219
+ background-color: #AD66D5;
220
+ cursor: not-allowed;
221
+ }
222
+
223
+ .analyst-btn-primary:active{
224
+ top:0.1em;
225
+ }
226
+ @media all and (max-width:30em){
227
+ .analyst-btn-primary {
228
+ display:block;
229
+ margin:0.4em auto;
230
+ }
231
+ }
232
+
233
+ .analyst-btn-secondary {
234
+ cursor: pointer;
235
+ border: none;
236
+ display:inline-block;
237
+ padding:0.7em 1.4em;
238
+ margin:0 0.3em 0.3em 0;
239
+ border-radius:0.15em;
240
+ box-sizing: border-box;
241
+ text-decoration:none;
242
+ font-family:'Roboto',sans-serif;
243
+ text-transform:uppercase;
244
+ font-weight:400;
245
+ color:#FFFFFF;
246
+ background-color:#6C8CD5;
247
+ box-shadow:inset 0 -0.6em 0 -0.35em rgba(0,0,0,0.17);
248
+ text-align:center;
249
+ position:relative;
250
+ }
251
+
252
+ .analyst-btn-secondary:disabled {
253
+ background-color: #6C8CD5;
254
+ cursor: not-allowed;
255
+ }
256
+
257
+ .analyst-btn-secondary:active{
258
+ top:0.1em;
259
+ }
260
+ @media all and (max-width:30em){
261
+ .analyst-btn-secondary {
262
+ display:block;
263
+ margin:0.4em auto;
264
+ }
265
+ }
266
+
267
+ .analyst-notice {
268
+ padding-right: 38px;
269
+ position: relative;
270
+ margin-bottom: 30px !important;
271
+ }
272
+
273
+ .analyst-notice .analyst-plugin-name {
274
+ background-color: #00000024;
275
+ padding-left: 7px;
276
+ padding-right: 7px;
277
+ position: absolute;
278
+ top: 100%;
279
+ border-radius: 0 0 5px 5px;
280
+ }
analyst/assets/index.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
- // Silence is golden.
1
+ <?php
2
+ // Silence is golden.
analyst/assets/js/customize.js CHANGED
@@ -1,29 +1,29 @@
1
- (function ($) {
2
- $(document).on('click', '.analyst-notice-dismiss', function () {
3
- var id = $(this).attr('analyst-notice-id');
4
- var self = this;
5
-
6
- $.post(ajaxurl, {action: 'analyst_notification_dismiss', id: id})
7
- .done(function () {
8
- $(self).parent().fadeOut()
9
- })
10
- })
11
-
12
- var url = new URL(window.location.href)
13
-
14
- if (url.searchParams.has('verify')) {
15
- var pluginId = url.searchParams.get('plugin_id')
16
-
17
- $.ajax({
18
- url: ajaxurl,
19
- method: 'POST',
20
- data: {
21
- action: 'analyst_install_verified_' + pluginId,
22
- },
23
- success: function () {
24
- // Refresh page without query params
25
- window.location.href = window.location.origin + window.location.pathname
26
- }
27
- })
28
- }
29
- })(jQuery)
1
+ (function ($) {
2
+ $(document).on('click', '.analyst-notice-dismiss', function () {
3
+ var id = $(this).attr('analyst-notice-id');
4
+ var self = this;
5
+
6
+ $.post(ajaxurl, {action: 'analyst_notification_dismiss', id: id})
7
+ .done(function () {
8
+ $(self).parent().fadeOut()
9
+ })
10
+ })
11
+
12
+ var url = new URL(window.location.href)
13
+
14
+ if (url.searchParams.has('verify')) {
15
+ var pluginId = url.searchParams.get('plugin_id')
16
+
17
+ $.ajax({
18
+ url: ajaxurl,
19
+ method: 'POST',
20
+ data: {
21
+ action: 'analyst_install_verified_' + pluginId,
22
+ },
23
+ success: function () {
24
+ // Refresh page without query params
25
+ window.location.href = window.location.origin + window.location.pathname
26
+ }
27
+ })
28
+ }
29
+ })(jQuery)
analyst/autoload.php CHANGED
@@ -1,40 +1,40 @@
1
- <?php
2
-
3
- require_once __DIR__ . '/src/helpers.php';
4
-
5
- require_once __DIR__ . '/src/Contracts/HttpClientContract.php';
6
- require_once __DIR__ . '/src/Contracts/RequestContract.php';
7
- require_once __DIR__ . '/src/Contracts/RequestorContract.php';
8
- require_once __DIR__ . '/src/Contracts/TrackerContract.php';
9
- require_once __DIR__ . '/src/Contracts/CacheContract.php';
10
-
11
- require_once __DIR__ . '/src/Core/AbstractFactory.php';
12
-
13
- require_once __DIR__ . '/src/Cache/DatabaseCache.php';
14
-
15
- require_once __DIR__ . '/src/Account/Account.php';
16
- require_once __DIR__ . '/src/Account/AccountData.php';
17
- require_once __DIR__ . '/src/Account/AccountDataFactory.php';
18
- require_once __DIR__ . '/src/Contracts/AnalystContract.php';
19
-
20
- require_once __DIR__ . '/src/Http/Requests/AbstractLoggerRequest.php';
21
- require_once __DIR__ . '/src/Http/Requests/ActivateRequest.php';
22
- require_once __DIR__ . '/src/Http/Requests/DeactivateRequest.php';
23
- require_once __DIR__ . '/src/Http/Requests/InstallRequest.php';
24
- require_once __DIR__ . '/src/Http/Requests/OptInRequest.php';
25
- require_once __DIR__ . '/src/Http/Requests/OptOutRequest.php';
26
- require_once __DIR__ . '/src/Http/Requests/UninstallRequest.php';
27
-
28
- require_once __DIR__ . '/src/Http/CurlHttpClient.php';
29
- require_once __DIR__ . '/src/Http/DummyHttpClient.php';
30
- require_once __DIR__ . '/src/Http/WordPressHttpClient.php';
31
-
32
- require_once __DIR__ . '/src/Notices/Notice.php';
33
- require_once __DIR__ . '/src/Notices/NoticeFactory.php';
34
-
35
- require_once __DIR__ . '/src/Analyst.php';
36
- require_once __DIR__ . '/src/ApiRequestor.php';
37
- require_once __DIR__ . '/src/ApiResponse.php';
38
- require_once __DIR__ . '/src/Collector.php';
39
- require_once __DIR__ . '/src/Mutator.php';
40
-
1
+ <?php
2
+
3
+ require_once __DIR__ . '/src/helpers.php';
4
+
5
+ require_once __DIR__ . '/src/Contracts/HttpClientContract.php';
6
+ require_once __DIR__ . '/src/Contracts/RequestContract.php';
7
+ require_once __DIR__ . '/src/Contracts/RequestorContract.php';
8
+ require_once __DIR__ . '/src/Contracts/TrackerContract.php';
9
+ require_once __DIR__ . '/src/Contracts/CacheContract.php';
10
+
11
+ require_once __DIR__ . '/src/Core/AbstractFactory.php';
12
+
13
+ require_once __DIR__ . '/src/Cache/DatabaseCache.php';
14
+
15
+ require_once __DIR__ . '/src/Account/Account.php';
16
+ require_once __DIR__ . '/src/Account/AccountData.php';
17
+ require_once __DIR__ . '/src/Account/AccountDataFactory.php';
18
+ require_once __DIR__ . '/src/Contracts/AnalystContract.php';
19
+
20
+ require_once __DIR__ . '/src/Http/Requests/AbstractLoggerRequest.php';
21
+ require_once __DIR__ . '/src/Http/Requests/ActivateRequest.php';
22
+ require_once __DIR__ . '/src/Http/Requests/DeactivateRequest.php';
23
+ require_once __DIR__ . '/src/Http/Requests/InstallRequest.php';
24
+ require_once __DIR__ . '/src/Http/Requests/OptInRequest.php';
25
+ require_once __DIR__ . '/src/Http/Requests/OptOutRequest.php';
26
+ require_once __DIR__ . '/src/Http/Requests/UninstallRequest.php';
27
+
28
+ require_once __DIR__ . '/src/Http/CurlHttpClient.php';
29
+ require_once __DIR__ . '/src/Http/DummyHttpClient.php';
30
+ require_once __DIR__ . '/src/Http/WordPressHttpClient.php';
31
+
32
+ require_once __DIR__ . '/src/Notices/Notice.php';
33
+ require_once __DIR__ . '/src/Notices/NoticeFactory.php';
34
+
35
+ require_once __DIR__ . '/src/Analyst.php';
36
+ require_once __DIR__ . '/src/ApiRequestor.php';
37
+ require_once __DIR__ . '/src/ApiResponse.php';
38
+ require_once __DIR__ . '/src/Collector.php';
39
+ require_once __DIR__ . '/src/Mutator.php';
40
+
analyst/index.php CHANGED
@@ -1,2 +1,2 @@
1
- <?php
2
- // Silence
1
+ <?php
2
+ // Silence
analyst/main.php CHANGED
@@ -1,36 +1,36 @@
1
- <?php
2
-
3
- require_once 'sdk_resolver.php';
4
-
5
-
6
- if (!function_exists('analyst_init')) {
7
- /**
8
- * Initialize analyst
9
- *
10
- * @param array $options
11
- */
12
- function analyst_init ($options) {
13
- // Try resolve latest supported SDK
14
- // In case resolving is failed exit the execution
15
- try {
16
- analyst_resolve_sdk($options['base-dir']);
17
- } catch (Exception $exception) {
18
- error_log('[ANALYST] Cannot resolve any supported SDK');
19
- return;
20
- }
21
-
22
- try {
23
- global /** @var Analyst\Analyst $analyst */
24
- $analyst;
25
-
26
- // Set global instance of analyst
27
- if (!$analyst) {
28
- $analyst = Analyst\Analyst::getInstance();
29
- }
30
-
31
- $analyst->registerAccount(new Account\Account($options['client-id'], $options['client-secret'], $options['base-dir']));
32
- } catch (Exception $e) {
33
- error_log('Analyst SDK receive an error: [' . $e->getMessage() . '] Please contact our support at support@analyst.com');
34
- }
35
- }
36
- }
1
+ <?php
2
+
3
+ require_once 'sdk_resolver.php';
4
+
5
+
6
+ if (!function_exists('analyst_init')) {
7
+ /**
8
+ * Initialize analyst
9
+ *
10
+ * @param array $options
11
+ */
12
+ function analyst_init ($options) {
13
+ // Try resolve latest supported SDK
14
+ // In case resolving is failed exit the execution
15
+ try {
16
+ analyst_resolve_sdk($options['base-dir']);
17
+ } catch (Exception $exception) {
18
+ error_log('[ANALYST] Cannot resolve any supported SDK');
19
+ return;
20
+ }
21
+
22
+ try {
23
+ global /** @var Analyst\Analyst $analyst */
24
+ $analyst;
25
+
26
+ // Set global instance of analyst
27
+ if (!$analyst) {
28
+ $analyst = Analyst\Analyst::getInstance();
29
+ }
30
+
31
+ $analyst->registerAccount(new Account\Account($options['client-id'], $options['client-secret'], $options['base-dir']));
32
+ } catch (Exception $e) {
33
+ error_log('Analyst SDK receive an error: [' . $e->getMessage() . '] Please contact our support at support@analyst.com');
34
+ }
35
+ }
36
+ }
analyst/sdk_resolver.php CHANGED
@@ -1,79 +1,79 @@
1
- <?php
2
-
3
- if (!function_exists('analyst_resolve_sdk')) {
4
-
5
- /**
6
- * Resolve supported sdk versions and load latest supported one
7
- * also bootstrap sdk with autoloader
8
- *
9
- * @since 1.1.3
10
- *
11
- * @param null $thisPluginPath
12
- * @return void
13
- * @throws Exception
14
- */
15
- function analyst_resolve_sdk($thisPluginPath = null) {
16
- static $loaded = false;
17
-
18
- // Exit if we already resolved SDK
19
- if ($loaded) return;
20
-
21
- $plugins = get_option('active_plugins');
22
-
23
- if ($thisPluginPath) {
24
- array_push($plugins, plugin_basename($thisPluginPath));
25
- }
26
-
27
- $pluginsFolder = WP_PLUGIN_DIR;
28
-
29
- $possibleSDKs = array_map(function ($path) use ($pluginsFolder) {
30
- $sdkFolder = sprintf('%s/%s/analyst/', $pluginsFolder, dirname($path));
31
-
32
- $sdkFolder = str_replace('\\', '/', $sdkFolder);
33
-
34
- $versionPath = $sdkFolder . 'version.php';
35
-
36
- if (file_exists($versionPath)) {
37
- return require $versionPath;
38
- }
39
-
40
- return false;
41
- }, $plugins);
42
-
43
- global $wp_version;
44
-
45
- // Filter out plugins which has no SDK
46
- $SDKs = array_filter($possibleSDKs, function ($s) {return is_array($s);});
47
-
48
- // Filter SDKs which is supported by PHP and WP
49
- $supported = array_values(array_filter($SDKs, function ($sdk) use($wp_version) {
50
- $phpSupported = version_compare(PHP_VERSION, $sdk['php']) >= 0;
51
- $wpSupported = version_compare($wp_version, $sdk['wp']) >= 0;
52
-
53
- return $phpSupported && $wpSupported;
54
- }));
55
-
56
- // Sort SDK by version in descending order
57
- uasort($supported, function ($x, $y) {
58
- return version_compare($y['sdk'], $x['sdk']);
59
- });
60
-
61
- // Reset sorted values keys
62
- $supported = array_values($supported);
63
-
64
- if (!isset($supported[0])) {
65
- throw new Exception('There is no SDK which is support current PHP version and WP version');
66
- }
67
-
68
- // Autoload files for supported SDK
69
- $autoloaderPath = str_replace(
70
- '\\',
71
- '/',
72
- sprintf('%s/autoload.php', $supported[0]['path'])
73
- );
74
-
75
- require_once $autoloaderPath;
76
-
77
- $loaded = true;
78
- }
79
- }
1
+ <?php
2
+
3
+ if (!function_exists('analyst_resolve_sdk')) {
4
+
5
+ /**
6
+ * Resolve supported sdk versions and load latest supported one
7
+ * also bootstrap sdk with autoloader
8
+ *
9
+ * @since 1.1.3
10
+ *
11
+ * @param null $thisPluginPath
12
+ * @return void
13
+ * @throws Exception
14
+ */
15
+ function analyst_resolve_sdk($thisPluginPath = null) {
16
+ static $loaded = false;
17
+
18
+ // Exit if we already resolved SDK
19
+ if ($loaded) return;
20
+
21
+ $plugins = get_option('active_plugins');
22
+
23
+ if ($thisPluginPath) {
24
+ array_push($plugins, plugin_basename($thisPluginPath));
25
+ }
26
+
27
+ $pluginsFolder = WP_PLUGIN_DIR;
28
+
29
+ $possibleSDKs = array_map(function ($path) use ($pluginsFolder) {
30
+ $sdkFolder = sprintf('%s/%s/analyst/', $pluginsFolder, dirname($path));
31
+
32
+ $sdkFolder = str_replace('\\', '/', $sdkFolder);
33
+
34
+ $versionPath = $sdkFolder . 'version.php';
35
+
36
+ if (file_exists($versionPath)) {
37
+ return require $versionPath;
38
+ }
39
+
40
+ return false;
41
+ }, $plugins);
42
+
43
+ global $wp_version;
44
+
45
+ // Filter out plugins which has no SDK
46
+ $SDKs = array_filter($possibleSDKs, function ($s) {return is_array($s);});
47
+
48
+ // Filter SDKs which is supported by PHP and WP
49
+ $supported = array_values(array_filter($SDKs, function ($sdk) use($wp_version) {
50
+ $phpSupported = version_compare(PHP_VERSION, $sdk['php']) >= 0;
51
+ $wpSupported = version_compare($wp_version, $sdk['wp']) >= 0;
52
+
53
+ return $phpSupported && $wpSupported;
54
+ }));
55
+
56
+ // Sort SDK by version in descending order
57
+ uasort($supported, function ($x, $y) {
58
+ return version_compare($y['sdk'], $x['sdk']);
59
+ });
60
+
61
+ // Reset sorted values keys
62
+ $supported = array_values($supported);
63
+
64
+ if (!isset($supported[0])) {
65
+ throw new Exception('There is no SDK which is support current PHP version and WP version');
66
+ }
67
+
68
+ // Autoload files for supported SDK
69
+ $autoloaderPath = str_replace(
70
+ '\\',
71
+ '/',
72
+ sprintf('%s/autoload.php', $supported[0]['path'])
73
+ );
74
+
75
+ require_once $autoloaderPath;
76
+
77
+ $loaded = true;
78
+ }
79
+ }
analyst/src/Account/Account.php CHANGED
@@ -1,584 +1,584 @@
1
- <?php
2
-
3
- namespace Account;
4
-
5
- use Analyst\Analyst;
6
- use Analyst\ApiRequestor;
7
- use Analyst\Cache\DatabaseCache;
8
- use Analyst\Collector;
9
- use Analyst\Http\Requests\ActivateRequest;
10
- use Analyst\Http\Requests\DeactivateRequest;
11
- use Analyst\Http\Requests\InstallRequest;
12
- use Analyst\Http\Requests\OptInRequest;
13
- use Analyst\Http\Requests\OptOutRequest;
14
- use Analyst\Http\Requests\UninstallRequest;
15
- use Analyst\Notices\Notice;
16
- use Analyst\Notices\NoticeFactory;
17
- use Analyst\Contracts\TrackerContract;
18
- use Analyst\Contracts\RequestorContract;
19
-
20
- /**
21
- * Class Account
22
- *
23
- * This is plugin's account object
24
- */
25
- class Account implements TrackerContract
26
- {
27
- /**
28
- * Account id
29
- *
30
- * @var string
31
- */
32
- protected $id;
33
-
34
- /**
35
- * Basename of plugin
36
- *
37
- * @var string
38
- */
39
- protected $path;
40
-
41
- /**
42
- * Whether plugin is active or not
43
- *
44
- * @var bool
45
- */
46
- protected $isInstalled = false;
47
-
48
- /**
49
- * Is user sign in for data tracking
50
- *
51
- * @var bool
52
- */
53
- protected $isOptedIn = false;
54
-
55
- /**
56
- * Is user accepted permissions grant
57
- * for collection site data
58
- *
59
- * @var bool
60
- */
61
- protected $isSigned = false;
62
-
63
- /**
64
- * Is user ever resolved install modal window?
65
- *
66
- * @var bool
67
- */
68
- protected $isInstallResolved = false;
69
-
70
- /**
71
- * Public secret code
72
- *
73
- * @var string
74
- */
75
- protected $clientSecret;
76
-
77
- /**
78
- * @var AccountData
79
- */
80
- protected $data;
81
-
82
- /**
83
- * Base plugin path
84
- *
85
- * @var string
86
- */
87
- protected $basePluginPath;
88
-
89
- /**
90
- * @var RequestorContract
91
- */
92
- protected $requestor;
93
-
94
- /**
95
- * @var Collector
96
- */
97
- protected $collector;
98
-
99
- /**
100
- * Account constructor.
101
- * @param $id
102
- * @param $secret
103
- * @param $baseDir
104
- */
105
- public function __construct($id, $secret, $baseDir)
106
- {
107
- $this->id = $id;
108
- $this->clientSecret = $secret;
109
-
110
- $this->path = $baseDir;
111
-
112
- $this->basePluginPath = plugin_basename($baseDir);
113
- }
114
-
115
- /**
116
- * @return string
117
- */
118
- public function getPath()
119
- {
120
- return $this->path;
121
- }
122
-
123
- /**
124
- * @param string $path
125
- */
126
- public function setPath($path)
127
- {
128
- $this->data->setPath($path);
129
-
130
- $this->path = $path;
131
- }
132
-
133
- /**
134
- * @return bool
135
- */
136
- public function isOptedIn()
137
- {
138
- return $this->isOptedIn;
139
- }
140
-
141
- /**
142
- * @param bool $isOptedIn
143
- */
144
- public function setIsOptedIn($isOptedIn)
145
- {
146
- $this->data->setIsOptedIn($isOptedIn);
147
-
148
- $this->isOptedIn = $isOptedIn;
149
- }
150
-
151
- /**
152
- * Whether plugin is active
153
- *
154
- * @return bool
155
- */
156
- public function isActive()
157
- {
158
- return is_plugin_active($this->path);
159
- }
160
-
161
- /**
162
- * @param string $id
163
- */
164
- public function setId($id)
165
- {
166
- $this->id = $id;
167
- }
168
-
169
- /**
170
- * @return string
171
- */
172
- public function getId()
173
- {
174
- return $this->id;
175
- }
176
-
177
- /**
178
- * @return bool
179
- */
180
- public function isInstalled()
181
- {
182
- return $this->isInstalled;
183
- }
184
-
185
- /**
186
- * @param bool $isInstalled
187
- */
188
- public function setIsInstalled($isInstalled)
189
- {
190
- $this->data->setIsInstalled($isInstalled);
191
-
192
- $this->isInstalled = $isInstalled;
193
- }
194
-
195
- /**
196
- * Should register activation and deactivation
197
- * event hooks
198
- *
199
- * @return void
200
- */
201
- public function registerHooks()
202
- {
203
- register_activation_hook($this->basePluginPath, [&$this, 'onActivePluginListener']);
204
- register_uninstall_hook($this->basePluginPath, ['Account\Account', 'onUninstallPluginListener']);
205
-
206
- $this->addFilter('plugin_action_links', [&$this, 'onRenderActionLinksHook']);
207
-
208
- $this->addAjax('analyst_opt_in', [&$this, 'onOptInListener']);
209
- $this->addAjax('analyst_opt_out', [&$this, 'onOptOutListener']);
210
- $this->addAjax('analyst_plugin_deactivate', [&$this, 'onDeactivatePluginListener']);
211
- $this->addAjax('analyst_install', [&$this, 'onInstallListener']);
212
- $this->addAjax('analyst_skip_install', [&$this, 'onSkipInstallListener']);
213
- $this->addAjax('analyst_install_verified', [&$this, 'onInstallVerifiedListener']);
214
- }
215
-
216
- /**
217
- * Will fire when admin activates plugin
218
- *
219
- * @return void
220
- */
221
- public function onActivePluginListener()
222
- {
223
- if (!$this->isInstallResolved()) {
224
- DatabaseCache::getInstance()->put('plugin_to_install', $this->id);
225
- }
226
-
227
- if (!$this->isAllowingLogging()) return;
228
-
229
- ActivateRequest::make($this->collector, $this->id, $this->path)
230
- ->execute($this->requestor);
231
-
232
- $this->setIsInstalled(true);
233
-
234
- AccountDataFactory::syncData();
235
- }
236
-
237
- /**
238
- * Will fire when admin deactivates plugin
239
- *
240
- * @return void
241
- */
242
- public function onDeactivatePluginListener()
243
- {
244
- if (!$this->isAllowingLogging()) return;
245
-
246
- $question = isset($_POST['question']) ? stripslashes($_POST['question']) : null;
247
- $reason = isset($_POST['reason']) ? stripslashes($_POST['reason']) : null;
248
-
249
- DeactivateRequest::make($this->collector, $this->id, $this->path, $question, $reason)
250
- ->execute($this->requestor);
251
-
252
- $this->setIsInstalled(false);
253
-
254
- AccountDataFactory::syncData();
255
-
256
- wp_send_json_success();
257
- }
258
-
259
- /**
260
- * Will fire when user opted in
261
- *
262
- * @return void
263
- */
264
- public function onOptInListener()
265
- {
266
- OptInRequest::make($this->collector, $this->id, $this->path)->execute($this->requestor);
267
-
268
- $this->setIsOptedIn(true);
269
-
270
- AccountDataFactory::syncData();
271
-
272
- wp_die();
273
- }
274
-
275
- /**
276
- * Will fire when user opted out
277
- *
278
- * @return void
279
- */
280
- public function onOptOutListener()
281
- {
282
- OptOutRequest::make($this->collector, $this->id, $this->path)->execute($this->requestor);
283
-
284
- $this->setIsOptedIn(false);
285
-
286
- AccountDataFactory::syncData();
287
-
288
- wp_send_json_success();
289
- }
290
-
291
- /**
292
- * Will fire when user accept opt-in
293
- * at first time
294
- *
295
- * @return void
296
- */
297
- public function onInstallListener()
298
- {
299
- $cache = DatabaseCache::getInstance();
300
-
301
- // Set flag to true which indicates that install is resolved
302
- // also remove install plugin id from cache
303
- $this->setIsInstallResolved(true);
304
- $cache->delete('plugin_to_install');
305
-
306
- InstallRequest::make($this->collector, $this->id, $this->path)->execute($this->requestor);
307
-
308
- $this->setIsSigned(true);
309
-
310
- $this->setIsOptedIn(true);
311
-
312
- $factory = NoticeFactory::instance();
313
-
314
- $message = sprintf('Please confirm your email by clicking on the link we sent to %s. This makes sure you’re not a bot.', $this->collector->getGeneralEmailAddress());
315
-
316
- $notificationId = uniqid();
317
-
318
- $notice = Notice::make(
319
- $notificationId,
320
- $this->getId(),
321
- $message,
322
- $this->collector->getPluginName($this->path)
323
- );
324
-
325
- $factory->addNotice($notice);
326
-
327
- AccountDataFactory::syncData();
328
-
329
- // Set email confirmation notification id to cache
330
- // se we can extract and remove it when user confirmed email
331
- $cache->put(
332
- sprintf('account_email_confirmation_%s', $this->getId()),
333
- $notificationId
334
- );
335
-
336
- wp_send_json_success();
337
- }
338
-
339
- /**
340
- * Will fire when user skipped installation
341
- *
342
- * @return void
343
- */
344
- public function onSkipInstallListener()
345
- {
346
- // Set flag to true which indicates that install is resolved
347
- // also remove install plugin id from cache
348
- $this->setIsInstallResolved(true);
349
- DatabaseCache::getInstance()->delete('plugin_to_install');
350
- }
351
-
352
- /**
353
- * Will fire when user delete plugin through admin panel.
354
- * This action will happen if admin at least once
355
- * activated the plugin.
356
- *
357
- * @return void
358
- * @throws \Exception
359
- */
360
- public static function onUninstallPluginListener()
361
- {
362
- $factory = AccountDataFactory::instance();
363
-
364
- $pluginFile = substr(current_filter(), strlen( 'uninstall_' ));
365
-
366
- $account = $factory->getAccountDataByBasePath($pluginFile);
367
-
368
- // If account somehow is not found, exit the execution
369
- if (!$account) return;
370
-
371
- $analyst = Analyst::getInstance();
372
-
373
- $collector = new Collector($analyst);
374
-
375
- $requestor = new ApiRequestor($account->getId(), $account->getSecret(), $analyst->getApiBase());
376
-
377
- // Just send request to log uninstall event not caring about response
378
- UninstallRequest::make($collector, $account->getId(), $account->getPath())->execute($requestor);
379
-
380
- $factory->sync();
381
- }
382
-
383
- /**
384
- * Fires when used verified his account
385
- */
386
- public function onInstallVerifiedListener()
387
- {
388
- $factory = NoticeFactory::instance();
389
-
390
- $notice = Notice::make(
391
- uniqid(),
392
- $this->getId(),
393
- 'Thank you for confirming your email.',
394
- $this->collector->getPluginName($this->path)
395
- );
396
-
397
- $factory->addNotice($notice);
398
-
399
- // Remove confirmation notification
400
- $confirmationNotificationId = DatabaseCache::getInstance()->pop(sprintf('account_email_confirmation_%s', $this->getId()));
401
- $factory->remove($confirmationNotificationId);
402
-
403
- AccountDataFactory::syncData();
404
-
405
- wp_send_json_success();
406
- }
407
-
408
- /**
409
- * Will fire when wp renders plugin
410
- * action buttons
411
- *
412
- * @param $defaultLinks
413
- * @return array
414
- */
415
- public function onRenderActionLinksHook($defaultLinks)
416
- {
417
- $customLinks = [];
418
-
419
- $customLinks[] = $this->isOptedIn()
420
- ? '<a class="analyst-action-opt analyst-opt-out" analyst-plugin-id="' . $this->getId() . '" analyst-plugin-signed="' . (int) $this->isSigned() . '">Opt Out</a>'
421
- : '<a class="analyst-action-opt analyst-opt-in" analyst-plugin-id="' . $this->getId() . '" analyst-plugin-signed="' . (int) $this->isSigned() . '">Opt In</a>';
422
-
423
- // Append anchor to find specific deactivation link
424
- if (isset($defaultLinks['deactivate'])) {
425
- $defaultLinks['deactivate'] .= '<span analyst-plugin-id="' . $this->getId() . '" analyst-plugin-opted-in="' . (int) $this->isOptedIn() . '"></span>';
426
- }
427
-
428
- return array_merge($customLinks, $defaultLinks);
429
- }
430
-
431
- /**
432
- * @return AccountData
433
- */
434
- public function getData()
435
- {
436
- return $this->data;
437
- }
438
-
439
- /**
440
- * @param AccountData $data
441
- */
442
- public function setData(AccountData $data)
443
- {
444
- $this->data = $data;
445
-
446
- $this->setIsOptedIn($data->isOptedIn());
447
- $this->setIsInstalled($data->isInstalled());
448
- $this->setIsSigned($data->isSigned());
449
- $this->setIsInstallResolved($data->isInstallResolved());
450
- }
451
-
452
- /**
453
- * Resolves valid action name
454
- * based on client id
455
- *
456
- * @param $action
457
- * @return string
458
- */
459
- private function resolveActionName($action)
460
- {
461
- return sprintf('%s_%s', $action, $this->id);
462
- }
463
-
464
- /**
465
- * Register action for current plugin
466
- *
467
- * @param $action
468
- * @param $callback
469
- */
470
- private function addFilter($action, $callback)
471
- {
472
- $validAction = sprintf('%s_%s', $action, $this->basePluginPath);
473
-
474
- add_filter($validAction, $callback, 10);
475
- }
476
-
477
- /**
478
- * Add ajax action for current plugin
479
- *
480
- * @param $action
481
- * @param $callback
482
- * @param bool $raw Format action ??
483
- */
484
- private function addAjax($action, $callback, $raw = false)
485
- {
486
- $validAction = $raw ? $action : sprintf('%s%s', 'wp_ajax_', $this->resolveActionName($action));
487
-
488
- add_action($validAction, $callback);
489
- }
490
-
491
- /**
492
- * @return bool
493
- */
494
- public function isSigned()
495
- {
496
- return $this->isSigned;
497
- }
498
-
499
- /**
500
- * @param bool $isSigned
501
- */
502
- public function setIsSigned($isSigned)
503
- {
504
- $this->data->setIsSigned($isSigned);
505
-
506
- $this->isSigned = $isSigned;
507
- }
508
-
509
- /**
510
- * @return RequestorContract
511
- */
512
- public function getRequestor()
513
- {
514
- return $this->requestor;
515
- }
516
-
517
- /**
518
- * @param RequestorContract $requestor
519
- */
520
- public function setRequestor(RequestorContract $requestor)
521
- {
522
- $this->requestor = $requestor;
523
- }
524
-
525
- /**
526
- * @return string
527
- */
528
- public function getClientSecret()
529
- {
530
- return $this->clientSecret;
531
- }
532
-
533
- /**
534
- * @return Collector
535
- */
536
- public function getCollector()
537
- {
538
- return $this->collector;
539
- }
540
-
541
- /**
542
- * @param Collector $collector
543
- */
544
- public function setCollector(Collector $collector)
545
- {
546
- $this->collector = $collector;
547
- }
548
-
549
- /**
550
- * Do we allowing logging
551
- *
552
- * @return bool
553
- */
554
- public function isAllowingLogging()
555
- {
556
- return $this->isOptedIn;
557
- }
558
-
559
- /**
560
- * @return string
561
- */
562
- public function getBasePluginPath()
563
- {
564
- return $this->basePluginPath;
565
- }
566
-
567
- /**
568
- * @return bool
569
- */
570
- public function isInstallResolved()
571
- {
572
- return $this->isInstallResolved;
573
- }
574
-
575
- /**
576
- * @param bool $isInstallResolved
577
- */
578
- public function setIsInstallResolved($isInstallResolved)
579
- {
580
- $this->data->setIsInstallResolved($isInstallResolved);
581
-
582
- $this->isInstallResolved = $isInstallResolved;
583
- }
584
- }
1
+ <?php
2
+
3
+ namespace Account;
4
+
5
+ use Analyst\Analyst;
6
+ use Analyst\ApiRequestor;
7
+ use Analyst\Cache\DatabaseCache;
8
+ use Analyst\Collector;
9
+ use Analyst\Http\Requests\ActivateRequest;
10
+ use Analyst\Http\Requests\DeactivateRequest;
11
+ use Analyst\Http\Requests\InstallRequest;
12
+ use Analyst\Http\Requests\OptInRequest;
13
+ use Analyst\Http\Requests\OptOutRequest;
14
+ use Analyst\Http\Requests\UninstallRequest;
15
+ use Analyst\Notices\Notice;
16
+ use Analyst\Notices\NoticeFactory;
17
+ use Analyst\Contracts\TrackerContract;
18
+ use Analyst\Contracts\RequestorContract;
19
+
20
+ /**
21
+ * Class Account
22
+ *
23
+ * This is plugin's account object
24
+ */
25
+ class Account implements TrackerContract
26
+ {
27
+ /**
28
+ * Account id
29
+ *
30
+ * @var string
31
+ */
32
+ protected $id;
33
+
34
+ /**
35
+ * Basename of plugin
36
+ *
37
+ * @var string
38
+ */
39
+ protected $path;
40
+
41
+ /**
42
+ * Whether plugin is active or not
43
+ *
44
+ * @var bool
45
+ */
46
+ protected $isInstalled = false;
47
+
48
+ /**
49
+ * Is user sign in for data tracking
50
+ *
51
+ * @var bool
52
+ */
53
+ protected $isOptedIn = false;
54
+
55
+ /**
56
+ * Is user accepted permissions grant
57
+ * for collection site data
58
+ *
59
+ * @var bool
60
+ */
61
+ protected $isSigned = false;
62
+
63
+ /**
64
+ * Is user ever resolved install modal window?
65
+ *
66
+ * @var bool
67
+ */
68
+ protected $isInstallResolved = false;
69
+
70
+ /**
71
+ * Public secret code
72
+ *
73
+ * @var string
74
+ */
75
+ protected $clientSecret;
76
+
77
+ /**
78
+ * @var AccountData
79
+ */
80
+ protected $data;
81
+
82
+ /**
83
+ * Base plugin path
84
+ *
85
+ * @var string
86
+ */
87
+ protected $basePluginPath;
88
+
89
+ /**
90
+ * @var RequestorContract
91
+ */
92
+ protected $requestor;
93
+
94
+ /**
95
+ * @var Collector
96
+ */
97
+ protected $collector;
98
+
99
+ /**
100
+ * Account constructor.
101
+ * @param $id
102
+ * @param $secret
103
+ * @param $baseDir
104
+ */
105
+ public function __construct($id, $secret, $baseDir)
106
+ {
107
+ $this->id = $id;
108
+ $this->clientSecret = $secret;
109
+
110
+ $this->path = $baseDir;
111
+
112
+ $this->basePluginPath = plugin_basename($baseDir);
113
+ }
114
+
115
+ /**
116
+ * @return string
117
+ */
118
+ public function getPath()
119
+ {
120
+ return $this->path;
121
+ }
122
+
123
+ /**
124
+ * @param string $path
125
+ */
126
+ public function setPath($path)
127
+ {
128
+ $this->data->setPath($path);
129
+
130
+ $this->path = $path;
131
+ }
132
+
133
+ /**
134
+ * @return bool
135
+ */
136
+ public function isOptedIn()
137
+ {
138
+ return $this->isOptedIn;
139
+ }
140
+
141
+ /**
142
+ * @param bool $isOptedIn
143
+ */
144
+ public function setIsOptedIn($isOptedIn)
145
+ {
146
+ $this->data->setIsOptedIn($isOptedIn);
147
+
148
+ $this->isOptedIn = $isOptedIn;
149
+ }
150
+
151
+ /**
152
+ * Whether plugin is active
153
+ *
154
+ * @return bool
155
+ */
156
+ public function isActive()
157
+ {
158
+ return is_plugin_active($this->path);
159
+ }
160
+
161
+ /**
162
+ * @param string $id
163
+ */
164
+ public function setId($id)
165
+ {
166
+ $this->id = $id;
167
+ }
168
+
169
+ /**
170
+ * @return string
171
+ */
172
+ public function getId()
173
+ {
174
+ return $this->id;
175
+ }
176
+
177
+ /**
178
+ * @return bool
179
+ */
180
+ public function isInstalled()
181
+ {
182
+ return $this->isInstalled;
183
+ }
184
+
185
+ /**
186
+ * @param bool $isInstalled
187
+ */
188
+ public function setIsInstalled($isInstalled)
189
+ {
190
+ $this->data->setIsInstalled($isInstalled);
191
+
192
+ $this->isInstalled = $isInstalled;
193
+ }
194
+
195
+ /**
196
+ * Should register activation and deactivation
197
+ * event hooks
198
+ *
199
+ * @return void
200
+ */
201
+ public function registerHooks()
202
+ {
203
+ register_activation_hook($this->basePluginPath, [&$this, 'onActivePluginListener']);
204
+ register_uninstall_hook($this->basePluginPath, ['Account\Account', 'onUninstallPluginListener']);
205
+
206
+ $this->addFilter('plugin_action_links', [&$this, 'onRenderActionLinksHook']);
207
+
208
+ $this->addAjax('analyst_opt_in', [&$this, 'onOptInListener']);
209
+ $this->addAjax('analyst_opt_out', [&$this, 'onOptOutListener']);
210
+ $this->addAjax('analyst_plugin_deactivate', [&$this, 'onDeactivatePluginListener']);
211
+ $this->addAjax('analyst_install', [&$this, 'onInstallListener']);
212
+ $this->addAjax('analyst_skip_install', [&$this, 'onSkipInstallListener']);
213
+ $this->addAjax('analyst_install_verified', [&$this, 'onInstallVerifiedListener']);
214
+ }
215
+
216
+ /**
217
+ * Will fire when admin activates plugin
218
+ *
219
+ * @return void
220
+ */
221
+ public function onActivePluginListener()
222
+ {
223
+ if (!$this->isInstallResolved()) {
224
+ DatabaseCache::getInstance()->put('plugin_to_install', $this->id);
225
+ }
226
+
227
+ if (!$this->isAllowingLogging()) return;
228
+
229
+ ActivateRequest::make($this->collector, $this->id, $this->path)
230
+ ->execute($this->requestor);
231
+
232
+ $this->setIsInstalled(true);
233
+
234
+ AccountDataFactory::syncData();
235
+ }
236
+
237
+ /**
238
+ * Will fire when admin deactivates plugin
239
+ *
240
+ * @return void
241
+ */
242
+ public function onDeactivatePluginListener()
243
+ {
244
+ if (!$this->isAllowingLogging()) return;
245
+
246
+ $question = isset($_POST['question']) ? stripslashes($_POST['question']) : null;
247
+ $reason = isset($_POST['reason']) ? stripslashes($_POST['reason']) : null;
248
+
249
+ DeactivateRequest::make($this->collector, $this->id, $this->path, $question, $reason)
250
+ ->execute($this->requestor);
251
+
252
+ $this->setIsInstalled(false);
253
+
254
+ AccountDataFactory::syncData();
255
+
256
+ wp_send_json_success();
257
+ }
258
+
259
+ /**
260
+ * Will fire when user opted in
261
+ *
262
+ * @return void
263
+ */
264
+ public function onOptInListener()
265
+ {
266
+ OptInRequest::make($this->collector, $this->id, $this->path)->execute($this->requestor);
267
+
268
+ $this->setIsOptedIn(true);
269
+
270
+ AccountDataFactory::syncData();
271
+
272
+ wp_die();
273
+ }
274
+
275
+ /**
276
+ * Will fire when user opted out
277
+ *
278
+ * @return void
279
+ */
280
+ public function onOptOutListener()
281
+ {
282
+ OptOutRequest::make($this->collector, $this->id, $this->path)->execute($this->requestor);
283
+
284
+ $this->setIsOptedIn(false);
285
+
286
+ AccountDataFactory::syncData();
287
+
288
+ wp_send_json_success();
289
+ }
290
+
291
+ /**
292
+ * Will fire when user accept opt-in
293
+ * at first time
294
+ *
295
+ * @return void
296
+ */
297
+ public function onInstallListener()
298
+ {
299
+ $cache = DatabaseCache::getInstance();
300
+
301
+ // Set flag to true which indicates that install is resolved
302
+ // also remove install plugin id from cache
303
+ $this->setIsInstallResolved(true);
304
+ $cache->delete('plugin_to_install');
305
+
306
+ InstallRequest::make($this->collector, $this->id, $this->path)->execute($this->requestor);
307
+
308
+ $this->setIsSigned(true);
309
+
310
+ $this->setIsOptedIn(true);
311
+
312
+ $factory = NoticeFactory::instance();
313
+
314
+ $message = sprintf('Please confirm your email by clicking on the link we sent to %s. This makes sure you’re not a bot.', $this->collector->getGeneralEmailAddress());
315
+
316
+ $notificationId = uniqid();
317
+
318
+ $notice = Notice::make(
319
+ $notificationId,
320
+ $this->getId(),
321
+ $message,
322
+ $this->collector->getPluginName($this->path)
323
+ );
324
+
325
+ $factory->addNotice($notice);
326
+
327
+ AccountDataFactory::syncData();
328
+
329
+ // Set email confirmation notification id to cache
330
+ // se we can extract and remove it when user confirmed email
331
+ $cache->put(
332
+ sprintf('account_email_confirmation_%s', $this->getId()),
333
+ $notificationId
334
+ );
335
+
336
+ wp_send_json_success();
337
+ }
338
+
339
+ /**
340
+ * Will fire when user skipped installation
341
+ *
342
+ * @return void
343
+ */
344
+ public function onSkipInstallListener()
345
+ {
346
+ // Set flag to true which indicates that install is resolved
347
+ // also remove install plugin id from cache
348
+ $this->setIsInstallResolved(true);
349
+ DatabaseCache::getInstance()->delete('plugin_to_install');
350
+ }
351
+
352
+ /**
353
+ * Will fire when user delete plugin through admin panel.
354
+ * This action will happen if admin at least once
355
+ * activated the plugin.
356
+ *
357
+ * @return void
358
+ * @throws \Exception
359
+ */
360
+ public static function onUninstallPluginListener()
361
+ {
362
+ $factory = AccountDataFactory::instance();
363
+
364
+ $pluginFile = substr(current_filter(), strlen( 'uninstall_' ));
365
+
366
+ $account = $factory->getAccountDataByBasePath($pluginFile);
367
+
368
+ // If account somehow is not found, exit the execution
369
+ if (!$account) return;
370
+
371
+ $analyst = Analyst::getInstance();
372
+
373
+ $collector = new Collector($analyst);
374
+
375
+ $requestor = new ApiRequestor($account->getId(), $account->getSecret(), $analyst->getApiBase());
376
+
377
+ // Just send request to log uninstall event not caring about response
378
+ UninstallRequest::make($collector, $account->getId(), $account->getPath())->execute($requestor);
379
+
380
+ $factory->sync();
381
+ }
382
+
383
+ /**
384
+ * Fires when used verified his account
385
+ */
386
+ public function onInstallVerifiedListener()
387
+ {
388
+ $factory = NoticeFactory::instance();
389
+
390
+ $notice = Notice::make(
391
+ uniqid(),
392
+ $this->getId(),
393
+ 'Thank you for confirming your email.',
394
+ $this->collector->getPluginName($this->path)
395
+ );
396
+
397
+ $factory->addNotice($notice);
398
+
399
+ // Remove confirmation notification
400
+ $confirmationNotificationId = DatabaseCache::getInstance()->pop(sprintf('account_email_confirmation_%s', $this->getId()));
401
+ $factory->remove($confirmationNotificationId);
402
+
403
+ AccountDataFactory::syncData();
404
+
405
+ wp_send_json_success();
406
+ }
407
+
408
+ /**
409
+ * Will fire when wp renders plugin
410
+ * action buttons
411
+ *
412
+ * @param $defaultLinks
413
+ * @return array
414
+ */
415
+ public function onRenderActionLinksHook($defaultLinks)
416
+ {
417
+ $customLinks = [];
418
+
419
+ $customLinks[] = $this->isOptedIn()
420
+ ? '<a class="analyst-action-opt analyst-opt-out" analyst-plugin-id="' . $this->getId() . '" analyst-plugin-signed="' . (int) $this->isSigned() . '">Opt Out</a>'
421
+ : '<a class="analyst-action-opt analyst-opt-in" analyst-plugin-id="' . $this->getId() . '" analyst-plugin-signed="' . (int) $this->isSigned() . '">Opt In</a>';
422
+
423
+ // Append anchor to find specific deactivation link
424
+ if (isset($defaultLinks['deactivate'])) {
425
+ $defaultLinks['deactivate'] .= '<span analyst-plugin-id="' . $this->getId() . '" analyst-plugin-opted-in="' . (int) $this->isOptedIn() . '"></span>';
426
+ }
427
+
428
+ return array_merge($customLinks, $defaultLinks);
429
+ }
430
+
431
+ /**
432
+ * @return AccountData
433
+ */
434
+ public function getData()
435
+ {
436
+ return $this->data;
437
+ }
438
+
439
+ /**
440
+ * @param AccountData $data
441
+ */
442
+ public function setData(AccountData $data)
443
+ {
444
+ $this->data = $data;
445
+
446
+ $this->setIsOptedIn($data->isOptedIn());
447
+ $this->setIsInstalled($data->isInstalled());
448
+ $this->setIsSigned($data->isSigned());
449
+ $this->setIsInstallResolved($data->isInstallResolved());
450
+ }
451
+
452
+ /**
453
+ * Resolves valid action name
454
+ * based on client id
455
+ *
456
+ * @param $action
457
+ * @return string
458
+ */
459
+ private function resolveActionName($action)
460
+ {
461
+ return sprintf('%s_%s', $action, $this->id);
462
+ }
463
+
464
+ /**
465
+ * Register action for current plugin
466
+ *
467
+ * @param $action
468
+ * @param $callback
469
+ */
470
+ private function addFilter($action, $callback)
471
+ {
472
+ $validAction = sprintf('%s_%s', $action, $this->basePluginPath);
473
+
474
+ add_filter($validAction, $callback, 10);
475
+ }
476
+
477
+ /**
478
+ * Add ajax action for current plugin
479
+ *
480
+ * @param $action
481
+ * @param $callback
482
+ * @param bool $raw Format action ??
483
+ */
484
+ private function addAjax($action, $callback, $raw = false)
485
+ {
486
+ $validAction = $raw ? $action : sprintf('%s%s', 'wp_ajax_', $this->resolveActionName($action));
487
+
488
+ add_action($validAction, $callback);
489
+ }
490
+
491
+ /**
492
+ * @return bool
493
+ */
494
+ public function isSigned()
495
+ {
496
+ return $this->isSigned;
497
+ }
498
+
499
+ /**
500
+ * @param bool $isSigned
501
+ */
502
+ public function setIsSigned($isSigned)
503
+ {
504
+ $this->data->setIsSigned($isSigned);
505
+
506
+ $this->isSigned = $isSigned;
507
+ }
508
+
509
+ /**
510
+ * @return RequestorContract
511
+ */
512
+ public function getRequestor()
513
+ {
514
+ return $this->requestor;
515
+ }
516
+
517
+ /**
518
+ * @param RequestorContract $requestor
519
+ */
520
+ public function setRequestor(RequestorContract $requestor)
521
+ {
522
+ $this->requestor = $requestor;
523
+ }
524
+
525
+ /**
526
+ * @return string
527
+ */
528
+ public function getClientSecret()
529
+ {
530
+ return $this->clientSecret;
531
+ }
532
+
533
+ /**
534
+ * @return Collector
535
+ */
536
+ public function getCollector()
537
+ {
538
+ return $this->collector;
539
+ }
540
+
541
+ /**
542
+ * @param Collector $collector
543
+ */
544
+ public function setCollector(Collector $collector)
545
+ {
546
+ $this->collector = $collector;
547
+ }
548
+
549
+ /**
550
+ * Do we allowing logging
551
+ *
552
+ * @return bool
553
+ */
554
+ public function isAllowingLogging()
555
+ {
556
+ return $this->isOptedIn;
557
+ }
558
+
559
+ /**
560
+ * @return string
561
+ */
562
+ public function getBasePluginPath()
563
+ {
564
+ return $this->basePluginPath;
565
+ }
566
+
567
+ /**
568
+ * @return bool
569
+ */
570
+ public function isInstallResolved()
571
+ {
572
+ return $this->isInstallResolved;
573
+ }
574
+
575
+ /**
576
+ * @param bool $isInstallResolved
577
+ */
578
+ public function setIsInstallResolved($isInstallResolved)
579
+ {
580
+ $this->data->setIsInstallResolved($isInstallResolved);
581
+
582
+ $this->isInstallResolved = $isInstallResolved;
583
+ }
584
+ }
analyst/src/Account/AccountData.php CHANGED
@@ -1,176 +1,176 @@
1
- <?php
2
-
3
- namespace Account;
4
-
5
- /**
6
- * Class AccountData is the data holder
7
- * for Analyst\Account\Account class
8
- * which is unserialized from database
9
- */
10
- class AccountData
11
- {
12
- /**
13
- * Account id
14
- *
15
- * @var string
16
- */
17
- protected $id;
18
-
19
- /**
20
- * Account secret key
21
- *
22
- * @var string
23
- */
24
- protected $secret;
25
-
26
- /**
27
- * Basename of plugin
28
- *
29
- * @var string
30
- */
31
- protected $path;
32
-
33
- /**
34
- * Whether admin accepted opt in
35
- * terms and permissions
36
- *
37
- * @var bool
38
- */
39
- protected $isInstalled = false;
40
-
41
- /**
42
- * Is user sign in for data tracking
43
- *
44
- * @var bool
45
- */
46
- protected $isOptedIn = false;
47
-
48
- /**
49
- * Is user accepted permissions grant
50
- * for collection site data
51
- *
52
- * @var bool
53
- */
54
- protected $isSigned = false;
55
-
56
- /**
57
- * Is user ever resolved install modal window?
58
- *
59
- * @var bool
60
- */
61
- protected $isInstallResolved;
62
-
63
- /**
64
- * @return string
65
- */
66
- public function getId()
67
- {
68
- return $this->id;
69
- }
70
-
71
- /**
72
- * @param string $id
73
- */
74
- public function setId($id)
75
- {
76
- $this->id = $id;
77
- }
78
-
79
- /**
80
- * @param string $path
81
- * @return AccountData
82
- */
83
- public function setPath($path)
84
- {
85
- $this->path = $path;
86
- return $this;
87
- }
88
-
89
- /**
90
- * @return bool
91
- */
92
- public function isInstalled()
93
- {
94
- return $this->isInstalled;
95
- }
96
-
97
- /**
98
- * @param bool $isInstalled
99
- */
100
- public function setIsInstalled($isInstalled)
101
- {
102
- $this->isInstalled = $isInstalled;
103
- }
104
-
105
- /**
106
- * @return bool
107
- */
108
- public function isOptedIn()
109
- {
110
- return $this->isOptedIn;
111
- }
112
-
113
- /**
114
- * @param bool $isOptedIn
115
- */
116
- public function setIsOptedIn($isOptedIn)
117
- {
118
- $this->isOptedIn = $isOptedIn;
119
- }
120
-
121
- /**
122
- * @return bool
123
- */
124
- public function isSigned()
125
- {
126
- return $this->isSigned;
127
- }
128
-
129
- /**
130
- * @param bool $isSigned
131
- */
132
- public function setIsSigned($isSigned)
133
- {
134
- $this->isSigned = $isSigned;
135
- }
136
-
137
- /**
138
- * @return string
139
- */
140
- public function getPath()
141
- {
142
- return $this->path;
143
- }
144
-
145
- /**
146
- * @return string
147
- */
148
- public function getSecret()
149
- {
150
- return $this->secret;
151
- }
152
-
153
- /**
154
- * @param string $secret
155
- */
156
- public function setSecret($secret)
157
- {
158
- $this->secret = $secret;
159
- }
160
-
161
- /**
162
- * @return bool
163
- */
164
- public function isInstallResolved()
165
- {
166
- return $this->isInstallResolved;
167
- }
168
-
169
- /**
170
- * @param bool $isInstallResolved
171
- */
172
- public function setIsInstallResolved($isInstallResolved)
173
- {
174
- $this->isInstallResolved = $isInstallResolved;
175
- }
176
- }
1
+ <?php
2
+
3
+ namespace Account;
4
+
5
+ /**
6
+ * Class AccountData is the data holder
7
+ * for Analyst\Account\Account class
8
+ * which is unserialized from database
9
+ */
10
+ class AccountData
11
+ {
12
+ /**
13
+ * Account id
14
+ *
15
+ * @var string
16
+ */
17
+ protected $id;
18
+
19
+ /**
20
+ * Account secret key
21
+ *
22
+ * @var string
23
+ */
24
+ protected $secret;
25
+
26
+ /**
27
+ * Basename of plugin
28
+ *
29
+ * @var string
30
+ */
31
+ protected $path;
32
+
33
+ /**
34
+ * Whether admin accepted opt in
35
+ * terms and permissions
36
+ *
37
+ * @var bool
38
+ */
39
+ protected $isInstalled = false;
40
+
41
+ /**
42
+ * Is user sign in for data tracking
43
+ *
44
+ * @var bool
45
+ */
46
+ protected $isOptedIn = false;
47
+
48
+ /**
49
+ * Is user accepted permissions grant
50
+ * for collection site data
51
+ *
52
+ * @var bool
53
+ */
54
+ protected $isSigned = false;
55
+
56
+ /**
57
+ * Is user ever resolved install modal window?
58
+ *
59
+ * @var bool
60
+ */
61
+ protected $isInstallResolved;
62
+
63
+ /**
64
+ * @return string
65
+ */
66
+ public function getId()
67
+ {
68
+ return $this->id;
69
+ }
70
+
71
+ /**
72
+ * @param string $id
73
+ */
74
+ public function setId($id)
75
+ {
76
+ $this->id = $id;
77
+ }
78
+
79
+ /**
80
+ * @param string $path
81
+ * @return AccountData
82
+ */
83
+ public function setPath($path)
84
+ {
85
+ $this->path = $path;
86
+ return $this;
87
+ }
88
+
89
+ /**
90
+ * @return bool
91
+ */
92
+ public function isInstalled()
93
+ {
94
+ return $this->isInstalled;
95
+ }
96
+
97
+ /**
98
+ * @param bool $isInstalled
99
+ */
100
+ public function setIsInstalled($isInstalled)
101
+ {
102
+ $this->isInstalled = $isInstalled;
103
+ }
104
+
105
+ /**
106
+ * @return bool
107
+ */
108
+ public function isOptedIn()
109
+ {
110
+ return $this->isOptedIn;
111
+ }
112
+
113
+ /**
114
+ * @param bool $isOptedIn
115
+ */
116
+ public function setIsOptedIn($isOptedIn)
117
+ {
118
+ $this->isOptedIn = $isOptedIn;
119
+ }
120
+
121
+ /**
122
+ * @return bool
123
+ */
124
+ public function isSigned()
125
+ {
126
+ return $this->isSigned;
127
+ }
128
+
129
+ /**
130
+ * @param bool $isSigned
131
+ */
132
+ public function setIsSigned($isSigned)
133
+ {
134
+ $this->isSigned = $isSigned;
135
+ }
136
+
137
+ /**
138
+ * @return string
139
+ */
140
+ public function getPath()
141
+ {
142
+ return $this->path;
143
+ }
144
+
145
+ /**
146
+ * @return string
147
+ */
148
+ public function getSecret()
149
+ {
150
+ return $this->secret;
151
+ }
152
+
153
+ /**
154
+ * @param string $secret
155
+ */
156
+ public function setSecret($secret)
157
+ {
158
+ $this->secret = $secret;
159
+ }
160
+
161
+ /**
162
+ * @return bool
163
+ */
164
+ public function isInstallResolved()
165
+ {
166
+ return $this->isInstallResolved;
167
+ }
168
+
169
+ /**
170
+ * @param bool $isInstallResolved
171
+ */
172
+ public function setIsInstallResolved($isInstallResolved)
173
+ {
174
+ $this->isInstallResolved = $isInstallResolved;
175
+ }
176
+ }
analyst/src/Account/AccountDataFactory.php CHANGED
@@ -1,125 +1,125 @@
1
- <?php
2
-
3
- namespace Account;
4
-
5
-
6
- use Analyst\Core\AbstractFactory;
7
-
8
- /**
9
- * Class AccountDataFactory
10
- *
11
- * Holds information about this
12
- * wordpress project plugins accounts
13
- *
14
- */
15
- class AccountDataFactory extends AbstractFactory
16
- {
17
- private static $instance;
18
-
19
- CONST OPTIONS_KEY = 'analyst_accounts_data';
20
-
21
- /**
22
- * @var AccountData[]
23
- */
24
- protected $accounts = [];
25
-
26
- /**
27
- * Read factory from options or make fresh instance
28
- *
29
- * @return static
30
- */
31
- public static function instance()
32
- {
33
- if (!static::$instance) {
34
- $raw = get_option(self::OPTIONS_KEY);
35
-
36
- // In case object is already unserialized
37
- // and instance of AccountDataFactory we
38
- // return it, in other case deal with
39
- // serialized string data
40
- if ($raw instanceof self) {
41
- static::$instance = $raw;
42
- } else {
43
- static::$instance = is_string($raw) ? static::unserialize($raw) : new self();
44
- }
45
- }
46
-
47
- return static::$instance;
48
- }
49
-
50
- /**
51
- * Sync this object data with cache
52
- */
53
- public function sync()
54
- {
55
- update_option(self::OPTIONS_KEY, serialize($this));
56
- }
57
-
58
- /**
59
- * Sync this instance data with cache
60
- */
61
- public static function syncData()
62
- {
63
- static::instance()->sync();
64
- }
65
-
66
- /**
67
- * Find plugin account data or create fresh one
68
- *
69
- * @param Account $account
70
- * @return AccountData|null
71
- */
72
- public function resolvePluginAccountData(Account $account)
73
- {
74
- $accountData = $this->findAccountDataById($account->getId());
75
-
76
- if (!$accountData) {
77
- $accountData = new AccountData();
78
-
79
- // Set proper default values
80
- $accountData->setPath($account->getPath());
81
- $accountData->setId($account->getId());
82
- $accountData->setSecret($account->getClientSecret());
83
-
84
- array_push($this->accounts, $accountData);
85
- }
86
-
87
- return $accountData;
88
- }
89
-
90
- /**
91
- * Should return account data by base path
92
- *
93
- * @param $basePath
94
- * @return AccountData
95
- */
96
- public function getAccountDataByBasePath($basePath)
97
- {
98
- foreach ($this->accounts as $iterable) {
99
- $iterableBasePath = plugin_basename($iterable->getPath());
100
-
101
- if ($iterableBasePath === $basePath) {
102
- return $iterable;
103
- }
104
- }
105
-
106
- return null;
107
- }
108
-
109
- /**
110
- * Return account by id
111
- *
112
- * @param $id
113
- * @return AccountData|null
114
- */
115
- private function findAccountDataById($id)
116
- {
117
- foreach ($this->accounts as &$iterable) {
118
- if ($iterable->getId() === $id) {
119
- return $iterable;
120
- }
121
- }
122
-
123
- return null;
124
- }
125
- }
1
+ <?php
2
+
3
+ namespace Account;
4
+
5
+
6
+ use Analyst\Core\AbstractFactory;
7
+
8
+ /**
9
+ * Class AccountDataFactory
10
+ *
11
+ * Holds information about this
12
+ * wordpress project plugins accounts
13
+ *
14
+ */
15
+ class AccountDataFactory extends AbstractFactory
16
+ {
17
+ private static $instance;
18
+
19
+ CONST OPTIONS_KEY = 'analyst_accounts_data';
20
+
21
+ /**
22
+ * @var AccountData[]
23
+ */
24
+ protected $accounts = [];
25
+
26
+ /**
27
+ * Read factory from options or make fresh instance
28
+ *
29
+ * @return static
30
+ */
31
+ public static function instance()
32
+ {
33
+ if (!static::$instance) {
34
+ $raw = get_option(self::OPTIONS_KEY);
35
+
36
+ // In case object is already unserialized
37
+ // and instance of AccountDataFactory we
38
+ // return it, in other case deal with
39
+ // serialized string data
40
+ if ($raw instanceof self) {
41
+ static::$instance = $raw;
42
+ } else {
43
+ static::$instance = is_string($raw) ? static::unserialize($raw) : new self();
44
+ }
45
+ }
46
+
47
+ return static::$instance;
48
+ }
49
+
50
+ /**
51
+ * Sync this object data with cache
52
+ */
53
+ public function sync()
54
+ {
55
+ update_option(self::OPTIONS_KEY, serialize($this));
56
+ }
57
+
58
+ /**
59
+ * Sync this instance data with cache
60
+ */
61
+ public static function syncData()
62
+ {
63
+ static::instance()->sync();
64
+ }
65
+
66
+ /**
67
+ * Find plugin account data or create fresh one
68
+ *
69
+ * @param Account $account
70
+ * @return AccountData|null
71
+ */
72
+ public function resolvePluginAccountData(Account $account)
73
+ {
74
+ $accountData = $this->findAccountDataById($account->getId());
75
+
76
+ if (!$accountData) {
77
+ $accountData = new AccountData();
78
+
79
+ // Set proper default values
80
+ $accountData->setPath($account->getPath());
81
+ $accountData->setId($account->getId());
82
+ $accountData->setSecret($account->getClientSecret());
83
+
84
+ array_push($this->accounts, $accountData);
85
+ }
86
+
87
+ return $accountData;
88
+ }
89
+
90
+ /**
91
+ * Should return account data by base path
92
+ *
93
+ * @param $basePath
94
+ * @return AccountData
95
+ */
96
+ public function getAccountDataByBasePath($basePath)
97
+ {
98
+ foreach ($this->accounts as $iterable) {
99
+ $iterableBasePath = plugin_basename($iterable->getPath());
100
+
101
+ if ($iterableBasePath === $basePath) {
102
+ return $iterable;
103
+ }
104
+ }
105
+
106
+ return null;
107
+ }
108
+
109
+ /**
110
+ * Return account by id
111
+ *
112
+ * @param $id
113
+ * @return AccountData|null
114
+ */
115
+ private function findAccountDataById($id)
116
+ {
117
+ foreach ($this->accounts as &$iterable) {
118
+ if ($iterable->getId() === $id) {
119
+ return $iterable;
120
+ }
121
+ }
122
+
123
+ return null;
124
+ }
125
+ }
analyst/src/Analyst.php CHANGED
@@ -1,167 +1,167 @@
1
- <?php
2
- namespace Analyst;
3
-
4
- use Account\Account;
5
- use Account\AccountDataFactory;
6
- use Analyst\Contracts\AnalystContract;
7
- use Analyst\Contracts\RequestorContract;
8
-
9
- class Analyst implements AnalystContract
10
- {
11
- /**
12
- * All plugin's accounts
13
- *
14
- * @var array
15
- */
16
- protected $accounts = array();
17
-
18
- /**
19
- * @var Mutator
20
- */
21
- protected $mutator;
22
-
23
- /**
24
- * @var AccountDataFactory
25
- */
26
- protected $accountDataFactory;
27
-
28
- /**
29
- * Base url to api
30
- *
31
- * @var string
32
- */
33
- protected $apiBase = 'https://feedback.sellcodes.com/api/v1';
34
-
35
- /**
36
- * @var Collector
37
- */
38
- protected $collector;
39
-
40
- /**
41
- * Singleton instance
42
- *
43
- * @var static
44
- */
45
- protected static $instance;
46
-
47
- /**
48
- * Get instance of analyst
49
- *
50
- * @return Analyst
51
- * @throws \Exception
52
- */
53
- public static function getInstance()
54
- {
55
- if (!static::$instance) {
56
- static::$instance = new Analyst();
57
- }
58
-
59
- return static::$instance;
60
- }
61
-
62
- protected function __construct()
63
- {
64
- $this->mutator = new Mutator();
65
-
66
- $this->accountDataFactory = AccountDataFactory::instance();
67
-
68
- $this->mutator->initialize();
69
-
70
- $this->collector = new Collector($this);
71
-
72
- $this->initialize();
73
- }
74
-
75
- /**
76
- * Initialize rest of application
77
- */
78
- public function initialize()
79
- {
80
- add_action('init', function () {
81
- $this->collector->loadCurrentUser();
82
- });
83
- }
84
-
85
- /**
86
- * Register new account
87
- *
88
- * @param Account $account
89
- * @return Analyst
90
- * @throws \Exception
91
- */
92
- public function registerAccount($account)
93
- {
94
- // Stop propagation when account is already registered
95
- if ($this->isAccountRegistered($account)) {
96
- return $this;
97
- }
98
-
99
- // Resolve account data from factory
100
- $accountData = $this->accountDataFactory->resolvePluginAccountData($account);
101
-
102
- $account->setData($accountData);
103
-
104
- $account->setRequestor(
105
- $this->resolveRequestorForAccount($account)
106
- );
107
-
108
- $account->setCollector($this->collector);
109
-
110
- $account->registerHooks();
111
-
112
- $this->accounts[$account->getId()] = $account;
113
-
114
- return $this;
115
- }
116
-
117
- /**
118
- * Must return version of analyst
119
- *
120
- * @return string
121
- */
122
- public static function version()
123
- {
124
- $version = require __DIR__ . '/../version.php';
125
-
126
- return $version['sdk'];
127
- }
128
-
129
- /**
130
- * Is this account registered
131
- *
132
- * @param Account $account
133
- * @return bool
134
- */
135
- protected function isAccountRegistered($account)
136
- {
137
- return isset($this->accounts[$account->getId()]);
138
- }
139
-
140
- /**
141
- * Resolves requestor for account
142
- *
143
- * @param Account $account
144
- * @return RequestorContract
145
- * @throws \Exception
146
- */
147
- protected function resolveRequestorForAccount(Account $account)
148
- {
149
- $requestor = new ApiRequestor($account->getId(), $account->getClientSecret(), $this->apiBase);
150
-