Alexell / XEmpireBot

Bot that earn money in X Empire (Musk Empire)
137 stars 35 forks source link

Улучшение навыков / Skill Improvement #2

Closed ButCheR-PRO closed 3 months ago

ButCheR-PRO commented 4 months ago

Как насчет того чтобы добавить логику покупки выгодных карточек, как это сделано в HamsterKombatBot? Добавлять в очередь и сравнивать какую в первую очередь покупать по соотношении доход / цена.

Alexell commented 4 months ago

Над этим я буду работать после того, как реализую переговоры. Хотя я не планирую так заморачиваться с логикой, я хочу просто сделать прокачку всех карточек до уровня, указанного в .env

zv09 commented 4 months ago

Чтобы не заморачиваться, можно посмотреть как в Хамстере решали это. Лямбдой сортировка соотношением PpH к Стоимости апгрейда. В ту или иную сторону:

def sorted_by_profit(prepared):
    return sorted(prepared, key=lambda x: x["profitPerHourDelta"], reverse=True)

def sorted_by_profitness(prepared):
    return sorted(prepared, key=lambda x: x['profitPerHourDelta'] / x['price'], reverse=True)

def sorted_by_price(prepared):
    return sorted(prepared, key=lambda x: x["price"], reverse=False)

def sorted_by_payback(prepared):
    return sorted(prepared, key=lambda x: x['price'] / x['profitPerHourDelta'], reverse=False)
        - price -> покупать самую дешевую
        - payback -> покупать ту, что быстрей всего окупится
        - profit -> покупать самую прибыльну
        - profitness -> покупать самую профитную (сколько добыча на каждый потраченный поинт)
Deftus commented 4 months ago

Бро сделай авто улучшение карточек ,это было бы мега круто, спасибо за твой труд!

ButCheR-PRO commented 4 months ago

Чтобы не заморачиваться, можно посмотреть как в Хамстере решали это.

В Хомяке придумали такую логику:

  1. https://github.com/shamhi/HamsterKombatBot/issues/142
BigNeam commented 4 months ago

Спасибо за бота . Буду ждать обнову с авто прокачкой карточек

Ashaxer commented 4 months ago

Google Translated Я пытался написать код, но облажался. но я написал логику покупки наиболее выгодных карт. логика расчета прибыли и цен взята из самих игровых кодов. Оцените это Как правило, вы можете найти прибыльную покупку, передавkill_entity и target_level в get_price() или get_profit().

I tried to write the code but I fd up. but I wrote a logic to buy most profitable cards. the logic for calculating the profits and prices are from the game codes itself. Checkout this Generally you can find the profit buy passing skill_entity and target_level to get_price() or get_profit()

BigNeam commented 4 months ago

Google Translate Я писал код, но облажался. Но я написал логику покупки наиболее выгодных карт. логика расчета прибыли и цен взята из собственных кодов игровых автоматов. Оцените это. Как правило, вы можете найти прибыльную покупку, передавkill_entity и target_level в get_price() или get_profit().

Я пытался написать код, но у меня ничего не вышло. но я написал логику для покупки самых прибыльных карт. логика для расчета прибыли и цен взята из самих кодов игры. Проверьте это. Обычно вы можете найти прибыльную покупку, передавая skill_entity и target_level в get_price() или get_profit()

Посмотри это , возможно что-то получится async def run(self, proxy: str | None) -> None: proxy_conn = ProxyConnector().from_url(proxy) if proxy else None

