Ejemplo n.º 1
0
    def Caldav(self):
        # Verbinding maken met CalDav agenda
        client = caldav.DAVClient(self.config["url"])
        principal = client.principal()
        calendars = principal.calendars()

        first_all = True
        # Lus door de beschikbare agenda's heen
        for calendar in calendars:
            # Zoek de naam hiervan op
            calendar_name = calendar.get_properties([
                dav.DisplayName(),
            ])["{DAV:}displayname"]

            # Alleen doorgaan indien de agenda in de 'calendars' config regel staat
            if calendar_name in self.config["calendars"]:
                first = True

                now = f.Now(self.config_full)

                # Evenementen voor vandaag zoeken, met een beetje buffer terug in de tijd.
                results = calendar.date_search(now - timedelta(hours=2),
                                               now + timedelta(days=1))
                for vevent in results:
                    event = Event(client=client, url=vevent.url)
                    event.load()

                    # Oke.. in de documentatie niks over hoe hier een nette string van te maken
                    # En in het object zelf zit ook niet echt een functie daarvoor, los van __str()__
                    start = event.instance.vevent.dtstart.__str__()
                    summary = event.instance.vevent.summary.__str__()
                    # Zo kan het ook.
                    summary = summary.replace("<SUMMARY{}", "")[:-1]
                    # Dit komt binnen: <DTSTART{'X-VOBJ-ORIGINAL-TZID': ['Europe/Amsterdam']}
                    # Dus split op } en dan de eerste verwijderen, en het > teken achteraan verwijderen
                    start = parse(''.join(start.split("}")[1:])[:-1])

                    # Eerste event in deze agenda? Toon de agenda naam
                    if first:
                        # Niet de eerste agenda? Extra witregel
                        if not first_all:
                            self.text += "<br/>"

                        self.text += "<h3>" + calendar_name + "</h3>"
                        first = False
                        first_all = False

                    # Event samenvatting (tijd + omschijving) toevoegen aan de text
                    dt = "%A %H:%M"
                    if (calendar_name.lower().find("birthday") >= 0
                            or calendar_name.lower().find("verjaardag") >= 0):
                        dt = "%A"

                    self.text += "{0} {1}<br/>".format(start.strftime(dt),
                                                       summary)

        if not first_all:
            self.hasText = True
Ejemplo n.º 2
0
    def Run(self):
        now = f.Now(self.config_full)

        # Na 11u is het toch al te laat
        if now.hour < 11:
            # Dag van vandaag
            weekday = now.weekday()

            # Staat vandaag in de config file?
            if str(weekday) in self.config:
                self.hasText = True
                self.text = "Vandaag moet het " + \
                    self.config[str(weekday)] + " bij de weg"
Ejemplo n.º 3
0
    def Run(self):
        now = f.Now(self.config_full)

        with urllib.request.urlopen(self.config["url"]) as url:
            data = url.read()

        servers = json.loads(data)

        for server in servers:
            if not server in self.config["servers"]:
                continue

            ping = f.GetDateTimeWithTZ(self.config_full,
                                       (datetime.datetime.fromtimestamp(
                                           int(servers[server]["ping"]))))
            diffhour = ((now - ping).total_seconds() / 60 / 60)

            if (diffhour > int(self.config["servers"][server])):
                self.text += server + " is al " + \
                    str(round(diffhour, 2)) + " uur stil.<br />"
                self.hasText = True
