예제 #1
0
    def update_credentials(self):
        self.server = False  # False for an ics file, true for a caldav server -regardless of where the creds are stored
        self.no_creds = False

        server_type = self.settings.get("server_type")
        if server_type == "server":  # On home
            self.server = True

            self.user = self.settings.get("username")
            self.server_address = self.settings.get("server_address")
            self.port = self.settings.get("port")
            self.password = self.settings.get("password")
            if self.user is None or self.user == "":
                # Using pw in config
                fs = FileSystemAccess(str(self.skill_id))
                if fs.exists("calendar_conf.yml"):
                    #  Use yml file for config
                    config = self.read_file("calendar_conf.yml")
                    config = yaml.safe_load(config)
                    self.user = config.get("username")
                    self.server_address = config.get("server_address")
                    self.port = config.get("port")
                    self.password = config.get("password")
                else:
                    self.no_creds = True
                if self.user is None or self.user == "":
                    self.no_creds = True
        elif server_type == "local":  # Use file
            pass

        if self.no_creds is True:
            # Not set up in file/home
            self.speak_dialog("setup")
            return False
        return True
예제 #2
0
    def update_credentials(self):
        self.server = False  # False for an ics file, true for a caldav server -regardless of where the creds are stored
        self.no_creds = False

        self.server = True

        self.account = self.settings.get('username')
        self.password = self.settings.get('password')
        self.server = self.settings.get("server")
        self.folder = self.settings.get('folder')
        self.port = self.settings.get("port")

        if self.account is None or self.account == "" or self.server is None or self.server == "":
            # Using pw in config
            fs = FileSystemAccess(str(self.skill_id))
            if fs.exists("email_conf.yml"):
                #  Use yml file for config
                config = fs.open("email_conf.yml", "r").read()
                config = yaml.safe_load(config)
                self.account = config.get("username")
                self.password = config.get("password")
                self.server = config.get("server_address")
                self.folder = config.get("folder")
                self.port = config.get("port")

            else:
                self.no_creds = True
            if self.account is None or self.account == "":
                self.no_creds = True

        if self.no_creds is True:
            # Not set up in file/home
            self.speak_dialog("setup")
            return False
        return True
예제 #3
0
    def get_events(self, date):
        """Get events on a date and return them as a list.
        date: Date object!
        Returns:
        list: {"datetime", "event"}
        """
        if self.server is False:
            events = []
            # The calendar is on the device
            # Check if it needs to be made...
            fs = FileSystemAccess(str(self.skill_id))
            if fs.exists("calendar.ics"):
                # YAY! exists
                calendar = self.read_file("calendar.ics")
                c = ics.Calendar(imports=calendar)
                for event in c.timeline.on(day=arrow.get(date)):
                    event_dict = {
                        "datetime": event.begin.datetime,
                        "event": event.name
                    }
                    events.append(event_dict)
                return events
            else:
                return []

        elif self.server is True:
            url = "http://{}:{}@{}:{}/".format(self.user, self.password,
                                               self.server_address, self.port)

            try:
                client = caldav.DAVClient(url)
                principal = client.principal()

                # Select calendar
                events = []
                for calendar in principal.calendars():
                    for event in calendar.events():
                        event_text = event.data
                        cal = vobject.readOne(event_text)
                        event_date = cal.vevent.dtstart.value.date()
                        # If in date, append.
                        if event_date == date:
                            event_dict = {
                                "datetime": cal.vevent.dtstart.value,
                                "event": cal.vevent.summary.valueRepr()
                            }
                            events.append(event_dict)
                return events

            except:
                self.speak_dialog("error.logging.in")
                return None

        else:
            raise ("Wrong input")
예제 #4
0
class IdentityManager(object):
    def __init__(self):
        self.filesystem = FileSystemAccess('identity')
        self.identity = None
        self.initialize()

    def initialize(self):
        if self.filesystem.exists('identity.json'):
            self.identity = DeviceIdentity.load(self.filesystem.open('identity.json', 'r'))
        else:
            identity = DeviceIdentity(device_id=str(uuid4()))
            self.update(identity)

    def update(self, identity):
        self.identity = identity
        with self.filesystem.open('identity.json', 'w') as f:
            self.identity.save(f)

    def is_paired(self):
        return self.identity is not None and self.identity.owner is not None

    def get(self):
        return self.identity
