Yessiest
2 years ago
commit
9381e246ce
2 changed files with 198 additions and 0 deletions
@ -0,0 +1,7 @@ |
|||
# decal - a simple calendar with caldav events |
|||
|
|||
# Dependencies |
|||
``` |
|||
pip install caldav |
|||
``` |
|||
|
@ -0,0 +1,191 @@ |
|||
#!/usr/bin/python |
|||
import configparser |
|||
import datetime |
|||
import calendar |
|||
import caldav |
|||
import argparse |
|||
import os |
|||
import json |
|||
import re |
|||
config = configparser.ConfigParser() |
|||
Version = "%(prog)s 0.1" |
|||
configpath = os.getenv("HOME")+"/.config/decal.conf" |
|||
config.read(configpath) |
|||
#define arguments |
|||
today = datetime.date.today() |
|||
parser = argparse.ArgumentParser(description="Cal with events.") |
|||
parser.add_argument("year", |
|||
action="store", |
|||
default=today.year, |
|||
nargs="?", |
|||
type=int) |
|||
parser.add_argument("month", |
|||
action="store", |
|||
default=today.month, |
|||
nargs="?", |
|||
type=int) |
|||
parser.add_argument("day", |
|||
action="store", |
|||
default=today.day, |
|||
nargs="?", |
|||
type=int) |
|||
parser.add_argument("-v", "--version", |
|||
action="version", |
|||
version=Version, |
|||
help="Display the version of the program") |
|||
parser.add_argument("--json", |
|||
action="store_true", |
|||
help="Dump events output to json") |
|||
parser.add_argument("--create", |
|||
action="store_true", |
|||
help="Create a new event") |
|||
parser.add_argument("--calendar", |
|||
action="append", |
|||
help="Specify a calendar (or multiple calendars) to sync from") |
|||
parser.add_argument("-1", |
|||
action="store_true", |
|||
help="show only a single month (default)") |
|||
parser.add_argument("-3", |
|||
action="store_true", |
|||
help="show three months spanning the date") |
|||
parser.add_argument("-y", |
|||
action="store_true", |
|||
help="show the whole year") |
|||
parser.add_argument("-n", |
|||
action="store_const", |
|||
const=int, |
|||
help="show n months") |
|||
|
|||
args = vars(parser.parse_args()) |
|||
|
|||
#check some stuff, do some warnings, initiate the config, etc. |
|||
if not os.path.exists(configpath): |
|||
config['DEFAULT'] = {'uri': 'your caldap server here', |
|||
'user': 'your username here', |
|||
'password': 'your pass here'} |
|||
print("Creating an empty config in ~/.config/decal.conf") |
|||
with open(configpath,'w') as configfile: |
|||
config.write(configfile) |
|||
configfile.close() |
|||
print("To properly utilize decal, please fill out the fields in the config") |
|||
exit(1) |
|||
|
|||
for arg in ("user","password","uri"): |
|||
if not arg in config['DEFAULT']: |
|||
print("The config is incomplete, please check the \""+arg+"\" field") |
|||
exit(1) |
|||
|
|||
if config['DEFAULT']['uri'] == "your caldap server here": |
|||
print("To properly utilize decal, please fill out the fields in the config") |
|||
exit(1) |
|||
|
|||
#actual works begins here |
|||
|
|||
#generate the actual calendar, line by line, output an array of lines. |
|||
#it works trust me, idk what is happening in this one but it works. |
|||
def gencal(year,month,start_on_sunday=True,cell_modifier=lambda d: d,append_year=True): |
|||
firstweekday = 0 |
|||
if start_on_sunday: |
|||
firstweekday = 6 |
|||
cal = calendar.Calendar(firstweekday=firstweekday) |
|||
lines = [""]*6 |
|||
monthstart = False |
|||
counter = 0 |
|||
for date in cal.itermonthdates(year,month): |
|||
lines[counter//7] |
|||
day = str(date)[-2:] |
|||
if day == "01": |
|||
monthstart = not monthstart |
|||
if monthstart: |
|||
lines[counter//7] += cell_modifier(day) |
|||
else: |
|||
lines[counter//7] += " " |
|||
lines[counter//7] +=" " |
|||
counter+=1 |
|||
month = datetime.date(year,month,1).strftime("%B %Y") |
|||
padding = (len(lines[0])-len(month))//2 |
|||
rpadding = len(lines[0])%(padding+len(month)+padding) |
|||
if start_on_sunday: |
|||
lines.insert(0,"Su Mo Tu We Th Fr Sa ") |
|||
else: |
|||
lines.insert(0,"Mo Tu We Th Fr Sa Su ") |
|||
lines.insert(0,(" "*padding)+month+(" "*(padding+rpadding))) |
|||
lines[-1] += " "*(21-len(lines[-1])) |
|||
return lines |
|||
|
|||
color_names = { |
|||
"red":"0;31", |
|||
"green":"0;32", |
|||
"brown":"0;33", |
|||
"orange":"0;33", |
|||
"blue":"0;34", |
|||
"purple":"0;35", |
|||
"cyan":"0;36", |
|||
"yellow":"1;33", |
|||
"white":"1;37", |
|||
"blink":"5", |
|||
"bold":"1", |
|||
"italic":"3", |
|||
"underline":"4", |
|||
"inverse":"7", |
|||
"strikethrough":"9", |
|||
"light red":"1;31", |
|||
"light green":"1;32", |
|||
"light blue":"1;34", |
|||
"light purple":"1;36", |
|||
"light cyan":"0;37" |
|||
} |
|||
def colorize(text,color): |
|||
if color in color_names: |
|||
return "\033["+color_names[color]+"m"+text+"\033[0m" |
|||
elif re.match("(\d{1,3}),(\d{1,3}),(\d{1,3})",color): |
|||
color = "\\"+re.sub("(\d{1,3}),(\d{1,3}),(\d{1,3})","38;2;\\1;\\2;\\3m",color) |
|||
|
|||
return color+text+"\033[0m" |
|||
|
|||
def span(year,month,offset): |
|||
return year+((month+offset-1)//12),((month+offset-1)%12)+1 |
|||
|
|||
def getbounds(y,m,offset): |
|||
start = datetime.date(y,m,1) |
|||
postnextmonth = span(y,m,offset) |
|||
nextmonth = span(postnextmonth[0],postnextmonth[1],-1) |
|||
end = datetime.date(nextmonth[0], |
|||
nextmonth[1], |
|||
(datetime.date(postnextmonth[0],postnextmonth[1],1)-datetime.timedelta(days=1)).day) |
|||
return start,end |
|||
|
|||
start = None |
|||
end = None |
|||
if args["1"]: |
|||
start,end = getbounds(args["year"],args["month"],1) |
|||
elif args["3"]: |
|||
y,m = span(args["year"],args["month"],-1) |
|||
start,end = getbounds(y,m,3) |
|||
elif args["n"]: |
|||
start,end = getbounds(args["year"],args["month"],args["n"]) |
|||
else: |
|||
start,end = getbounds(args["year"],args["month"],1) |
|||
|
|||
client = caldav.DAVClient(url = config['DEFAULT']['uri'], |
|||
username = config['DEFAULT']['user'], |
|||
password = config['DEFAULT']['password']) |
|||
principal = client.principal() |
|||
calendars = principal.calendars() |
|||
if "calendar" in config['DEFAULT']: |
|||
calendars2 = [] |
|||
cals = config['DEFAULT']["calendar"].split(",") |
|||
for cal in calendars: |
|||
if cal.name in cal: |
|||
calendars2.append(cal) |
|||
calendars = calendars2 |
|||
|
|||
|
|||
events = [] |
|||
for calendar in calendars: |
|||
events_fetched = calendar.date_search(start,end) |
|||
for event in events_fetched: |
|||
if not event in events: |
|||
events.append(event) |
|||
|
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue