-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
lambda_function.py
56 lines (44 loc) · 1.57 KB
/
lambda_function.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import json
from nacl.signing import VerifyKey
from nacl.exceptions import BadSignatureError
PUBLIC_KEY = '<your public key here>' # found on Discord Application -> General Information page
PING_PONG = {"type": 1}
RESPONSE_TYPES = {
"PONG": 1,
"ACK_NO_SOURCE": 2,
"MESSAGE_NO_SOURCE": 3,
"MESSAGE_WITH_SOURCE": 4,
"ACK_WITH_SOURCE": 5
}
def verify_signature(event):
raw_body = event.get("rawBody")
auth_sig = event['params']['header'].get('x-signature-ed25519')
auth_ts = event['params']['header'].get('x-signature-timestamp')
message = auth_ts.encode() + raw_body.encode()
verify_key = VerifyKey(bytes.fromhex(PUBLIC_KEY))
verify_key.verify(message, bytes.fromhex(auth_sig)) # raises an error if unequal
def ping_pong(body):
if body.get("type") == 1:
return True
return False
def handler(event, context):
print(f"event {event}") # debug print
# verify the signature
try:
verify_signature(event)
except Exception as e:
raise Exception(f"[UNAUTHORIZED] Invalid request signature: {e}")
# check if message is a ping
body = event.get('body-json')
if ping_pong(body):
return PING_PONG
# dummy return
return {
"type": RESPONSE_TYPES['MESSAGE_NO_SOURCE'],
"data": {
"tts": False,
"content": "BEEP BOOP",
"embeds": [],
"allowed_mentions": []
}
}