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:
mcinj 2022-05-05 09:01:11 -04:00
parent 4a6acc66a1
commit 40d2256eb5
5 changed files with 123 additions and 41 deletions

View file

@ -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 =

View file

@ -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 = {

View file

@ -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
View 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()}")

View file

@ -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,39 +24,58 @@ def run():
exit(-1) exit(-1)
config.read(file_name) config.read(file_name)
cookie = config['DEFAULT'].get('cookie')
enabled = config['DEFAULT'].getboolean('enabled')
minimum_points = config['DEFAULT'].getint('minimum_points')
max_entries = config['DEFAULT'].getint('max_entries')
max_time_left = config['DEFAULT'].getint('max_time_left')
minimum_game_points = config['DEFAULT'].getint('minimum_game_points')
blacklist = config['DEFAULT'].get('blacklist_keywords')
all_page = SteamGifts(cookie, 'All', False, minimum_points, max_entries, notification = Notification()
max_time_left, minimum_game_points, blacklist) 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)
wishlist_enabled = config['WISHLIST'].getboolean('wishlist.enabled') try:
wishlist_minimum_points = config['WISHLIST'].getint('wishlist.minimum_points') cookie = config['DEFAULT'].get('cookie')
wishlist_max_entries = config['WISHLIST'].getint('wishlist.max_entries')
wishlist_max_time_left = config['WISHLIST'].getint('wishlist.max_time_left')
wishlist_page = SteamGifts(cookie, 'Wishlist', False, wishlist_minimum_points, enabled = config['DEFAULT'].getboolean('enabled')
wishlist_max_entries, wishlist_max_time_left, 0, '') minimum_points = config['DEFAULT'].getint('minimum_points')
max_entries = config['DEFAULT'].getint('max_entries')
max_time_left = config['DEFAULT'].getint('max_time_left')
minimum_game_points = config['DEFAULT'].getint('minimum_game_points')
blacklist = config['DEFAULT'].get('blacklist_keywords')
if not enabled and not wishlist_enabled: all_page = SteamGifts(cookie, 'All', False, minimum_points, max_entries,
logger.error("Both 'Default' and 'Wishlist' configurations are disabled. Nothing will run. Exiting...") max_time_left, minimum_game_points, blacklist, notification)
sleep(10)
wishlist_enabled = config['WISHLIST'].getboolean('wishlist.enabled')
wishlist_minimum_points = config['WISHLIST'].getint('wishlist.minimum_points')
wishlist_max_entries = config['WISHLIST'].getint('wishlist.max_entries')
wishlist_max_time_left = config['WISHLIST'].getint('wishlist.max_time_left')
wishlist_page = SteamGifts(cookie, 'Wishlist', False, wishlist_minimum_points,
wishlist_max_entries, wishlist_max_time_left, 0, '', notification)
if not enabled and not wishlist_enabled:
logger.error("Both 'Default' and 'Wishlist' configurations are disabled. Nothing will run. Exiting...")
sleep(10)
exit(-1)
while True:
if wishlist_enabled:
wishlist_page.start()
if enabled:
all_page.start()
random_seconds = randint(1740, 3540) # sometime between 29-59 minutes
logger.info(f"Going to sleep for {random_seconds / 60} minutes.")
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) exit(-1)
while True:
if wishlist_enabled:
wishlist_page.start()
if enabled:
all_page.start()
random_seconds = randint(1740, 3540) # sometime between 29-59 minutes
logger.info(f"Going to sleep for {random_seconds / 60} minutes.")
sleep(random_seconds)
if __name__ == '__main__': if __name__ == '__main__':