-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcheck.py
More file actions
executable file
·76 lines (66 loc) · 2.99 KB
/
check.py
File metadata and controls
executable file
·76 lines (66 loc) · 2.99 KB
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
#!/usr/bin/env python
import requests
import re
import time
import os
import argparse
from dotenv import load_dotenv
from os.path import join, dirname
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
def get_rooms():
rooms = os.environ.get("ROOMS")
if rooms is not None:
return (int(room) for room in rooms.split(","))
else:
return []
def get_link(room):
return "http://classic.laundryview.com/laundry_room.php?view=c&lr=%d" % room
def get_html(room):
r = requests.get(get_link(room))
assert(r.status_code == 200)
return r.text
number_regex = re.compile(ur'WASHERS:</span>\s*(\d+) of \d+ available\s*<span[^>]*>DRYERS:</span>\s*(\d+) of \d+ available')
def number_available(room):
html = get_html(room)
match = re.search(number_regex, html)
return { "washer": int(match.group(1)), "dryer": int(match.group(2)) }
def available(room, min_washers=1, min_dryers=1):
number = number_available(room)
return number["washer"] >= min_washers and number["dryer"] >= min_dryers
def yo(room):
r = requests.post("http://api.justyo.co/yo/", data={
'api_token': os.environ.get("YO_API_KEY"),
'username': os.environ.get("YO_RECIPIENT_USERNAME"),
'link': get_link(room),
'text': "laundry room available"
})
if r.status_code < 400:
print "Sent a yo about %d" % room
else:
print "An error occurred while sending a yo about %d" % room
AVAIL_FOR_X_MINUTES = 3
def main(washers, dryers, rooms, minutes):
history = {};
yoed = set();
while True:
for room in rooms:
if available(room, min_washers=washers, min_dryers=dryers):
history[room] = history.get(room, 0) + 1
if history[room] >= AVAIL_FOR_X_MINUTES:
print "%d is available!" % room
if room not in yoed:
yoed.add(room)
yo(room)
else:
history[room] = 0
time.sleep(60)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Get yo\'ed when a washers and driers are available')
parser.add_argument('rooms', metavar='rooms', type=int, nargs='*',
help='the ids of the laundry rooms (the lr parameter in the URL of LaundryView). If none are provided, looks for the ROOMS env variable for a comma separated list.', default=list(get_rooms()))
parser.add_argument('-w', '--washers', dest='washers', type=int, nargs='?', help="the minimum number of washers available to consider a room available", default=1)
parser.add_argument('-d', '--dryers', dest='dryers', type=int, nargs='?', help="the minimum number of dryers to consider a room available", default=1)
parser.add_argument('-t', '--time-available-before-notification', dest='minutes', type=int, nargs='?', help="the number of minutes the room must be available before sending a notification", default=3)
args = parser.parse_args()
main(**vars(args))