mirror of
https://github.com/chatmail/core.git
synced 2026-04-06 15:42:10 +03:00
emit "DC_EVENT_MEMBER_ADDED" and python plugin event "member_added" for securejoin or non-securejoin additions of a contact to a chat. also fixup some docs
This commit is contained in:
@@ -5,6 +5,8 @@
|
||||
|
||||
- introduced PerAccount and Global hooks that plugins can implement
|
||||
|
||||
- introduced `member_added()` plugin event.
|
||||
|
||||
|
||||
0.800.0
|
||||
-------
|
||||
|
||||
@@ -7,6 +7,9 @@ for managing global and per-account plugin registration, and performing
|
||||
hook calls.
|
||||
|
||||
|
||||
Registering a plugin
|
||||
--------------------
|
||||
|
||||
.. autoclass:: deltachat.register_global_plugin
|
||||
|
||||
.. autoclass:: deltachat.account.Account.add_account_plugin
|
||||
|
||||
@@ -86,4 +86,9 @@ def register_global_plugin(plugin):
|
||||
gm.check_pending()
|
||||
|
||||
|
||||
def unregister_global_plugin(plugin):
|
||||
gm = hookspec.Global._get_plugin_manager()
|
||||
gm.unregister(plugin)
|
||||
|
||||
|
||||
register_global_plugin(eventlogger)
|
||||
|
||||
@@ -76,6 +76,10 @@ class Account(object):
|
||||
elif name == "DC_EVENT_MSG_DELIVERED":
|
||||
msg = self.get_message_by_id(ffi_event.data2)
|
||||
self._pm.hook.process_message_delivered(message=msg)
|
||||
elif name == "DC_EVENT_MEMBER_ADDED":
|
||||
chat = self.get_chat_by_id(ffi_event.data1)
|
||||
contact = self.get_contact_by_id(ffi_event.data2)
|
||||
self._pm.hook.member_added(chat=chat, contact=contact)
|
||||
|
||||
# def __del__(self):
|
||||
# self.shutdown()
|
||||
@@ -342,6 +346,13 @@ class Account(object):
|
||||
"""
|
||||
return Message.from_db(self, msg_id)
|
||||
|
||||
def get_contact_by_id(self, contact_id):
|
||||
""" return Contact instance or None.
|
||||
:param contact_id: integer id of this contact.
|
||||
:returns: None or :class:`deltachat.contact.Contact` instance.
|
||||
"""
|
||||
return Contact(self._dc_context, contact_id)
|
||||
|
||||
def get_chat_by_id(self, chat_id):
|
||||
""" return Chat instance.
|
||||
:param chat_id: integer id of this chat.
|
||||
|
||||
@@ -99,6 +99,7 @@ DC_EVENT_IMEX_FILE_WRITTEN = 2052
|
||||
DC_EVENT_SECUREJOIN_INVITER_PROGRESS = 2060
|
||||
DC_EVENT_SECUREJOIN_JOINER_PROGRESS = 2061
|
||||
DC_EVENT_SECUREJOIN_MEMBER_ADDED = 2062
|
||||
DC_EVENT_MEMBER_ADDED = 2063
|
||||
DC_EVENT_FILE_COPIED = 2055
|
||||
DC_EVENT_IS_OFFLINE = 2081
|
||||
DC_EVENT_GET_STRING = 2091
|
||||
|
||||
@@ -4,12 +4,13 @@ import sys
|
||||
import py
|
||||
import pytest
|
||||
import requests
|
||||
from contextlib import contextmanager
|
||||
import time
|
||||
from deltachat import Account
|
||||
from deltachat.tracker import ConfigureTracker
|
||||
from deltachat import const
|
||||
from deltachat.capi import lib
|
||||
from deltachat.hookspec import PerAccount
|
||||
from deltachat.hookspec import account_hookimpl
|
||||
from deltachat.eventlogger import FFIEventLogger
|
||||
from _pytest.monkeypatch import MonkeyPatch
|
||||
from ffi_event import FFIEventTracker
|
||||
@@ -293,14 +294,25 @@ def lp():
|
||||
|
||||
@pytest.fixture
|
||||
def make_plugin_recorder():
|
||||
@contextmanager
|
||||
def make_plugin_recorder(account):
|
||||
class HookImpl:
|
||||
def __init__(self):
|
||||
self.calls_member_added = []
|
||||
|
||||
@account_hookimpl
|
||||
def member_added(self, chat, member):
|
||||
self.calls_member_added.append(dict(chat=chat, member=member))
|
||||
def member_added(self, chat, contact):
|
||||
self.calls_member_added.append(dict(chat=chat, contact=contact))
|
||||
|
||||
def get_first(self, name):
|
||||
val = getattr(self, "calls_" + name, None)
|
||||
if val is not None:
|
||||
return val.pop(0)
|
||||
|
||||
with account.temp_plugin(HookImpl()) as plugin:
|
||||
yield plugin
|
||||
|
||||
return make_plugin_recorder
|
||||
|
||||
|
||||
def wait_configuration_progress(account, min_target, max_target=1001):
|
||||
|
||||
@@ -167,16 +167,17 @@ class TestOfflineChat:
|
||||
else:
|
||||
pytest.fail("could not find chat")
|
||||
|
||||
def test_add_member_event(self, ac1):
|
||||
contact1 = ac1.create_contact("some1@hello.com", name="some1")
|
||||
contact2 = ac1.create_contact("some2@hello.com", name="some2")
|
||||
def test_add_member_event(self, ac1, make_plugin_recorder):
|
||||
chat = ac1.create_group_chat(name="title1")
|
||||
# promote the chat
|
||||
chat.send_text("hello")
|
||||
contact1 = ac1.create_contact("some1@hello.com", name="some1")
|
||||
|
||||
with make_plugin_recorder(ac1) as rec:
|
||||
chat.add_contact(contact2)
|
||||
chat.add_contact(contact1)
|
||||
kwargs = rec.get_first("member_added")
|
||||
assert kwargs["chat"] == chat
|
||||
assert kwargs["member"] == contact2
|
||||
assert kwargs["contact"] == contact1
|
||||
|
||||
def test_group_chat_creation(self, ac1):
|
||||
contact1 = ac1.create_contact("some1@hello.com", name="some1")
|
||||
@@ -1129,7 +1130,7 @@ class TestOnlineAccount:
|
||||
ac1._evtracker.get_matching("DC_EVENT_IMAP_MESSAGE_DELETED")
|
||||
ac2._evtracker.get_matching("DC_EVENT_IMAP_MESSAGE_DELETED")
|
||||
wait_securejoin_inviter_progress(ac1, 1000)
|
||||
ac1._evtracker.get_matching("DC_EVENT_SECUREJOIN_MEMBER_ADDED")
|
||||
ac1._evtracker.get_matching("DC_EVENT_MEMBER_ADDED")
|
||||
|
||||
def test_qr_verified_group_and_chatting(self, acfactory, lp):
|
||||
ac1, ac2 = acfactory.get_two_online_accounts()
|
||||
@@ -1141,7 +1142,7 @@ class TestOnlineAccount:
|
||||
chat2 = ac2.qr_join_chat(qr)
|
||||
assert chat2.id >= 10
|
||||
wait_securejoin_inviter_progress(ac1, 1000)
|
||||
ac1._evtracker.get_matching("DC_EVENT_SECUREJOIN_MEMBER_ADDED")
|
||||
ac1._evtracker.get_matching("DC_EVENT_MEMBER_ADDED")
|
||||
|
||||
lp.sec("ac2: read member added message")
|
||||
msg = ac2._evtracker.wait_next_incoming_message()
|
||||
|
||||
Reference in New Issue
Block a user