Add basic support for scheduled statuses

This commit is contained in:
Lorenz Diener 2019-04-28 18:37:15 +02:00
pare 08ba4c88bf
commit 09f9023c70

Veure arxiu

@ -179,6 +179,7 @@ class Mastodon:
__DICT_VERSION_PUSH_NOTIF = "2.4.0" __DICT_VERSION_PUSH_NOTIF = "2.4.0"
__DICT_VERSION_FILTER = "2.4.3" __DICT_VERSION_FILTER = "2.4.3"
__DICT_VERSION_CONVERSATION = bigger_version(bigger_version("2.6.0", __DICT_VERSION_ACCOUNT), __DICT_VERSION_STATUS) __DICT_VERSION_CONVERSATION = bigger_version(bigger_version("2.6.0", __DICT_VERSION_ACCOUNT), __DICT_VERSION_STATUS)
__DICT_VERSION_SCHEDULED_STATUS = bigger_version("2.7.0", __DICT_VERSION_STATUS)
### ###
# Registering apps # Registering apps
@ -1300,10 +1301,11 @@ class Mastodon:
### ###
# Writing data: Statuses # Writing data: Statuses
### ###
@api_version("1.0.0", "2.4.3", __DICT_VERSION_STATUS) @api_version("1.0.0", "2.7.0", __DICT_VERSION_STATUS)
def status_post(self, status, in_reply_to_id=None, media_ids=None, def status_post(self, status, in_reply_to_id=None, media_ids=None,
sensitive=False, visibility=None, spoiler_text=None, sensitive=False, visibility=None, spoiler_text=None,
language=None, idempotency_key=None, content_type=None): language=None, idempotency_key=None, content_type=None,
scheduled_at=None):
""" """
Post a status. Can optionally be in reply to another status and contain Post a status. Can optionally be in reply to another status and contain
media. media.
@ -1341,7 +1343,11 @@ class Mastodon:
if you call it with the same `idempotency_key`, only one status will if you call it with the same `idempotency_key`, only one status will
be created. be created.
Specify 'content_type' to set the content type of your post on Pleroma. Pass a datetime as `scheduled_at` to schedule the toot for a specific time
(the time must be at least 5 minutes into the future). If this is passed,
status_post returns a `scheduled toot dict`_ instead.
Specify `content_type` to set the content type of your post on Pleroma.
It accepts 'text/plain' (default), 'text/markdown', and 'text/html'. It accepts 'text/plain' (default), 'text/markdown', and 'text/html'.
This parameter is not supported on Mastodon servers, but will be This parameter is not supported on Mastodon servers, but will be
safely ignored if set. safely ignored if set.
@ -1351,6 +1357,9 @@ class Mastodon:
if in_reply_to_id != None: if in_reply_to_id != None:
in_reply_to_id = self.__unpack_id(in_reply_to_id) in_reply_to_id = self.__unpack_id(in_reply_to_id)
if scheduled_at != None:
scheduled_at = scheduled_at.isoformat()
params_initial = locals() params_initial = locals()
# Validate visibility parameter # Validate visibility parameter
@ -1395,7 +1404,7 @@ class Mastodon:
params = self.__generate_params(params_initial, ['idempotency_key']) params = self.__generate_params(params_initial, ['idempotency_key'])
return self.__api_request('POST', '/api/v1/statuses', params, headers = headers) return self.__api_request('POST', '/api/v1/statuses', params, headers = headers)
@api_version("1.0.0", "2.4.3", __DICT_VERSION_STATUS) @api_version("1.0.0", "2.7.0", __DICT_VERSION_STATUS)
def toot(self, status): def toot(self, status):
""" """
Synonym for `status_post()`_ that only takes the status text as input. Synonym for `status_post()`_ that only takes the status text as input.
@ -1406,9 +1415,10 @@ class Mastodon:
""" """
return self.status_post(status) return self.status_post(status)
@api_version("1.0.0", "2.4.3", __DICT_VERSION_STATUS) @api_version("1.0.0", "2.7.0", __DICT_VERSION_STATUS)
def status_reply(self, to_status, status, media_ids=None, sensitive=False, visibility=None, def status_reply(self, to_status, status, media_ids=None, sensitive=False, visibility=None,
spoiler_text=None, language=None, idempotency_key=None, untag=False): spoiler_text=None, language=None, idempotency_key=None, content_type=None,
scheduled_at=None, untag=False):
""" """
Helper function - acts like status_post, but prepends the name of all Helper function - acts like status_post, but prepends the name of all
the users that are being replied to to the status text and retains the users that are being replied to to the status text and retains
@ -1440,7 +1450,8 @@ class Mastodon:
return self.status_post(status, in_reply_to_id = to_status.id, media_ids = media_ids, sensitive = sensitive, return self.status_post(status, in_reply_to_id = to_status.id, media_ids = media_ids, sensitive = sensitive,
visibility = visibility, spoiler_text = spoiler_text, language = language, visibility = visibility, spoiler_text = spoiler_text, language = language,
idempotency_key = idempotency_key) idempotency_key = idempotency_key, content_type = content_type,
scheduled_at = scheduled_at)
@api_version("1.0.0", "1.0.0", "1.0.0") @api_version("1.0.0", "1.0.0", "1.0.0")
def status_delete(self, id): def status_delete(self, id):
@ -1539,6 +1550,17 @@ class Mastodon:
url = '/api/v1/statuses/{0}/unpin'.format(str(id)) url = '/api/v1/statuses/{0}/unpin'.format(str(id))
return self.__api_request('POST', url) return self.__api_request('POST', url)
###
# Writing data: Scheduled statuses
###
@api_version("2.7.0", "2.7.0", __DICT_VERSION_SCHEDULED_STATUS)
def update_scheduled_status(self, id, scheduled_at):
scheduled_at = scheduled_at.isoformat()
id = self.__unpack_id(id)
self.__generate_params(locals(), ['id'])
url = '/api/v1/scheduled_statuses/{0}'.format(str(id))
return self.__api_request('PUT', url, params)
### ###
# Writing data: Notifications # Writing data: Notifications
### ###
@ -2303,7 +2325,7 @@ class Mastodon:
""" """
Parse dates in certain known json fields, if possible. Parse dates in certain known json fields, if possible.
""" """
known_date_fields = ["created_at", "week", "day", "expires_at"] known_date_fields = ["created_at", "week", "day", "expires_at", "scheduled_at"]
for k, v in json_object.items(): for k, v in json_object.items():
if k in known_date_fields: if k in known_date_fields:
if v != None: if v != None: