Convert durations to timedeltas
On: - AudioAttachment.duration - VideoAttachment.duration - Client.onCallEnded call_duration argument - Client.muteThread mute_time argument
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import datetime
|
||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
import requests
|
import requests
|
||||||
@@ -2109,15 +2110,19 @@ class Client:
|
|||||||
j = self._payload_post("/ajax/mercury/delete_messages.php?dpr=1", data)
|
j = self._payload_post("/ajax/mercury/delete_messages.php?dpr=1", data)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def muteThread(self, mute_time=-1, thread_id=None):
|
def muteThread(self, mute_time=None, thread_id=None):
|
||||||
"""Mute thread.
|
"""Mute thread.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
mute_time: Mute time in seconds, leave blank to mute forever
|
mute_time (datetime.timedelta): Time to mute, use ``None`` to mute forever
|
||||||
thread_id: User/Group ID to mute. See :ref:`intro_threads`
|
thread_id: User/Group ID to mute. See :ref:`intro_threads`
|
||||||
"""
|
"""
|
||||||
thread_id, thread_type = self._getThread(thread_id, None)
|
thread_id, thread_type = self._getThread(thread_id, None)
|
||||||
data = {"mute_settings": str(mute_time), "thread_fbid": thread_id}
|
if mute_time is None:
|
||||||
|
mute_settings = -1
|
||||||
|
else:
|
||||||
|
mute_settings = _util.timedelta_to_seconds(mute_time)
|
||||||
|
data = {"mute_settings": str(mute_settings), "thread_fbid": thread_id}
|
||||||
j = self._payload_post("/ajax/mercury/change_mute_thread.php?dpr=1", data)
|
j = self._payload_post("/ajax/mercury/change_mute_thread.php?dpr=1", data)
|
||||||
|
|
||||||
def unmuteThread(self, thread_id=None):
|
def unmuteThread(self, thread_id=None):
|
||||||
@@ -2126,7 +2131,7 @@ class Client:
|
|||||||
Args:
|
Args:
|
||||||
thread_id: User/Group ID to unmute. See :ref:`intro_threads`
|
thread_id: User/Group ID to unmute. See :ref:`intro_threads`
|
||||||
"""
|
"""
|
||||||
return self.muteThread(0, thread_id)
|
return self.muteThread(datetime.timedelta(0), thread_id)
|
||||||
|
|
||||||
def muteThreadReactions(self, mute=True, thread_id=None):
|
def muteThreadReactions(self, mute=True, thread_id=None):
|
||||||
"""Mute thread reactions.
|
"""Mute thread reactions.
|
||||||
@@ -2468,7 +2473,9 @@ class Client:
|
|||||||
elif delta_type == "rtc_call_log":
|
elif delta_type == "rtc_call_log":
|
||||||
thread_id, thread_type = getThreadIdAndThreadType(metadata)
|
thread_id, thread_type = getThreadIdAndThreadType(metadata)
|
||||||
call_status = delta["untypedData"]["event"]
|
call_status = delta["untypedData"]["event"]
|
||||||
call_duration = int(delta["untypedData"]["call_duration"])
|
call_duration = _util.seconds_to_timedelta(
|
||||||
|
int(delta["untypedData"]["call_duration"])
|
||||||
|
)
|
||||||
is_video_call = bool(int(delta["untypedData"]["is_video_call"]))
|
is_video_call = bool(int(delta["untypedData"]["is_video_call"]))
|
||||||
if call_status == "call_started":
|
if call_status == "call_started":
|
||||||
self.onCallStarted(
|
self.onCallStarted(
|
||||||
@@ -3595,7 +3602,7 @@ class Client:
|
|||||||
mid: The action ID
|
mid: The action ID
|
||||||
caller_id: The ID of the person who ended the call
|
caller_id: The ID of the person who ended the call
|
||||||
is_video_call: True if it was video call
|
is_video_call: True if it was video call
|
||||||
call_duration: Call duration in seconds
|
call_duration (datetime.timedelta): Call duration
|
||||||
thread_id: Thread ID that the action was sent to. See :ref:`intro_threads`
|
thread_id: Thread ID that the action was sent to. See :ref:`intro_threads`
|
||||||
thread_type (ThreadType): Type of thread that the action was sent to. See :ref:`intro_threads`
|
thread_type (ThreadType): Type of thread that the action was sent to. See :ref:`intro_threads`
|
||||||
ts: A timestamp of the action
|
ts: A timestamp of the action
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
import attr
|
import attr
|
||||||
|
from . import _util
|
||||||
from ._attachment import Attachment
|
from ._attachment import Attachment
|
||||||
|
|
||||||
|
|
||||||
@@ -36,7 +37,7 @@ class AudioAttachment(Attachment):
|
|||||||
filename = attr.ib(None)
|
filename = attr.ib(None)
|
||||||
#: URL of the audio file
|
#: URL of the audio file
|
||||||
url = attr.ib(None)
|
url = attr.ib(None)
|
||||||
#: Duration of the audio clip in milliseconds
|
#: Duration of the audio clip as a timedelta
|
||||||
duration = attr.ib(None)
|
duration = attr.ib(None)
|
||||||
#: Audio type
|
#: Audio type
|
||||||
audio_type = attr.ib(None)
|
audio_type = attr.ib(None)
|
||||||
@@ -49,7 +50,7 @@ class AudioAttachment(Attachment):
|
|||||||
return cls(
|
return cls(
|
||||||
filename=data.get("filename"),
|
filename=data.get("filename"),
|
||||||
url=data.get("playable_url"),
|
url=data.get("playable_url"),
|
||||||
duration=data.get("playable_duration_in_ms"),
|
duration=_util.millis_to_timedelta(data.get("playable_duration_in_ms")),
|
||||||
audio_type=data.get("audio_type"),
|
audio_type=data.get("audio_type"),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -175,7 +176,7 @@ class VideoAttachment(Attachment):
|
|||||||
width = attr.ib(None)
|
width = attr.ib(None)
|
||||||
#: Height of original video
|
#: Height of original video
|
||||||
height = attr.ib(None)
|
height = attr.ib(None)
|
||||||
#: Length of video in milliseconds
|
#: Length of video as a timedelta
|
||||||
duration = attr.ib(None)
|
duration = attr.ib(None)
|
||||||
#: URL to very compressed preview video
|
#: URL to very compressed preview video
|
||||||
preview_url = attr.ib(None)
|
preview_url = attr.ib(None)
|
||||||
@@ -243,7 +244,7 @@ class VideoAttachment(Attachment):
|
|||||||
return cls(
|
return cls(
|
||||||
width=data.get("original_dimensions", {}).get("width"),
|
width=data.get("original_dimensions", {}).get("width"),
|
||||||
height=data.get("original_dimensions", {}).get("height"),
|
height=data.get("original_dimensions", {}).get("height"),
|
||||||
duration=data.get("playable_duration_in_ms"),
|
duration=_util.millis_to_timedelta(data.get("playable_duration_in_ms")),
|
||||||
preview_url=data.get("playable_url"),
|
preview_url=data.get("playable_url"),
|
||||||
small_image=data.get("chat_image"),
|
small_image=data.get("chat_image"),
|
||||||
medium_image=data.get("inbox_image"),
|
medium_image=data.get("inbox_image"),
|
||||||
@@ -255,7 +256,7 @@ class VideoAttachment(Attachment):
|
|||||||
def _from_subattachment(cls, data):
|
def _from_subattachment(cls, data):
|
||||||
media = data["media"]
|
media = data["media"]
|
||||||
return cls(
|
return cls(
|
||||||
duration=media.get("playable_duration_in_ms"),
|
duration=_util.millis_to_timedelta(media.get("playable_duration_in_ms")),
|
||||||
preview_url=media.get("playable_url"),
|
preview_url=media.get("playable_url"),
|
||||||
medium_image=media.get("image"),
|
medium_image=media.get("image"),
|
||||||
uid=data["target"].get("video_id"),
|
uid=data["target"].get("video_id"),
|
||||||
|
@@ -269,3 +269,21 @@ def datetime_to_millis(dt):
|
|||||||
The returned milliseconds will be rounded to the nearest whole number.
|
The returned milliseconds will be rounded to the nearest whole number.
|
||||||
"""
|
"""
|
||||||
return round(dt.timestamp() * 1000)
|
return round(dt.timestamp() * 1000)
|
||||||
|
|
||||||
|
|
||||||
|
def seconds_to_timedelta(seconds):
|
||||||
|
"""Convert seconds to a timedelta."""
|
||||||
|
return datetime.timedelta(seconds=seconds)
|
||||||
|
|
||||||
|
|
||||||
|
def millis_to_timedelta(milliseconds):
|
||||||
|
"""Convert a duration (in milliseconds) to a timedelta object."""
|
||||||
|
return datetime.timedelta(milliseconds=milliseconds)
|
||||||
|
|
||||||
|
|
||||||
|
def timedelta_to_seconds(td):
|
||||||
|
"""Convert a timedelta to seconds.
|
||||||
|
|
||||||
|
The returned seconds will be rounded to the nearest whole number.
|
||||||
|
"""
|
||||||
|
return round(td.total_seconds())
|
||||||
|
Reference in New Issue
Block a user