Ejemplo n.º 4
0
        config = Config(user).GetConfig()
    except Exception as e:
        print("Error: de config van {0} is niet correct.".format(user))
        run = False
        pass

    if run:
        # Set de locale, voor de tijd functies (agenda) en de tijd van de cron
        if 'Locale' in config:
            locale.setlocale(locale.LC_TIME,
                             '{0}.UTF-8'.format(config["Locale"]))

        # Checken of je de notificatie dit uur wilt ontvangen?
        run = False
        if 'Tijd' in config:
            if f.Now(config).hour in config["Tijd"]:
                run = True

    if run:

        userdir = "data/{0}/".format(user)
        if not os.path.isdir(userdir):
            os.makedirs(userdir)

        # Config extenden met runtime variabelen
        with open('secrets/secrets.json') as secrets:
            config['Runtime'] = {
                "datadir": datadir,
                "userdir": userdir,
                "secrets": json.load(secrets),
                "production": prod,
Ejemplo n.º 5
0
    def Run(self):
        # Een textfile met de API-key. Met name om de key uit git te houden, en niet te hardcoden.
        apikey = self.config_full["Runtime"]["secrets"]["darksky_apikey"]

        temperatureKey = "temperature"
        if 'gevoel' in self.config:
            if self.config["gevoel"]:
                temperatureKey = "apparentTemperature"

        # Cache de API verzoeken in een map per dag.
        filename = "{0}/Weer{1}_{2}.json".format(self.config_full["Runtime"]["datadir"], str(
            self.config["lang"]), str(self.config["long"]))

        now = f.Now(self.config_full)

        # Alleen cachen op test verzoeken, ik blijf toch wel onder de max api calls
        if os.path.exists(filename) and not self.config_full["Runtime"]["production"]:
            data = open(filename).read()

        else:
            # Bouw de URL voor de API-call op en maak een weer object
            with urllib.request.urlopen("https://api.darksky.net/forecast/{0}/{1},{2}?units=si".format(apikey, str(self.config["lang"]), str(self.config["long"]))) as url:
                data = url.read()

            with open(filename, 'w') as outfile:
                json.dump(json.loads(data), outfile)

        weather = json.loads(data)

        # Weerbericht opbouwen op basis van voorkeurs tijden.
        if "tijden" in self.config:
            text_builder = ""

            weekday = now.weekday()

            # Wil je vandaag een voorspelling?
            if str(weekday) in self.config["tijden"]:

                # Stats voor het advies
                minTemp = 99
                maxTemp = -99
                maxRegen = 0

                # Voor elk uur de voorspelling opzoeken
                for data in weather["hourly"]["data"]:
                    hour = datetime.datetime.utcfromtimestamp(
                        data["time"]).hour
                    day = datetime.datetime.utcfromtimestamp(data["time"]).day

                    # Alleen de voorspelling van vandaag gebruiken
                    if day == now.day:
                        # Staat het uur in de gewenste tijden, en na het huidige uur?
                        if hour in self.config["tijden"][str(weekday)] and hour >= now.hour:
                            # Text opbouwen per tijd.
                            text_builder += "Om {0} uur is het {1}°".format(
                                hour, data[temperatureKey])
                            if (data["precipProbability"] >= 0.1):
                                perciptype = "regen"
                                if data["precipType"] == "snow":
                                    perciptype = "sneeuw"

                                text_builder += " met {0}% kans op {1}".format(
                                    round(data["precipProbability"]*100), perciptype)

                            if data[temperatureKey] < minTemp:
                                minTemp = data[temperatureKey]
                            if data[temperatureKey] > maxTemp:
                                maxTemp = data[temperatureKey]

                            if (data["precipProbability"] * 100) > maxRegen:
                                maxRegen = (data["precipProbability"] * 100)

                            text_builder += "<br/>"

                if text_builder != "":
                    # Advies opbouwen
                    advies = ""
                    if "advies" in self.config:
                        for key in self.config["advies"]:
                            if minTemp >= self.config["advies"][key]["min"] and maxTemp <= self.config["advies"][key]["max"] and maxRegen <= self.config["advies"][key]["regen"]:
                                advies = self.config["advies"][key]["advies"]
                                break

                    # Het instellen van advies op basis van parameters is een onmogelijke taak.
                    # Dus of heel veel in de config tweaken en super kleine advies sets maken, of nog iets in code verzinnen.
                    # We gaan het meemaken.. ok doei.
                    if advies != "":
                        text_builder += "Advies: " + advies

                    self.text = text_builder

                else:
                    self.hasText = False

            else:
                self.hasText = False

        else:
            # Standaard tekst
            self.text = u"Het is nu {0}° en het wordt vandaag tussen de {1}° en {2}°".format(
                weather["currently"][temperatureKey],
                weather["daily"]["data"][0]["temperatureLow"],
                weather["daily"]["data"][0]["temperatureHigh"])
Ejemplo n.º 6
0
    def Run(self):
        now = f.Now(self.config_full)
        dag = now.strftime("%A").lower()

        # Url checken en eventueel fixen zodat ik folder+file kan doen
        if self.config["folder"][-1:] != "/":
            self.config["folder"] += "/"

        if "weekly" in self.config:
            if self.config["weekly"][:1] == "/":
                self.config["weekly"] = self.config["weekly"][1:]

            weekly_url = self.config["folder"] + self.config["weekly"]

            weekly_url = weekly_url.replace("[year]", "[jaar]")
            weekly_url = weekly_url.replace("[week]",
                                            str(now.isocalendar()[1]))
            weekly_url = weekly_url.replace("[jaar]", str(now.year))

            response = requests.get(weekly_url)

            if response.status_code == 200:
                weekly = response.text

                # Zoek op ## Dag
                weeklyDagIndex = weekly.lower().find("## " + dag)
                # index = start van ## Dag t/m eof, GetBlock kapt hem op de volgende ## af
                weeklyDag = self.GetBlock(weekly[weeklyDagIndex:])

                # Filter alle uitgevoerde taken
                weeklyDag = self.FilterDone(weeklyDag)

                # Openstaande punten uit vorige dagen
                laatsteDag = ""
                firstDag = True
                histText = ""
                # DagIndex = index van vandaag, alles daarvoor is al geweest, dus scannen op gemist.
                for regel in weekly[:weeklyDagIndex].split("\n"):
                    if regel.find(
                            "## "
                    ) >= 0:  # Dag onthouden om in het bericht te zetten
                        laatsteDag = regel
                        firstDag = True
                    if regel.find("[ ]") >= 0:
                        if firstDag:
                            histText += laatsteDag + "\n"
                            firstDag = False

                        histText += regel + "\n"

                histText = histText.rstrip()

                # Openstaande punten in de algemene ## TODO
                # .find = start van ## todo t/m eof, GetBlock kapt hem op de volgende ## af
                weeklyTodo = self.GetBlock(
                    weekly[weekly.lower().find("## todo"):])

                # Todo tekst opbouwen, alleen openstaande vinkjes
                todoText = self.FilterDone(weeklyTodo)

                # *# Tekst opbouwen

                # Gemiste punten van deze week toevoegen
                if histText != "":
                    self.hasText = True
                    self.text += histText + "\n\n"

                # Alle punten van vandaag toevoegen, indien er minimaal 1 openstaande is.
                if weeklyDag.find("[ ]") > 0:
                    self.hasText = True
                    self.text += weeklyDag + "\n\n"

                # Open algemene TODO toevoegen
                if todoText.find("[ ]") > 0:
                    self.hasText = True
                    self.text += todoText + "\n\n"

            # Omzetten naar HTML gezien main dat verwacht.
            self.text = f.plain2hml(self.text).rstrip()