-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjackpot.6h.py
executable file
·203 lines (174 loc) · 7.49 KB
/
jackpot.6h.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#!/usr/bin/env python3
# <xbar.title>Jackpot</xbar.title>
# <xbar.version>v1.1</xbar.version>
# <xbar.author>Marcos</xbar.author>
# <xbar.author.github>astrowonk</xbar.author.github>
# <xbar.desc>Displays current Mega Millions and Powerball jackpots.</xbar.desc>
# <xbar.dependencies>python</xbar.dependencies>
# <xbar.abouturl>https://github.com/astrowonk/jackpot_xbar</xbar.abouturl>
# <xbar.image>https://user-images.githubusercontent.com/13702392/215283698-5f5f16aa-7ed2-4325-b006-879e4dbe9ae9.png</xbar.image>
import gzip
from http import client
import json
import datetime
from os import environ
import argparse
JACKPOT_THRESHOLD = 200e6
def get_weekday(day):
days = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
return days.index(day) + 1
def get_next_dayofweek_datetime(dayofweek):
date_time = datetime.datetime.now().date()
start_time_w = date_time.isoweekday()
target_w = get_weekday(dayofweek)
if start_time_w <= target_w:
day_diff = target_w - start_time_w
else:
day_diff = 7 - (start_time_w - target_w)
return date_time + datetime.timedelta(days=day_diff)
class Jackpot:
"""Class that loads lottery jackpot data and generates text for xbar and swiftbar"""
mega_json = None
pb_json = None
mega_color = 'black'
pb_color = 'black'
symbol_color = 'black'
pb_float_value = 0
icon_row = None
def __init__(self, load_data=None) -> None:
"""optionally can take tuple for fake data for testing on the command line and to avoid downloading from the internet.
Otherwise loads data and figures out the next drawing date and color"""
self.pb_json = {}
self.mega_json = {}
if not load_data:
self.load_data()
else:
self.pb_float_value, self.mega_float_value = load_data
self.handle_color()
self.set_icon()
def set_icon(self):
"""Swiftbar can use SF Symbols, xbar can not (yet)"""
if environ.get('SWIFTBAR') and float(environ.get('OS_VERSION_MAJOR')) >= 11:
self.icon_row = f':dollarsign.circle.fill: | size=13 sfcolor={self.symbol_color}'
else:
self.icon_row = (
f" $ | size=13 | font='Copperplate Gothic Bold' color={self.symbol_color}"
)
def load_data(self):
"""Load data from endpoints, store to properties. Using http.client because I want to avoid any dependencies
though requests is a lot easier/nicer."""
conn = client.HTTPSConnection('www.megamillions.com', timeout=5)
payload = ''
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json, text/javascript, */*; q=0.01',
# 'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.9',
'Host': 'www.megamillions.com',
'Origin': 'https://www.megamillions.com',
'Content-Length': '0',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Safari/605.1.15',
'Referer': 'https://www.megamillions.com/',
'X-Requested-With': 'XMLHttpRequest',
}
try:
conn.request(
'POST', '/cmspages/utilservice.asmx/GetLatestDrawData', payload, headers
)
response = conn.getresponse().read()
self.mega_json = json.loads(json.loads(response)['d'])
self.mega_float_value = self.mega_json['Jackpot']['NextPrizePool']
except:
self.mega_json = {}
self.mega_float_value = 0
conn = client.HTTPSConnection('www.valottery.com')
payload = ''
headers = {
'Accept': '*/*',
'Connection': 'keep-alive',
'Accept-Encoding': 'gzip, deflate, br',
'Host': 'www.valottery.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15',
'Accept-Language': 'en-US,en;q=0.9',
'Referer': 'https://www.valottery.com/',
'X-Requested-With': 'XMLHttpRequest',
}
try:
conn.request('GET', '/api/v1/drawgames/20/nextdrawing', payload, headers)
response2 = conn.getresponse().read()
self.pb_json = json.loads(gzip.decompress(response2))['data']
mapping_dict = {'MILLION': 1e6, 'BILLION': 1e9}
out = self.pb_json['nextDrawing']['nextJackpotAmount'].split()
self.pb_float_value = float(out[0].replace('$', '')) * mapping_dict[out[1]]
except:
self.pb_json = {}
self.pb_float_value = 0
def handle_color(self):
"""Make things green if prize is large"""
if self.mega_float_value >= JACKPOT_THRESHOLD:
self.mega_color = 'green'
if self.pb_float_value >= JACKPOT_THRESHOLD:
self.pb_color = 'green'
if 'green' in [self.mega_color, self.pb_color]:
self.symbol_color = 'green'
@staticmethod
def format_float(value):
"""Format float as a string with B for billion and M for million"""
if value == 0:
return 'No Data'
elif value >= 1e9:
return f'${value / 1E9:.2f}B'
elif value >= 1e6:
return f'${value / 1E6:.1f}M'
else:
return f'${value / 1E3:.1f}K'
def print_json(self):
pb_str = self.format_float(self.pb_float_value)
mm_str = self.format_float(self.mega_float_value)
json_dict = {
'mm': {
'jackpot_float': self.mega_float_value,
'jackpot_str': f'{mm_str: >7}',
'next_date': self.get_next_drawing_date(['tue', 'fri']),
},
'pb': {
'jackpot_float': self.pb_float_value,
'jackpot_str': f'{pb_str: >7}',
'next_date': self.get_powerball_date(),
},
}
print(json.dumps(json_dict, indent=4))
def generate_menu(self):
pb_str = self.format_float(self.pb_float_value)
mm_str = self.format_float(self.mega_float_value)
# generate menus
print(self.icon_row)
print('---')
print(
f"MM: {mm_str: >7} - {self.get_next_drawing_date(['tue','fri'])} | font='Menlo' size=13 color={self.mega_color} href=https://www.megamillions.com"
)
print(
f"PB: {pb_str: >7} - {self.get_powerball_date()} | font='Menlo' size=13 color={self.pb_color} href=https://www.powerball.com"
)
@staticmethod
def get_next_drawing_date(list_of_weekdays):
dates = [get_next_dayofweek_datetime(x) for x in list_of_weekdays]
return min(dates).strftime('%a %b %d')
def get_powerball_date(self):
try:
d = datetime.datetime.strptime(
self.pb_json['nextDrawing']['nextDrawingDate'], '%a %m/%d/%Y'
)
return d.strftime('%a %b %d')
except TypeError:
return self.get_next_drawing_date(['mon', 'wed', 'sat'])
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Get Jackpot info')
parser.add_argument('--data', type=int, nargs='+', action='extend', default=None)
parser.add_argument('--output-json', action='store_true', default=False)
args = parser.parse_args()
if not args.output_json:
Jackpot(load_data=args.data).generate_menu()
else:
Jackpot(load_data=args.data).print_json()