diff --git a/python/examples/echo_and_quit.py b/python/examples/echo_and_quit.py index bc66c43e0..73a8bc099 100644 --- a/python/examples/echo_and_quit.py +++ b/python/examples/echo_and_quit.py @@ -13,8 +13,10 @@ class SimpleEchoPlugin: if message.text.strip() == "/quit": message.account.shutdown() else: - ch = message.account.create_chat_by_contact(message.get_sender_contact()) - ch.send_text("echoing from {}:\n{}".format(message.get_sender_contact().addr, message.text)) + ch = message.get_sender_chat() + addr = message.get_sender_contact().addr + text = message.text + ch.send_text("echoing from {}:\n{}".format(addr, text)) @deltachat.hookspec.account_hookimpl def process_message_delivered(self, message): @@ -23,7 +25,7 @@ class SimpleEchoPlugin: def main(argv): p = optparse.OptionParser("simple-echo") - p.add_option("-l", action="store_true", help="show low-level events") + p.add_option("-l", action="store_true", help="show ffi") p.add_option("--db", type="str", help="database file") p.add_option("--email", type="str", help="email address") p.add_option("--password", type="str", help="password") @@ -34,10 +36,13 @@ def main(argv): ac = deltachat.Account(opts.db) if opts.l: - ac.add_account_plugin(deltachat.eventlogger.FFIEventLogger(ac, "echo")) + log = deltachat.eventlogger.FFIEventLogger(ac, "echo") + ac.add_account_plugin(log) if not ac.is_configured(): - assert opts.email and opts.password, "you must specify --email and --password" + assert opts.email and opts.password, ( + "you must specify --email and --password" + ) ac.set_config("addr", opts.email) ac.set_config("mail_pw", opts.password) ac.set_config("mvbox_watch", "0") @@ -45,10 +50,10 @@ def main(argv): ac.add_account_plugin(SimpleEchoPlugin()) - # start IO threads and perform configure if neccessary - ac.start(callback_thread=True) + # start IO threads and configure if neccessary + ac.start() - print("waiting for /quit or message to echo on: {}".format(ac.get_config("addr"))) + print("{}: waiting for message".format(ac.get_config("addr"))) ac.wait_shutdown() diff --git a/python/src/deltachat/account.py b/python/src/deltachat/account.py index 51349c8eb..853d13894 100644 --- a/python/src/deltachat/account.py +++ b/python/src/deltachat/account.py @@ -214,7 +214,7 @@ class Account(object): :returns: :class:`deltachat.contact.Contact` """ self.check_is_configured() - return Contact(self._dc_context, const.DC_CONTACT_ID_SELF) + return Contact(self, const.DC_CONTACT_ID_SELF) def create_contact(self, email, name=None): """ create a (new) Contact. If there already is a Contact @@ -229,7 +229,7 @@ class Account(object): email = as_dc_charpointer(email) contact_id = lib.dc_create_contact(self._dc_context, name, email) assert contact_id > const.DC_CHAT_ID_LAST_SPECIAL - return Contact(self._dc_context, contact_id) + return Contact(self, contact_id) def delete_contact(self, contact): """ delete a Contact. @@ -261,7 +261,7 @@ class Account(object): lib.dc_get_contacts(self._dc_context, flags, query), lib.dc_array_unref ) - return list(iter_array(dc_array, lambda x: Contact(self._dc_context, x))) + return list(iter_array(dc_array, lambda x: Contact(self, x))) def create_chat_by_contact(self, contact): """ create or get an existing 1:1 chat object for the specified contact or contact id. @@ -340,7 +340,7 @@ class Account(object): :param contact_id: integer id of this contact. :returns: None or :class:`deltachat.contact.Contact` instance. """ - return Contact(self._dc_context, contact_id) + return Contact(self, contact_id) def get_chat_by_id(self, chat_id): """ return Chat instance. @@ -542,7 +542,7 @@ class Account(object): If this account is not configured, an internal configuration job will be scheduled if config values are sufficiently specified. - You may call :method:`wait_shutdown` or `shutdown` after the + You may call `wait_shutdown` or `shutdown` after the account is in started mode. :raises MissingCredentials: if `addr` and `mail_pw` values are not set. diff --git a/python/src/deltachat/chat.py b/python/src/deltachat/chat.py index 173ec8e84..ea84c378c 100644 --- a/python/src/deltachat/chat.py +++ b/python/src/deltachat/chat.py @@ -363,7 +363,7 @@ class Chat(object): lib.dc_array_unref ) return list(iter_array( - dc_array, lambda id: Contact(self._dc_context, id)) + dc_array, lambda id: Contact(self.account, id)) ) def set_profile_image(self, img_path): diff --git a/python/src/deltachat/contact.py b/python/src/deltachat/contact.py index 9cebc829a..6e2cf1ae5 100644 --- a/python/src/deltachat/contact.py +++ b/python/src/deltachat/contact.py @@ -10,8 +10,9 @@ class Contact(object): You obtain instances of it through :class:`deltachat.account.Account`. """ - def __init__(self, dc_context, id): - self._dc_context = dc_context + def __init__(self, account, id): + self.account = account + self._dc_context = account._dc_context self.id = id def __eq__(self, other): @@ -57,3 +58,7 @@ class Contact(object): if dc_res == ffi.NULL: return None return from_dc_charpointer(dc_res) + + def get_chat(self): + """return 1:1 chat for this contact. """ + return self.account.create_chat_by_contact(self) diff --git a/python/src/deltachat/message.py b/python/src/deltachat/message.py index d8128bfb0..370863231 100644 --- a/python/src/deltachat/message.py +++ b/python/src/deltachat/message.py @@ -159,6 +159,13 @@ class Message(object): chat_id = lib.dc_msg_get_chat_id(self._dc_msg) return Chat(self.account, chat_id) + def get_sender_chat(self): + """return the 1:1 chat with the sender of this message. + + :returns: :class:`deltachat.chat.Chat` instance + """ + return self.get_sender_contact().get_chat() + def get_sender_contact(self): """return the contact of who wrote the message. @@ -166,7 +173,7 @@ class Message(object): """ from .contact import Contact contact_id = lib.dc_msg_get_from_id(self._dc_msg) - return Contact(self._dc_context, contact_id) + return Contact(self.account, contact_id) # # Message State query methods diff --git a/python/tox.ini b/python/tox.ini index cfdab2957..45810e40b 100644 --- a/python/tox.ini +++ b/python/tox.ini @@ -8,7 +8,7 @@ envlist = [testenv] commands = pytest -n6 --reruns 2 --reruns-delay 5 -v -rsXx --ignored {posargs:tests} - pytest examples + pytest examples/test_examples.py python tests/package_wheels.py {toxworkdir}/wheelhouse passenv = TRAVIS