From 33b1bf8497f6d7866010bfa8ff6d4d5b3b5c2b34 Mon Sep 17 00:00:00 2001 From: Graeme Porteous Date: Mon, 9 Oct 2023 13:24:58 +0100 Subject: [PATCH 1/3] Add optional response arg for get_events Useful for retrieving events without a response. --- spond/spond.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spond/spond.py b/spond/spond.py index d342f3e..e1ad893 100644 --- a/spond/spond.py +++ b/spond/spond.py @@ -214,6 +214,7 @@ async def get_events( self, group_id: Optional[str] = None, include_scheduled: bool = False, + response: Optional[str] = None, max_end: Optional[datetime] = None, min_end: Optional[datetime] = None, max_start: Optional[datetime] = None, @@ -233,6 +234,9 @@ async def get_events( (TO DO: probably events for which invites haven't been sent yet?) Defaults to False for performance reasons. Uses `scheduled` API parameter. + response : str, optional + Only include events which this response. Valid known options are: + `unanswered`, there may be more. max_end : datetime, optional Only include events which end before or at this datetime. Uses `maxEndTimestamp` API parameter; relates to `endTimestamp` event @@ -276,6 +280,8 @@ async def get_events( url += f"&minStartTimestamp={min_start.strftime('%Y-%m-%dT00:00:00.000Z')}" if group_id: url += f"&groupId={group_id}" + if response: + url += f"&response={response}" async with self.clientsession.get(url, headers=self.auth_headers) as r: self.events = await r.json() From 73298db214df8abb051749748a49a3fade05ab8d Mon Sep 17 00:00:00 2001 From: Graeme Porteous Date: Mon, 9 Oct 2023 13:25:38 +0100 Subject: [PATCH 2/3] Add method to retrieve profile endpoint Return details of the user currently logged in. --- spond/spond.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/spond/spond.py b/spond/spond.py index e1ad893..0b6a065 100644 --- a/spond/spond.py +++ b/spond/spond.py @@ -15,6 +15,7 @@ def __init__(self, username, password): self.chat_url = None self.auth = None self.token = None + self.profile = None self.groups = None self.events = None @@ -43,6 +44,22 @@ async def login(self): self.chat_url = result["url"] self.auth = result["auth"] + async def get_profile(self): + """ + Get the current users profile. + Subject to authenticated user's access. + + Returns + ------- + json response of the current user + """ + if not self.token: + await self.login() + url = f"{self.api_url}profile" + async with self.clientsession.get(url, headers=self.auth_headers) as r: + self.profile = await r.json() + return self.profile + async def get_groups(self): """ Get all groups. From a2547eb56fa6fc15f04e4c244a0cddbdeb8edcd7 Mon Sep 17 00:00:00 2001 From: Graeme Porteous Date: Mon, 9 Oct 2023 13:26:26 +0100 Subject: [PATCH 3/3] Add ability to respond to event invites ``` s = spond.Spond(username=username, password=password) events = await s.get_events(response="unanswered") await s.update_event_response(event[0]["id"], accepted=True) await s.clientsession.close() ``` --- spond/spond.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/spond/spond.py b/spond/spond.py index 0b6a065..a60b556 100644 --- a/spond/spond.py +++ b/spond/spond.py @@ -403,3 +403,47 @@ async def update_event(self, uid, updates: dict): async with self.clientsession.post(url, json=data, headers=headers) as r: self.events_update = await r.json() return self.events + + async def update_event_response( + self, + uid, + accepted: bool = True, + ) -> List[dict]: + """ + Respond to an event invite. + + Parameters: + ---------- + uid : str + UID of the event. + accepted : bool + Accept invite to an event. + + Returns: + ---------- + json results of put command, containing: + `acceptedIds`, + `unconfirmedIds`, + `waitinglistIds`, + `votes` + """ + if not self.token: + await self.login() + profile = await self.get_profile() + event = await self.get_event(uid) + + membershipId = None + members = event["recipients"]["group"]["members"] + for m in members: + if m["profile"]["id"] == profile["id"]: + membershipId = m["id"] + break + + if membershipId == None: + raise ValueError("You don't seem to be a member of the event's group") + + url = f"{self.api_url}sponds/{uid}/responses/{membershipId}" + + data = {"accepted": accepted} + r = await self.clientsession.put(url, json=data, headers=self.auth_headers) + return await r.json()