From 1c826de338f80fd07cfec82deca3611a20f66788 Mon Sep 17 00:00:00 2001 From: velesey Date: Sun, 27 Dec 2020 00:06:39 +0600 Subject: [PATCH 1/3] filter None reminders --- remind.py | 1 + 1 file changed, 1 insertion(+) diff --git a/remind.py b/remind.py index e172ab2..2cb81c3 100644 --- a/remind.py +++ b/remind.py @@ -85,6 +85,7 @@ def invoke_operation(args): print('argument to list command must be positive') return reminders = client.list_reminders(num_reminders=num_reminders) + reminders = filter(None, reminders) if reminders is not None: for r in sorted(reminders): print(r) From 3d852747448dbe59bd035ca312052371512bd96c Mon Sep 17 00:00:00 2001 From: velesey Date: Sun, 27 Dec 2020 22:45:40 +0600 Subject: [PATCH 2/3] reminders can be with empty time --- reminders_client_utils.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/reminders_client_utils.py b/reminders_client_utils.py index 0dcfffd..c93035d 100644 --- a/reminders_client_utils.py +++ b/reminders_client_utils.py @@ -122,9 +122,15 @@ def build_reminder(reminder_dict: dict) -> Optional[Reminder]: year = r['5']['1'] month = r['5']['2'] day = r['5']['3'] - hour = r['5']['4']['1'] - minute = r['5']['4']['2'] - second = r['5']['4']['3'] + if '4' in r['5']: + hour = r['5']['4']['1'] + minute = r['5']['4']['2'] + second = r['5']['4']['3'] + else: + hour = 0 + minute = 0 + second = 0 + creation_timestamp_msec = int(r['18']) done = '8' in r and r['8'] == 1 From cd473f05b57aadd11bc8894f2087710112741f0e Mon Sep 17 00:00:00 2001 From: velesey Date: Mon, 28 Dec 2020 15:59:06 +0600 Subject: [PATCH 3/3] Update reminders --- reminder.py | 2 ++ reminders_client.py | 22 ++++++++++-- reminders_client_utils.py | 70 ++++++++++++++++++++++++++++++++++----- 3 files changed, 83 insertions(+), 11 deletions(-) diff --git a/reminder.py b/reminder.py index 48e2f26..91d5294 100644 --- a/reminder.py +++ b/reminder.py @@ -18,7 +18,9 @@ class Reminder: title: str dt: datetime creation_timestamp_msec: Optional[int] = None + done_timestamp_msec: Optional[int] = None done: bool = False + all_day: bool = False def __repr_title(self): """ diff --git a/reminders_client.py b/reminders_client.py index 352f0a6..196f246 100644 --- a/reminders_client.py +++ b/reminders_client.py @@ -8,7 +8,8 @@ 'create': 'https://reminders-pa.clients6.google.com/v1internalOP/reminders/create', 'delete': 'https://reminders-pa.clients6.google.com/v1internalOP/reminders/delete', 'get': 'https://reminders-pa.clients6.google.com/v1internalOP/reminders/get', - 'list': 'https://reminders-pa.clients6.google.com/v1internalOP/reminders/list' + 'list': 'https://reminders-pa.clients6.google.com/v1internalOP/reminders/list', + 'update': 'https://reminders-pa.clients6.google.com/v1internalOP/reminders/update' } HEADERS = { @@ -44,7 +45,24 @@ def create_reminder(self, reminder: Reminder) -> bool: else: self._report_error(response, content, 'create_reminder') return False - + + def update_reminder(self, reminder: Reminder) -> bool: + """ + send a 'update reminder' request. + returns True upon a successful update of a reminder + """ + response, content = self.auth_http.request( + uri=URIs['update'], + method='POST', + body=client_utils.update_req_body(reminder), + headers=HEADERS, + ) + if response.status == HTTP_OK: + return True + else: + self._report_error(response, content, 'update_reminder') + return False + def get_reminder(self, reminder_id: str) -> Optional[Reminder]: """ retrieve information about the reminder with the given id. None if an diff --git a/reminders_client_utils.py b/reminders_client_utils.py index c93035d..d9ca536 100644 --- a/reminders_client_utils.py +++ b/reminders_client_utils.py @@ -73,6 +73,45 @@ def create_req_body(reminder: Reminder) -> str: return json.dumps(body) +def update_req_body(reminder: Reminder) -> str: + """ + returns the body of a update-reminder request + """ + body = { + '2': { + '2': reminder.id + }, + '4': { + '1': { + '2': reminder.id + }, + '3': reminder.title, + '5': { + '1': reminder.dt.year, + '2': reminder.dt.month, + '3': reminder.dt.day, + '4': { + '1': reminder.dt.hour, + '2': reminder.dt.minute, + '3': reminder.dt.second, + }, + '9': 1 if reminder.all_day else 0, + }, + '8': 1 if reminder.done else 0, + '11': str(int(datetime.utcnow().timestamp() * 1000)), + '18': str(reminder.creation_timestamp_msec) + }, + '7': { + '1': [ + 0, + 1, + 3, + 10, + ]}, + } + return json.dumps(body) + + def get_req_body(reminder_id: str) -> str: """ returns the body of a get-reminder request @@ -119,29 +158,42 @@ def build_reminder(reminder_dict: dict) -> Optional[Reminder]: try: id = r['1']['2'] title = r['3'] - year = r['5']['1'] - month = r['5']['2'] - day = r['5']['3'] - if '4' in r['5']: - hour = r['5']['4']['1'] - minute = r['5']['4']['2'] - second = r['5']['4']['3'] + if '5' in r: + year = r['5']['1'] + month = r['5']['2'] + day = r['5']['3'] + if '4' in r['5']: + hour = r['5']['4']['1'] + minute = r['5']['4']['2'] + second = r['5']['4']['3'] + else: + hour = 0 + minute = 0 + second = 0 + all_day = '9' in r['5'] and r['5']['9'] == 1 else: + now = datetime.now() + year = now.year + month = now.month + day = now.day hour = 0 minute = 0 second = 0 creation_timestamp_msec = int(r['18']) + done_timestamp_msec = int(r['11']) if '11' in r else None done = '8' in r and r['8'] == 1 - + return Reminder( id=id, title=title, dt=datetime(year, month, day, hour, minute, second), creation_timestamp_msec=creation_timestamp_msec, + done_timestamp_msec=done_timestamp_msec, done=done, + all_day = all_day ) - + except KeyError: print('build_reminder failed: unrecognized reminder dictionary format') return None