import 'package:hiddingsel_app/appflow/model/event_organisations.dart'; import 'package:hiddingsel_app/appflow/model/location.dart'; import '../constants/enums.dart'; import '../appflow/model/contacts.dart'; import '../appflow/model/event.dart'; import '../appflow/model/schedules.dart'; class IcalParser { static List parse(String data) { final regex = RegExp('BEGIN:VEVENT(.*?)END:VEVENT', dotAll: true); return regex .allMatches(data) .map((e) => e.group(0)) .map((e) => _parseToEvent(e!)) .where((e) => e != null) .cast() .toList(); } static EventModel? _parseToEvent(String data) { try { final cleandData = data.replaceAll('\n', '\r'); final String id = RegExp('UID:(.*?)\\r').firstMatch(cleandData)!.group(1)!; final String summary = RegExp('SUMMARY.*?:(.*?)\\r').firstMatch(cleandData)!.group(1)!; final String dtStart = RegExp('DTSTART.*:(.*?)\\r').firstMatch(cleandData)!.group(1)!; final String dtEnd = RegExp('DTEND.*:(.*?)\\r').firstMatch(cleandData)!.group(1)!; final description = RegExp('DESCRIPTION:(.*?)\\r').firstMatch(cleandData)?.group(1); var location = RegExp('LOCATION:(.*?)\\r').firstMatch(cleandData)?.group(1)?.replaceAll('\\,', ','); final attendees = RegExp('ATTENDEE.*?CN=(.*?);', dotAll: true).allMatches(cleandData).map((e) => e.group(1)?.replaceAll('\r', '') .replaceAll('\n', '') .replaceAll(' ', '')).where((e) => e != null).cast().toList(); final freq = RegExp('RRULE.*?FREQ=(.*?);', dotAll: true) .firstMatch(cleandData) ?.group(1); final interval = RegExp('RRULE.*?INTERVAL=(.*?);', dotAll: true) .firstMatch(cleandData) ?.group(1); final until = RegExp('RRULE.*?UNTIL=(.*?);', dotAll: true) .firstMatch(cleandData) ?.group(1); final List eventOrganizer; if(location!.contains('Brinkstraße')) { location = 'Hiddingsel'; eventOrganizer = [EventOrganisationModel.fromId('garbage')!]; } else { eventOrganizer = attendees.map((e) => fromAttendee(e)).where((e) => e != null).cast().toList(); } var freqKey = Frequency.once; if (freq == 'DAILY') { freqKey = Frequency.days; } else if (freq == 'WEEKLY') { freqKey = Frequency.weeks; } else if (freq == 'MONTHLY') { freqKey = Frequency.months; } return EventModel(id, ScheduleModel( _parse(dtStart), _parse(dtEnd), freqKey, interval != null ? _parseInt(interval) : 1, until != null ? _parse(until) : null ), summary, ContactModel(location: LocationModel(address: location)), description: description, eventOrganizer: eventOrganizer, ); } catch (e) { return null; } } static DateTime _parse(String data) => DateTime.parse(data).toLocal(); static int _parseInt(String data) => int.parse(data); static EventOrganisationModel? fromAttendee(String? attendee) { if(attendee == null) return null; switch (attendee) { case 'sportverein@hiddingsel.de': return EventOrganisationModel.fromId('svVorwaertsHiddingsel'); case 'dorfgemeinschaft@hiddingsel.de': return EventOrganisationModel.fromId('dorfgemeinschaft'); case 'dorfnews@hiddingsel.de': return EventOrganisationModel.fromId('dorfgemeinschaft'); case 'schuetzenverein-hiddingsel@hiddingsel.de': return EventOrganisationModel.fromId('allgemeinerSchuetzenverein'); case 'kolping@hiddingsel.de': return EventOrganisationModel.fromId('kolpingfamilieHiddingsel'); case 'landjugend@hiddingsel.de': return EventOrganisationModel.fromId('landjugendHiddingsel'); case 'feuerwehr@hiddingsel.de': return EventOrganisationModel.fromId('freiwilligeFeuerwehr'); case 'kirche@hiddingsel.de': return EventOrganisationModel.fromId('stGeorgKirche'); case 'kindergarten@hiddingsel.de': return EventOrganisationModel.fromId('kindergarten'); case 'grundschule@hiddingsel.de': return EventOrganisationModel.fromId('grundschule'); case 'landfrauen@hiddingsel.de': return EventOrganisationModel.fromId('landfrauen'); case 'schuetzenverein-daldrup@hiddingsel.de': return EventOrganisationModel.fromId('daldruperSchuetzenverein'); case 'landwirtschaftlicher-ortsverein@hiddingsel.de': return EventOrganisationModel.fromId('landwirtschaflicherOrtsverein'); case 'drk@hiddingsel.de': return EventOrganisationModel.fromId('drk'); case 'eltern-kind-gruppe@hiddingsel.de': return EventOrganisationModel.fromId('elternKindGruppe'); case 'kfd@hiddingsel.de': return EventOrganisationModel.fromId('kfd'); case 'kulturforum@hiddingsel.de': return EventOrganisationModel.fromId('kulturforum'); case 'psg@hiddingsel.de': return EventOrganisationModel.fromId('pfadfinderinnenschaftStGeorg'); case 'seniorengemeinschaft@hiddingsel.de': return EventOrganisationModel.fromId('seniorengemeinschaft'); case 'voices@hiddingsel.de': return EventOrganisationModel.fromId('voices'); case 'aida@hiddingsel.de': return EventOrganisationModel.fromId('aktivInDasAlter'); case 'foerderverein-kiga-schule@hiddingsel.de': return EventOrganisationModel.fromId('foerdervereinKigaSchu'); case 'buecherei@hiddingsel.de': return EventOrganisationModel.fromId('buecherei'); case 'jaegerzug@hiddingsel.de': return EventOrganisationModel.fromId('jaegerzug'); case 'cdu@hiddingsel.de': return EventOrganisationModel.fromId('cdu'); default: return null; } } }