예제 #5
0
class IdentityManager(object):
    def __init__(self):
        self.filesystem = FileSystemAccess('identity')
        self.identity = None
        self.initialize()

    def initialize(self):
        if self.filesystem.exists('identity.json'):
            self.identity = DeviceIdentity.load(
                self.filesystem.open('identity.json', 'r'))
        else:
            identity = DeviceIdentity(device_id=str(uuid4()))
            self.update(identity)

    def update(self, identity):
        self.identity = identity
        with self.filesystem.open('identity.json', 'w') as f:
            self.identity.save(f)

    def is_paired(self):
        return self.identity is not None and self.identity.owner is not None

    def get(self):
        return self.identity
예제 #6
0
    def handle_add_appoint(self, message):
        if self.update_credentials() is False:  # No credentials
            return

        event = message.data.get("event")
        while not event:
            # We need to get the event
            event = self.get_response("new.event.name")

        utterance = message.data['utterance']
        date, rest = extract_datetime(utterance, datetime.datetime.now(),
                                      self.lang)
        while rest == normalize(utterance):
            utterance = self.get_response("new.event.date")
            date, rest = extract_datetime(utterance, datetime.datetime.now(),
                                          self.lang)

        # Clean the date being in the event
        test_date, rest = extract_datetime(event, datetime.datetime.now(),
                                           self.lang)
        if test_date is not None:
            date_said = event.replace(rest, '')
            event = event.replace(date_said, '')

        # Check that there is a time - ask for one if there isn't
        if not self.check_for_time(date):
            time = None
            # No time- ask
            while self.check_for_time(time) is False:
                time = self.get_response("new.event.time",
                                         data={"event": event})
                time, _ = extract_datetime(time)

            # user said date: add to date object
            date = datetime.datetime.combine(date.date(), time.time())

        self.log.info("Calendar skill new event: date: " + str(date) +
                      " event: " + event)
        # ADD EVENT
        if self.server is True:
            # start creating a vevent:
            cal = vobject.iCalendar()
            cal.add("vevent")
            # add name
            cal.vevent.add("summary").value = str(event)
            # add date
            cal.vevent.add('dtstart').value = date
            # add it to the calendar
            url = "http://{}:{}@{}:{}/".format(self.user, self.password,
                                               self.server_address, self.port)
            try:
                client = caldav.DAVClient(url)
                principal = client.principal()

                # Select calendar
                events = []
                for calendar in principal.calendars():
                    calendar.add_event(str(cal.serialize()))
                self.speak_dialog("new.event.summary",
                                  data={"event": str(event)})
            except:
                self.speak_dialog("error.logging.in")
                return None

        elif self.server is False:
            # Local
            # The calendar is on the device
            # Check if it needs to be made...
            fs = FileSystemAccess(str(self.skill_id))
            if fs.exists("calendar.ics"):
                # YAY! exists
                calendar = self.read_file("calendar.ics")
                c = ics.Calendar(calendar)
                e = ics.Event()
                # add event
                e.name = str(event)
                e.begin = str(arrow.get(date))
                c.events.append(e)
                self.write_file("calendar.ics", str(c))
                self.speak_dialog("new.event.summary",
                                  data={"event": str(event)})
            else:
                # create calendar
                c = ics.Calendar()
                e = ics.Event()
                # add event
                e.name = str(event)
                e.begin = str(arrow.get(date))
                c.events.add(e)
                self.write_file("calendar.ics", str(c))
                self.speak_dialog("new.event.summary",
                                  data={"event": str(event)})
