#!/bin/env python # vim:fileencoding=utf-8:ft=python # Geburtstage der nächsten Tage ausgeben # import re, datetime, os, getopt, sys # Einstellungen laden try: options = getopt.getopt(sys.argv[1:], "cgf:s:p:") settings = dict(options[0]) if "-f" in settings: gebFile = settings["-f"] else: gebFile = os.path.expanduser("~/Textdateien/Geburtstage") if not os.access(gebFile, os.F_OK): raise 1 if "-s" in settings: waitTime = int(settings["-s"]) * 1000 else: waitTime = 4000 except: try: noGTK = "" import gtk, gobject except: noGTK = " (Da kein pyGTK installiert ist, ist dies Standard)\n" print ("Geburtstage anzeigen\n" "Syntax:\n" " geburtstag [-g] [-c] [-f ] [-s ] [-p ]\n" " -g Nur Text, kein GTK-Frontend\n%s" " -f Diese Datei statt ~/Textdateien/Geburtstage verwenden\n" " -p Geburtstag von ausgeben\n" " -s Das Fenster nach n Sekunden automatisch schließen (Standard: 4)\n" " -c Fenster zentrieren\n\n" "Aufbau der Geburtstagsdatei:\n" " \\t\\tdd.mm.yyyy\\n\t(\\t == Tabulator, \\n == Zeilenumbruch)\n" " Hans Peter 31.03.1988\n\n") % noGTK sys.exit(1) # Geburtstage einlesen gebDates = dict([ re.split("\t+", st.strip(), 2) for st in open(gebFile).readlines() ]) # Geburtstage finden gebSoon = [] for name in gebDates.keys(): dmy = [ int(x) for x in gebDates[name].split(".", 3) ] date = apply(datetime.date, list(reversed(dmy))) daysTillBd = (date - datetime.date.today().replace(year=dmy[2])).days % 360 age = int(((datetime.date.today() - date).days + daysTillBd) / 360) if "-p" in settings: if name.lower().find(settings["-p"].lower()) > -1: gebSoon.append({ "name": name, "days": daysTillBd, "date": gebDates[name], "age": age }) elif daysTillBd < 8: gebSoon.append({ "name": name, "days": daysTillBd, "date": gebDates[name], "age": age }) gebSoon = sorted(gebSoon, key=lambda x: x["days"]) if len(gebSoon) == 0: sys.exit(0) try: assert "-g" not in settings assert "-p" not in settings import gtk, gobject except: # Kein GTK vorhanden for geb in gebSoon: print "· %s (%d Tage, %s, %s Jahre)" % (geb["name"], geb["days"], geb["date"], geb["age"]) sys.exit(0) # GTK Fenster erstellen gebWindow = gtk.Window() gebWindow.stick() gebWindow.set_accept_focus(False) gebWindow.set_title("Geburtstage") gebWindow.set_size_request(320, 10 + 15 * len(gebSoon)) gebWindow.set_resizable(False) width, height = gebWindow.get_size() if "-c" in settings: gebWindow.move((gtk.gdk.screen_width() - width) / 2, (gtk.gdk.screen_height() - height) / 2) else: gebWindow.set_decorated(gtk.gdk.DECOR_ALL & (not gtk.gdk.DECOR_TITLE)) gebWindow.set_gravity(gtk.gdk.GRAVITY_SOUTH_EAST) gebWindow.move(gtk.gdk.screen_width() - width, gtk.gdk.screen_height() - height) gebText = gtk.TextView() gebText.set_sensitive(False) gebText.set_border_width(5) gebText.set_editable(False) gebWindow.add(gebText) gebBuffer = gebText.get_buffer() bold = gtk.TextTag("bold") bold.set_property("weight", 900) gebBuffer.get_tag_table().add(bold) red = gtk.TextTag("red") red.set_property("foreground", "#ff0000") gebBuffer.get_tag_table().add(red) for geb in gebSoon: gebBuffer.insert_with_tags_by_name(gebBuffer.get_end_iter(), "· ", "bold") if geb["days"] == 0: gebBuffer.insert_with_tags_by_name(gebBuffer.get_end_iter(), geb["name"], "bold", "red") elif geb["days"] < 2: gebBuffer.insert_with_tags_by_name(gebBuffer.get_end_iter(), geb["name"], "bold") else: gebBuffer.insert_with_tags_by_name(gebBuffer.get_end_iter(), geb["name"]) gebBuffer.insert(gebBuffer.get_end_iter(), " (%d Tage, %s, %s Jahre)\n" % (geb["days"], geb["date"], geb["age"])) gebWindow.connect("hide", lambda x: gtk.main_quit()) gobject.timeout_add(waitTime, lambda: gebWindow.hide()) gebWindow.set_focus(None) gebWindow.show_all() gtk.main()