mirror of
https://github.com/chatmail/core.git
synced 2026-05-05 06:16:30 +03:00
Add Python API to send reactions (#3762)
This commit is contained in:
@@ -192,6 +192,12 @@ class FFIEventTracker:
|
|||||||
return self.account.get_message_by_id(ev.data2)
|
return self.account.get_message_by_id(ev.data2)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def wait_next_reactions_changed(self):
|
||||||
|
"""wait for and return next reactions-changed message"""
|
||||||
|
ev = self.get_matching("DC_EVENT_REACTIONS_CHANGED")
|
||||||
|
assert ev.data1 > 0
|
||||||
|
return self.account.get_message_by_id(ev.data2)
|
||||||
|
|
||||||
def wait_msg_delivered(self, msg):
|
def wait_msg_delivered(self, msg):
|
||||||
ev = self.get_matching("DC_EVENT_MSG_DELIVERED")
|
ev = self.get_matching("DC_EVENT_MSG_DELIVERED")
|
||||||
assert ev.data1 == msg.chat.id
|
assert ev.data1 == msg.chat.id
|
||||||
@@ -296,6 +302,10 @@ class EventThread(threading.Thread):
|
|||||||
"ac_incoming_message",
|
"ac_incoming_message",
|
||||||
dict(message=msg),
|
dict(message=msg),
|
||||||
)
|
)
|
||||||
|
elif name == "DC_EVENT_REACTIONS_CHANGED":
|
||||||
|
assert ffi_event.data1 > 0
|
||||||
|
msg = account.get_message_by_id(ffi_event.data2)
|
||||||
|
yield "ac_reactions_changed", dict(message=msg)
|
||||||
elif name == "DC_EVENT_MSG_DELIVERED":
|
elif name == "DC_EVENT_MSG_DELIVERED":
|
||||||
msg = account.get_message_by_id(ffi_event.data2)
|
msg = account.get_message_by_id(ffi_event.data2)
|
||||||
yield "ac_message_delivered", dict(message=msg)
|
yield "ac_message_delivered", dict(message=msg)
|
||||||
|
|||||||
@@ -49,6 +49,10 @@ class PerAccount:
|
|||||||
def ac_outgoing_message(self, message):
|
def ac_outgoing_message(self, message):
|
||||||
"""Called on each outgoing message (both system and "normal")."""
|
"""Called on each outgoing message (both system and "normal")."""
|
||||||
|
|
||||||
|
@account_hookspec
|
||||||
|
def ac_reactions_changed(self, message):
|
||||||
|
"""Called when message reactions changed."""
|
||||||
|
|
||||||
@account_hookspec
|
@account_hookspec
|
||||||
def ac_message_delivered(self, message):
|
def ac_message_delivered(self, message):
|
||||||
"""Called when an outgoing message has been delivered to SMTP.
|
"""Called when an outgoing message has been delivered to SMTP.
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ from typing import Optional, Union
|
|||||||
from . import const, props
|
from . import const, props
|
||||||
from .capi import ffi, lib
|
from .capi import ffi, lib
|
||||||
from .cutil import as_dc_charpointer, from_dc_charpointer, from_optional_dc_charpointer
|
from .cutil import as_dc_charpointer, from_dc_charpointer, from_optional_dc_charpointer
|
||||||
|
from .reactions import Reactions
|
||||||
|
|
||||||
|
|
||||||
class Message(object):
|
class Message(object):
|
||||||
@@ -161,6 +162,17 @@ class Message(object):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def send_reaction(self, reaction: str):
|
||||||
|
"""Send a reaction to message and return the resulting Message instance."""
|
||||||
|
msg_id = lib.dc_send_reaction(self.account._dc_context, self.id, as_dc_charpointer(reaction))
|
||||||
|
if msg_id == 0:
|
||||||
|
raise ValueError("reaction could not be send")
|
||||||
|
return Message.from_db(self.account, msg_id)
|
||||||
|
|
||||||
|
def get_reactions(self) -> Reactions:
|
||||||
|
"""Get :class:`deltachat.reactions.Reactions` to the message."""
|
||||||
|
return Reactions.from_msg(self)
|
||||||
|
|
||||||
def is_system_message(self):
|
def is_system_message(self):
|
||||||
"""return True if this message is a system/info message."""
|
"""return True if this message is a system/info message."""
|
||||||
return bool(lib.dc_msg_is_info(self._dc_msg))
|
return bool(lib.dc_msg_is_info(self._dc_msg))
|
||||||
|
|||||||
43
python/src/deltachat/reactions.py
Normal file
43
python/src/deltachat/reactions.py
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
""" The Reactions object. """
|
||||||
|
|
||||||
|
from .capi import ffi, lib
|
||||||
|
from .cutil import from_dc_charpointer, iter_array
|
||||||
|
|
||||||
|
|
||||||
|
class Reactions(object):
|
||||||
|
"""Reactions object.
|
||||||
|
|
||||||
|
You obtain instances of it through :class:`deltachat.message.Message`.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, account, dc_reactions):
|
||||||
|
assert isinstance(account._dc_context, ffi.CData)
|
||||||
|
assert isinstance(dc_reactions, ffi.CData)
|
||||||
|
assert dc_reactions != ffi.NULL
|
||||||
|
self.account = account
|
||||||
|
self._dc_reactions = dc_reactions
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "<Reactions dc_reactions={}>".format(self._dc_reactions)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_msg(cls, msg):
|
||||||
|
assert msg.id > 0
|
||||||
|
return cls(
|
||||||
|
msg.account,
|
||||||
|
ffi.gc(lib.dc_get_msg_reactions(msg.account._dc_context, msg.id), lib.dc_reactions_unref),
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_contacts(self) -> list:
|
||||||
|
"""Get list of contacts reacted to the message.
|
||||||
|
|
||||||
|
:returns: list of :class:`deltachat.contact.Contact` objects for this reaction.
|
||||||
|
"""
|
||||||
|
from .contact import Contact
|
||||||
|
|
||||||
|
dc_array = ffi.gc(lib.dc_reactions_get_contacts(self._dc_reactions), lib.dc_array_unref)
|
||||||
|
return list(iter_array(dc_array, lambda x: Contact(self.account, x)))
|
||||||
|
|
||||||
|
def get_by_contact(self, contact) -> str:
|
||||||
|
"""Get a string containing space-separated reactions of a single :class:`deltachat.contact.Contact`."""
|
||||||
|
return from_dc_charpointer(lib.dc_reactions_get_by_contact_id(self._dc_reactions, contact.id))
|
||||||
Reference in New Issue
Block a user