mirror of
https://github.com/Sneed-Group/pypush-plus-plus
synced 2024-12-24 20:02:31 -06:00
some error handling, jank typing notifs
This commit is contained in:
parent
a9b84c7dbf
commit
ceeb9160ed
2 changed files with 40 additions and 4 deletions
12
demo.py
12
demo.py
|
@ -21,7 +21,7 @@ logging.getLogger("py.warnings").setLevel(logging.ERROR) # Ignore warnings from
|
||||||
logging.getLogger("asyncio").setLevel(logging.WARNING)
|
logging.getLogger("asyncio").setLevel(logging.WARNING)
|
||||||
logging.getLogger("jelly").setLevel(logging.INFO)
|
logging.getLogger("jelly").setLevel(logging.INFO)
|
||||||
logging.getLogger("nac").setLevel(logging.INFO)
|
logging.getLogger("nac").setLevel(logging.INFO)
|
||||||
logging.getLogger("apns").setLevel(logging.INFO)
|
logging.getLogger("apns").setLevel(logging.DEBUG)
|
||||||
logging.getLogger("albert").setLevel(logging.INFO)
|
logging.getLogger("albert").setLevel(logging.INFO)
|
||||||
logging.getLogger("ids").setLevel(logging.DEBUG)
|
logging.getLogger("ids").setLevel(logging.DEBUG)
|
||||||
logging.getLogger("bags").setLevel(logging.INFO)
|
logging.getLogger("bags").setLevel(logging.INFO)
|
||||||
|
@ -171,6 +171,16 @@ async def input_task(im: imessage.iMessageUser):
|
||||||
im.user.current_handle = handle
|
im.user.current_handle = handle
|
||||||
else:
|
else:
|
||||||
print(f"Handle {handle} not found")
|
print(f"Handle {handle} not found")
|
||||||
|
elif is_cmd(cmd, "typing"):
|
||||||
|
if len(current_participants) > 0:
|
||||||
|
await im.typing(current_participants)
|
||||||
|
else:
|
||||||
|
print("No chat selected")
|
||||||
|
elif is_cmd(cmd, "typingoff"):
|
||||||
|
if len(current_participants) > 0:
|
||||||
|
await im.typing(current_participants, False)
|
||||||
|
else:
|
||||||
|
print("No chat selected")
|
||||||
elif len(current_participants) > 0:
|
elif len(current_participants) > 0:
|
||||||
if cmd.startswith("\\"):
|
if cmd.startswith("\\"):
|
||||||
cmd = cmd[1:]
|
cmd = cmd[1:]
|
||||||
|
|
30
imessage.py
30
imessage.py
|
@ -156,7 +156,8 @@ class Message:
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
raise NotImplementedError()
|
#raise NotImplementedError()
|
||||||
|
return f"[Message {self.sender}] '{self.text}'"
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class SMSReflectedMessage(Message):
|
class SMSReflectedMessage(Message):
|
||||||
|
@ -344,6 +345,7 @@ class iMessage(Message):
|
||||||
|
|
||||||
MESSAGE_TYPES = {
|
MESSAGE_TYPES = {
|
||||||
100: ("com.apple.madrid", iMessage),
|
100: ("com.apple.madrid", iMessage),
|
||||||
|
101: ("com.apple.madrid", iMessage),
|
||||||
140: ("com.apple.private.alloy.sms", SMSIncomingMessage),
|
140: ("com.apple.private.alloy.sms", SMSIncomingMessage),
|
||||||
141: ("com.apple.private.alloy.sms", SMSIncomingImage),
|
141: ("com.apple.private.alloy.sms", SMSIncomingImage),
|
||||||
143: ("com.apple.private.alloy.sms", SMSReflectedMessage),
|
143: ("com.apple.private.alloy.sms", SMSReflectedMessage),
|
||||||
|
@ -516,12 +518,20 @@ class iMessageUser:
|
||||||
body: dict[str, Any] = await self._receive_raw(list(MESSAGE_TYPES.keys()), [t[0] for t in MESSAGE_TYPES.values()])
|
body: dict[str, Any] = await self._receive_raw(list(MESSAGE_TYPES.keys()), [t[0] for t in MESSAGE_TYPES.values()])
|
||||||
t: type[Message] = MESSAGE_TYPES[body["c"]][1]
|
t: type[Message] = MESSAGE_TYPES[body["c"]][1]
|
||||||
|
|
||||||
|
if not "P" in body:
|
||||||
|
return Message(text="No payload", sender="System", participants=[], id=uuid.uuid4(), _raw=body)
|
||||||
|
|
||||||
if not await self._verify_payload(body["P"], body["sP"], body["t"]):
|
if not await self._verify_payload(body["P"], body["sP"], body["t"]):
|
||||||
raise Exception("Failed to verify payload")
|
return Message(text="Failed to verify payload", sender="System", participants=[], id=uuid.uuid4(), _raw=body)
|
||||||
|
#raise Exception("Failed to verify payload")
|
||||||
|
|
||||||
logger.debug(f"Encrypted body : {body}")
|
logger.debug(f"Encrypted body : {body}")
|
||||||
|
|
||||||
|
try:
|
||||||
decrypted: bytes = self._decrypt_payload(body["P"])
|
decrypted: bytes = self._decrypt_payload(body["P"])
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Failed to decrypt message : {e}")
|
||||||
|
return Message(text="Failed to decrypt message", sender="System", participants=[], id=uuid.uuid4(), _raw=body)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return t.from_raw(decrypted, body["sP"])
|
return t.from_raw(decrypted, body["sP"])
|
||||||
|
@ -632,10 +642,26 @@ class iMessageUser:
|
||||||
|
|
||||||
body.update(extra)
|
body.update(extra)
|
||||||
|
|
||||||
|
# Remove keys that are None
|
||||||
|
body = {k: v for k, v in body.items() if v is not None}
|
||||||
|
|
||||||
body = plistlib.dumps(body, fmt=plistlib.FMT_BINARY)
|
body = plistlib.dumps(body, fmt=plistlib.FMT_BINARY)
|
||||||
|
|
||||||
await self.connection.send_notification(topic, body, message_id)
|
await self.connection.send_notification(topic, body, message_id)
|
||||||
|
|
||||||
|
async def typing(self, participants: list[str], start=True):
|
||||||
|
await self._cache_keys(participants, "com.apple.madrid")
|
||||||
|
|
||||||
|
await self._send_raw(
|
||||||
|
100,
|
||||||
|
participants,
|
||||||
|
"com.apple.madrid",
|
||||||
|
extra={
|
||||||
|
"eX": 0 if start else None, # expiration
|
||||||
|
"nr": 1 if start else None, # no response
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
async def _receive_raw(self, c: int | list[int], topics: str | list[str]) -> dict[str, Any]:
|
async def _receive_raw(self, c: int | list[int], topics: str | list[str]) -> dict[str, Any]:
|
||||||
def check(payload: apns.APNSPayload):
|
def check(payload: apns.APNSPayload):
|
||||||
# Check if the "c" key matches
|
# Check if the "c" key matches
|
||||||
|
|
Loading…
Reference in a new issue