for forwarding sending errors to relay group #13

Merged
missytake merged 2 commits from sending-errors into main 2023-12-08 12:58:56 +00:00
3 changed files with 58 additions and 1 deletions

View file

@ -1,4 +1,5 @@
import logging import logging
import time
from threading import Event from threading import Event
import pickledb import pickledb
@ -44,6 +45,25 @@ class RelayPlugin:
if not kvstore.get("relays"): if not kvstore.get("relays"):
kvstore.set("relays", list()) kvstore.set("relays", list())
@account_hookimpl
def ac_outgoing_message(self, message: deltachat.Message):
while not message.is_out_delivered():
time.sleep(0.1)
if message.is_out_failed():
break
begin = int(time.time())
while not message.is_out_failed():
time.sleep(0.1)
if int(time.time()) < begin + 10:
break # it probably just worked.
else:
error = message.get_message_info()
logging.warning(
"Outgoing message failed. Forwarding error to relay group: %s", error
)
relay_group = self.get_relay_group(message.chat.id)
relay_group.send_text(f"Sending Message failed:\n\n{error}")
@account_hookimpl @account_hookimpl
def ac_incoming_message(self, message: deltachat.Message): def ac_incoming_message(self, message: deltachat.Message):
"""This method is called on every incoming message and decides what to do with it.""" """This method is called on every incoming message and decides what to do with it."""

View file

@ -141,7 +141,9 @@ def outsider(tmpdir):
def account(db_path, show_ffi=False): def account(db_path, show_ffi=False):
token = os.environ.get("DCC_NEW_TMP_EMAIL", "https://nine.testrun.org/cgi-bin/newemail.py") token = os.environ.get(
"DCC_NEW_TMP_EMAIL", "https://nine.testrun.org/cgi-bin/newemail.py"
)
print(token) print(token)
ac = deltachat.Account(str(db_path)) ac = deltachat.Account(str(db_path))
credentials = requests.post(token).json() credentials = requests.post(token).json()

View file

@ -1,10 +1,14 @@
import os.path import os.path
import time
import deltachat import deltachat
import pytest import pytest
from deltachat.capi import lib as dclib from deltachat.capi import lib as dclib
TIMEOUT = 20
@pytest.mark.timeout(60) @pytest.mark.timeout(60)
def test_not_relay_groups(relaycrew, outsider): def test_not_relay_groups(relaycrew, outsider):
bot = relaycrew.bot bot = relaycrew.bot
@ -215,3 +219,34 @@ def test_change_avatar(relaycrew):
confirmation_msg = user.wait_next_incoming_message() confirmation_msg = user.wait_next_incoming_message()
assert confirmation_msg.text == "Avatar changed to this image." assert confirmation_msg.text == "Avatar changed to this image."
assert botcontact.get_profile_image() assert botcontact.get_profile_image()
def test_forward_sending_errors_to_relay_group(relaycrew):
usercrew = relaycrew.user.get_chats()[-1]
usercrew.send_text("/start_chat alice@example.org This_Message_will_fail test")
while len(relaycrew.bot.get_chats()) < 3:
time.sleep(0.1)
out_chat = relaycrew.bot.get_chats()[-1]
outgoing_message = out_chat.get_messages()[-1]
print(outgoing_message)
begin = int(time.time())
while not outgoing_message.is_out_failed() and int(time.time()) < begin + TIMEOUT:
time.sleep(0.1)
assert outgoing_message.is_out_failed()
while len(relaycrew.user.get_chats()) < 2 and int(time.time()) < begin + TIMEOUT:
time.sleep(0.1)
relay_group = relaycrew.user.get_chats()[-2]
while len(relay_group.get_messages()) < 3 and int(time.time()) < begin + TIMEOUT:
print(relay_group.get_messages()[-1].text)
time.sleep(0.1)
assert (
"Recipient address rejected: Domain example.org does not accept mail"
not in relay_group.get_messages()[-1].text
)
assert (
"Invalid unencrypted mail to <alice@example.org>"
in relay_group.get_messages()[-1].text
)