diff options
Diffstat (limited to 'web/src/ambienteq.js')
-rw-r--r-- | web/src/ambienteq.js | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/web/src/ambienteq.js b/web/src/ambienteq.js new file mode 100644 index 0000000..81acb65 --- /dev/null +++ b/web/src/ambienteq.js @@ -0,0 +1,103 @@ +window.loadingItems.push(() => { + const width = 320; + let height = 0; + let streaming = false; + + let video = null; + let canvas = null; + let photo = null; + + function startup() { + video = document.getElementById("video"); + canvas = document.getElementById("canvas"); + photo = document.getElementById("photo"); + + if (localStorage.getItem("ambienteq_filter_enable") === "false") { + document.getElementById("filter").style.display = "none"; + return; + } + + navigator.mediaDevices + .getUserMedia({ video: true, audio: false }) + .then((stream) => { + video.srcObject = stream; + video.play(); + }) + .catch(async (err) => { + console.error(`An error occurred: ${err}`); + document.getElementById("filter").style.display = "none"; + addWarning("[CAMERA_ERROR] Unable to use camera, ambient lighting will be unavailable. See console for details."); + if (navigator.userAgent.includes("Ponyplay/")) sendNotification("Ponyplay System", await renderIcon("system", true), "Unable to access camera", "Face unlock and Ambient Brightness will not work", null, true); + }); + + video.addEventListener( + "canplay", + (ev) => { + if (!streaming) { + height = video.videoHeight / (video.videoWidth / width); + + video.setAttribute("width", width); + video.setAttribute("height", height); + canvas.setAttribute("width", width); + canvas.setAttribute("height", height); + streaming = true; + } + }, + false, + ); + + clearphoto(); + } + + function clearphoto() { + const context = canvas.getContext("2d"); + context.fillStyle = "#AAA"; + context.fillRect(0, 0, canvas.width, canvas.height); + + const data = canvas.toDataURL("image/png"); + photo.setAttribute("src", data); + } + + function takepicture() { + const context = canvas.getContext("2d"); + + if (width && height) { + canvas.width = width; + canvas.height = height; + context.drawImage(video, 0, 0, width, height); + + const data = canvas.toDataURL("image/png"); + photo.setAttribute("src", data); + } else { + clearphoto(); + } + } + + window.addEventListener("load", startup, false); + + setInterval(() => { + takepicture(); + + if (window.engine && localStorage.getItem("ambienteq_brightness_enable") === "true") { + if (!window.sleeping || localStorage.getItem("ambienteq_add_whilesleep") === "true") { + if (Math.abs(window.engine.getBrightness() - window.engine.getSystemBrightness()) > 10) window.engine.setBrightness(window.engine.getBrightness() + parseInt(localStorage.getItem("ambianteq_brightness_add"))); + } else { + if (Math.abs(window.engine.getBrightness() - window.engine.getSystemBrightness()) > 10) window.engine.setBrightness(window.engine.getBrightness()); + } + } + }, 2000); + + document.getElementById("photo").onload = () => { + let rgb = Object.values(getAverageRGB(document.getElementById("photo"))); + document.getElementById("rgb").innerText = rgb2hue(rgb[0], rgb[1], rgb[2]).toFixed(2); + document.getElementById("sq1").style.backgroundColor = "rgb(" + rgb[0] + ", " + rgb[1] + ", " + rgb[2] + ")"; + document.getElementById("sq2").style.backgroundColor = document.getElementById("filter").style.backgroundColor = "hsl(" + rgb2hue(rgb[0], rgb[1], rgb[2]) + "deg, 100%, 50%)"; + + let opacity = (rgb.reduce((a, b) => a + b) / rgb.length) / 255; + if (opacity < parseFloat(localStorage.getItem("sleep_minimum_opacity"))) opacity = parseFloat(localStorage.getItem("sleep_minimum_opacity")); + + document.getElementById("time-sleep").style.opacity = opacity.toString(); + } + + startup(); +});
\ No newline at end of file |