Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 61 additions & 1 deletion nwcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -507,12 +507,72 @@ async def _on_message(self, _, message: str):
# A message from the relay, mostly useless, but we log it anyway
logger.info("Notice from relay " + self.relay + ": " + str(msg[1]))
elif msg[0] == "OK":
pass
await self._on_ok_message(msg)
elif msg[0] == "AUTH":
await self._on_auth_message(msg)
else:
raise Exception("Unknown message type " + str(msg[0]))
except Exception as e:
logger.error("Error parsing event: " + str(e))

async def _on_ok_message(self, msg: list) -> None:
"""Handle relay OK messages and surface rejections for diagnostics."""
event_id = str(msg[1]) if len(msg) > 1 else "unknown"
accepted = msg[2] if len(msg) > 2 else None
relay_msg = str(msg[3]) if len(msg) > 3 else ""

if accepted is False:
logger.warning(
"Relay "
+ self.relay
+ " rejected event "
+ event_id
+ (": " + relay_msg if relay_msg else "")
)
return

if accepted is True:
logger.debug(
"Relay "
+ self.relay
+ " accepted event "
+ event_id
+ (": " + relay_msg if relay_msg else "")
)
return

logger.debug(
"Received malformed OK message from relay "
+ self.relay
+ ": "
+ str(msg)
)

async def _on_auth_message(self, msg: list) -> None:
"""
Handle NIP-42 AUTH challenge from the relay (NIP-42).

When a relay sends ["AUTH", "<challenge>"], we respond with a signed
kind-22242 event containing the relay URL and challenge string.
See: https://github.com/nostr-protocol/nips/blob/master/42.md
"""
if len(msg) < 2:
logger.warning("Received AUTH message without challenge, ignoring")
return
challenge = msg[1]
auth_event: dict = {
"kind": 22242,
"content": "",
"created_at": int(time.time()),
"tags": [
["relay", self.relay],
["challenge", challenge],
],
}
self._sign_event(auth_event)
await self._send(["AUTH", auth_event])
logger.debug("Sent NIP-42 AUTH response for challenge: " + str(challenge))

async def _connect_to_relay(self):
"""
Initiate websocket connection to the relay.
Expand Down