HamsterKombatBot icon indicating copy to clipboard operation
HamsterKombatBot copied to clipboard

Опция покупки карт

Open Geo2005 opened this issue 1 year ago • 15 comments

Было бы неплохо иметь опцию, в которой можно указать предельное соотношение цена \ доход. Иначе часто покупает абсолютно не выгодные карты за бешеную цену, когда через пять минут откроется другая, очень выгодная.

Geo2005 avatar Aug 16 '24 17:08 Geo2005

if settings.AUTO_UPGRADE is True:
    for _ in range(settings.UPGRADES_COUNT):
        available_upgrades = [
            data for data in upgrades
            if data['isAvailable'] is True
                and data['isExpired'] is False
                and data.get('cooldownSeconds', 0) == 0
                and data.get('maxLevel', data['level']) >= data['level']
        ]

        queue = []

        for upgrade in available_upgrades:
            upgrade_id = upgrade['id']
            level = upgrade['level']
            price = upgrade['price']
            profit = upgrade['profitPerHourDelta']

            # Calculate price/profit ratio
            price_profit_ratio = price / max(profit, 1)

            # Check if ratio meets the threshold
            if price_profit_ratio <= settings.PRICE_PROFIT_THRESHOLD:
                significance = profit / max(price, 1)

                free_money = balance - settings.BALANCE_TO_SAVE
                max_price_limit = earn_on_hour * 5

                if ((free_money * 0.7) >= price
                        and profit > 0
                        and level <= settings.MAX_LEVEL
                        and price <= settings.MAX_PRICE
                        and price < max_price_limit):
                    heapq.heappush(queue, (-significance, upgrade_id, upgrade))

        if not queue:
            continue

        top_card = heapq.nsmallest(1, queue)[0]

        upgrade = top_card[2]

        upgrade_id = upgrade['id']
        level = upgrade['level']
        price = upgrade['price']
        profit = upgrade['profitPerHourDelta']

        logger.info(f"{self.session_name} | Sleep <lw>5s</lw> before upgrade <le>{upgrade_id}</le>")
        await asyncio.sleep(delay=5)

        status, upgrades = await buy_upgrade(http_client=http_client, upgrade_id=upgrade_id)

        if status is True:
            earn_on_hour += profit
            balance -= price
            logger.success(f"{self.session_name} | "
                           f"Successfully upgraded <le>{upgrade_id}</le> with price <lr>{price:,}</lr> to <m>{level}</m> lvl | "
                           f"Earn every hour: <ly>{earn_on_hour:,}</ly> (<lg>+{profit:,}</lg>) | "
                           f"Money left: <le>{balance:,}</le>")

            await asyncio.sleep(delay=1)

            continue

Geo2005 avatar Aug 17 '24 06:08 Geo2005

Замени price_profit_ratio = price / max(profit, 1) на price_profit_ratio = price / (max(profit, 1) * max(profit, 1)) и будет тебе счастье.

Например, доходность от карты с ценой 1 монету на 10 монет в час такая же, как и у карты с ценой 10 монет на 100 монет в час, а именно = 0.1, но если посчитать ещё цену и за такой профит, то получается, что покупать за 100 монет такой же профит 0.1 не выгодно, чем купить такой же профит всего за 10 монет, поэтому считается эффективная стоимость покупки такого профита. Как в физике есть скорость м/с, а есть ускорение м/с^2. Так и тут, мы считаем стоимость ускорения, а не стоимость скорости.

Далее, из условия

if ((free_money * 0.7) >= price
                        and profit > 0
                        and level <= settings.MAX_LEVEL
                        and price <= settings.MAX_PRICE
                        and price < max_price_limit):
                    heapq.heappush(queue, (-significance, upgrade_id, upgrade))

убери сравнение free_money * 0.7 с прайсом. Пусть в очередь добавляются все, даже те, на которые сейчас не хватает денег. Но добавь условие if free_money >= price: перед отправкой запроса на покупку, чтобы оно не спамило на сервер даже если денег не хватает:

if free_money >= price:
    status, upgrades = await buy_upgrade(http_client=http_client, upgrade_id=upgrade_id)

Таким образом бот будет ждать самую выгодную из всех карт с минимальной ценой за самый высокий профит, но если окончится время кулдауна, и он окажется выгоднее ожидаемой карты, то будет сначала куплена карта с кулдауном, а потом опять продолжится ожидание покупки самой выгодной на текущий момент.

ghost avatar Aug 17 '24 09:08 ghost

Данный алгоритм можно усовершенствовать, если из условия:

if data['isAvailable'] is True
        and data['isExpired'] is False
        and data.get('cooldownSeconds', 0) == 0
        and data.get('maxLevel', data['level']) >= data['level']

удалить строку and data.get('cooldownSeconds', 0) == 0, то если карта с кулдауном будет выгоднее всех, то бот будет ожидать её до посинения, если она является на текущий момент самой выгодной из всех даже если текущих денег хватает и на другие карты.

ghost avatar Aug 17 '24 10:08 ghost

а кто-нибудь может залить готовый tapper.py со всеми улучшайзерами? думаю, многие будут благодарны

pekatron9000 avatar Aug 17 '24 12:08 pekatron9000

Замени price_profit_ratio = price / max(profit, 1) на price_profit_ratio = price / (max(profit, 1) * max(profit, 1)) и будет тебе счастье.

