considers number of copies when determining if we should enter

This commit is contained in:
mcinj 2022-04-24 13:29:50 -04:00
parent 4b8a9fe7b7
commit 855029e67e
2 changed files with 83 additions and 49 deletions

2
.gitignore vendored
View file

@ -3,4 +3,4 @@ env/
__pycache__/
.idea
config/config.ini
src/debug.log
config/debug.log

View file

@ -12,6 +12,7 @@ import log
logger = log.get_logger(__name__)
class SteamGifts:
def __init__(self, cookie, gifts_type, pinned, min_points, max_entries, max_time_left, minimum_game_points):
self.cookie = {
@ -96,6 +97,82 @@ class SteamGifts:
else:
return None
def determine_cost_and_copies(self, item, game_name, game_id):
item_headers = item.find_all('span', {'class': 'giveaway__heading__thin'})
if len(item_headers) == 1: # then no multiple copies
game_cost = item_headers[0].getText().replace('(', '').replace(')', '').replace('P', '')
if not re.search('^[0-9]+$', game_cost):
txt = f"Unable to determine cost of {game_name} with id {game_id}. Cost string: {item_headers[0]}"
logger.error(txt)
return None, None
game_cost = int(game_cost)
return game_cost, 1
elif len(item_headers) == 2: # then multiple copies
game_cost = item_headers[1].getText().replace('(', '').replace(')', '').replace('P', '')
if not re.search('^[0-9]+$', game_cost):
txt = f"Unable to determine cost of {game_name} with id {game_id}. Cost string: {item_headers[1].getText()}"
logger.error(txt)
return None, None
game_cost = int(game_cost)
match = re.search('(?P<copies>[0-9]+) Copies', item_headers[0].getText(), re.IGNORECASE)
if match:
num_copies_str = match.group('copies')
num_copies = int(num_copies_str)
return game_cost, num_copies
else:
txt = f"It appears there are multiple copies of {game_name} with id {game_id}, but we could not " \
f"determine that. Copy string: {item_headers[0].getText()}"
logger.error(txt)
return game_cost, None
else:
txt = f"Unable to determine cost or num copies of {game_name} with id {game_id}."
logger.error(txt)
return None, None
def should_we_enter_giveaway(self, item, game_name, game_cost, copies):
times = item.select('div span[data-timestamp]')
game_remaining = times[0].text
game_remaining_in_minutes = self.determine_time_in_minutes(game_remaining)
if game_remaining_in_minutes is None:
return False
game_created = times[1].text
game_created_in_minutes = self.determine_time_in_minutes(game_created)
if game_created_in_minutes is None:
return False
game_entries = int(item.select('div.giveaway__links span')[0].text.split(' ')[0].replace(',', ''))
txt = f"{game_name} - {game_cost}P - {game_entries} entries (w/ {copies} copies) - " \
f"Created {game_created} ago with {game_remaining} remaining."
logger.debug(txt)
if self.points - int(game_cost) < 0:
txt = f"⛔ Not enough points to enter: {game_name}"
logger.debug(txt)
return False
if game_cost < self.minimum_game_points:
txt = f"Game {game_name} costs {game_cost}P and is below your cutoff of {self.minimum_game_points}P."
logger.debug(txt)
return False
if game_remaining_in_minutes > self.max_time_left:
txt = f"Game {game_name} has {game_remaining_in_minutes} minutes left and is above your cutoff of {self.max_time_left} minutes."
logger.debug(txt)
return False
if game_entries / copies > self.max_entries:
txt = f"Game {game_name} has {game_entries} entries and is above your cutoff of {self.max_entries} entries."
logger.debug(txt)
return False
return True
def enter_giveaway(self, game_id):
payload = {'xsrf_token': self.xsrf_token, 'do': 'entry_insert', 'code': game_id}
entry = requests.post('https://www.steamgifts.com/ajax.php', data=payload, cookies=self.cookie)
json_data = json.loads(entry.text)
if json_data['type'] == 'success':
return True
def get_game_content(self, page=1):
n = page
while True:
@ -133,13 +210,12 @@ class SteamGifts:
game_name = item.find('a', {'class': 'giveaway__heading__name'}).text
game_id = item.find('a', {'class': 'giveaway__heading__name'})['href'].split('/')[2]
game_cost = item.find_all('span', {'class': 'giveaway__heading__thin'})[-1]
if game_cost:
game_cost = game_cost.getText().replace('(', '').replace(')', '').replace('P', '')
game_cost = int(game_cost)
else:
game_cost, copies = self.determine_cost_and_copies(item, game_name, game_id)
if not game_cost:
continue
if_enter_giveaway = self.should_we_enter_giveaway(item, game_name, game_cost)
if_enter_giveaway = self.should_we_enter_giveaway(item, game_name, game_cost, copies)
if if_enter_giveaway:
res = self.enter_giveaway(game_id)
@ -157,48 +233,6 @@ class SteamGifts:
sleep(120)
self.start()
def should_we_enter_giveaway(self, item, game_name, game_cost):
times = item.select('div span[data-timestamp]')
game_remaining = times[0].text
game_remaining_in_minutes = self.determine_time_in_minutes(game_remaining)
if game_remaining_in_minutes is None:
return False
game_created = times[1].text
game_created_in_minutes = self.determine_time_in_minutes(game_created)
if game_created_in_minutes is None:
return False
game_entries = int(item.select('div.giveaway__links span')[0].text.split(' ')[0].replace(',', ''))
txt = f"{game_name} - {game_cost}P - {game_entries} entries - Created {game_created} ago with {game_remaining} remaining."
logger.debug(txt)
if self.points - int(game_cost) < 0:
txt = f"⛔ Not enough points to enter: {game_name}"
logger.debug(txt)
return False
if game_cost < self.minimum_game_points:
txt = f"Game {game_name} costs {game_cost}P and is below your cutoff of {self.minimum_game_points}P."
logger.debug(txt)
return False
if game_remaining_in_minutes > self.max_time_left:
txt = f"Game {game_name} has {game_remaining_in_minutes} minutes left and is above your cutoff of {self.max_time_left} minutes."
logger.debug(txt)
return False
if game_entries > self.max_entries:
txt = f"Game {game_name} has {game_entries} entries and is above your cutoff of {self.max_entries} entries."
logger.debug(txt)
return False
return True
def enter_giveaway(self, game_id):
payload = {'xsrf_token': self.xsrf_token, 'do': 'entry_insert', 'code': game_id}
entry = requests.post('https://www.steamgifts.com/ajax.php', data=payload, cookies=self.cookie)
json_data = json.loads(entry.text)
if json_data['type'] == 'success':
return True
def start(self):
self.update_info()