Example #1
0
    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);
        }
      });
    })
Example #2
0
	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);
		});
	});
Example #3
0
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);

            }
        }
    });
    
}
Example #4
0
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)
      }));
  });
}
Example #5
0
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);
	});
}
Example #6
0
/**
 * 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);
          }
        }
      }
    });
}
Example #7
0
  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();
    });
  });
Example #8
0
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()];
        }
    }
}
});
}
Example #9
0
  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);
      }
    })
  });
Example #10
0
  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]);
            });
        });
    }
}
Example #13
0
// 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'));
}
Example #14
0
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);
        });
}
Example #15
0
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);


})
Example #16
0
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);
		}
	});
});

Example #17
0
	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});
    });
};