11import os
22import sys
3- import datetime
3+ from datetime import datetime , timedelta , timezone
44import traceback
55import hashlib
6+ from typing import Iterable
7+ import human
68import ics
79import json
810
1214FRESH = os .path .expanduser ('~/.cache/calendar/fresh/{}' )
1315CONFIG = os .path .expanduser ('~/.config/calendar/config' )
1416
15- def _range ( now , begin , end ) :
17+ def _range ( now : datetime , begin : datetime , end : datetime ) :
1618
17- if end - begin < datetime . timedelta (1 ) :
19+ if end - begin < timedelta (days = 1 ) :
1820 hour = True
19- elif begin .to ( ' utc' ).time ().minute != end .to ( ' utc' ).time ().minute :
21+ elif begin .replace ( tzinfo = timezone . utc ).time ().minute != end .replace ( tzinfo = timezone . utc ).time ().minute :
2022 hour = True
21- elif begin .to ( ' utc' ).time ().second != end .to ( ' utc' ).time ().second :
23+ elif begin .replace ( tzinfo = timezone . utc ).time ().second != end .replace ( tzinfo = timezone . utc ).time ().second :
2224 hour = True
23- elif begin .to ( ' utc' ).time ().hour in [ 22 , 23 , 0 ] and end .to ( ' utc' ).time ().hour in [ 22 , 23 , 0 ] :
25+ elif begin .replace ( tzinfo = timezone . utc ).time ().hour in ( 22 , 23 , 0 ) and end .replace ( tzinfo = timezone . utc ).time ().hour in ( 22 , 23 , 0 ) :
2426 hour = False
2527 else :
2628 hour = True
2729
2830 if hour :
2931
30- bf = 'YYYY, MMM DD, HH:mm '
32+ bf = '%Y, %b %d, %H:%M '
3133 if begin .year == now .year :
3234 if begin .month == now .month :
3335 if begin .day == now .day :
34- bf = 'HH:mm '
36+ bf = '%H:%M '
3537 else :
36- bf = 'ddd DD, HH:mm '
38+ bf = '%a %d, %H:%M '
3739 else :
38- bf = 'MMM DD, HH:mm '
40+ bf = '%b %d, %H:%M '
3941
40- ef = 'YYYY, MMM DD, HH:mm '
42+ ef = '%Y, %b %d, %H:%M '
4143 if end .year == begin .year :
4244 if end .month == begin .month :
4345 if end .day == begin .day :
44- ef = 'HH:mm '
46+ ef = '%H:%M '
4547 else :
46- ef = 'DD, HH:mm '
48+ ef = '%d, %H:%M '
4749 else :
48- ef = 'MMM DD, HH:mm '
50+ ef = '%b %d, %H:%M '
4951
5052 else :
5153
52- bf = 'YYYY, MMM DD '
54+ bf = '%Y, %b %d '
5355 if begin .year == now .year :
5456 if begin .month == now .month :
5557 if begin .day == now .day :
56- bf = 'HH:mm '
58+ bf = '%H:%M '
5759 else :
58- bf = 'ddd DD '
60+ bf = '%a %d '
5961 else :
60- bf = 'MMM DD '
62+ bf = '%b %d '
6163
62- ef = 'YYYY, MMM DD '
63- if end - begin < datetime . timedelta (365 ) :
64+ ef = '%Y, %b %d '
65+ if end - begin < timedelta (days = 365 ) :
6466 if end .month == begin .month :
65- ef = 'DD '
67+ ef = '%d '
6668 else :
67- ef = 'MMM DD '
69+ ef = '%b %d '
6870
69- return begin .format ( bf ) + ' - ' + end .format ( ef )
71+ return begin .strftime ( bf ) + ' - ' + end .strftime ( ef )
7072
7173def calendars ( config = CONFIG ) :
7274 with open (config , 'r' ) as fd :
@@ -130,7 +132,7 @@ def dropalarms(string):
130132 return '\n ' .join (_dropalarms (string ))
131133
132134
133- def main ( now , events ) :
135+ def main ( now : datetime , events : Iterable [ ics . Event ] ) :
134136
135137 _fresh = list (filter (lambda x : x .end >= now , events ))
136138 _future = filter (lambda x : x .begin >= now , _fresh )
@@ -153,13 +155,13 @@ def main ( now , events ) :
153155 return _current if _next is None or _next .begin >= _current .end else _next
154156
155157
156- def event_to_i3_status_object ( now , event ) :
158+ def event_to_i3_status_object ( now : datetime , event : ics . Event ) :
157159
158160 name = event .name
159161 location = event .location
160162 short_location = location .split (',' )[0 ] if location else None
161- begin = event .begin .to ( 'local' )
162- end = event .end .to ( 'local' )
163+ begin = event .begin .datetime . astimezone ( )
164+ end = event .end .datetime . astimezone ( )
163165
164166 # event format
165167 ef = '{name}'
@@ -173,8 +175,8 @@ def event_to_i3_status_object ( now , event ) :
173175
174176 full_text = ef .format (
175177 range = _range ( now , begin , end ) ,
176- hbegin = begin . humanize ( ),
177- hend = end . humanize ( ) ,
178+ hbegin = human . datetime ( begin ),
179+ hend = human . datetime ( end ) ,
178180 name = name ,
179181 location = location
180182 )
@@ -184,8 +186,8 @@ def event_to_i3_status_object ( now , event ) :
184186
185187 short_text = ef .format (
186188 range = _range ( now , begin , end ) ,
187- hbegin = begin . humanize ( ),
188- hend = end . humanize ( ) ,
189+ hbegin = human . datetime ( begin ),
190+ hend = human . datetime ( end ) ,
189191 name = (name [:47 ] + '..' ) if len (name ) > 49 else name ,
190192 location = short_location
191193 )
0 commit comments