1
- #!/usr/bin/python3
1
+ #!/usr/bin/env python3
2
2
3
3
# advent_of_code_notify.py
4
4
# Send a webhook notification when someone from an Advent Of Code
5
5
# leaderboard solves a puzzle
6
6
#
7
7
# tofran, dec 2020
8
+ # https://github.com/tofran/advent-of-code-leaderboard-notifier
8
9
9
10
import os
10
11
import requests
11
12
import json
13
+ from datetime import date
12
14
13
15
LEADERBOARD_ENDPOINT_TEMPLATE = (
14
16
"https://adventofcode.com/"
15
- "{year}/leaderboard/private/view/{leaderboard_id}.json "
17
+ "{year}/leaderboard/private/view/{leaderboard_id}{extension} "
16
18
)
17
19
18
20
CACHE_FILE = os .getenv ("CACHE_FILE" , "./cache.json" )
19
21
20
- ADVENT_OF_CODE_YEAR = int (os .getenv ("ADVENT_OF_CODE_YEAR" , "2020" ))
22
+
23
+ def get_default_year ():
24
+ today = date .today ()
25
+ if today .month == 12 :
26
+ return today .year
27
+ return today .year - 1
28
+
29
+
30
+ ADVENT_OF_CODE_YEAR = int (os .getenv ("ADVENT_OF_CODE_YEAR" , get_default_year ()))
21
31
ADVENT_OF_CODE_LEADERBOARD_ID = os .getenv ("ADVENT_OF_CODE_LEADERBOARD_ID" )
22
32
ADVENT_OF_CODE_SESSION_ID = os .getenv ("ADVENT_OF_CODE_SESSION_ID" )
23
33
27
37
assert ADVENT_OF_CODE_SESSION_ID , "ADVENT_OF_CODE_SESSION_ID missing"
28
38
assert WEBHOOK_URL , "WEBHOOK_URL missing"
29
39
30
- LEADERBOARD_ENDPOINT = LEADERBOARD_ENDPOINT_TEMPLATE .format (
31
- year = ADVENT_OF_CODE_YEAR ,
32
- leaderboard_id = ADVENT_OF_CODE_LEADERBOARD_ID ,
33
- )
40
+ WEBHOOK_MAX_CONTENT_LENGTH = int (os .getenv ("WEBHOOK_MAX_CONTENT_LENGTH" , "2000" ))
41
+
42
+
43
+ def get_leaderboard_enpoint (as_json_api = True ):
44
+ return LEADERBOARD_ENDPOINT_TEMPLATE .format (
45
+ year = ADVENT_OF_CODE_YEAR ,
46
+ leaderboard_id = ADVENT_OF_CODE_LEADERBOARD_ID ,
47
+ extension = ".json" if as_json_api else "" ,
48
+ )
34
49
35
50
36
51
def get_cached_leaderboard ():
@@ -52,7 +67,7 @@ def save_cached_leaderboard(data):
52
67
53
68
def fetch_leaderboard ():
54
69
response = requests .get (
55
- LEADERBOARD_ENDPOINT ,
70
+ get_leaderboard_enpoint ( as_json_api = True ) ,
56
71
cookies = {
57
72
"session" : ADVENT_OF_CODE_SESSION_ID
58
73
}
@@ -77,11 +92,16 @@ def get_name(leaderboard, member_id):
77
92
78
93
79
94
def send_webhook_notification (content ):
95
+ if len (content ) > WEBHOOK_MAX_CONTENT_LENGTH :
96
+ content = "The diff is too big, check the leaderbord: {}" .format (
97
+ get_leaderboard_enpoint (as_json_api = False )
98
+ )
99
+
80
100
requests .post (
81
101
WEBHOOK_URL ,
82
- data = json . dumps ( {
102
+ json = {
83
103
"content" : content ,
84
- }) ,
104
+ },
85
105
headers = {"Content-Type" : "application/json" }
86
106
).raise_for_status ()
87
107
0 commit comments