· 6 years ago · Oct 15, 2019, 03:30 AM
1<script src='http://localhost:8080/scripts/wasabi.js'></script>
2<script src="https://code.jquery.com/jquery-1.12.3.min.js"></script>
3
4<script>
5
6 function uuidv4() {
7 return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
8 var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
9 return v.toString(16);
10 });
11 }
12
13 var expIDarray = [];
14
15 var objectWithExperiments;
16 $.ajax({
17 dataType:'json',
18 async: false,
19 url:"http://localhost:8080/api/v1/experiments",
20 contentType: "application/json",
21 headers:{"Authorization":"Basic " + btoa("admin" + ":" + "admin")},
22 success: function(experData){
23 objectWithExperiments = experData;
24 },
25 error: function(ex){
26 console.log("[PREDATOR] server issue");
27 }
28 });
29 ///! console.log(objectWithExperiments); //an object containing all exp objects but without 'experiment' key
30
31 var initExperimentArray = objectWithExperiments.experiments;
32 console.log("[PREDATOR] the initial non-filtered array is",initExperimentArray)
33 const experimentArray = initExperimentArray.filter(exp => {return exp.state == "RUNNING"});
34 console.log("[PREDATOR] the filtered array is ", experimentArray);
35
36 var size = experimentArray.length;
37
38 //to grab experiment IDs needed for API calls
39 for (var i = 0; i < size; i++){
40 //experiment labels
41 ///!console.log("[PREDATOR]", experimentArray[i].label)
42 expIDarray[i] = experimentArray[i].id;
43 }
44
45 var bucketArray = [] //array of objects with buckets(buckets being an array of objects)
46 for (var j = 0; j < expIDarray.length; j++){
47 var objWithArrOfBucketObjsWithLabels;
48
49 $.ajax({
50 dataType:'json',
51 async: false,
52 url:`http://localhost:8080/api/v1/experiments/${expIDarray[j]}/buckets`,
53 contentType: "application/json",
54 headers:{"Authorization":"Basic " + btoa("admin" + ":" + "admin")},
55 success: function(obWithBuckObjs){ //param is an object containing an array of objects
56 objWithArrOfBucketObjsWithLabels = obWithBuckObjs;
57 //console.log(obWithBuckObjs);
58 bucketArray[j] = objWithArrOfBucketObjsWithLabels;
59 },
60 error: function(ex){
61 console.log("[PREDATOR] server issue");
62 }
63 });
64 }
65
66
67 //bucketArray[2].buckets[0].allocationPercent --- how to get allocation percentage for a bucket
68
69 var amountOfExps = bucketArray.length; //how many experiments
70 console.log(`[PREDATOR] amountOfExps is ${amountOfExps}`)
71
72 ///running all headline changes
73 for(var dc = 0; dc < amountOfExps; dc++){ //iterate all experiments
74 var buckSoFar = 0;
75 var accum = 0;
76 var rand = Math.random();
77 var amountOfBuckets = bucketArray[dc].buckets.length;
78
79 for (buckSoFar; buckSoFar < amountOfBuckets; buckSoFar++){ //each group of buckets an exp has
80 accum += bucketArray[dc].buckets[buckSoFar].allocationPercent;
81 console.log("[PREDATOR] random int is " + rand);
82 console.log(`[PREDATOR] accum is ${accum}`)
83
84 if ( $("a[href='" + JSON.parse(bucketArray[dc].buckets[buckSoFar].description).url + "']").length > 0 ) { //if link is on page
85
86 if(rand < accum){
87 $("h2 a[href='" + JSON.parse(bucketArray[dc].buckets[buckSoFar].description).url + "']").html(JSON.parse(bucketArray[dc].buckets[buckSoFar].payload).headline);
88 }
89 else{
90 $("h2 a[href='" + JSON.parse(bucketArray[dc].buckets[buckSoFar].description).url + "']").html(JSON.parse(bucketArray[dc].buckets[amountOfBuckets-1].payload).headline);
91 }
92 }
93 }
94 }
95
96
97 var user = function(){
98 user = uuidv4();
99 return user;
100 }()
101 console.log(`[PREDATOR] the user is ${user}`);
102 var slugUser = user;
103
104 var theDC;
105 for(theDC = 0; theDC < amountOfExps; theDC++){ ///make the API calls
106 var appName = objectWithExperiments.experiments[theDC].applicationName;
107 var expLabel = objectWithExperiments.experiments[amountOfExps].label;
108 var amountOfBuckets = bucketArray[theDC].buckets.length;
109
110
111 async function assignUser(){
112 $.ajax({
113 dataType: 'json',
114 async: false,
115 type: 'POST',
116 url: `http://localhost:8080/api/v1/assignments/applications/Prototype/experiments/${expLabel}/users/${slugUser}`,
117 contentType: "application/json",
118 //headers:{"Authorization":"Basic " + btoa("admin" + ":" + "admin")},
119 data: "",
120 success : function(data){
121 console.log("[PREDATOR] successful user assignment!!");
122 },
123 error :function(ex){
124 console.log("[PREDATOR] try again")
125 }
126 });
127 console.log(`[PREDATOR] first time after user is inited, the userID is ${slugUser}`)
128 }
129
130 var impData = "{\"events\":[{\"name\":\"IMPRESSION\"}]}" ;
131 function recordImpression(impData){
132 return new Promise(async function(resolve,reject){
133 var req = new XMLHttpRequest();
134 console.log("[PREDATOR] heading to res/rej")
135 req.onLoad = function(e){
136 console.log("[PREDATOR] onload")
137 resolve(req.response);
138 };
139 req.onerror = function(e){
140 console.log("[PREDATOR] onerror")
141 reject(e);
142 };
143 var url = "http://localhost:8080/api/v1/events/applications/Prototype/experiments/"+ expLabel + "/users/"+ slugUser;
144 req.open("POST",url,true);
145 //req.setRequestHeader("Authorization","Basic " + btoa("admin" + ":" + "admin"));
146 req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
147 req.send(impData);
148 });
149 }
150
151 //record clicks
152 var clickData = "{\"events\":[{\"name\":\"articleClicked\"}]}" ;
153 function recordClick(clickData){
154 var req = new XMLHttpRequest();
155 var url = "http://localhost:8080/api/v1/events/applications/Prototype/experiments/"+ expLabel + "/users/"+ slugUser;
156 req.open("POST",url,true);
157 req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
158 req.send(clickData);
159 }
160 var thruEachExpBuckets;
161 for (thruEachExpBuckets = 0; thruEachExpBuckets < amountOfBuckets; thruEachExpBuckets++){
162 if ($("a[href='" + JSON.parse(bucketArray[theDC].buckets[thruEachExpBuckets].description).url + "']").length > 0){
163 console.log(`[PREDATOR] link for ${bucketArray[theDC].buckets[thruEachExpBuckets].description} seen by code!`)
164 assignUser().then(recordImpression(impData));
165 console.log("[PREDATOR] impression sent");
166 }
167 else{
168 console.log("[PREDATOR] link NOT seen by code");
169 }
170 console.log(`[PREDATOR] after impression shoulda happened, the userID is ${slugUser}`)
171
172 $("a[href='" + JSON.parse(bucketArray[theDC].buckets[thruEachExpBuckets].description).url + "']").click(function(event){
173 recordClick(clickData);
174 console.log("[PREDATOR] click recorded");
175 event.preventDefault();
176 setTimeout(function(){
177 window.location = JSON.parse(bucketArray[theDC].buckets[thruEachExpBuckets].description).url
178 }, 300);
179 })
180 }
181
182 }