async with aiohttp.ClientSession(headers=headers, connector=proxy_conn) as http_client:
    self.http_client = http_client
    if proxy:
        await self.check_proxy(proxy=proxy)

    self.authorized = False
    while True:
        if self.errors >= config.ERRORS_BEFORE_STOP:
            log.error(f"{self.session_name} | Bot stopped (too many errors)")
            break
        try:
            if not self.authorized:
                login_data = await self.get_tg_web_data(proxy=proxy)
                if await self.login(json_data=login_data):
                    log.success(f"{self.session_name} | Login successful")
                    self.authorized = True
                    self.http_client.headers['Api-Key'] = self.api_key
                    self.dbs = await self.get_dbs()
                    full_profile = await self.get_profile(full=True)
                    if self.user_id is None: self.user_id = int(full_profile['data']['profile']['id'])
                    self.balance = int(full_profile['data']['hero']['money'])
                    offline_bonus = int(full_profile['data']['hero']['offlineBonus'])
                    if offline_bonus > 0:
                        if await self.get_offline_bonus():
                            log.success(f"{self.session_name} | Offline bonus claimed: +{offline_bonus}")
                    else:
                        log.info(f"{self.session_name} | Offline bonus not available")
                else:
                    continue

            profile = await self.get_profile(full=False)
            self.balance = int(profile['data']['hero']['money'])
            log.info(f"{self.session_name} | Level: {profile['data']['hero']['level']} | "
                            f"Balance: {self.balance} | "
                            f"Money per hour: {profile['data']['hero']['moneyPerHour']}")

            daily_rewards = full_profile['data']['dailyRewards']
            daily_index = None
            for day, status in daily_rewards.items():
                if status == 'canTake':
                    daily_index = day
                    break
            if daily_index is not None:
                log.info(f"{self.session_name} | Daily reward available")
                daily_claimed = await self.daily_reward(index=daily_index)
                if daily_claimed:
                    log.success(f"{self.session_name} | Daily reward claimed")
                    self.errors = 0
            else:
                log.info(f"{self.session_name} | Daily reward not available")

            unrewarded_quests = [quest['key'] for quest in full_profile['data']['quests'] if not quest['isRewarded']]
            if unrewarded_quests:
                log.info(f"{self.session_name} | Quest rewards available")
                for quest in unrewarded_quests:
                    if await self.quest_reward(quest=quest):
                        log.success(f"{self.session_name} | Reward for quest {quest} claimed")

            await self.daily_quests()

            unrewarded_friends = [int(friend['id']) for friend in full_profile['data']['friends'] if friend['bonusToTake'] > 0]
            if unrewarded_friends:
                log.info(f"{self.session_name} | Reward for friends available")
                for friend in unrewarded_friends:
                    if await self.friend_reward(friend=friend):
                        log.success(f"{self.session_name} | Reward for friend {friend} claimed")

            if config.TAPS_ENABLED:
                per_tap = profile['data']['hero']['earns']['task']['moneyPerTap']
                max_energy = profile['data']['hero']['earns']['task']['limit']
                energy = profile['data']['hero']['earns']['task']['energy']
                if energy == max_energy:
                    await self.perform_taps(per_tap=per_tap, energy=energy)

            if config.PVP_ENABLED:
                if self.dbs:
                    league_data = None
                    for league in self.dbs['dbNegotiationsLeague']:
                        if league['key'] == config.PVP_LEAGUE:
                            league_data = league
                            break;

                    if league_data is not None:
                        if int(profile['data']['hero']['level']) >= int(league_data['requiredLevel']):
                            self.strategies = [strategy['key'] for strategy in self.dbs['dbNegotiationsStrategy']]
                            if config.PVP_STRATEGY == 'random' or config.PVP_STRATEGY in self.strategies:
                                await self.perform_pvp(league=league_data, strategy=config.PVP_STRATEGY, count=config.PVP_COUNT)
                            else:
                                config.PVP_ENABLED = False
                                log.warning(f"{self.session_name} | PVP_STRATEGY param is invalid. PvP negotiations disabled.")
                        else:
                            config.PVP_ENABLED = False
                            log.warning(f"{self.session_name} | Your level is too low for the {config.PVP_LEAGUE} league. PvP negotiations disabled.")
                    else:
                        config.PVP_ENABLED = False
                        log.warning(f"{self.session_name} | PVP_LEAGUE param is invalid. PvP negotiations disabled.")
                else:
                    log.warning(f"{self.session_name} | Database is missing. PvP negotiations will be skipped this time.")

            # Автопрокачка карточек
            can_upgrade, best_skill = await self.calculate_best_purchase(full_profile, profile, self.dbs, full_profile, time.time(), time.time())
            if can_upgrade:
                if await self.upgrade_card(card_id=best_skill['key']):
                    log.success(f"{self.session_name} | Card {best_skill['key']} upgraded to level {best_skill['newlevel']}")

            profile = await self.get_profile(full=False)
            self.balance = int(profile['data']['hero']['money'])
            log.info(f"{self.session_name} | Level: {profile['data']['hero']['level']} | "
                            f"Balance: {self.balance} | "
                            f"Money per hour: {profile['data']['hero']['moneyPerHour']}")

            log.info(f"{self.session_name} | Sleep 1 hour")
            await asyncio.sleep(3600)
            self.authorized = False

        except RuntimeError as error:
            raise error
        except Exception as error:
            log.error(f"{self.session_name} | Unknown error: {error}")
            await asyncio.sleep(delay=3)