예제 #7
0
    def handle_add_appoint(self, message):
        event = message.data.get("event")
        while not event:
            #We need to get the event
            event = self.get_response("new.event.name")

        utterance = message.data['utterance']
        date, rest = extract_datetime(utterance, datetime.now(), self.lang)
        while rest == normalize(utterance):
            utterance = self.get_response("new.event.date")
            date, rest = extract_datetime(utterance)

        self.log.info(" Calendar skill new event: date: " + str(date) +
                      " event: " + event)
        #ADD EVENT
        server_type = self.check_server()
        if server_type == "Handled":
            return
        elif server_type == True:
            #Home
            server_address = self.settings.get("server_address")
            port = self.settings.get("port")
            username = self.settings.get("username")
            password = self.settings.get("password")
            #start creating a vevent:
            cal = vobject.iCalendar()
            cal.add("vevent")
            #add name
            cal.vevent.add("summary").value = str(event)
            #add date
            cal.vevent.add('dtstart').value = date
            # add it to the calendar
            url = "http://{}:{}@{}:{}/".format(username, password,
                                               server_address, port)
            try:
                client = caldav.DAVClient(url)
                principal = client.principal()

                #Select calendar
                events = []
                for calendar in principal.calendars():
                    calendar.add_event(str(cal.serialize()))
                self.speak_dialog("new.event.summary",
                                  data={"event": str(event)})
            except:
                self.speak_dialog("error.logging.in")
                return None

        elif server_type is None:
            # Password local
            server_address = self.settings.get("server_address")
            calendar = self.settings.get("calendar")
            port = self.settings.get("port")
            account_config = self.config_core.get("calendar", {})
            username = account_config.get("username")
            password = account_config.get("password")

            # start creating a vevent:
            cal = vobject.iCalendar()
            cal.add("vevent")
            # add name
            cal.vevent.add("summary").value = str(event)
            # add date
            cal.vevent.add('dtstart').value = date
            # add it to the calendar
            url = "http://{}:{}@{}:{}/".format(username, password,
                                               server_address, port)
            try:
                client = caldav.DAVClient(url)
                principal = client.principal()

                # Select calendar
                events = []
                for calendar in principal.calendars():
                    calendar.add_event(str(cal.serialize()))
                self.speak_dialog("new.event.summary",
                                  data={"event": str(event)})
            except:
                self.speak_dialog("error.logging.in")
                return None

        elif server_type == False:
            #Local
            #The calendar is on the device
            #Check if it needs to be made...
            fs = FileSystemAccess(str(self.skill_id))
            if fs.exists("calendar.ics"):
                #YAY! exists
                calendar = self.read_file("calendar.ics")
                c = ics.Calendar(calendar)
                e = ics.Event()
                #add event
                e.name = str(event)
                e.begin = str(arrow.get(date))
                c.events.apaddpend(e)
                self.write_file("calendar.ics", str(c))
                self.speak_dialog("new.event.summary",
                                  data={"event": str(event)})
            else:
                #create calendar
                c = ics.Calendar()
                e = ics.Event()
                #add event
                e.name = str(event)
                e.begin = str(arrow.get(date))
                c.events.add(e)
                self.write_file("calendar.ics", str(c))
                self.speak_dialog("new.event.summary",
                                  data={"event": str(event)})
예제 #8
0
    def get_events(self, date):
        """Get events on a date and return them as a list.
        date: Date object!
        Returns:
        list: {"datetime", "event"}
        """
        server_type = self.check_server()
        if server_type == "Handled":
            #Do nothing
            return "Handled"
        elif server_type == False:
            events = []
            #The calendar is on the device
            #Check if it needs to be made...
            fs = FileSystemAccess(str(self.skill_id))
            if fs.exists("calendar.ics"):
                #YAY! exists
                calendar = self.read_file("calendar.ics")
                c = ics.Calendar(calendar)
                for event in c.events:
                    event_date = event.begin.datetime
                    if event_date.date() == date:
                        event_dict = {
                            "datetime": event.begin.datetime,
                            "event": event.name
                        }
                        events.append(event_dict)
                return events
            else:
                return []

        elif server_type == True:
            #Get server and password info from home
            server_address = self.settings.get("server_address")
            port = self.settings.get("port")
            username = self.settings.get("username")
            password = self.settings.get("password")

            url = "http://{}:{}@{}:{}/".format(username, password,
                                               server_address, port)

            try:
                client = caldav.DAVClient(url)
                principal = client.principal()

                #Select calendar
                events = []
                for calendar in principal.calendars():
                    for event in calendar.events():
                        event_text = event.data
                        cal = vobject.readOne(event_text)
                        event_date = cal.vevent.dtstart.value.date()
                        #If in date, append.
                        if event_date == date:
                            event_dict = {
                                "date": cal.vevent.dtstart.value.date(),
                                "time": cal.vevent.dtstart.value.time(),
                                "event": cal.vevent.summary.valueRepr()
                            }
                            events.append(event_dict)
                return events

            except:
                self.speak_dialog("error.logging.in")
                return None

        elif server_type == None:
            #Get server info on home. Password in config.
            server_address = self.settings.get("server_address")
            calendar = self.settings.get("calendar")
            port = self.settings.get("port")
            account_config = self.config_core.get("calendar", {})
            username = account_config.get("username")
            password = account_config.get("password")

            url = "http://{}:{}@{}:{}/".format(username, password,
                                               server_address, port)

            try:
                client = caldav.DAVClient(url)
                principal = client.principal()

                #Select calendar
                events = []
                for calendar in principal.calendars():
                    for event in calendar.events():
                        event_text = event.data
                        cal = vobject.readOne(event_text)
                        event_date = cal.vevent.dtstart.value.date()
                        #If in date, append.
                        if event_date == date:
                            event_dict = {
                                "date": cal.vevent.dtstart.value.date(),
                                "time": cal.vevent.dtstart.value.time(),
                                "event": cal.vevent.summary.valueRepr()
                            }
                            events.append(event_dict)
                return events

            except:
                self.speak_dialog("error.logging.in")
                return None
        else:
            raise ("Wrong input")