icsGroups.forEach(function(group) { ical.fromURL(group.ics_url, {}, function(err, data) { if (err) { logger.warn('Cannot read ICS Group ' + group.group_name + ': ' + err); } else { var thisEvent = {}; for (var key in data) { if (data.hasOwnProperty(key)) { if (data[ key ].start && data[ key ].end) { thisEvent = {}; thisEvent.group_name = group.group_name; thisEvent.group_url = group.group_url; thisEvent.start_time = data[ key ].start; thisEvent.end_time = data[ key ].end; thisEvent.uid = data[ key ].uid; thisEvent.name = data[ key ].summary; thisEvent.description = data[ key ].description; thisEvent.location = data[ key ].location; events.push(thisEvent); } } } } countReplies++; if (countReplies >= icsGroups.length) { callback(events); } }); })
robot.hear(/^!events$/i, function (res) { var months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"]; ical.fromURL('https://calendar.google.com/calendar/ical/q3n3pce86072n9knt3pt65fhio%40group.calendar.google.com/public/basic.ics', {}, function(err, data) { var now = new Date().getTime(); var arr = [] for(var k in data) { if(data[k].end.getTime() > now) { arr.push(data[k]); } } arr.sort(function(a,b) { return a.start.getTime()-b.start.getTime(); }); var ret = ""; for(var k in arr) { var ev = arr[k]; if(ev.location == "") {ev.location = "Unkown location";} ret += "*" + months[ev.start.getMonth()] + " " + ev.start.getDate() + " " + ev.start.getHours() + ":" + (ev.start.getMinutes() < 10 ? "0" : "") + ev.start.getMinutes() + " - " + months[ev.end.getMonth()] + " " + ev.end.getDate() + " " + ev.end.getHours() + ":" + (ev.end.getMinutes() < 10 ? "0" : "") + ev.end.getMinutes() + "*" + " - _" + ev.location + "_" + ": `" + ev.summary + "`\r\n"; } res.send(ret); }); });
function fetchICal($N, x, url) { function event2Object(e) { if (!e.summary) return null; var n = new $N.nobject(e.uid); n.setName(e.summary); n.addTag('Event'); if (e.description) n.addDescription(e.description); if (e.geo) n.earthPoint(e.geo.lat, e.geo.lon); if (e.location) n.addDescription(e.location); if (e.url) { n.addTag('WebURL'); n.add('urlAddress', e.url); } n.author = x.id; if (e.start) { var start = e.start.getTime(); n.when = start; if (e.end) { var end = e.end.getTime(); n.duration = end - n.when; } } return n; } ical.fromURL(url, {}, function(err, data) { for (var k in data) { if (data.hasOwnProperty(k)) { var ev = data[k]; var n = event2Object(ev); if (n) $N.pub(n); } } }); }
var calendar = function(res){ var icalURL = config.calendar; moment.locale(config.language); var now = moment(); var nextHour = moment().add(1, 'hour'); ical.fromURL(icalURL, {}, function(err, data) { var vevents = []; for (var k in data){ var vevent = {}; var ev = data[k]; var end; var start; if( ev.type === 'VEVENT'){ if ( ev.rrule === undefined){//regular date start = moment(ev.start).tz(config.timezone); if (nextHour.isBefore(start)){ end = moment(ev.end).tz(config.timezone); if ( now.isBefore(end)){ vevents.push({ "start": start.format(dateFormatter), "summary": ev.summary }); } } }else{ //periodic date, like as a birthday var vevent = {}; var start = moment(ev.start).tz(config.timezone); start = start.format("DD/MM/")+now.get("year")+" 23:59:59"; start = moment(start, "DD/MM/YYYY HH:mm:ss"); if ( now.isBefore(start)){ vevents.push({ "start": start.format(dateFormatter), "summary": ev.summary }) } } } } vevents.sort(function(a, b){ var msA = moment(a.start, dateFormatter).format('X'); var msB = moment(b.start, dateFormatter).format('X'); return msA - msB; }); res.end(JSON.stringify({ "calendar": vevents.slice(0, 10) })); }); }
function getEvents(cb) { ical.fromURL('http://grical.org/s/?query=%23netz39&view=ical', {}, function(err, data) { var events = []; for(var k in data){ if (data.hasOwnProperty(k)) { if(data[k].start) if((new Date(data[k].start)).getTime() < (new Date()).getTime() + 1000* 3600* 24 * 30) events.push(data[k]); } } events.sort(function(a,b) { return (new Date(a.start)).getTime() - (new Date(b.start)).getTime(); }); cb(events); }); }
/** * Description * @method downloadIcal * @param {} url * @param {} callback * @return */ function downloadIcal (url,callback){ ical.fromURL(url, {}, function(err, data) { if(err) return sails.log.warn('iCalService : downloadIcal : '+ err); for (var k in data){ if (data.hasOwnProperty(k)) { var ev = data[k]; if(callback){ callback(ev); } } } }); }
rooms.forEach(function (room) { var url = format("https://www.google.com/calendar/ical/%s/public/basic.ics", atMozYVR(room.id)); ical.fromURL(url, {}, function(err, data) { var d = []; for (var k in data) { if (data.hasOwnProperty(k)) { var ev = data[k]; var start = moment.utc(ev.start); start.local(); if (now.isBefore(start)) { d.push(start); } } } room.nextEvent = d.sort(function (a, b) { return moment(a.start) > moment(b.start); }).pop(); }); });
function reloadCalendar() { ical.fromURL(config.calendar[calNum], {}, function(err, data) { for (var k in data){ if (data.hasOwnProperty(k)) { f++; var ev = data[k]; var dateNow = new Date(); var yearNow = dateNow.getFullYear() + 1; var date = new Date(ev.start); if (date < dateNow && calNum != 3){ date.setFullYear(yearNow); }else if (calNum == 3){ dateNow.setFullYear(config.calendarYear[calNum]); } control[f] = ev.summary; if (ev.summary != undefined){ if (date >= dateNow){ if (control[f] != control[f-1]){ e++; summary[e] = ev.summary; dstart[e] = date; } } } } } classificationCal1(); for (var i=1; i<9; i++){ control[f] = summary[i]; if(summary[i] != undefined){ if (control[f] != control[f-1] && calNum != 3){ document.getElementById("summary" + i).innerHTML = ' <i class="material-icons" style="font-size:17px">event</i> ' + summary[i]; document.getElementById("datecal" + i).innerHTML = dstart[i].getDate() + ' ' + months[dstart[i].getMonth()]; }else if(calNum == 3){ document.getElementById("summary" + i).innerHTML = ' <i class="material-icons" style="font-size:17px">event</i> ' + summary[i]; document.getElementById("datecal" + i).innerHTML = dstart[i].getDate() + ' ' + months[dstart[i].getMonth()]; } } } }); }
return new Promise((resolve, reject) => { icalParser.fromURL('http://conferences.oreilly.com/oscon/open-source-us/public/schedule/ical/public', {}, function(err, data) { if (err) { console.log('[schedule-update.fetchSchedule] reject: '); console.log(e); reject(e); } else { var schedule = []; console.log('[schedule-update.fetchSchedule] resolve: '); for (var k in data) { if (data.hasOwnProperty(k)) { var session = data[k]; console.log(session.summary); // Remove punctuation, common words, and tokenize. // TODO: Enhance session information with metadata more intelligently to improve the matching algorithm. session.keywords = []; session.keywords = session.keywords.concat(keywordExtractor.extract( session.summary.replace(/[^a-zA-Z ]/g, ""), { language: "english", return_changed_case: true, remove_duplicates: true } )); session.keywords = session.keywords.concat(keywordExtractor.extract( session.description.replace(/[^a-zA-Z ]/g, ""), { language: "english", return_changed_case: true, remove_duplicates: true } )); schedule.push(session); } } resolve(schedule); } }) });
rooms.forEach(function (room) { var url = format(ics, atMozYVR(room.id), now.format("YYYYMMDD")); ical.fromURL(url, {}, function(err, data) { if (err) { console.error(err); return; } var events = []; for (var k in data){ if (data.hasOwnProperty(k)){ var ev = data[k]; if (ev.type && ev.type === "VFREEBUSY") { if (typeof ev.freebusy === "undefined") { var start = moment.utc(ev.start); var end = moment.utc(ev.end); start.local(); end.local(); events.push({"start": start, "end": end}); events = events.filter(today); } } } } room.freebusy = events; } ); });
return new Promise((resolve, reject) => { var events = []; var months = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']; ical.fromURL(url, {}, function(err, data) { if (err) { console.log(err); reject(err); } var i=0; limit>0 ? limit : limit=3; //only return 3 entries if no limit is set by user for (var k in data){ if (data.hasOwnProperty(k)) { var ev = data[k] // Use only events in the future if (new Date(ev.start) > Date.now()) { ev.summary = limitString(ev.summary, 50); ev.location = limitString(ev.location, 55); events.push(ev); } } } // Sort events by date events.sort(function (a, b) { return new Date(a.start) - new Date(b.start); }); // Return limited result resolve(events.splice(0, limit)) }); });
function getSchedule(url, callback) { var events = [], file ; console.log('getSchedule: ' + url); var path = __dirname + '/../tmp/'+config.site.mlb.code+'-'+moment().format('YYYYMMDD')+'-schedule-full.json'; var file_exists = fs.existsSync(path); if ( file_exists ) { file = fs.readFile(path, function(err, data){ callback.apply(undefined, [err, JSON.parse(data)]); }); } else { ical.fromURL(url, {}, function(err, data) { //console.log(data); for ( var k in data ) { if ( data.hasOwnProperty(k) ) { var ev = data[k]; if ( ev.type == 'VEVENT' ) { events.push(ev); } } } fs.writeFile(path, JSON.stringify(events), function(err){ callback.apply(undefined, [err, events]); }); }); } }
// Parse ical feed, and send data off function ParseiCalFeed(){ log.info('Parse ical file'); ical.fromURL(config.icalurl, {}, ParseiCalData); //ParseiCalData('',ical.parseFile('/home/jimshoe/dev/makerslocal/eventwitter/calendar.ics.test')); }
function checkiCal(loc,col,count,cb) { //Benötigt eine angepasste Version von node-ical, damit die übergebenden Opts auch wieder zurückkommen // Syntax ical.fromURL(URL,opts,callback) returns err,opts,data ical.fromURL(loc, col, function (err, opts, data) { if (err != undefined) { logger.info("adapter ical Error Reading from URL: " + err.toString()); } logger.info("adapter ical processing URL: " + opts+ " "+ loc); //Variable ablöschen setState(icalSettings.firstId + 1, ""); /* for (var k in data) { if (data.hasOwnProperty(k)) { var value = data[k]; console.log("property name is " + k + " value is " + value); for (var l in value) { if (value.hasOwnProperty(l)) { var val = value[l]; console.log("property name2 is " + k + " " + l + " value is " + val); } } } }*/ for (var k in data) { if (data.hasOwnProperty(k)) { var ev = data[k]; var endpreview = new Date(); var realnow = new Date(); var heute = new Date(); endpreview.setDate(endpreview.getDate() + preview); heute.setHours(0,0,0,0); //Now2 1 Sekunde zurück für Vergleich von ganztägigen Terminen in RRule var now2 = new Date(); //Uhzeit nullen now2.setHours(0,0,0,0); //Datum 1 Sec zurück wegen Ganztätigen Terminen um 00:00 Uhr now2.setSeconds(now2.getSeconds() - 1); tomorrow = new Date(); tomorrow.setDate(heute.getDate() + 1); tomorrow.setHours(0,0,0,0); tomorrow2 = new Date(); //es interessieren nur Termine mit einer Summary und nur Einträge vom Typ VEVENT if ((ev.summary != undefined) && (ev.type == "VEVENT") ) { //aha, eine RRULE in dem Termin --> auswerten if (ev.rrule != undefined) { var options = RRule.parseString(ev.rrule.toString()); options.dtstart = ev.start rule = new RRule(options) if (debug) {logger.info("RRule termin:" + ev.summary + " " + ev.start.toString() + " " + endpreview.toString() + " now:" + heute + " now2:" + now2 + " " +rule.toText());} var dates = rule.between(now2, endpreview); //Termine innerhalb des Zeitfensters if (dates.length > 0) { for (var i = 0; i < dates.length; i++) { //Datum ersetzen für jeden einzelnen Termin in RRule //TODO: funktioniert nur mit Terminen innerhalb eines Tages, da auch das EndDate ersetzt wird ev.start.setDate(dates[i].getDate()); ev.start.setMonth(dates[i].getMonth()); ev.start.setFullYear(dates[i].getFullYear()); ev.end.setDate(dates[i].getDate()); ev.end.setMonth(dates[i].getMonth()); ev.end.setFullYear(dates[i].getFullYear()); //Termin auswerten if (ev.exdate) { //Wenn es exdate if (ev.exdate != heute) { checkDates(ev,endpreview,heute,tomorrow,realnow," rrule ",col); } } else { checkDates(ev,endpreview,heute,tomorrow,realnow," rrule ",col); } } } else { if (debug) {logger.info("Keine RRule Termine innerhalb des Zeitfensters");} } } else { //Kein RRule Termin checkDates(ev,endpreview,heute,tomorrow,realnow," ",col); } } } } //wir sind fertig callback aufrufen cb(count); }); }
var _ = require('lodash'); var ical = require('ical'); var schedule = []; ical.fromURL("https://calendar.google.com/calendar/ical/cssconfbp.rocks_8qdn2o02kiasgaai9o2kffcl64%40group.calendar.google.com/public/basic.ics?ts=" + +new Date(), {}, function(err, data) { for (var i in data) { schedule.push(data[i]) } schedule = _.sortBy(schedule, ['start']); var next = _.find(schedule, function(o) { console.log(o.start) return o.start > new Date() }); console.log(schedule); })
var ical = require('ical'); ical.fromURL('https://www.google.com/calendar/ical/mengwong%40hackerspace.sg/public/basic.ics', {}, function(err, data) { var futureEvents = []; for (var k in data) { if (data.hasOwnProperty(k)) { var ev = data[k] if (ev.start && ! isNaN(ev.start) && (ev.start > Date.now())) { futureEvents.push({ "Name": ev.summary, "When": ev.start.getTime() }); } } } if (!futureEvents) { return; } var j = JSON.stringify(futureEvents, undefined, 2); var fs = require('fs'); fs.writeFile("contents/_index/events.json", j, function(err) { if (err) { console.log(err); } }); });
robot.respond(/!?events ?(full|all|[1-9][0-9]*)? ?(weeks?)?/i, function (res) { var months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"]; var now = new Date().getTime(); var week = 1000*60*60*24*7; var to = null; // Time until, false values imply no end var cap = 0; // Maximum number of events, 0 implies no cap var no_result_msg = "There doesn't appear to be any "; var header; if (res.match[1] === undefined) { // Two weeks to = now + week * 2; no_result_msg += "events in the next two weeks..."; header = "Events in the *next two weeks*"; } else if (res.match[1] !== "full" && res.match[1] !== "all") { var n = +res.match[1]; // Convert to num if (res.match[2] === undefined) { cap = n; // n events no_result_msg += "upcoming events..."; header = "The *next _" + n + "_ events*"; } else { to = now + week * n; // n weeks no_result_msg += "events in the next *" + n + "* weeks..."; header = "Events in the *next _n_ weeks*"; } } else { // All no_result_msg += "upcoming events..."; header = "List of *all* upcoming events"; } ical.fromURL('https://calendar.google.com/calendar/ical/q3n3pce86072n9knt3pt65fhio%40group.calendar.google.com/public/basic.ics', {}, function(err, data) { var arr = []; for(var k in data) { if(n === 0) { break; } if(data[k].type == 'VTIMEZONE') { continue; } // I don't even know. See issue #50 on peterbraden/ical.js if(data[k].rrule) { // Repeated event, stored in the format from the rrule package var times; // List of repeated times in the desired time-frame if(to) { times = data[k].rrule.between(new Date(now), new Date(to)); } else { // Technically until a year ahead, safer this way. times = data[k].rrule.between(new Date(now), new Date(now + week * 52)); } var obj; var duration = data[k].end.getTime() - data[k].start.getTime(); // How long it goes for for(var i = 0; i < times.length; i++) { obj = {}; // Copy necessary information from the original event obj.location = data[k].location; obj.summary = data[k].summary; // Set new start/end obj.start = times[i]; obj.end = new Date(times[i].getTime() + duration); arr.push(obj); } } else if(data[k].end.getTime() > now) { if(!to || data[k].start.getTime() < to) { arr.push(data[k]); } } } arr.sort(function(a, b) { return a.start.getTime() - b.start.getTime(); }); if(cap) { arr = arr.slice(0, cap); } var ret = ""; if(arr.length === 0) { ret += "_" + no_result_msg + "_\r\nFor a full list of events, visit: https://uqcs.org.au/calendar.html\r\n"; } else { ret += header + "\r\n"; for(var k in arr) { var ev = arr[k]; if(ev.location == "") { ev.location = "TBA"; } var start_time = months[ev.start.getMonth()] + " " + ev.start.getDate() + " " + ev.start.getHours() + ":" + (ev.start.getMinutes() < 10 ? "0" : "") + ev.start.getMinutes(); var end_time = ev.end.getHours() + ":" + (ev.end.getMinutes() < 10 ? "0" : "") + ev.end.getMinutes(); if (ev.start.getMonth() !== ev.end.getMonth() || ev.start.getDate() !== ev.end.getDate()) { end_time = months[ev.end.getMonth()] + " " + ev.end.getDate() + " " + end_time; } ret += "*" + start_time + " - " + end_time + "*" + " - _" + ev.location + "_" + ": `" + ev.summary + "`\r\n"; } } res.send(ret); }); });
module.exports = function(config, dependencies, job_callback) { var maxEntries = config.maxEntries; var logger = dependencies.logger; var formatDate = function(date) { var d = date.getDay(); var h = date.getHours(); var M = date.getMinutes(); var weekday = new Array(7); weekday[0]= "Sun"; weekday[1] = "Mon"; weekday[2] = "Tue"; weekday[3] = "Wed"; weekday[4] = "Thu"; weekday[5] = "Fri"; weekday[6] = "Sat"; if(h==0 && M==0){ return weekday[d]; } else{ return '' + weekday[d] + ' ' + (h<=9?'0'+h:h) + ':' + (M<=9?'0'+M:M); } }; var formatDateEnd = function(date) { var d = date.getDay(); var h = date.getHours(); var M = date.getMinutes(); var weekday = new Array(7); weekday[0]= "Sun"; weekday[1] = "Mon"; weekday[2] = "Tue"; weekday[3] = "Wed"; weekday[4] = "Thu"; weekday[5] = "Fri"; weekday[6] = "Sat"; if(h==0 && M==0){ return weekday[d]; } else{ return '' + (h<=9?'0'+h:h) + ':' + (M<=9?'0'+M:M); } }; ical.fromURL(config.calendarUrl, {}, function(err, data){ if (err){ logger.error(err); job_callback("error loading calendar"); return; } var events = _.sortBy(data, function(event) { return event.start; }); events = _.filter(events, function(event) { return event.end >= new Date(); }); var result = []; var counter = 0; events.forEach(function(event) { console.log(event); if (counter < maxEntries) { counter++; if(event.start.getDate()==event.end.getDate() && event.start.getFullYear()==event.end.getFullYear() && event.start.getMonth()==event.end.getMonth()){ result.push({startDate: formatDate(event.start), endDate: formatDateEnd(event.end), summary: event.summary, attendees: event.description}); } else{ result.push({startDate: formatDate(event.start), endDate: formatDate(event.end), summary: event.summary, attendees: event.description}); } } }); job_callback(null, {events: result, title: config.widgetTitle}); }); };