mirror of
https://github.com/deltachat/deltachat-core.git
synced 2025-10-04 10:19:16 +02:00
implement enough API to mark messages as noticed and seen, and check that MDNs arrives back
also fix up setup.py
This commit is contained in:
parent
9d22585cea
commit
dd060d7cf2
3 changed files with 76 additions and 13 deletions
|
@ -9,7 +9,7 @@ def main():
|
||||||
version='0.1',
|
version='0.1',
|
||||||
description='Python bindings for deltachat-core using CFFI',
|
description='Python bindings for deltachat-core using CFFI',
|
||||||
long_description = long_description,
|
long_description = long_description,
|
||||||
author='Delta Chat contributors',
|
author='holger krekel and contributors',
|
||||||
setup_requires=['cffi>=1.0.0'],
|
setup_requires=['cffi>=1.0.0'],
|
||||||
install_requires=['cffi>=1.0.0', 'requests', 'attr'],
|
install_requires=['cffi>=1.0.0', 'requests', 'attr'],
|
||||||
packages=setuptools.find_packages('src'),
|
packages=setuptools.find_packages('src'),
|
||||||
|
|
|
@ -2,6 +2,7 @@ from __future__ import print_function
|
||||||
import threading
|
import threading
|
||||||
import re
|
import re
|
||||||
import requests
|
import requests
|
||||||
|
from array import array
|
||||||
try:
|
try:
|
||||||
from queue import Queue
|
from queue import Queue
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
@ -88,6 +89,7 @@ class Contact(object):
|
||||||
return capi.lib.dc_get_contact(self.dc_context, self.id)
|
return capi.lib.dc_get_contact(self.dc_context, self.id)
|
||||||
|
|
||||||
def __del__(self, dc_contact_unref=capi.lib.dc_contact_unref):
|
def __del__(self, dc_contact_unref=capi.lib.dc_contact_unref):
|
||||||
|
if self._property_cache:
|
||||||
dc_contact_unref(self.dc_contact_t)
|
dc_contact_unref(self.dc_contact_t)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -98,12 +100,12 @@ class Contact(object):
|
||||||
def display_name(self):
|
def display_name(self):
|
||||||
return ffi_unicode(capi.lib.dc_contact_get_display_name(self.dc_contact_t))
|
return ffi_unicode(capi.lib.dc_contact_get_display_name(self.dc_contact_t))
|
||||||
|
|
||||||
@property
|
|
||||||
def is_blocked(self):
|
def is_blocked(self):
|
||||||
|
""" Return True if the contact is blocked. """
|
||||||
return capi.lib.dc_contact_is_blocked(self.dc_contact_t)
|
return capi.lib.dc_contact_is_blocked(self.dc_contact_t)
|
||||||
|
|
||||||
@property
|
|
||||||
def is_verified(self):
|
def is_verified(self):
|
||||||
|
""" Return True if the contact is verified. """
|
||||||
return capi.lib.dc_contact_is_verified(self.dc_contact_t)
|
return capi.lib.dc_contact_is_verified(self.dc_contact_t)
|
||||||
|
|
||||||
|
|
||||||
|
@ -117,8 +119,13 @@ class Chat(object):
|
||||||
return capi.lib.dc_get_chat(self.dc_context, self.id)
|
return capi.lib.dc_get_chat(self.dc_context, self.id)
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
|
if self._property_cache:
|
||||||
capi.lib.dc_chat_unref(self.dc_chat_t)
|
capi.lib.dc_chat_unref(self.dc_chat_t)
|
||||||
|
|
||||||
|
def is_deaddrop(self):
|
||||||
|
""" return true if this chat is a deaddrop chat. """
|
||||||
|
return self.id == lib.DC_CHAT_ID_DEADDROP
|
||||||
|
|
||||||
def send_text_message(self, msg):
|
def send_text_message(self, msg):
|
||||||
""" send a text message and return the resulting Message instance. """
|
""" send a text message and return the resulting Message instance. """
|
||||||
msg = convert_to_bytes_utf8(msg)
|
msg = convert_to_bytes_utf8(msg)
|
||||||
|
@ -131,6 +138,17 @@ class Chat(object):
|
||||||
dc_array_t = lib.dc_get_chat_msgs(self.dc_context, self.id, 0, 0)
|
dc_array_t = lib.dc_get_chat_msgs(self.dc_context, self.id, 0, 0)
|
||||||
return list(iter_array_and_unref(dc_array_t, lambda x: Message(self.dc_context, x)))
|
return list(iter_array_and_unref(dc_array_t, lambda x: Message(self.dc_context, x)))
|
||||||
|
|
||||||
|
def count_fresh_messages(self):
|
||||||
|
""" return number of fresh messages in this chat. """
|
||||||
|
return lib.dc_get_fresh_msg_cnt(self.dc_context, self.id)
|
||||||
|
|
||||||
|
def mark_noticed(self):
|
||||||
|
""" mark all messages in this chat as noticed.
|
||||||
|
|
||||||
|
Noticed messages are no longer fresh.
|
||||||
|
"""
|
||||||
|
return lib.dc_marknoticed_chat(self.dc_context, self.id)
|
||||||
|
|
||||||
|
|
||||||
@attr.s
|
@attr.s
|
||||||
class Message(object):
|
class Message(object):
|
||||||
|
@ -142,6 +160,7 @@ class Message(object):
|
||||||
return capi.lib.dc_get_msg(self.dc_context, self.id)
|
return capi.lib.dc_get_msg(self.dc_context, self.id)
|
||||||
|
|
||||||
def __del__(self, dc_msg_unref=capi.lib.dc_msg_unref):
|
def __del__(self, dc_msg_unref=capi.lib.dc_msg_unref):
|
||||||
|
if self._property_cache:
|
||||||
dc_msg_unref(self.dc_msg_t)
|
dc_msg_unref(self.dc_msg_t)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -224,9 +243,31 @@ class Account(object):
|
||||||
self.dc_context, contact_id)
|
self.dc_context, contact_id)
|
||||||
return Chat(self.dc_context, chat_id)
|
return Chat(self.dc_context, chat_id)
|
||||||
|
|
||||||
|
def create_chat_by_message(self, message):
|
||||||
|
""" return a Chat object for the given message.
|
||||||
|
|
||||||
|
@param message: messsage id or message instance.
|
||||||
|
"""
|
||||||
|
msg_id = getattr(message, "id", message)
|
||||||
|
assert isinstance(msg_id, int)
|
||||||
|
chat_id = capi.lib.dc_create_chat_by_msg_id(self.dc_context, msg_id)
|
||||||
|
return Chat(self.dc_context, chat_id)
|
||||||
|
|
||||||
def get_message_by_id(self, msg_id):
|
def get_message_by_id(self, msg_id):
|
||||||
return Message(self.dc_context, msg_id)
|
return Message(self.dc_context, msg_id)
|
||||||
|
|
||||||
|
def mark_seen_messages(self, messages):
|
||||||
|
""" mark the given set of messages as seen.
|
||||||
|
|
||||||
|
:messages: a list of message ids or Message instances.
|
||||||
|
"""
|
||||||
|
arr = array("i")
|
||||||
|
for msg in messages:
|
||||||
|
msg = getattr(msg, "id", msg)
|
||||||
|
arr.append(msg)
|
||||||
|
msg_ids = ffi.cast("uint32_t*", ffi.from_buffer(arr))
|
||||||
|
lib.dc_markseen_msgs(self.dc_context, msg_ids, len(messages))
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
deltachat.set_context_callback(self.dc_context, self._process_event)
|
deltachat.set_context_callback(self.dc_context, self._process_event)
|
||||||
capi.lib.dc_configure(self.dc_context)
|
capi.lib.dc_configure(self.dc_context)
|
||||||
|
|
|
@ -21,8 +21,8 @@ class TestOfflineAccount:
|
||||||
assert contact1.id
|
assert contact1.id
|
||||||
assert contact1.addr == "some1@hello.com"
|
assert contact1.addr == "some1@hello.com"
|
||||||
assert contact1.display_name == "some1"
|
assert contact1.display_name == "some1"
|
||||||
assert not contact1.is_blocked
|
assert not contact1.is_blocked()
|
||||||
assert not contact1.is_verified
|
assert not contact1.is_verified()
|
||||||
|
|
||||||
def test_contact_get_contacts(self, acfactory):
|
def test_contact_get_contacts(self, acfactory):
|
||||||
ac1 = acfactory.get_offline_account()
|
ac1 = acfactory.get_offline_account()
|
||||||
|
@ -91,7 +91,7 @@ class TestOnlineAccount:
|
||||||
assert ac1.get_config("mail_pw")
|
assert ac1.get_config("mail_pw")
|
||||||
assert ac1.is_configured()
|
assert ac1.is_configured()
|
||||||
|
|
||||||
def test_send_message(self, acfactory):
|
def test_send_and_receive_message(self, acfactory):
|
||||||
ac1 = acfactory.get_live_account()
|
ac1 = acfactory.get_live_account()
|
||||||
ac2 = acfactory.get_live_account()
|
ac2 = acfactory.get_live_account()
|
||||||
c2 = ac1.create_contact(email=ac2.get_config("addr"))
|
c2 = ac1.create_contact(email=ac2.get_config("addr"))
|
||||||
|
@ -107,9 +107,31 @@ class TestOnlineAccount:
|
||||||
evt_name, data1, data2 = ev
|
evt_name, data1, data2 = ev
|
||||||
assert data1 == chat.id
|
assert data1 == chat.id
|
||||||
assert data2 == msg.id
|
assert data2 == msg.id
|
||||||
|
|
||||||
|
# wait for other account to receive
|
||||||
ev = ac2._evlogger.get_matching("DC_EVENT_MSGS_CHANGED")
|
ev = ac2._evlogger.get_matching("DC_EVENT_MSGS_CHANGED")
|
||||||
assert ev[2] == msg.id
|
assert ev[2] == msg.id
|
||||||
msg = ac2.get_message_by_id(msg.id)
|
msg2 = ac2.get_message_by_id(msg.id)
|
||||||
assert msg.text == "msg1"
|
assert msg2.text == "msg1"
|
||||||
messages = msg.chat.get_messages()
|
|
||||||
assert msg in messages, (msg, messages)
|
# check the message arrived in contact-requets/deaddrop
|
||||||
|
chat2 = msg2.chat
|
||||||
|
assert msg2 in chat2.get_messages()
|
||||||
|
assert chat2.is_deaddrop()
|
||||||
|
assert chat2.count_fresh_messages() == 0
|
||||||
|
|
||||||
|
# create new chat with contact and verify it's proper
|
||||||
|
chat2b = ac2.create_chat_by_message(msg2)
|
||||||
|
assert not chat2b.is_deaddrop()
|
||||||
|
assert chat2b.count_fresh_messages() == 1
|
||||||
|
|
||||||
|
# mark chat as noticed
|
||||||
|
chat2b.mark_noticed()
|
||||||
|
assert chat2b.count_fresh_messages() == 0
|
||||||
|
|
||||||
|
# mark messages as seen and check ac1 sees the MDN
|
||||||
|
ac2.mark_seen_messages([msg2])
|
||||||
|
while 1:
|
||||||
|
ev = ac1._evlogger.get_matching("DC_EVENT_INFO")
|
||||||
|
if "Marking message" in ev[2]:
|
||||||
|
break
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue