def acquire(obj, player_list, futbin_multiplier, increase_each_round=False, max_increases=5, sell_acquired_if_full=True, special_only=False): obj.current_strategy = 'Acquire' snipe_settings = obj.strategy_settings['acquire']['snipe'] hunt_settings = obj.strategy_settings['acquire']['hunt'] if type(player_list) is not list: new = [player_list] player_list = new if special_only: quality = 'Special' else: quality = None multi_log(obj, 'Acquiring Players...', level='title') # Go through player lists remaining_players = player_list acquired = [] iteration = 1 while len(remaining_players) > 0: bids = 0 search_list = [] if iteration > 1: snipe_settings['max_results'] = 9999999 print('{:<30} {:<20} {:<20}'.format('Name', 'Futbin Price', 'Asset ID')) for player in remaining_players: player_info = info.get_player_info(player, include_futbin_price=True) print('{:<30} {:<20} {:<20}'.format(player_info['name'], player_info['futbin_price'], player)) search_list.append(player_info) for player in search_list: name = player['name'] futbin_price = player['futbin_price'] tier = info.get_tier(futbin_price) max_bin = max(200, info.round_down(futbin_price * futbin_multiplier, Global.rounding_tiers[tier])) if increase_each_round: max_bin += Global.rounding_tiers[tier] * iteration include = [] if quality and quality.lower() == 'special' and int(player['asset_id']) <= 300000: special_ids = info.get_special_ids(player['asset_id']) for s in list(special_ids.values()): if int(s) >= 300000: include.append(s) include.append(info.get_base_id(player['asset_id'])) include.append(player.get('asset_id', None)) elif int(player['asset_id']) > 300000: include.append(player['asset_id']) include.append(info.get_base_id(player['asset_id'])) snipe_criteria = { 'search_type': 'Players', 'player': player['asset_id'], 'quality': quality, 'position': None, 'chem_style': None, 'nation': None, 'league': None, 'club': None, 'min_bin': None, 'include': include, 'exclude': None, } snipe_result = common_snipe(obj=obj, snipe_criteria=snipe_criteria, name=name, strategy='acquire', price=max_bin, max_item_buys=1, sell_acquired_if_full=sell_acquired_if_full, **snipe_settings) if snipe_result == 'too many': multi_log(obj, 'Lots of results returned. Trying to get this cheaper by bidding...') max_bin -= Global.rounding_tiers[tier] elif snipe_result > 0: acquired.append((name, max_bin)) for i, player_id in enumerate(remaining_players): if str(player_id) == str(player['asset_id'] or str(player_id) in include): remaining_players.pop(i) break continue if obj.get_credits() > player['futbin_price']: num_bids = common_hunt(obj=obj, name=name, hunt_criteria=snipe_criteria, price=max_bin, strategy='acquire', max_item_bids=1, **hunt_settings) if num_bids == 'limit': common_wait_to_expire(obj, 'acquire', remaining_players, acquired, sell_acquired_if_full=sell_acquired_if_full) break elif num_bids == 'owned' or num_bids == 'sniped': acquired.append((name, max_bin)) for i, player_id in enumerate(remaining_players): if str(player_id) == str(player['asset_id']) or str(player_id) in include: remaining_players.pop(i) break else: bids += num_bids if bids > 0: remaining_players, acquired = common_wait_to_expire(obj, 'acquire', remaining_players, acquired, sell_acquired_if_full=sell_acquired_if_full) if increase_each_round and iteration <= max_increases: iteration += 1 if len(remaining_players) > 0: multi_log(obj, message='Increasing search price by {} step(s)'.format(min(iteration, max_increases))) multi_log(obj, message='Got all players!', level='green', notify=True, title='DONE') print('Acquired:') print('-' * 50) print('{:<30} {:<6}'.format('Name', 'Price')) for player in acquired: print('{:<30} {:<6}'.format(player[0], player[1])) return 'done'
def find_player(obj, player_to_search): obj.go_to('players') search_button = obj.__get_class__('searchAction', as_list=False) obj.__click_element__(search_button) rating = None quality = 'Special' search_panel = obj.__get_class__('searchContainer', as_list=False) sleep(Global.micro_min / 2) name_list = [] if type(player_to_search) is int or (type(player_to_search) is str and any(n in player_to_search for n in '1234567890')): have_id = True try: db_player = Global.fifa_players[player_to_search] except KeyError: multi_log(obj, 'No player with id {} in fifa_players.json'.format(player_to_search), level='error') try: player_to_search = info.get_base_id(player_to_search) db_player = Global.fifa_players[player_to_search] except KeyError: return 'no_name' name_list = [db_player['first_name'], db_player['last_name'], db_player['surname']] temp_names = [] for name in name_list: if name: temp_names.append(name) name_list = temp_names if len(name_list) == 3: name_list = [name_list[2], name_list[0] + ' ' + name_list[1], name_list[0] + ' ' + name_list[2], name_list[1] + ' ' + name_list[2], name_list[1] + ' ' + name_list[0], name_list[1], name_list[2] + ' ' + name_list[0], name_list[2] + ' ' + name_list[1], name_list[0]] elif len(name_list) == 2: name_list = [name_list[0] + ' ' + name_list[1], name_list[1] + ' ' + name_list[0], name_list[1], name_list[0]] if not rating and int(player_to_search) < 300000: try: rating = Global.fifa_players[player_to_search]['rating'] except KeyError: pass else: have_id = False name = player_to_search.title() name_list.append(name) name_found = False while not name_found: if not name_list: multi_log(obj, message='Unable to find {}.'.format(player_to_search)) return [] name = name_list[0] name_box = search_panel.find_element_by_class_name('textInput') obj.__type_element__(name_box, name) name_parent = name_box.find_element_by_xpath('..') sleep(Global.micro_max) result_list = name_parent.find_element_by_tag_name('ul') results = result_list.find_elements_by_class_name('btn-text') if not results: if len(name_list) <= 1: multi_log(obj, 'Unable to find results for {}'.format(player_to_search), level='warn', notify=True, title='Search Error') return [] else: og_name = name new_name = name_list[1] multi_log(obj, '\"{}\" not found. Trying \"{}\"'.format(og_name, new_name), level='debug') search_panel = obj.__get_class__('ClubSearchFilters', as_list=False) name_list = name_list[1:] else: for r in results: if have_id: if rating and len(results) > 1: result_parent = r.find_element_by_xpath('..') result_rating = result_parent.find_element_by_class_name('btn-subtext').text if str(rating) == str(result_rating): obj.__click_element__(r) name_found = True break else: try: obj.__click_element__(r) name_found = True break except StaleElementReferenceException: return [] else: if name.lower() in parse.remove_accents(r.text).lower(): if rating and len(results) > 1: result_parent = r.find_element_by_xpath('..') result_rating = result_parent.find_element_by_class_name('btn-subtext').text if str(rating) == str(result_rating): obj.__click_element__(r) name_found = True break else: obj.__click_element__(r) name_found = True break if not name_found: name_list = name_list[1:] quality = quality.title() quality_dropdown = search_panel.find_element_by_xpath(".//*[contains(text(), 'Quality')]") obj.__click_element__(quality_dropdown) sleep(5) quality_parent = quality_dropdown.find_element_by_xpath('..') obj.__check_for_errors__() quality_parent.find_element_by_xpath(".//*[contains(text(), '{}')]".format(quality)).click() obj.__click_element__(search_panel.find_element_by_xpath(".//*[contains(text(), 'Search')]")) sleep(Global.small_min) results = obj.__get_items__(get_price=False) return results
gain_config_file = '\\'.join( directory.split('\\')[:-2]) + '\config\\bot{}.yml'.format(gain_coins) with open(gain_config_file) as config: gain_config = yaml.load(config) settings = gain_config['coin_transfer'] remaining = [] sorted_players = result = sorted(settings['players'], key=lambda x: x['expires']) for player in sorted_players: if str(player['lose_coins']) == str( lose_coins) and player['expires'] > datetime.now(): remaining.append(player) while len(remaining) > 0: for i, player in enumerate(remaining): asset_id = player['asset_id'] base_id = info.get_base_id(asset_id) name = info.get_player_info(base_id, include_futbin_price=False)['name'] bid_price = player['start_price'] bin_price = player['bin_price'] multi_log( None, 'Received coin transfer information. Waiting until {} is near expiration' .format(name)) expires = player['expires'] multi_log( None, '{} will expire at {}'.format( name, '{0:%H:%M on %m/%d}'.format(expires))) start = expires - timedelta(minutes=5) while True: now = datetime.now()
def add_player(player_to_search): rating = None quality = 'Special' search_panel = obj.__get_class__('ClubSearchFilters', as_list=False) sleep(Global.micro_min / 2) name_list = [] if type(player_to_search) is int or (type(player_to_search) is str and any(n in player_to_search for n in '1234567890')): have_id = True if int(player_to_search) >= 300000: quality = 'Special' try: db_player = Global.fifa_players[player_to_search] except KeyError: try: player_to_search = info.get_base_id(player_to_search) db_player = Global.fifa_players[player_to_search] except KeyError: multi_log( obj, 'No player with id {} in fifa_players.json, Unable to find player' .format(player_to_search), level='error') return 'no_name' name_list = [ db_player['first_name'], db_player['last_name'], db_player['surname'] ] temp_names = [] for name in name_list: if name: temp_names.append(name) name_list = temp_names if len(name_list) == 3: name_list = [ name_list[2], name_list[0] + ' ' + name_list[1], name_list[0] + ' ' + name_list[2], name_list[1] + ' ' + name_list[2], name_list[1] + ' ' + name_list[0], name_list[1], name_list[2] + ' ' + name_list[0], name_list[2] + ' ' + name_list[1], name_list[0] ] elif len(name_list) == 2: name_list = [ name_list[0] + ' ' + name_list[1], name_list[1] + ' ' + name_list[0], name_list[1], name_list[0] ] if not rating and int(player_to_search) < 300000: try: rating = Global.fifa_players[player_to_search]['rating'] except KeyError: pass else: have_id = False name = player_to_search.title() name_list.append(name) name_found = False while not name_found: if not name_list: multi_log( obj, message='Unable to find {}.'.format(player_to_search)) return [] name = name_list[0] name_box = search_panel.find_element_by_class_name('textInput') obj.__type_element__(name_box, name) name_parent = name_box.find_element_by_xpath('..') sleep(Global.micro_max) result_list = name_parent.find_element_by_tag_name('ul') results = result_list.find_elements_by_class_name('btn-text') if not results: if len(name_list) <= 1: multi_log(obj, 'Unable to find results for {}'.format( player_to_search), level='warn', notify=True, title='Search Error') return [] else: og_name = name new_name = name_list[1] multi_log(obj, '\"{}\" not found. Trying \"{}\"'.format( og_name, new_name), level='debug') search_panel = obj.__get_class__('ClubSearchFilters', as_list=False) name_list = name_list[1:] else: for r in results: if have_id: if rating and len(results) > 1: result_parent = r.find_element_by_xpath('..') result_rating = result_parent.find_element_by_class_name( 'btn-subtext').text if str(rating) == str(result_rating): obj.__click_element__(r) name_found = True break else: try: obj.__click_element__(r) name_found = True break except StaleElementReferenceException: return [] else: if name.lower() in parse.remove_accents( r.text).lower(): if rating and len(results) > 1: result_parent = r.find_element_by_xpath('..') result_rating = result_parent.find_element_by_class_name( 'btn-subtext').text if str(rating) == str(result_rating): obj.__click_element__(r) name_found = True break else: obj.__click_element__(r) name_found = True break if not name_found: name_list = name_list[1:] if quality is not None: quality = quality.title() quality_dropdown = search_panel.find_element_by_xpath( ".//*[contains(text(), 'Quality')]") obj.__click_element__(quality_dropdown) sleep(5) quality_parent = quality_dropdown.find_element_by_xpath('..') obj.__check_for_errors__() quality_parent.find_element_by_xpath( ".//*[contains(text(), '{}')]".format(quality)).click() else: try: obj.__click_element__( search_panel.find_element_by_xpath( './/div[3]/div[2]/div[3]/div/a') ) # Remove quality filter except ElementNotVisibleException: pass obj.__click_element__( search_panel.find_element_by_xpath( './/div[3]/div[2]/div[4]/div/a')) # Remove position filter obj.__click_element__( search_panel.find_element_by_xpath( ".//*[contains(text(), 'Search')]")) sleep(Global.small_min) results = obj.__get_class__('MyClubResults', as_list=False) if not results: multi_log( obj, 'Missing {} for SBC solution'.format( info.get_player_info(player_to_search, False)['name'])) return False try: results.find_element_by_class_name('has-action').click() obj.__click_xpath__(".//*[contains(text(), 'Swap Player')]") return True except (TimeoutException, ElementNotVisibleException, NoSuchElementException): pass multi_log( obj, 'Missing {} for coin transfer'.format( info.get_player_info(player_to_search, False)['name'])) return False
def common_hunt(obj, name, hunt_criteria, strategy, price=0, max_item_bids=10, max_futbin_update=259200, min_time_left=30, max_time_left=420, use_buy_percent=True, min_profit=250, fight=False, use_max_buy=True, max_prp=None, sell_acquired_if_full=True, prices_dict=None): """ hunt_criteria = { 'search_type': 'Players', 'player': player_id, 'quality': None, 'position': None, 'chem_style': None, 'nation': None, 'league': None, 'club': None, 'min_bin': None, 'include': None, 'exclude': None, } """ def bid_on_results(results, num_bids, max_buy): if len(results) > 0: to_bid = [] for r in results: if min_time_left <= r['time_left'] <= max_time_left and (r['current_bid'] + Global.rounding_tiers[tier] <= max_buy or (r['current_bid'] == r['start_price'] and r['start_price'] <= max_buy)) and \ (hunt_criteria['search_type'].lower() != 'players' or ((not include and hunt_criteria['player'] == r['resource_id']) or (r['resource_id'] in include))): to_bid.append(r) if len(to_bid) == 0: multi_log(obj, 'Nothing worth bidding on', level='yellow') else: if use_max_buy: sorted_bids = sorted(to_bid, key=itemgetter('time_left')) else: sorted_bids = sorted(to_bid, key=itemgetter('current_bid')) for item in sorted_bids: try: futbin_price, updated = info.get_price( item['resource_id'], return_updated=True) if updated > max_futbin_update: continue result_tier = info.get_tier(futbin_price) result_buy_percent = obj.bin_settings[result_tier][ 'buy_percent'] if strategy != 'acquire' and strategy != 'price_fix': if not use_buy_percent: max_buy = info.round_down( (futbin_price * 0.95 * dynamic_profit(obj) * obj.bin_settings[result_tier] ['sell_percent']) - min_profit, Global.rounding_tiers[result_tier]) else: max_buy = info.round_down( (futbin_price * result_buy_percent * dynamic_profit(obj)), Global.rounding_tiers[result_tier]) except (KeyError, TypeError): continue if num_bids < max_item_bids: if use_max_buy: my_bid = max_buy elif strategy == 'acquire' and not use_max_buy: my_bid = max_buy - ( 2 * obj.bin_settings[result_tier]['spread']) else: my_bid = min( max_buy, item['current_bid'] + Global.rounding_tiers[result_tier]) if item['current_bid'] + Global.rounding_tiers[ result_tier] <= my_bid or ( item['current_bid'] == item['start_price'] and item['current_bid'] <= my_bid): try: bid_result = obj.bid(item, my_bid) if bid_result == 'limit': return 'limit' elif bid_result: num_bids += 1 if num_bids >= max_item_bids: break except StaleElementReferenceException: pass except Exception as e: multi_log(obj, '[{}]: Hunt BID error: {}'.format( strategy, e), level='error') continue else: multi_log( obj, 'HUNT PRICING ERROR: STRATEGY: {} | r[bnp]: {} | max: {} | len(res): {} |\ crit[type]: {} | player: {} | result: {}' .format(strategy, item['buy_now_price'], my_bid, len(search_results), hunt_criteria['search_type'], hunt_criteria['player'], item['resource_id']), level='debug') return num_bids check_sleep(obj) include = hunt_criteria.get('include', []) if not include: include = [] if (hunt_criteria.get('player', False) and int(hunt_criteria['player']) <= 300000) and (hunt_criteria['quality'] and hunt_criteria['quality'].lower() == 'special'): special_ids = info.get_special_ids(hunt_criteria['player']) for s in list(special_ids.values()): if int(s) >= 300000: include.append(s) include.append(info.get_base_id(hunt_criteria['player'])) include.append(hunt_criteria.get('player', None)) else: bids = 0 if hunt_criteria.get('player', False) and price == 0: price_data = info.get_price(hunt_criteria['player'], obj=obj, return_updated=True, return_prp=True) if price_data == 0: return 0 price = price_data[0] updated = price_data[1] prp = price_data[2] else: updated = None prp = None if obj.get_credits() > price and (not updated or updated <= max_futbin_update) and ( not max_prp or prp <= max_prp): tier = info.get_tier(price) profit_buy_percent = obj.bin_settings[tier]['buy_percent'] if hunt_criteria.get('max_buy', None): price = hunt_criteria['max_buy'] hunt_criteria = { k: v for k, v in hunt_criteria.items() if k != 'max_buy' } else: price = info.round_down(price, Global.rounding_tiers[tier]) if strategy != 'acquire' and strategy != 'price_fix' and 'consumable' not in strategy: if not use_buy_percent: max_buy = info.round_down( (price * 0.95 * dynamic_profit(obj) * obj.bin_settings[tier]['sell_percent']) - min_profit, Global.rounding_tiers[tier]) else: max_buy = info.round_down( (price * profit_buy_percent * dynamic_profit(obj)), Global.rounding_tiers[tier]) else: max_buy = price multi_log( obj, '[{}]: Hunting for {} at {}.'.format(strategy.title(), name, max_buy)) longest_time_left = 0 hunt_criteria = { k: v for k, v in hunt_criteria.items() if k != 'max_buy' } search_results = obj.search(max_buy=max_buy, **hunt_criteria) while longest_time_left < min_time_left: if len(search_results) == 0: multi_log(obj, 'Nothing worth bidding on', level='yellow') break else: longest_time_left = search_results[-1]['time_left'] if longest_time_left < min_time_left: try: nav_bar = obj.__get_class__('pagingContainer', as_list=False) except (ElementNotVisibleException, NoSuchElementException, TimeoutException): nav_bar = obj.__get_class__('mainHeader', as_list=False) try: next_btn = nav_bar.find_element_by_class_name('next') obj.__click_element__(next_btn) obj.keep_alive(Global.micro_max) search_results = obj.__get_items__(get_price=True) except (ElementNotVisibleException, NoSuchElementException, TimeoutException, StaleElementReferenceException): break else: break bids = bid_on_results(search_results, bids, max_buy) if bids == 'limit': return 'limit' elif type(bids) is str: return bids while bids < max_item_bids and longest_time_left <= max_time_left: try: nav_bar = obj.__get_class__('pagingContainer', as_list=False) except (ElementNotVisibleException, NoSuchElementException, TimeoutException): nav_bar = obj.__get_class__('mainHeader', as_list=False) try: next_btn = nav_bar.find_element_by_class_name('next') errors = obj.__check_for_errors__() if errors == 'limit': return 'limit' obj.__click_element__(next_btn) obj.keep_alive(Global.micro_max) search_results = obj.__get_items__(get_price=True) least_time_left = search_results[0]['time_left'] longest_time_left = search_results[-1]['time_left'] if least_time_left > max_time_left: break amt_bids = bid_on_results(search_results, bids, max_buy) if amt_bids == 'limit': return 'limit' else: try: bids += amt_bids except TypeError: pass if longest_time_left > max_time_left: break except (ElementNotVisibleException, NoSuchElementException, TimeoutException): break print(' ') if fight: common_fight(obj, strategy, use_buy_percent, min_profit) return bids