diff --git a/demo.py b/demo.py index 8632445..faa412c 100644 --- a/demo.py +++ b/demo.py @@ -127,10 +127,11 @@ threading.Thread(target=input_thread, daemon=True).start() print("Type 'help' for help") current_participants = [] +current_effect = None while True: msg = im.receive() if msg is not None: - print(f'[{msg.sender}] {msg.text}') + print(msg.to_string()) if len(INPUT_QUEUE) > 0: msg = INPUT_QUEUE.pop() @@ -140,10 +141,18 @@ while True: print('quit (q): quit') #print('send (s) [recipient] [message]: send a message') print('filter (f) [recipient]: set the current chat') + print('effect (e): adds an iMessage effect to the next sent message') print('note: recipient must start with tel: or mailto: and include the country code') print('\\: escape commands (will be removed from message)') elif msg == 'quit' or msg == 'q': break + elif msg.startswith("effect ") or msg.startswith("e "): + msg = msg.split(" ") + if len(msg) < 2 or msg[1] == "": + print("effect [effect namespace]") + else: + print(f"next message will be sent with [{msg[1]}]") + current_effect = msg[1] elif msg.startswith('filter ') or msg.startswith('f '): # Set the curernt chat msg = msg.split(' ') @@ -158,8 +167,10 @@ while True: im.send(imessage.iMessage( text=msg, participants=current_participants, - sender=user.handles[0] + sender=user.handles[0], + effect=current_effect )) + current_effect = None else: print('No chat selected, use help for help') diff --git a/imessage.py b/imessage.py index c6f78ea..45fb528 100644 --- a/imessage.py +++ b/imessage.py @@ -53,6 +53,8 @@ class iMessage: """Group ID of the message, will be randomly generated if not provided""" body: BalloonBody | None = None """BalloonBody, may be None""" + effect: str | None = None + """iMessage effect sent with this message, may be None""" _compressed: bool = True """Internal property representing whether the message should be compressed""" @@ -103,9 +105,8 @@ class iMessage: sender=sender if sender is not None else message.get("p", [])[-1] if "p" in message else None, _id=uuid.UUID(message.get("r")) if "r" in message else None, group_id=uuid.UUID(message.get("gid")) if "gid" in message else None, - body=BalloonBody(message["bid"], message["b"]) - if "bid" in message - else None, + body=BalloonBody(message["bid"], message["b"]) if "bid" in message else None, + effect=message["iid"] if "iid" in message else None, _compressed=compressed, _raw=message, ) @@ -124,6 +125,7 @@ class iMessage: "pv": 0, "gv": "8", "v": "1", + "iid": self.effect } # Remove keys that are None @@ -138,6 +140,12 @@ class iMessage: return d + def to_string(self) -> str: + message_str = f"[{self.sender}] '{self.text}'" + if self.effect is not None: + message_str += f" with effect [{self.effect}]" + return message_str + class iMessageUser: """Represents a logged in and connected iMessage user.