123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- /* Magic Mirror
- * Module: Compliments
- *
- * By Michael Teeuw https://michaelteeuw.nl
- * MIT Licensed.
- */
- Module.register("compliments", {
- // Module config defaults.
- defaults: {
- compliments: {
- anytime: ["Hey there sexy!"],
- morning: ["Good morning, handsome!", "Enjoy your day!", "How was your sleep?"],
- afternoon: ["Hello, beauty!", "You look sexy!", "Looking good today!"],
- evening: ["Wow, you look hot!", "You look nice!", "Hi, sexy!"],
- "....-01-01": ["Happy new year!"]
- },
- updateInterval: 30000,
- remoteFile: null,
- fadeSpeed: 4000,
- morningStartTime: 3,
- morningEndTime: 12,
- afternoonStartTime: 12,
- afternoonEndTime: 17,
- random: true,
- mockDate: null
- },
- lastIndexUsed: -1,
- // Set currentweather from module
- currentWeatherType: "",
-
- // Define required scripts.
- getScripts: function () {
- return ["moment.js"];
- },
-
- // Define start sequence.
- start: function () {
- Log.info("Starting module: " + this.name);
-
- this.lastComplimentIndex = -1;
-
- if (this.config.remoteFile !== null) {
- this.complimentFile((response) => {
- this.config.compliments = JSON.parse(response);
- this.updateDom();
- });
- }
-
- // Schedule update timer.
- setInterval(() => {
- this.updateDom(this.config.fadeSpeed);
- }, this.config.updateInterval);
- },
-
- /**
- * Generate a random index for a list of compliments.
- *
- * @param {string[]} compliments Array with compliments.
- * @returns {number} a random index of given array
- */
- randomIndex: function (compliments) {
- if (compliments.length === 1) {
- return 0;
- }
-
- const generate = function () {
- return Math.floor(Math.random() * compliments.length);
- };
-
- let complimentIndex = generate();
-
- while (complimentIndex === this.lastComplimentIndex) {
- complimentIndex = generate();
- }
-
- this.lastComplimentIndex = complimentIndex;
-
- return complimentIndex;
- },
-
- /**
- * Retrieve an array of compliments for the time of the day.
- *
- * @returns {string[]} array with compliments for the time of the day.
- */
- complimentArray: function () {
- const hour = moment().hour();
- const date = this.config.mockDate ? this.config.mockDate : moment().format("YYYY-MM-DD");
- let compliments;
-
- if (hour >= this.config.morningStartTime && hour < this.config.morningEndTime && this.config.compliments.hasOwnProperty("morning")) {
- compliments = this.config.compliments.morning.slice(0);
- } else if (hour >= this.config.afternoonStartTime && hour < this.config.afternoonEndTime && this.config.compliments.hasOwnProperty("afternoon")) {
- compliments = this.config.compliments.afternoon.slice(0);
- } else if (this.config.compliments.hasOwnProperty("evening")) {
- compliments = this.config.compliments.evening.slice(0);
- }
-
- if (typeof compliments === "undefined") {
- compliments = [];
- }
-
- if (this.currentWeatherType in this.config.compliments) {
- compliments.push.apply(compliments, this.config.compliments[this.currentWeatherType]);
- }
-
- compliments.push.apply(compliments, this.config.compliments.anytime);
-
- for (let entry in this.config.compliments) {
- if (new RegExp(entry).test(date)) {
- compliments.push.apply(compliments, this.config.compliments[entry]);
- }
- }
-
- return compliments;
- },
-
- /**
- * Retrieve a file from the local filesystem
- *
- * @param {Function} callback Called when the file is retrieved.
- */
- complimentFile: function (callback) {
- const xobj = new XMLHttpRequest(),
- isRemote = this.config.remoteFile.indexOf("http://") === 0 || this.config.remoteFile.indexOf("https://") === 0,
- path = isRemote ? this.config.remoteFile : this.file(this.config.remoteFile);
- xobj.overrideMimeType("application/json");
- xobj.open("GET", path, true);
- xobj.onreadystatechange = function () {
- if (xobj.readyState === 4 && xobj.status === 200) {
- callback(xobj.responseText);
- }
- };
- xobj.send(null);
- },
-
- /**
- * Retrieve a random compliment.
- *
- * @returns {string} a compliment
- */
- randomCompliment: function () {
- // get the current time of day compliments list
- const compliments = this.complimentArray();
- // variable for index to next message to display
- let index;
- // are we randomizing
- if (this.config.random) {
- // yes
- index = this.randomIndex(compliments);
- } else {
- // no, sequential
- // if doing sequential, don't fall off the end
- index = this.lastIndexUsed >= compliments.length - 1 ? 0 : ++this.lastIndexUsed;
- }
-
- return compliments[index] || "";
- },
-
- // Override dom generator.
- getDom: function () {
- const wrapper = document.createElement("div");
- wrapper.className = this.config.classes ? this.config.classes : "thin xlarge bright pre-line";
- // get the compliment text
- const complimentText = this.randomCompliment();
- // split it into parts on newline text
- const parts = complimentText.split("\n");
- // create a span to hold it all
- const compliment = document.createElement("span");
- // process all the parts of the compliment text
- for (const part of parts) {
- // create a text element for each part
- compliment.appendChild(document.createTextNode(part));
- // add a break `
- compliment.appendChild(document.createElement("BR"));
- }
- // remove the last break
- compliment.lastElementChild.remove();
- wrapper.appendChild(compliment);
-
- return wrapper;
- },
-
- // From data currentweather set weather type
- setCurrentWeatherType: function (type) {
- this.currentWeatherType = type;
- },
-
- // Override notification handler.
- notificationReceived: function (notification, payload, sender) {
- if (notification === "CURRENTWEATHER_TYPE") {
- this.setCurrentWeatherType(payload.type);
- }
- }
- });
|