mirror of
https://github.com/chatmail/core.git
synced 2026-04-17 21:46:35 +03:00
refine member/add remove further, and introduce ac_outgoing_message
This commit is contained in:
@@ -17,25 +17,31 @@ class GroupTrackingPlugin:
|
|||||||
text = message.text
|
text = message.text
|
||||||
message.chat.send_text("echoing from {}:\n{}".format(addr, text))
|
message.chat.send_text("echoing from {}:\n{}".format(addr, text))
|
||||||
|
|
||||||
|
@account_hookimpl
|
||||||
|
def ac_outgoing_message(self, message):
|
||||||
|
print("ac_outgoing_message:", message)
|
||||||
|
|
||||||
@account_hookimpl
|
@account_hookimpl
|
||||||
def ac_configure_completed(self, success):
|
def ac_configure_completed(self, success):
|
||||||
print("*** ac_configure_completed:", success)
|
print("ac_configure_completed:", success)
|
||||||
|
|
||||||
@account_hookimpl
|
@account_hookimpl
|
||||||
def ac_chat_modified(self, chat):
|
def ac_chat_modified(self, chat):
|
||||||
print("*** ac_chat_modified:", chat.id, chat.get_name())
|
print("ac_chat_modified:", chat.id, chat.get_name())
|
||||||
|
|
||||||
@account_hookimpl
|
|
||||||
def ac_member_added(self, chat, contact, sender):
|
|
||||||
print("*** ac_member_added {} to chat {} from {}".format(
|
|
||||||
contact.addr, chat.id, sender.addr))
|
|
||||||
for member in chat.get_contacts():
|
for member in chat.get_contacts():
|
||||||
print("chat member: {}".format(member.addr))
|
print("chat member: {}".format(member.addr))
|
||||||
|
|
||||||
@account_hookimpl
|
@account_hookimpl
|
||||||
def ac_member_removed(self, chat, contact, sender):
|
def ac_member_added(self, chat, contact, message):
|
||||||
print("*** ac_member_removed {} from chat {} by {}".format(
|
print("ac_member_added {} to chat {} from {}".format(
|
||||||
contact.addr, chat.id, sender.addr))
|
contact.addr, chat.id, message.get_sender_contact().addr))
|
||||||
|
for member in chat.get_contacts():
|
||||||
|
print("chat member: {}".format(member.addr))
|
||||||
|
|
||||||
|
@account_hookimpl
|
||||||
|
def ac_member_removed(self, chat, contact, message):
|
||||||
|
print("ac_member_removed {} from chat {} by {}".format(
|
||||||
|
contact.addr, chat.id, message.get_sender_contact().addr))
|
||||||
|
|
||||||
|
|
||||||
def main(argv=None):
|
def main(argv=None):
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class Chat(object):
|
|||||||
return not (self == other)
|
return not (self == other)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<Chat id={} name={} dc_context={}>".format(self.id, self.get_name(), self._dc_context)
|
return "<Chat id={} name={}>".format(self.id, self.get_name())
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def _dc_chat(self):
|
def _dc_chat(self):
|
||||||
|
|||||||
@@ -48,6 +48,10 @@ class PerAccount:
|
|||||||
def ac_incoming_message(self, message):
|
def ac_incoming_message(self, message):
|
||||||
""" Called on any incoming message (to deaddrop or chat). """
|
""" Called on any incoming message (to deaddrop or chat). """
|
||||||
|
|
||||||
|
@account_hookspec
|
||||||
|
def ac_outgoing_message(self, message):
|
||||||
|
""" Called on each outgoing message (both system and "normal")."""
|
||||||
|
|
||||||
@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. """
|
||||||
@@ -57,12 +61,12 @@ class PerAccount:
|
|||||||
""" Chat was created or modified regarding membership, avatar, title. """
|
""" Chat was created or modified regarding membership, avatar, title. """
|
||||||
|
|
||||||
@account_hookspec
|
@account_hookspec
|
||||||
def ac_member_added(self, chat, contact, sender):
|
def ac_member_added(self, chat, contact, message):
|
||||||
""" Called for each contact added to an accepted chat. """
|
""" Called for each contact added to an accepted chat. """
|
||||||
|
|
||||||
@account_hookspec
|
@account_hookspec
|
||||||
def ac_member_removed(self, chat, contact, sender):
|
def ac_member_removed(self, chat, contact, message):
|
||||||
""" Called for each contact removed from a chat. """
|
""" Called for each contact removed from a chat. """
|
||||||
|
|
||||||
|
|
||||||
class Global:
|
class Global:
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ class Message(object):
|
|||||||
return self.account == other.account and self.id == other.id
|
return self.account == other.account and self.id == other.id
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return "<Message id={} dc_context={}>".format(self.id, self._dc_context)
|
c = self.get_sender_contact()
|
||||||
|
return "<Message id={} sender={}/{} outgoing={} chat={}/{}>".format(
|
||||||
|
self.id, c.id, c.addr, self.is_outgoing(), self.chat.id, self.chat.get_name())
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_db(cls, account, id):
|
def from_db(cls, account, id):
|
||||||
@@ -322,14 +324,17 @@ def get_viewtype_code_from_name(view_type_name):
|
|||||||
"available {!r}".format(view_type_name, list(_view_type_mapping.values())))
|
"available {!r}".format(view_type_name, list(_view_type_mapping.values())))
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
# some helper code for turning system messages into hook events
|
# some helper code for turning system messages into hook events
|
||||||
|
#
|
||||||
|
|
||||||
def map_system_message(msg):
|
def map_system_message(msg):
|
||||||
if msg.is_system_message():
|
if msg.is_system_message():
|
||||||
res = parse_system_add_remove(msg.text)
|
res = parse_system_add_remove(msg.text)
|
||||||
if res:
|
if res:
|
||||||
contact = msg.account.get_contact_by_addr(res[1])
|
contact = msg.account.get_contact_by_addr(res[1])
|
||||||
if contact:
|
if contact:
|
||||||
d = dict(chat=msg.chat, contact=contact, sender=msg.get_sender_contact())
|
d = dict(chat=msg.chat, contact=contact, message=msg)
|
||||||
return "ac_member_" + res[0], d
|
return "ac_member_" + res[0], d
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -347,15 +347,21 @@ class BotProcess:
|
|||||||
patterns = [x.strip() for x in Source(pattern_lines.rstrip()).lines if x.strip()]
|
patterns = [x.strip() for x in Source(pattern_lines.rstrip()).lines if x.strip()]
|
||||||
for next_pattern in patterns:
|
for next_pattern in patterns:
|
||||||
print("+++FNMATCH:", next_pattern)
|
print("+++FNMATCH:", next_pattern)
|
||||||
|
ignored = []
|
||||||
while 1:
|
while 1:
|
||||||
line = self.stdout_queue.get(timeout=15)
|
line = self.stdout_queue.get(timeout=15)
|
||||||
if line is None:
|
if line is None:
|
||||||
|
if ignored:
|
||||||
|
print("BOT stdout terminated after these lines")
|
||||||
|
for line in ignored:
|
||||||
|
print(line)
|
||||||
raise IOError("BOT stdout-thread terminated")
|
raise IOError("BOT stdout-thread terminated")
|
||||||
if fnmatch.fnmatch(line, next_pattern):
|
if fnmatch.fnmatch(line, next_pattern):
|
||||||
print("+++MATCHED:", line)
|
print("+++MATCHED:", line)
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
print("+++IGN:", line)
|
print("+++IGN:", line)
|
||||||
|
ignored.append(line)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
|||||||
@@ -1052,12 +1052,17 @@ class TestOnlineAccount:
|
|||||||
message_queue.put(message)
|
message_queue.put(message)
|
||||||
|
|
||||||
delivered = queue.Queue()
|
delivered = queue.Queue()
|
||||||
|
out = queue.Queue()
|
||||||
|
|
||||||
class OutPlugin:
|
class OutPlugin:
|
||||||
@account_hookimpl
|
@account_hookimpl
|
||||||
def ac_message_delivered(self, message):
|
def ac_message_delivered(self, message):
|
||||||
delivered.put(message)
|
delivered.put(message)
|
||||||
|
|
||||||
|
@account_hookimpl
|
||||||
|
def ac_outgoing_message(self, message):
|
||||||
|
out.put(message)
|
||||||
|
|
||||||
ac1.add_account_plugin(OutPlugin())
|
ac1.add_account_plugin(OutPlugin())
|
||||||
ac2.add_account_plugin(InPlugin())
|
ac2.add_account_plugin(InPlugin())
|
||||||
|
|
||||||
@@ -1068,6 +1073,8 @@ class TestOnlineAccount:
|
|||||||
assert ev.data1 == chat.id
|
assert ev.data1 == chat.id
|
||||||
assert ev.data2 == msg_out.id
|
assert ev.data2 == msg_out.id
|
||||||
assert msg_out.is_out_delivered()
|
assert msg_out.is_out_delivered()
|
||||||
|
m = out.get()
|
||||||
|
assert m == msg_out
|
||||||
m = delivered.get()
|
m = delivered.get()
|
||||||
assert m == msg_out
|
assert m == msg_out
|
||||||
|
|
||||||
@@ -1304,12 +1311,12 @@ class TestOnlineAccount:
|
|||||||
in_list.put(EventHolder(action="chat-modified", chat=chat))
|
in_list.put(EventHolder(action="chat-modified", chat=chat))
|
||||||
|
|
||||||
@account_hookimpl
|
@account_hookimpl
|
||||||
def ac_member_added(self, chat, contact, sender):
|
def ac_member_added(self, chat, contact, message):
|
||||||
in_list.put(EventHolder(action="added", chat=chat, contact=contact, sender=sender))
|
in_list.put(EventHolder(action="added", chat=chat, contact=contact, message=message))
|
||||||
|
|
||||||
@account_hookimpl
|
@account_hookimpl
|
||||||
def ac_member_removed(self, chat, contact, sender):
|
def ac_member_removed(self, chat, contact, message):
|
||||||
in_list.put(EventHolder(action="removed", chat=chat, contact=contact, sender=sender))
|
in_list.put(EventHolder(action="removed", chat=chat, contact=contact, message=message))
|
||||||
|
|
||||||
ac2.add_account_plugin(InPlugin())
|
ac2.add_account_plugin(InPlugin())
|
||||||
|
|
||||||
@@ -1335,7 +1342,7 @@ class TestOnlineAccount:
|
|||||||
assert ev.action == "chat-modified"
|
assert ev.action == "chat-modified"
|
||||||
ev = in_list.get(timeout=10)
|
ev = in_list.get(timeout=10)
|
||||||
assert ev.action == "added"
|
assert ev.action == "added"
|
||||||
assert ev.sender.addr == ac1_addr
|
assert ev.message.get_sender_contact().addr == ac1_addr
|
||||||
assert ev.contact.addr == "notexistingaccountihope@testrun.org"
|
assert ev.contact.addr == "notexistingaccountihope@testrun.org"
|
||||||
|
|
||||||
lp.sec("ac1: remove address2")
|
lp.sec("ac1: remove address2")
|
||||||
@@ -1345,7 +1352,7 @@ class TestOnlineAccount:
|
|||||||
ev = in_list.get(timeout=10)
|
ev = in_list.get(timeout=10)
|
||||||
assert ev.action == "removed"
|
assert ev.action == "removed"
|
||||||
assert ev.contact.addr == contact2.addr
|
assert ev.contact.addr == contact2.addr
|
||||||
assert ev.sender.addr == ac1_addr
|
assert ev.message.get_sender_contact().addr == ac1_addr
|
||||||
|
|
||||||
lp.sec("ac1: remove ac2 contact from chat")
|
lp.sec("ac1: remove ac2 contact from chat")
|
||||||
chat.remove_contact(contact)
|
chat.remove_contact(contact)
|
||||||
@@ -1353,7 +1360,7 @@ class TestOnlineAccount:
|
|||||||
assert ev.action == "chat-modified"
|
assert ev.action == "chat-modified"
|
||||||
ev = in_list.get(timeout=10)
|
ev = in_list.get(timeout=10)
|
||||||
assert ev.action == "removed"
|
assert ev.action == "removed"
|
||||||
assert ev.sender.addr == ac1_addr
|
assert ev.message.get_sender_contact().addr == ac1_addr
|
||||||
|
|
||||||
def test_set_get_group_image(self, acfactory, data, lp):
|
def test_set_get_group_image(self, acfactory, data, lp):
|
||||||
ac1, ac2 = acfactory.get_two_online_accounts()
|
ac1, ac2 = acfactory.get_two_online_accounts()
|
||||||
|
|||||||
Reference in New Issue
Block a user