Например, доходность от карты с ценой 1 монету на 10 монет в час такая же, как и у карты с ценой 10 монет на 100 монет в час, а именно = 0.1, но если посчитать ещё цену и за такой профит, то получается, что покупать за 100 монет такой же профит 0.1 не выгодно, чем купить такой же профит всего за 10 монет, поэтому считается эффективная стоимость покупки такого профита. Как в физике есть скорость м/с, а есть ускорение м/с^2. Так и тут, мы считаем стоимость ускорения, а не стоимость скорости.

Далее, из условия

if ((free_money * 0.7) >= price
                        and profit > 0
                        and level <= settings.MAX_LEVEL
                        and price <= settings.MAX_PRICE
                        and price < max_price_limit):
                    heapq.heappush(queue, (-significance, upgrade_id, upgrade))

убери сравнение free_money * 0.7 с прайсом. Пусть в очередь добавляются все, даже те, на которые сейчас не хватает денег. Но добавь условие if free_money >= price: перед отправкой запроса на покупку, чтобы оно не спамило на сервер даже если денег не хватает:

if free_money >= price:
    status, upgrades = await buy_upgrade(http_client=http_client, upgrade_id=upgrade_id)

Таким образом бот будет ждать самую выгодную из всех карт с минимальной ценой за самый высокий профит, но если окончится время кулдауна, и он окажется выгоднее ожидаемой карты, то будет сначала куплена карта с кулдауном, а потом опять продолжится ожидание покупки самой выгодной на текущий момент.

помоги плиз, немного не понял как тут заменить image

SmILeTheMobster avatar Aug 17 '24 12:08 SmILeTheMobster

Подмени тот файл этим. Он будет ждать до последнего карточку с кулдауном, если она выгоднее даже той, у которой кулдаун прошёл. Но если выгода у той, которая уже не на кулдауне будет выше, а это обычно именно так, то будет куплена дешёвая без кулдауна. Внимание, тут убраны пороги на максимальную сумму покупки и на максимальный уровень. То есть сливать будет всё до последней копейки по порядку выгодности. tapper.zip

ghost avatar Aug 17 '24 13:08 ghost

Подмени тот файл этим. Он будет ждать до последнего карточку с кулдауном, если она выгоднее даже той, у которой кулдаун прошёл. Но если выгода у той, которая уже не на кулдауне будет выше, а это обычно именно так, то будет куплена дешёвая без кулдауна. Внимание, тут убраны пороги на максимальную сумму покупки и на максимальный уровень. То есть сливать будет всё до последней копейки по порядку выгодности. tapper.zip

спасибо! те, кто будут качать - не забудьте добавить токены двух последних игр

pekatron9000 avatar Aug 17 '24 13:08 pekatron9000

А я ручками качаю по такой таблице: Screenshot 2024-08-17 at 20-34-37 Upgrades List HamsterKombat

Pipulas avatar Aug 17 '24 13:08 Pipulas

есть же сайт удобный https://tapahelper.com/games/hamster_kombat

pekatron9000 avatar Aug 17 '24 13:08 pekatron9000

спасибо! те, кто будут качать - не забудьте добавить токены двух последних игр

Как получить токены, кстати?

в tapper.py найдите app_tokens и добавьте в список эти 2 новых

"dc128d28-c45b-411c-98ff-ac7726fbaea4": "8d1cc2ad-e097-4b86-90ef-7a27e19fb833", "61308365-9d16-4040-8bb0-2f4a4c69074c": "61308365-9d16-4040-8bb0-2f4a4c69074c"

pekatron9000 avatar Aug 17 '24 14:08 pekatron9000

Все ответы отличные, но все же, Основной посыл заключался как раз в том, чтобы сделать опцию для пользователя с выбором соотношения цена профит и прокачкой только выгодных карт, даже если есть кулдаун. Без вырезки других ограничений. Как это реализовать?

Geo2005 avatar Aug 17 '24 21:08 Geo2005

tapper.zip

Прикладываю оригинальный файл таппера с добавлением токенов двух новых игр (что выше выложили)

Geo2005 avatar Aug 17 '24 21:08 Geo2005

Подмени тот файл этим. Он будет ждать до последнего карточку с кулдауном, если она выгоднее даже той, у которой кулдаун прошёл. Но если выгода у той, которая уже не на кулдауне будет выше, а это обычно именно так, то будет куплена дешёвая без кулдауна. Внимание, тут убраны пороги на максимальную сумму покупки и на максимальный уровень. То есть сливать будет всё до последней копейки по порядку выгодности. tapper.zip

Не помешало бы вернуть сюда пороги и добавить сеттингс в файл .env.

Еще один тонкий нюанс очереди. Не пойму - обновляется ли очередь покупки карт после покупки каждой карты? По сути - надо обновлять очередь.

Geo2005 avatar Aug 17 '24 21:08 Geo2005

Еще один тонкий нюанс очереди. Не пойму - обновляется ли очередь покупки карт после покупки каждой карты? По сути - надо обновлять очередь.

Она обновляется на каждом круге.

ghost avatar Aug 18 '24 06:08 ghost

Добавили карту, которая по показателям показывает самую высокую выгоду, она самая дешёвая и у неё кулдаун на 12 часов. Имейте в виду, если меняете логику таппера, завязанную на ожидание кулдаунов.

ghost avatar Aug 19 '24 11:08 ghost