示例#1
0
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'
示例#2
0
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
示例#5
0
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