Alexell commented 4 months ago

Пожалуйста, имейте терпение, я займусь этим вопросом. Но сейчас тестирую другое обновление, как только я закончу с ним, смогу переключить свое внимание на вопрос со скилами. __ Please be patient, I will look into this issue. I am currently testing another update, once I am done with that I will be able to shift my attention to the skills issue.

@Ashaxer It is not necessary to translate, you can write in English.

ButCheR-PRO commented 4 months ago

Начиная с 20 уровня, в меню прокачки карточек, появился новый раздел ИИ, помимо Персональные, Офис, Команда. musk1

BigNeam commented 4 months ago

Начиная с 20 уровня, в меню прокачки карточек появился новый раздел II, кроме Персональные, Офисы, Команды. мускус1

Разве функцию авто прокачка карточек добавили ?

BigNeam commented 4 months ago

Так и не получается сделать автопрокачку карточек ?

Alexell commented 4 months ago

Я еще не начинал, времени свободного мало. Если завтра силы будут, начну.

Alexell commented 4 months ago

Прошу прощения, что реализация улучшения навыков затянулась. Мне по работе тоже надо писать код и я устаю, да и времени свободного не так много. Кроме того, некоторые из недавних обновлений бота нужно было сделать именно до прокачки скиллов, чтобы бот был готов к тому, что уровень героя может измениться прямо во время работы. Так что все сделано в нужном порядке. Итак, улучшение навыков готово. Я использовал немного измененный код от @Ashaxer, так что спасибо ему за то что избавил меня от математики. Пользуйтесь! __ I apologize for the delay in implementing the skill upgrade feature. I have to write code for work as well, and it can be tiring, plus I don't have much free time. Additionally, some of the recent updates to the bot had to be done before implementing the skill upgrades to ensure the bot could handle changes in the hero's level during operation. So everything was done in the correct order.

Now, the skill upgrade feature is ready. I used a slightly modified version of @Ashaxer code, so thanks to him for sparing me from the math. Enjoy!

BigNeam commented 4 months ago

Прошущения, что реализация улучшенных функций затянулась. Мне на работе тоже надо писать, и я устаю, да и свободного времени не так уж и много. Кроме того, в некоторых из недавних обновленных ботов нужно было сделать именно прокачки скиллов, чтобы бот был готов к тому, что уровень героя может меняться прямо во время работы. Так что все сделано в нужном порядке. Итак, улучшение навыков готово . Я использовал немного измененный код от@Ashaxer, так что спасибо ему за то что избавил меня от математики. Пользуйтесь! __ Я извиняюсь за задержку с реализацией функции улучшения навыков. Мне также приходится писать код для работы, и это может быть утомительно, плюс у меня не так много свободного времени. Кроме того, некоторые из последних обновлений бота должны были быть сделаны до реализации улучшений навыков, чтобы гарантировать, что бот сможет обрабатывать изменения уровня героя во время работы. Поэтому все было сделано в правильном порядке.

Теперь функция улучшения навыков готова . Я использовал слегка измененную версию@Ashaxercode, так что спасибо ему за то, что избавил меня от математики. Наслаждайтесь!

Спасибо большое