iobroker.fb-checkpresence
Version:
The adapter checks the presence of family members over the fritzbox. You must fill in the name of the family member and the mac-address of the used device. The comment is optional and you can enable or disable the family member. The datapoint based on the
323 lines (293 loc) • 11.3 kB
JavaScript
/*
* Date Format 1.2.3
* (c) 2007-2009 Steven Levithan <stevenlevithan.com>
* MIT license
*
* Includes enhancements by Scott Trenda <scott.trenda.net>
* and Kris Kowal <cixar.com/~kris.kowal/>
*
* Accepts a date, a mask, or a date and a mask.
* Returns a formatted version of the given date.
* The date defaults to the current date/time.
* The mask defaults to dateFormat.masks.default.
*/
//Changes:
// afuerhoff 2022.07.31: initial copy of v4.5.1 https://github.com/felixge/node-dateformat/blob/v4.5.1/src/dateformat.js
// based on https://blog.stevenlevithan.com/archives/javascript-date-format
(function (global) {
const dateFormat = (() => {
const token = /d{1,4}|D{3,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|W{1,2}|[LlopSZN]|"[^"]*"|'[^']*'/g;
const timezone =
/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g;
const timezoneClip = /[^-+\dA-Z]/g;
// Regexes and supporting functions are cached through closure
return (date, mask, utc, gmt) => {
// You can't provide utc if you skip other args (use the 'UTC:' mask prefix)
if (arguments.length === 1 && kindOf(date) === 'string' && !/\d/.test(date)) {
mask = date;
date = undefined;
}
date = date || date === 0 ? date : new Date();
if (!(date instanceof Date)) {
date = new Date(date);
}
if (isNaN(date)) {
throw TypeError('Invalid date');
}
mask = String(dateFormat.masks[mask] || mask || dateFormat.masks['default']);
// Allow setting the utc/gmt argument via the mask
const maskSlice = mask.slice(0, 4);
if (maskSlice === 'UTC:' || maskSlice === 'GMT:') {
mask = mask.slice(4);
utc = true;
if (maskSlice === 'GMT:') {
gmt = true;
}
}
const _ = () => (utc ? 'getUTC' : 'get');
const d = () => date[`${_()}Date`]();
const D = () => date[`${_()}Day`]();
const m = () => date[`${_()}Month`]();
const y = () => date[`${_()}FullYear`]();
const H = () => date[`${_()}Hours`]();
const M = () => date[`${_()}Minutes`]();
const s = () => date[`${_()}Seconds`]();
const L = () => date[`${_()}Milliseconds`]();
const o = () => (utc ? 0 : date.getTimezoneOffset());
const W = () => getWeek(date);
const N = () => getDayOfWeek(date);
const flags = {
d: () => d(),
dd: () => pad(d()),
ddd: () => dateFormat.i18n.dayNames[D()],
DDD: () =>
getDayName({
y: y(),
m: m(),
d: d(),
_: _(),
dayName: dateFormat.i18n.dayNames[D()],
short: true,
}),
dddd: () => dateFormat.i18n.dayNames[D() + 7],
DDDD: () =>
getDayName({
y: y(),
m: m(),
d: d(),
_: _(),
dayName: dateFormat.i18n.dayNames[D() + 7],
}),
m: () => m() + 1,
mm: () => pad(m() + 1),
mmm: () => dateFormat.i18n.monthNames[m()],
mmmm: () => dateFormat.i18n.monthNames[m() + 12],
yy: () => String(y()).slice(2),
yyyy: () => pad(y(), 4),
h: () => H() % 12 || 12,
hh: () => pad(H() % 12 || 12),
H: () => H(),
HH: () => pad(H()),
M: () => M(),
MM: () => pad(M()),
s: () => s(),
ss: () => pad(s()),
l: () => pad(L(), 3),
L: () => pad(Math.floor(L() / 10)),
t: () => (H() < 12 ? dateFormat.i18n.timeNames[0] : dateFormat.i18n.timeNames[1]),
tt: () => (H() < 12 ? dateFormat.i18n.timeNames[2] : dateFormat.i18n.timeNames[3]),
T: () => (H() < 12 ? dateFormat.i18n.timeNames[4] : dateFormat.i18n.timeNames[5]),
TT: () => (H() < 12 ? dateFormat.i18n.timeNames[6] : dateFormat.i18n.timeNames[7]),
Z: () =>
gmt
? 'GMT'
: utc
? 'UTC'
: (String(date).match(timezone) || [''])
.pop()
.replace(timezoneClip, '')
.replace(/GMT\+0000/g, 'UTC'),
o: () => (o() > 0 ? '-' : '+') + pad(Math.floor(Math.abs(o()) / 60) * 100 + (Math.abs(o()) % 60), 4),
p: () =>
`${(o() > 0 ? '-' : '+') + pad(Math.floor(Math.abs(o()) / 60), 2)}:${pad(
Math.floor(Math.abs(o()) % 60),
2,
)}`,
S: () => ['th', 'st', 'nd', 'rd'][d() % 10 > 3 ? 0 : (((d() % 100) - (d() % 10) != 10) * d()) % 10],
W: () => W(),
WW: () => pad(W()),
N: () => N(),
};
return mask.replace(token, match => {
if (match in flags) {
return flags[match]();
}
return match.slice(1, match.length - 1);
});
};
})();
dateFormat.masks = {
default: 'ddd mmm dd yyyy HH:MM:ss',
shortDate: 'm/d/yy',
paddedShortDate: 'mm/dd/yyyy',
mediumDate: 'mmm d, yyyy',
longDate: 'mmmm d, yyyy',
fullDate: 'dddd, mmmm d, yyyy',
shortTime: 'h:MM TT',
mediumTime: 'h:MM:ss TT',
longTime: 'h:MM:ss TT Z',
isoDate: 'yyyy-mm-dd',
isoTime: 'HH:MM:ss',
isoDateTime: "yyyy-mm-dd'T'HH:MM:sso",
isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'",
expiresHeaderFormat: 'ddd, dd mmm yyyy HH:MM:ss Z',
};
// Internationalization strings
dateFormat.i18n = {
dayNames: [
'Sun',
'Mon',
'Tue',
'Wed',
'Thu',
'Fri',
'Sat',
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
],
monthNames: [
'Jan',
'Feb',
'Mar',
'Apr',
'May',
'Jun',
'Jul',
'Aug',
'Sep',
'Oct',
'Nov',
'Dec',
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December',
],
timeNames: ['a', 'p', 'am', 'pm', 'A', 'P', 'AM', 'PM'],
};
const pad = (val, len) => {
val = String(val);
len = len || 2;
while (val.length < len) {
val = `0${val}`;
}
return val;
};
const getDayName = ({ y, m, d, _, dayName, short = false }) => {
const today = new Date();
const yesterday = new Date();
yesterday.setDate(yesterday[`${_}Date`]() - 1);
const tomorrow = new Date();
tomorrow.setDate(tomorrow[`${_}Date`]() + 1);
const today_d = () => today[`${_}Date`]();
const today_m = () => today[`${_}Month`]();
const today_y = () => today[`${_}FullYear`]();
const yesterday_d = () => yesterday[`${_}Date`]();
const yesterday_m = () => yesterday[`${_}Month`]();
const yesterday_y = () => yesterday[`${_}FullYear`]();
const tomorrow_d = () => tomorrow[`${_}Date`]();
const tomorrow_m = () => tomorrow[`${_}Month`]();
const tomorrow_y = () => tomorrow[`${_}FullYear`]();
if (today_y() === y && today_m() === m && today_d() === d) {
return short ? 'Tdy' : 'Today';
} else if (yesterday_y() === y && yesterday_m() === m && yesterday_d() === d) {
return short ? 'Ysd' : 'Yesterday';
} else if (tomorrow_y() === y && tomorrow_m() === m && tomorrow_d() === d) {
return short ? 'Tmw' : 'Tomorrow';
}
return dayName;
};
/**
* Get the ISO 8601 week number
* Based on comments from
* http://techblog.procurios.nl/k/n618/news/view/33796/14863/Calculate-ISO-8601-week-and-year-in-javascript.html
*
* @param {object} date - date object
* @returns {number} - week number
*/
const getWeek = date => {
// Remove time components of date
const targetThursday = new Date(date.getFullYear(), date.getMonth(), date.getDate());
// Change date to Thursday same week
targetThursday.setDate(targetThursday.getDate() - ((targetThursday.getDay() + 6) % 7) + 3);
// Take January 4th as it is always in week 1 (see ISO 8601)
const firstThursday = new Date(targetThursday.getFullYear(), 0, 4);
// Change date to Thursday same week
firstThursday.setDate(firstThursday.getDate() - ((firstThursday.getDay() + 6) % 7) + 3);
// Check if daylight-saving-time-switch occurred and correct for it
const ds = targetThursday.getTimezoneOffset() - firstThursday.getTimezoneOffset();
targetThursday.setHours(targetThursday.getHours() - ds);
// Number of weeks between target Thursday and first Thursday
const weekDiff = (targetThursday - firstThursday) / (86400000 * 7);
return 1 + Math.floor(weekDiff);
};
/**
* Get ISO-8601 numeric representation of the day of the week
* 1 (for Monday) through 7 (for Sunday)
*
* @param {object} date - date
* @returns {number} - day of the week
*/
const getDayOfWeek = date => {
let dow = date.getDay();
if (dow === 0) {
dow = 7;
}
return dow;
};
/**
* kind-of shortcut
*
* @param {*} val - input value
* @returns {string} - shortcut
*/
const kindOf = val => {
if (val === null) {
return 'null';
}
if (val === undefined) {
return 'undefined';
}
if (typeof val !== 'object') {
return typeof val;
}
if (Array.isArray(val)) {
return 'array';
}
return {}.toString.call(val).slice(8, -1).toLowerCase();
};
// eslint-disable-next-line no-undef
if (typeof define === 'function' && define.amd) {
// eslint-disable-next-line no-undef
define(() => {
return dateFormat;
});
} else if (typeof exports === 'object') {
module.exports = dateFormat;
} else {
global.dateFormat = dateFormat;
}
})(this);