-
Notifications
You must be signed in to change notification settings - Fork 1
/
multiplayer.html
185 lines (165 loc) · 12.1 KB
/
multiplayer.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<script>var pxtConfig=null</script>
<title>MakeCode Arcade Multiplayer</title>
<link rel="stylesheet" data-rtl="/rtlsemantic.css" href="/semantic.css">
<link rel="stylesheet" href="/icons.css">
<link rel="stylesheet" href="/react-common-multiplayer.css">
<script defer="defer" src="/multiplayer/js/main.c9d25e44.js"></script><link href="/multiplayer/css/main.2a6ba47d.css" rel="stylesheet"></head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<!-- include tracking.html -->
<script type="text/javascript" src="/pxtweb.js"></script>
<script type="text/javascript">
window.loadAppInsights = function (includeCookie) {
//Backend will patch / + doccdn + / with CDN url and the check that URL ends with the sha would pass
var isProduction = includeCookie && (/[0-9a-f]{40}\/ai\.2\.min\.js$/.test("/ai.2.min.js"));
!function(T,l,y){var S=T.location,k="script",D="connectionString",C="ingestionendpoint",I="disableExceptionTracking",E="ai.device.",b="toLowerCase",w="crossOrigin",N="POST",e="appInsightsSDK",t=y.name||"appInsights";(y.name||T[e])&&(T[e]=t);var n=T[t]||function(d){var g=!1,f=!1,m={initialize:!0,queue:[],sv:"5",version:2,config:d};function v(e,t){var n={},a="Browser";return n[E+"id"]=a[b](),n[E+"type"]=a,n["ai.operation.name"]=S&&S.pathname||"_unknown_",n["ai.internal.sdkVersion"]="javascript:snippet_"+(m.sv||m.version),{time:function(){var e=new Date;function t(e){var t=""+e;return 1===t.length&&(t="0"+t),t}return e.getUTCFullYear()+"-"+t(1+e.getUTCMonth())+"-"+t(e.getUTCDate())+"T"+t(e.getUTCHours())+":"+t(e.getUTCMinutes())+":"+t(e.getUTCSeconds())+"."+((e.getUTCMilliseconds()/1e3).toFixed(3)+"").slice(2,5)+"Z"}(),iKey:e,name:"Microsoft.ApplicationInsights."+e.replace(/-/g,"")+"."+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}}}var h=d.url||y.src;if(h){function a(e){var t,n,a,i,r,o,s,c,u,p,l;g=!0,m.queue=[],f||(f=!0,t=h,s=function(){var e={},t=d.connectionString;if(t)for(var n=t.split(";"),a=0;a<n.length;a++){var i=n[a].split("=");2===i.length&&(e[i[0][b]()]=i[1])}if(!e[C]){var r=e.endpointsuffix,o=r?e.location:null;e[C]="https://"+(o?o+".":"")+"dc."+(r||"services.visualstudio.com")}return e}(),c=s[D]||d[D]||"",u=s[C],p=u?u+"/v2/track":d.endpointUrl,(l=[]).push((n="SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)",a=t,i=p,(o=(r=v(c,"Exception")).data).baseType="ExceptionData",o.baseData.exceptions=[{typeName:"SDKLoadFailed",message:n.replace(/\./g,"-"),hasFullStack:!1,stack:n+"\nSnippet failed to load ["+a+"] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: "+(S&&S.pathname||"_unknown_")+"\nEndpoint: "+i,parsedStack:[]}],r)),l.push(function(e,t,n,a){var i=v(c,"Message"),r=i.data;r.baseType="MessageData";var o=r.baseData;return o.message='AI (Internal): 99 message:"'+("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("+n+")").replace(/\"/g,"")+'"',o.properties={endpoint:a},i}(0,0,t,p)),function(e,t){if(JSON){var n=T.fetch;if(n&&!y.useXhr)n(t,{method:N,body:JSON.stringify(e),mode:"cors"});else if(XMLHttpRequest){var a=new XMLHttpRequest;a.open(N,t),a.setRequestHeader("Content-type","application/json"),a.send(JSON.stringify(e))}}}(l,p))}function i(e,t){f||setTimeout(function(){!t&&m.core||a()},500)}var e=function(){var n=l.createElement(k);n.src=h;var e=y[w];return!e&&""!==e||"undefined"==n[w]||(n[w]=e),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){"loaded"!==n.readyState&&"complete"!==n.readyState||i(0,t)},n}();y.ld<0?l.getElementsByTagName("head")[0].appendChild(e):setTimeout(function(){l.getElementsByTagName(k)[0].parentNode.appendChild(e)},y.ld||0)}try{m.cookie=l.cookie}catch(p){}function t(e){for(;e.length;)!function(t){m[t]=function(){var e=arguments;g||m.queue.push(function(){m[t].apply(m,e)})}}(e.pop())}var n="track",r="TrackPage",o="TrackEvent";t([n+"Event",n+"PageView",n+"Exception",n+"Trace",n+"DependencyData",n+"Metric",n+"PageViewPerformance","start"+r,"stop"+r,"start"+o,"stop"+o,"addTelemetryInitializer","setAuthenticatedUserContext","clearAuthenticatedUserContext","flush"]),m.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4};var s=(d.extensionConfig||{}).ApplicationInsightsAnalytics||{};if(!0!==d[I]&&!0!==s[I]){var c="onerror";t(["_"+c]);var u=T[c];T[c]=function(e,t,n,a,i){var r=u&&u(e,t,n,a,i);return!0!==r&&m["_"+c]({message:e,url:t,lineNumber:n,columnNumber:a,error:i}),r},d.autoExceptionInstrumented=!0}return m}(y.cfg);function a(){y.onInit&&y.onInit(n)}(T[t]=n).queue&&0===n.queue.length?(n.queue.push(a),n.trackPageView({})):a()}(window,document,{
src: "https://js.monitor.azure.com/scripts/b/ai.2.min.js", // The SDK URL Source
onInit: function (sdk) {
sdk.addTelemetryInitializer(function (envelope) {
// App Insights automatically sends a page view event on setup, but we send our own later with additional properties.
// This stops the automatic event from firing, so we don't end up with duplicate page view events.
if (envelope.baseType == "PageviewData" && !envelope.baseData.properties) {
return false;
}
if (envelope.baseType == "PageviewPerformanceData") {
var pageName = envelope.baseData.name;
envelope.baseData.name = window.location.origin;
if (!envelope.baseData.properties) {
envelope.baseData.properties = {};
}
envelope.baseData.properties.pageName = pageName;
var scrubbedUrl = scrubUrl(envelope.baseData.uri);
envelope.baseData.uri = scrubbedUrl;
var toUrl = new URL(scrubbedUrl);
envelope.baseData.properties.pathName = toUrl ? toUrl.pathname : "";
if (envelope.ext && envelope.ext.trace) {
envelope.ext.trace.name = toUrl ? toUrl.pathname : "";
}
}
var telemetryItem = envelope.baseData;
telemetryItem.properties = telemetryItem.properties || {};
telemetryItem.properties["cookie"] = isProduction;
if (typeof pxtConfig === "undefined" || !pxtConfig || !pxtConfig.targetId) {
telemetryItem.properties["target"] = "???";
return true;
}
telemetryItem.properties["target"] = pxtConfig.targetId;
telemetryItem.properties["stage"] = (pxtConfig.relprefix || "/--").replace(/[^a-z]/ig, '')
if (typeof Windows !== "undefined")
telemetryItem.properties["WindowsApp"] = 1;
var userAgent = navigator.userAgent.toLowerCase();
var userAgentRegexResult = /\belectron\/(\d+\.\d+\.\d+.*?)(?: |$)/i.exec(userAgent); // Example navigator.userAgent: "Mozilla/5.0 Chrome/61.0.3163.100 Electron/2.0.0 Safari/537.36"
if (userAgentRegexResult) {
telemetryItem.properties["Electron"] = 1;
telemetryItem.properties["ElectronVersion"] = userAgentRegexResult[1];
}
if (typeof pxtElectron !== "undefined") {
telemetryItem.properties["PxtElectron"] = 1;
telemetryItem.properties["ElectronVersion"] = pxtElectron.versions.electronVersion;
telemetryItem.properties["ChromiumVersion"] = pxtElectron.versions.chromiumVersion;
telemetryItem.properties["NodeVersion"] = pxtElectron.versions.nodeVersion;
telemetryItem.properties["PxtElectronVersion"] = pxtElectron.versions.pxtElectronVersion;
telemetryItem.properties["PxtCoreVersion"] = pxtElectron.versions.pxtCoreVersion;
telemetryItem.properties["PxtTargetVersion"] = pxtElectron.versions.pxtTargetVersion;
telemetryItem.properties["PxtElectronIsProd"] = pxtElectron.versions.isProd;
}
return true;
});
},
cfg: {
instrumentationKey:"9801ed01-c40f-46ec-aa40-2a1742a9e71c",
disableAjaxTracking: true,
overridePageViewDuration: false,
disableExceptionTracking: true,
disableCookiesUsage: !isProduction,
isStorageUseDisabled: !isProduction,
url: "/ai.2.min.js"
}
});
window.appInsights=appInsights;
var location = window.location.toString();
appInsights.trackPageView({
name: window.location.hostname,
uri: window.location.origin,
properties: {
url: scrubUrl(location),
urlReferrer: scrubUrl(document.referrer.toString())
}
});
// Scrub potential PII from the URL.
function scrubUrl(url) {
if (!url) return url;
var scriptIdRegex = /(?:S?\d{5}-\d{5}-\d{5}-\d{5})|(?:_[0-9a-zA-Z]{12})/g;
var scrubbedUrl = new URL(url.toLocaleLowerCase().replace(scriptIdRegex, "xxxxx-xxxxx-xxxxx-xxxxx"));
// Just as a precaution, strip any suspicious query parameters.
var blockedParamKeywords = ["username", "password", "token", "pwd"];
var searchParams = Array.from(scrubbedUrl.searchParams.keys());
for (var param of searchParams) {
if (blockedParamKeywords.some(k => param.indexOf(k) != -1)) {
scrubbedUrl.searchParams.delete(param);
}
}
return scrubbedUrl.toString();
}
return isProduction;
}
pxt.initAnalyticsAsync();
</script>
<!-- end include tracking.html -->
<!-- include tickevent.html -->
<script type="text/javascript">
if (!window.pxtTickEvent) {
let queuedTicks;
window.pxtTickEvent = function(id, data) {
if (window.appInsights && window.appInsights.trackEvent) {
sendTick(id, data);
} else {
if (!queuedTicks) {
queuedTicks = [];
var interval = window.setInterval(function() {
if (window.appInsights && window.appInsights.trackEvent) {
window.clearInterval(interval);
for (var i = 0; i < queuedTicks.length; i++) {
queuedTicks[i]();
}
queuedTicks = undefined;
}
}, 1000);
}
if (queuedTicks.length >= 100) {
queuedTicks.shift();
}
queuedTicks.push(function () {
sendTick(id, data);
});
}
function sendTick(id, data) {
const props = {};
const measures = {};
if (data) {
Object.keys(data).forEach(k => {
if (typeof data[k] == "string") props[k] = data[k];
else if (typeof data[k] == "number") measures[k] = data[k];
else props[k] = JSON.stringify(data[k] || '');
});
} else {
data = {};
}
window.appInsights.trackEvent({name: id, properties: data, measurements: measures});
}
}
}
</script>
<!-- end include tickevent.html -->
<!-- target.js is generated by the CLI -->
<script type="text/javascript" src="/target.js"></script>
<script type="text/javascript" src="/pxtlib.js"></script>
<script type="text/javascript" src="/pxtsim.js"></script>
<div id="root"></div>
</body>
</html>