Continue fixing issues with WhatsApp sync
This commit is contained in:
@@ -2164,7 +2164,7 @@ class WhatsAppClient(ClientBase):
|
|||||||
payload={"presence": state_text, "sender": str(sender), "chat": str(chat)},
|
payload={"presence": state_text, "sender": str(sender), "chat": str(chat)},
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
await self.ur.stopped_typing(
|
await self.ur.stopped_typing(
|
||||||
self.service,
|
self.service,
|
||||||
identifier=candidate,
|
identifier=candidate,
|
||||||
payload={"presence": state_text, "sender": str(sender), "chat": str(chat)},
|
payload={"presence": state_text, "sender": str(sender), "chat": str(chat)},
|
||||||
@@ -2274,8 +2274,20 @@ class WhatsAppClient(ClientBase):
|
|||||||
async def send_message_raw(self, recipient, text=None, attachments=None):
|
async def send_message_raw(self, recipient, text=None, attachments=None):
|
||||||
if not self._client:
|
if not self._client:
|
||||||
return False
|
return False
|
||||||
jid = self._to_jid(recipient)
|
if self._build_jid is None:
|
||||||
if not jid:
|
return False
|
||||||
|
jid_str = self._to_jid(recipient)
|
||||||
|
if not jid_str:
|
||||||
|
return False
|
||||||
|
# Convert string JID to actual JID object that neonize expects
|
||||||
|
try:
|
||||||
|
jid = self._build_jid(jid_str)
|
||||||
|
# Verify it's a proper JID object with SerializeToString method
|
||||||
|
if not hasattr(jid, 'SerializeToString'):
|
||||||
|
self.log.error("whatsapp build_jid returned non-JID object: type=%s repr=%s", type(jid).__name__, repr(jid)[:100])
|
||||||
|
return False
|
||||||
|
except Exception as exc:
|
||||||
|
self.log.warning("whatsapp failed to build JID from %s: %s", jid_str, exc)
|
||||||
return False
|
return False
|
||||||
if not self._connected and hasattr(self._client, "connect"):
|
if not self._connected and hasattr(self._client, "connect"):
|
||||||
try:
|
try:
|
||||||
@@ -2341,21 +2353,14 @@ class WhatsAppClient(ClientBase):
|
|||||||
last_error = None
|
last_error = None
|
||||||
for attempt in range(3):
|
for attempt in range(3):
|
||||||
try:
|
try:
|
||||||
|
# Log what we're about to send for debugging
|
||||||
|
self.log.debug(f"send_message attempt {attempt+1}: jid={jid} text_type={type(text).__name__} text_len={len(text)}")
|
||||||
response = await self._maybe_await(self._client.send_message(jid, text))
|
response = await self._maybe_await(self._client.send_message(jid, text))
|
||||||
sent_any = True
|
sent_any = True
|
||||||
last_error = None
|
last_error = None
|
||||||
break
|
break
|
||||||
except TypeError:
|
|
||||||
try:
|
|
||||||
response = await self._maybe_await(
|
|
||||||
self._client.send_message(jid, message=text)
|
|
||||||
)
|
|
||||||
sent_any = True
|
|
||||||
last_error = None
|
|
||||||
break
|
|
||||||
except Exception as exc:
|
|
||||||
last_error = exc
|
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
|
self.log.debug(f"send_message attempt {attempt+1} failed: {type(exc).__name__}: {exc}")
|
||||||
last_error = exc
|
last_error = exc
|
||||||
|
|
||||||
error_text = str(last_error or "").lower()
|
error_text = str(last_error or "").lower()
|
||||||
@@ -2465,3 +2470,26 @@ class WhatsAppClient(ClientBase):
|
|||||||
return transport._as_qr_png(self._last_qr_payload)
|
return transport._as_qr_png(self._last_qr_payload)
|
||||||
except Exception:
|
except Exception:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
async def send_message_to_contact(self, contact_jid: str, text: str) -> bool:
|
||||||
|
"""Send a text message to a WhatsApp contact."""
|
||||||
|
try:
|
||||||
|
jid = build_jid(contact_jid.split("@")[0], contact_jid.split("@")[1])
|
||||||
|
# neonize.send_message() accepts either a Message protobuf or a plain string
|
||||||
|
# If passing a string, it auto-converts to Message(conversation=text)
|
||||||
|
response = self.client.send_message(jid, text)
|
||||||
|
return response is not None
|
||||||
|
except Exception as e:
|
||||||
|
self.log.error(f"Failed to send WhatsApp message: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
# If you need to send a Message object explicitly:
|
||||||
|
async def send_structured_message(self, contact_jid: str, message: Message) -> bool:
|
||||||
|
"""Send a structured Message protobuf to a WhatsApp contact."""
|
||||||
|
try:
|
||||||
|
jid = build_jid(contact_jid.split("@")[0], contact_jid.split("@")[1])
|
||||||
|
response = self.client.send_message(jid, message)
|
||||||
|
return response is not None
|
||||||
|
except Exception as e:
|
||||||
|
self.log.error(f"Failed to send structured WhatsApp message: {e}")
|
||||||
|
return False
|
||||||
|
|||||||
Reference in New Issue
Block a user