change: use php script
This commit is contained in:
		
							parent
							
								
									b6c0b5e558
								
							
						
					
					
						commit
						c58913f25c
					
				
							
								
								
									
										129
									
								
								ics.js
								
								
								
								
							
							
						
						
									
										129
									
								
								ics.js
								
								
								
								
							| 
						 | 
				
			
			@ -1,129 +0,0 @@
 | 
			
		|||
const https = require('https');
 | 
			
		||||
const fs = require('fs');
 | 
			
		||||
 | 
			
		||||
var settings = null;
 | 
			
		||||
var ics = "";
 | 
			
		||||
var id = 0;
 | 
			
		||||
 | 
			
		||||
function ics2json(input)
 | 
			
		||||
{
 | 
			
		||||
	var root = {};
 | 
			
		||||
	var curr = root;
 | 
			
		||||
	input.split("\r\n").forEach(l =>
 | 
			
		||||
	{
 | 
			
		||||
		var key = l.split(":")[0].split(";")[0];
 | 
			
		||||
		var val = l.split(":")[1];
 | 
			
		||||
		if (key == "BEGIN")
 | 
			
		||||
		{
 | 
			
		||||
			if (curr[val])
 | 
			
		||||
			{
 | 
			
		||||
				val += "_" + (id++);
 | 
			
		||||
			}
 | 
			
		||||
			curr[val] = {
 | 
			
		||||
				parent: curr
 | 
			
		||||
			};
 | 
			
		||||
			curr = curr[val];
 | 
			
		||||
		}
 | 
			
		||||
		else if (key == "END")
 | 
			
		||||
		{
 | 
			
		||||
			var parent = curr.parent;
 | 
			
		||||
			delete curr.parent;
 | 
			
		||||
			curr = parent;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			curr[key] = key.startsWith("DT") ? dt(val) : val;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	root.VCALENDAR.VEVENTS = [];
 | 
			
		||||
	Object.keys(root.VCALENDAR)
 | 
			
		||||
	.filter(k => (k == "VEVENT" || k.startsWith("VEVENT_")))
 | 
			
		||||
	.forEach(k =>
 | 
			
		||||
	{
 | 
			
		||||
		root.VCALENDAR.VEVENTS.push(root.VCALENDAR[k]);
 | 
			
		||||
		delete root.VCALENDAR[k];
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	return root.VCALENDAR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function dt(s)
 | 
			
		||||
{
 | 
			
		||||
	return new Date(
 | 
			
		||||
		s.substr(0,4) + "-" + s.substr(4,2) + "-" + s.substr(6,2)
 | 
			
		||||
		+ "T"
 | 
			
		||||
		+ s.substr(9,2) + ":" + s.substr(11,2) + ":" + s.substr(13,2));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function displayevents(events, func, title, created)
 | 
			
		||||
{
 | 
			
		||||
	var group = {};
 | 
			
		||||
	events
 | 
			
		||||
	.filter(func)
 | 
			
		||||
	.sort( (a,b) => a.DTSTART - b.DTSTART)
 | 
			
		||||
	.forEach(e => {
 | 
			
		||||
		var formatteddate = e.DTSTART.toLocaleString('fr-FR', { timeZone: 'Europe/Paris', dateStyle: "full", timeStyle: "short" });
 | 
			
		||||
		var splitdate = formatteddate.split(" ");
 | 
			
		||||
		var year = splitdate[3];
 | 
			
		||||
		var month = splitdate[2];
 | 
			
		||||
		group[year] = group[year] || {};
 | 
			
		||||
		group[year][month] = group[year][month] || [];
 | 
			
		||||
		group[year][month].push(formatteddate + ": " + e.SUMMARY + (created ? ` (modifié le ${e.DTSTAMP.toLocaleString('fr-FR', { timeZone: 'Europe/Paris', dateStyle: "full" })})` : ""));
 | 
			
		||||
	});
 | 
			
		||||
	console.log(title);
 | 
			
		||||
	for (var year in group)
 | 
			
		||||
	{
 | 
			
		||||
		console.log(year);
 | 
			
		||||
		for (var month in group[year])
 | 
			
		||||
		{
 | 
			
		||||
			console.log("  " + month);
 | 
			
		||||
			group[year][month].forEach(e =>
 | 
			
		||||
			{
 | 
			
		||||
				console.log("    " + e);
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	console.log("");
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
function main()
 | 
			
		||||
{
 | 
			
		||||
	var o = ics2json(ics);
 | 
			
		||||
 | 
			
		||||
	displayevents(o.VEVENTS, e => e.DTSTART >= (new Date), "A venir");
 | 
			
		||||
 | 
			
		||||
	var lastweek = new Date();
 | 
			
		||||
	lastweek.setDate(lastweek.getDate() - settings.recentdays);
 | 
			
		||||
	displayevents(o.VEVENTS, e => e.DTSTART >= (new Date) && e.DTSTAMP >= lastweek, "Changements récents", true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fs.readFile('settings.json', 'utf8', (err, data) =>
 | 
			
		||||
{
 | 
			
		||||
	settings = JSON.parse(data);
 | 
			
		||||
 | 
			
		||||
	var options =
 | 
			
		||||
	{
 | 
			
		||||
		host: settings.host,
 | 
			
		||||
		port: 443,
 | 
			
		||||
		path : settings.path,
 | 
			
		||||
		headers: {
 | 
			
		||||
			'Authorization': 'Basic ' + Buffer.from(settings.username + ':' + settings.passw).toString('base64')
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	request = https.get(options, function(res)
 | 
			
		||||
	{
 | 
			
		||||
		if (res.statusCode != 200)
 | 
			
		||||
		{
 | 
			
		||||
			console.log(`statusCode: ${res.statusCode}`)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		res.on('data', chunk => ics += chunk );
 | 
			
		||||
		res.on('end', main);
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	request.on('error', console.error);
 | 
			
		||||
	request.end();
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,150 @@
 | 
			
		|||
<?php
 | 
			
		||||
	require 'settings.php';
 | 
			
		||||
 | 
			
		||||
	if (isset($_POST['password']))
 | 
			
		||||
	{
 | 
			
		||||
		$password = $_POST['password'];
 | 
			
		||||
 | 
			
		||||
		$curl = curl_init();
 | 
			
		||||
 | 
			
		||||
		curl_setopt($curl, CURLOPT_URL, $url);
 | 
			
		||||
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 | 
			
		||||
		curl_setopt($curl, CURLOPT_USERPWD, $user . ':' . $password);
 | 
			
		||||
		curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
 | 
			
		||||
		$result = curl_exec($curl);
 | 
			
		||||
 | 
			
		||||
		if (!$result)
 | 
			
		||||
		{
 | 
			
		||||
			die('error');
 | 
			
		||||
		}
 | 
			
		||||
		curl_close($curl);
 | 
			
		||||
		die($result);
 | 
			
		||||
	}
 | 
			
		||||
?>
 | 
			
		||||
 | 
			
		||||
<html>
 | 
			
		||||
	<body>
 | 
			
		||||
		<script type="text/javascript">
 | 
			
		||||
function ics2json(input)
 | 
			
		||||
{
 | 
			
		||||
	var id = 0;
 | 
			
		||||
	var root = {};
 | 
			
		||||
	var curr = root;
 | 
			
		||||
	input.split("\r\n").forEach(l =>
 | 
			
		||||
	{
 | 
			
		||||
		var key = l.split(":")[0].split(";")[0];
 | 
			
		||||
		var val = l.split(":")[1];
 | 
			
		||||
		if (key == "BEGIN")
 | 
			
		||||
		{
 | 
			
		||||
			if (curr[val])
 | 
			
		||||
			{
 | 
			
		||||
				val += "_" + (id++);
 | 
			
		||||
			}
 | 
			
		||||
			curr[val] = {
 | 
			
		||||
				parent: curr
 | 
			
		||||
			};
 | 
			
		||||
			curr = curr[val];
 | 
			
		||||
		}
 | 
			
		||||
		else if (key == "END")
 | 
			
		||||
		{
 | 
			
		||||
			var parent = curr.parent;
 | 
			
		||||
			delete curr.parent;
 | 
			
		||||
			curr = parent;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			curr[key] = key.startsWith("DT") ? dt(val) : val;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	root.VCALENDAR.VEVENTS = [];
 | 
			
		||||
	Object.keys(root.VCALENDAR)
 | 
			
		||||
	.filter(k => (k == "VEVENT" || k.startsWith("VEVENT_")))
 | 
			
		||||
	.forEach(k =>
 | 
			
		||||
	{
 | 
			
		||||
		root.VCALENDAR.VEVENTS.push(root.VCALENDAR[k]);
 | 
			
		||||
		delete root.VCALENDAR[k];
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	return root.VCALENDAR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function dt(s)
 | 
			
		||||
{
 | 
			
		||||
	return new Date(
 | 
			
		||||
		s.substr(0,4) + "-" + s.substr(4,2) + "-" + s.substr(6,2)
 | 
			
		||||
		+ "T"
 | 
			
		||||
		+ s.substr(9,2) + ":" + s.substr(11,2) + ":" + s.substr(13,2));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function formatdate(d)
 | 
			
		||||
{
 | 
			
		||||
	return d.toLocaleString('fr-FR', { timeZone: 'Europe/Paris', dateStyle: "full", timeStyle: "short" });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function showresult()
 | 
			
		||||
{
 | 
			
		||||
	if (xhr.status == 200)
 | 
			
		||||
	{
 | 
			
		||||
		var params = new URLSearchParams(window.location.search);
 | 
			
		||||
		var recent = parseInt(params.get("recent")) || 7;
 | 
			
		||||
		var html = "<h1>Evénements à venir</h1>";
 | 
			
		||||
		html += "<p>En gras: modifié les " + recent + " derniers jours</p>";
 | 
			
		||||
		var o = ics2json(xhr.responseText);
 | 
			
		||||
 | 
			
		||||
		var lastweek = new Date();
 | 
			
		||||
		lastweek.setDate(lastweek.getDate() - recent);
 | 
			
		||||
 | 
			
		||||
		var html = "";
 | 
			
		||||
		var group = {};
 | 
			
		||||
 | 
			
		||||
		o.VEVENTS
 | 
			
		||||
		.filter(e => e.DTSTART >= (new Date))
 | 
			
		||||
		.sort( (a,b) => a.DTSTART - b.DTSTART)
 | 
			
		||||
		.forEach(e => {
 | 
			
		||||
			var formatteddate = formatdate(e.DTSTART);
 | 
			
		||||
			var splitdate = formatteddate.split(" ");
 | 
			
		||||
			var year = splitdate[3];
 | 
			
		||||
			var month = splitdate[2];
 | 
			
		||||
 | 
			
		||||
			if (!group[year])
 | 
			
		||||
			{
 | 
			
		||||
				html += `<h2>${year}</h2>`;
 | 
			
		||||
				group[year] = {};
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (!group[year][month])
 | 
			
		||||
			{
 | 
			
		||||
				html += `<h3>${month}</h3>`;
 | 
			
		||||
				group[year][month] = true;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			var line = `<li title="modifié le ${formatdate(e.DTSTAMP)}"> ${formatteddate}: ${e.SUMMARY}`;
 | 
			
		||||
			if (e.DTSTAMP >= lastweek)
 | 
			
		||||
			{
 | 
			
		||||
				line = `<b>${line}</b>`;
 | 
			
		||||
			}
 | 
			
		||||
			html += line;
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		document.body.innerHTML = html;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var password = localStorage.getItem("icspassword");
 | 
			
		||||
if (!password)
 | 
			
		||||
{
 | 
			
		||||
	password = prompt("password:");
 | 
			
		||||
	localStorage.setItem("icspassword", password);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var xhr = new XMLHttpRequest();
 | 
			
		||||
xhr.onload = showresult;
 | 
			
		||||
xhr.open("POST", "ics.php");
 | 
			
		||||
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
 | 
			
		||||
xhr.send("password=" + password);
 | 
			
		||||
 | 
			
		||||
		</script>
 | 
			
		||||
	</body>
 | 
			
		||||
</html>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,8 +1,3 @@
 | 
			
		|||
# ics tool
 | 
			
		||||
 | 
			
		||||
Script to display recently added or modified events in a calendar fetched from a caldav server.
 | 
			
		||||
 | 
			
		||||
Usage:
 | 
			
		||||
* Rename settings.json.sample to settings.json
 | 
			
		||||
* Edit settings.json
 | 
			
		||||
* run `node ics`
 | 
			
		||||
| 
						 | 
				
			
			@ -1,7 +0,0 @@
 | 
			
		|||
{
 | 
			
		||||
	"host": "caldav.server.example",
 | 
			
		||||
	"username": "username",
 | 
			
		||||
	"passw": "pizz@!123",
 | 
			
		||||
	"path": "/my/calendar/path",
 | 
			
		||||
	"recentdays": 10
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,4 @@
 | 
			
		|||
<?php
 | 
			
		||||
	$url = 'https://caldav.example.com/path/to/calendar';
 | 
			
		||||
	$user = 'caldavuser';
 | 
			
		||||
?>
 | 
			
		||||
		Loading…
	
		Reference in New Issue