Pushover notifications
- Ability to setup pushover notifications - Will send a message if the cookie is invalid or if something happens evaluating gifts
This commit is contained in:
parent
4a6acc66a1
commit
40d2256eb5
5 changed files with 123 additions and 41 deletions
|
@ -9,15 +9,22 @@ max_entries = 2000
|
||||||
# time left in minutes of a giveaway for it to be considered
|
# time left in minutes of a giveaway for it to be considered
|
||||||
max_time_left = 300
|
max_time_left = 300
|
||||||
# the minimum point value for a giveaway to be considered
|
# the minimum point value for a giveaway to be considered
|
||||||
minimum_game_points = 5
|
minimum_game_points = 50
|
||||||
# a comma separated list of keywords in game titles to ignore
|
# a comma separated list of keywords in game titles to ignore
|
||||||
blacklist_keywords = hentai,adult
|
blacklist_keywords = hentai,adult
|
||||||
[WISHLIST]
|
[WISHLIST]
|
||||||
# should we consider giveaways on the 'Wishlist' page?
|
# should we consider giveaways on the 'Wishlist' page?
|
||||||
wishlist.enabled = true
|
wishlist.enabled = true
|
||||||
# minimum number of points in your account before entering into giveaways
|
# minimum number of points in your account before entering into giveaways
|
||||||
wishlist.minimum_points = 50
|
wishlist.minimum_points = 1
|
||||||
# max number of entries in a giveaway for it to be considered
|
# max number of entries in a giveaway for it to be considered
|
||||||
wishlist.max_entries = 2000
|
wishlist.max_entries = 10000
|
||||||
# time left in minutes of a giveaway for it to be considered
|
# time left in minutes of a giveaway for it to be considered
|
||||||
wishlist.max_time_left = 300
|
wishlist.max_time_left = 300
|
||||||
|
[NOTIFICATIONS]
|
||||||
|
# if we should send notifications via pushover
|
||||||
|
pushover.enabled = false
|
||||||
|
# your specific pushover token
|
||||||
|
pushover.token =
|
||||||
|
# your specific pushover user key
|
||||||
|
pushover.user_key =
|
|
@ -4,6 +4,7 @@ import log
|
||||||
|
|
||||||
logger = log.get_logger(__name__)
|
logger = log.get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class ConfigException(Exception):
|
class ConfigException(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -25,6 +26,9 @@ class ConfigReader(ConfigParser):
|
||||||
'wishlist.minimum_points': '%s' % (value_range(0, 400)),
|
'wishlist.minimum_points': '%s' % (value_range(0, 400)),
|
||||||
'wishlist.max_entries': '%s' % (value_range(0, 100000)),
|
'wishlist.max_entries': '%s' % (value_range(0, 100000)),
|
||||||
'wishlist.max_time_left': '%s' % (value_range(0, 21600))
|
'wishlist.max_time_left': '%s' % (value_range(0, 21600))
|
||||||
|
},
|
||||||
|
'NOTIFICATIONS': {
|
||||||
|
'pushover.enabled': ('true', 'false'),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default_values = {
|
default_values = {
|
||||||
|
@ -34,14 +38,20 @@ class ConfigReader(ConfigParser):
|
||||||
'minimum_points': f"{randint(20, 100)}",
|
'minimum_points': f"{randint(20, 100)}",
|
||||||
'max_entries': f"{randint(1000, 2500)}",
|
'max_entries': f"{randint(1000, 2500)}",
|
||||||
'max_time_left': f"{randint(180,500)}",
|
'max_time_left': f"{randint(180,500)}",
|
||||||
'minimum_game_points': '1',
|
'minimum_game_points': f"{randint(20, 100)}",
|
||||||
'blacklist_keywords': 'hentai,adult'
|
'blacklist_keywords': 'hentai,adult'
|
||||||
},
|
},
|
||||||
'WISHLIST': {
|
'WISHLIST': {
|
||||||
'wishlist.enabled': 'true',
|
'wishlist.enabled': 'true',
|
||||||
'wishlist.minimum_points': f"{randint(20, 100)}",
|
'wishlist.minimum_points': '1',
|
||||||
'wishlist.max_entries': f"{randint(10000, 100000)}",
|
'wishlist.max_entries': f"{randint(10000, 100000)}",
|
||||||
'wishlist.max_time_left': f"{randint(180,500)}"
|
'wishlist.max_time_left': f"{randint(180,500)}"
|
||||||
|
},
|
||||||
|
'NOTIFICATIONS': {
|
||||||
|
'pushover.enabled': 'false',
|
||||||
|
'pushover.token': '',
|
||||||
|
'pushover.user_key': '',
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
deprecated_values = {
|
deprecated_values = {
|
||||||
|
|
|
@ -13,9 +13,15 @@ from giveaway import Giveaway
|
||||||
logger = log.get_logger(__name__)
|
logger = log.get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class SteamGiftsException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class SteamGifts:
|
class SteamGifts:
|
||||||
def __init__(self, cookie, gifts_type, pinned, min_points, max_entries,
|
def __init__(self, cookie, gifts_type, pinned, min_points, max_entries,
|
||||||
max_time_left, minimum_game_points, blacklist):
|
max_time_left, minimum_game_points, blacklist, notification):
|
||||||
|
self.xsrf_token = None
|
||||||
|
self.points = None
|
||||||
self.cookie = {
|
self.cookie = {
|
||||||
'PHPSESSID': cookie
|
'PHPSESSID': cookie
|
||||||
}
|
}
|
||||||
|
@ -26,6 +32,7 @@ class SteamGifts:
|
||||||
self.max_time_left = int(max_time_left)
|
self.max_time_left = int(max_time_left)
|
||||||
self.minimum_game_points = int(minimum_game_points)
|
self.minimum_game_points = int(minimum_game_points)
|
||||||
self.blacklist = blacklist.split(',')
|
self.blacklist = blacklist.split(',')
|
||||||
|
self.notification = notification
|
||||||
|
|
||||||
self.base = "https://www.steamgifts.com"
|
self.base = "https://www.steamgifts.com"
|
||||||
self.session = requests.Session()
|
self.session = requests.Session()
|
||||||
|
@ -71,8 +78,7 @@ class SteamGifts:
|
||||||
self.points = int(soup.find('span', {'class': 'nav__points'}).text) # storage points
|
self.points = int(soup.find('span', {'class': 'nav__points'}).text) # storage points
|
||||||
except TypeError:
|
except TypeError:
|
||||||
logger.error("⛔ Cookie is not valid.")
|
logger.error("⛔ Cookie is not valid.")
|
||||||
sleep(10)
|
raise SteamGiftsException("Cookie is not valid.")
|
||||||
exit()
|
|
||||||
|
|
||||||
def should_we_enter_giveaway(self, giveaway):
|
def should_we_enter_giveaway(self, giveaway):
|
||||||
if giveaway.time_remaining_in_minutes is None:
|
if giveaway.time_remaining_in_minutes is None:
|
||||||
|
@ -178,7 +184,6 @@ class SteamGifts:
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
self.update_info()
|
self.update_info()
|
||||||
|
|
||||||
if self.points >= self.min_points:
|
if self.points >= self.min_points:
|
||||||
txt = f"🤖 You have {self.points} points. Evaluating '{self.gifts_type}' giveaways..."
|
txt = f"🤖 You have {self.points} points. Evaluating '{self.gifts_type}' giveaways..."
|
||||||
logger.info(txt)
|
logger.info(txt)
|
||||||
|
@ -187,5 +192,3 @@ class SteamGifts:
|
||||||
txt = f"You have {self.points} points which is below your minimum point threshold of " \
|
txt = f"You have {self.points} points which is below your minimum point threshold of " \
|
||||||
f"{self.min_points} points for '{self.gifts_type}' giveaways. Not evaluating right now."
|
f"{self.min_points} points for '{self.gifts_type}' giveaways. Not evaluating right now."
|
||||||
logger.info(txt)
|
logger.info(txt)
|
||||||
|
|
||||||
|
|
||||||
|
|
42
src/notification.py
Normal file
42
src/notification.py
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
import http.client
|
||||||
|
import urllib
|
||||||
|
|
||||||
|
import log
|
||||||
|
|
||||||
|
logger = log.get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class Notification:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.pushover = False
|
||||||
|
self.pushover_token = None
|
||||||
|
self.pushover_user_key = None
|
||||||
|
self.message_prefix = "SG-bot: "
|
||||||
|
|
||||||
|
def send(self, message):
|
||||||
|
logger.debug(f"Attempting to notify: {message}")
|
||||||
|
if self.pushover:
|
||||||
|
logger.debug("Pushover enabled. Sending message.")
|
||||||
|
self.__pushover(message)
|
||||||
|
|
||||||
|
def enable_pushover(self, token, user_key):
|
||||||
|
logger.debug("Enabling pushover notifications.")
|
||||||
|
self.pushover = True
|
||||||
|
self.pushover_token = token
|
||||||
|
self.pushover_user_key = user_key
|
||||||
|
|
||||||
|
def __pushover(self, message):
|
||||||
|
conn = http.client.HTTPSConnection("api.pushover.net:443")
|
||||||
|
conn.request("POST", "/1/messages.json",
|
||||||
|
urllib.parse.urlencode({
|
||||||
|
"token": self.pushover_token,
|
||||||
|
"user": self.pushover_user_key,
|
||||||
|
"message": f"{self.message_prefix}{message}",
|
||||||
|
}), {"Content-type": "application/x-www-form-urlencoded"})
|
||||||
|
response = conn.getresponse()
|
||||||
|
logger.debug(f"Pushover response code: {response.getcode()}")
|
||||||
|
if response.getcode() != 200:
|
||||||
|
logger.error(f"Pushover notification failed. Code {response.getcode()}: {response.read().decode()}")
|
||||||
|
|
||||||
|
|
26
src/run.py
26
src/run.py
|
@ -3,7 +3,8 @@ from time import sleep
|
||||||
|
|
||||||
import log
|
import log
|
||||||
from ConfigReader import ConfigReader, ConfigException
|
from ConfigReader import ConfigReader, ConfigException
|
||||||
from SteamGifts import SteamGifts
|
from SteamGifts import SteamGifts, SteamGiftsException
|
||||||
|
from notification import Notification
|
||||||
|
|
||||||
logger = log.get_logger(__name__)
|
logger = log.get_logger(__name__)
|
||||||
|
|
||||||
|
@ -23,7 +24,17 @@ def run():
|
||||||
exit(-1)
|
exit(-1)
|
||||||
|
|
||||||
config.read(file_name)
|
config.read(file_name)
|
||||||
|
|
||||||
|
notification = Notification()
|
||||||
|
pushover_enabled = config['NOTIFICATIONS'].getboolean('pushover.enabled')
|
||||||
|
pushover_token = config['NOTIFICATIONS'].get('pushover.token')
|
||||||
|
pushover_user_key = config['NOTIFICATIONS'].get('pushover.user_key')
|
||||||
|
if pushover_enabled:
|
||||||
|
notification.enable_pushover(pushover_token, pushover_user_key)
|
||||||
|
|
||||||
|
try:
|
||||||
cookie = config['DEFAULT'].get('cookie')
|
cookie = config['DEFAULT'].get('cookie')
|
||||||
|
|
||||||
enabled = config['DEFAULT'].getboolean('enabled')
|
enabled = config['DEFAULT'].getboolean('enabled')
|
||||||
minimum_points = config['DEFAULT'].getint('minimum_points')
|
minimum_points = config['DEFAULT'].getint('minimum_points')
|
||||||
max_entries = config['DEFAULT'].getint('max_entries')
|
max_entries = config['DEFAULT'].getint('max_entries')
|
||||||
|
@ -32,7 +43,7 @@ def run():
|
||||||
blacklist = config['DEFAULT'].get('blacklist_keywords')
|
blacklist = config['DEFAULT'].get('blacklist_keywords')
|
||||||
|
|
||||||
all_page = SteamGifts(cookie, 'All', False, minimum_points, max_entries,
|
all_page = SteamGifts(cookie, 'All', False, minimum_points, max_entries,
|
||||||
max_time_left, minimum_game_points, blacklist)
|
max_time_left, minimum_game_points, blacklist, notification)
|
||||||
|
|
||||||
wishlist_enabled = config['WISHLIST'].getboolean('wishlist.enabled')
|
wishlist_enabled = config['WISHLIST'].getboolean('wishlist.enabled')
|
||||||
wishlist_minimum_points = config['WISHLIST'].getint('wishlist.minimum_points')
|
wishlist_minimum_points = config['WISHLIST'].getint('wishlist.minimum_points')
|
||||||
|
@ -40,7 +51,7 @@ def run():
|
||||||
wishlist_max_time_left = config['WISHLIST'].getint('wishlist.max_time_left')
|
wishlist_max_time_left = config['WISHLIST'].getint('wishlist.max_time_left')
|
||||||
|
|
||||||
wishlist_page = SteamGifts(cookie, 'Wishlist', False, wishlist_minimum_points,
|
wishlist_page = SteamGifts(cookie, 'Wishlist', False, wishlist_minimum_points,
|
||||||
wishlist_max_entries, wishlist_max_time_left, 0, '')
|
wishlist_max_entries, wishlist_max_time_left, 0, '', notification)
|
||||||
|
|
||||||
if not enabled and not wishlist_enabled:
|
if not enabled and not wishlist_enabled:
|
||||||
logger.error("Both 'Default' and 'Wishlist' configurations are disabled. Nothing will run. Exiting...")
|
logger.error("Both 'Default' and 'Wishlist' configurations are disabled. Nothing will run. Exiting...")
|
||||||
|
@ -56,6 +67,15 @@ def run():
|
||||||
random_seconds = randint(1740, 3540) # sometime between 29-59 minutes
|
random_seconds = randint(1740, 3540) # sometime between 29-59 minutes
|
||||||
logger.info(f"Going to sleep for {random_seconds / 60} minutes.")
|
logger.info(f"Going to sleep for {random_seconds / 60} minutes.")
|
||||||
sleep(random_seconds)
|
sleep(random_seconds)
|
||||||
|
except SteamGiftsException as e:
|
||||||
|
notification.send(e)
|
||||||
|
sleep(5)
|
||||||
|
exit(-1)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(e)
|
||||||
|
notification.send("Something happened and the bot had to quit!")
|
||||||
|
sleep(5)
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
Loading…
Reference in a new issue