C # SteamBot - получить состояние торгового предложения

Я получаю сообщение об ошибке, используя этот код:

var offer = Bot.NewTradeOffer(dbSteamId);

    offer.Items.AddMyItem(730, 2, 2611100148);

    if (offer.Items.NewVersion)
    {
        string newOfferId;
        if (offer.SendWithToken(out newOfferId, dbToken, dbMessage))
        {
            Log.Success("Trade offer sent : Offer ID " + newOfferId);
            Bot.TryGetTradeOffer(newOfferId, out offer);
        }
     }

Вылетает с ошибкой:

ERROR: System.NullReferenceException: Object reference not set to an instance of an object. 
at SteamTrade.TradeOffer.TradeOfferManager.IsOfferValid(Offer offer) in C:\Users\Robertas\Desktop\SteamBot-master\SteamTrade\TradeOffer\TradeOfferManager.cs:line 130
at SteamTrade.TradeOffer.TradeOfferManager.GetOffer(String offerId, TradeOffer& tradeOffer) in C:\Users\Robertas\Desktop\SteamBot-master\SteamTrade\TradeOffer\TradeOfferManager.cs:line 162
at SteamBot.Bot.TryGetTradeOffer(String offerId, TradeOffer& tradeOffer) in C:\Users\Robertas\Desktop\SteamBot-master\SteamBot\Bot.cs:line 331
at SteamBot.TradeOfferUserHandler.SendTradeOffer() in C:\Users\Robertas\Desktop\SteamBot-master\SteamBot\TradeOfferUserHandler.cs:line 81
at SteamBot.TradeOfferUserHandler.OnLoginCompleted() in C:\Users\Robertas\Desktop\SteamBot-master\SteamBot\TradeOfferUserHandler.cs:line 64
at SteamBot.Bot.<HandleSteamMessage>b__5(LoginKeyCallback callback) in C:\Users\Robertas\Desktop\SteamBot-master\SteamBot\Bot.cs:line 476
at SteamKit2.CallbackMsgExtensions.Handle[T](ICallbackMsg msg, Action`1 handler)
at SteamBot.Bot.HandleSteamMessage(ICallbackMsg msg) in C:\Users\Robertas\Desktop\SteamBot-master\SteamBot\Bot.cs:line 458
at SteamBot.Bot.BackgroundWorkerOnDoWork(Object sender, DoWorkEventArgs doWorkEventArgs) in C:\Users\Robertas\Desktop\SteamBot-master\SteamBot\Bot.cs:line 941

Любые идеи? Может быть, вы знаете другой способ проверить состояние торгового предложения? Пожалуйста, поделитесь своими идеями. Спасибо!

ОТРЕДАКТИРОВАНО:

public bool GetOffer(string offerId, out TradeOffer tradeOffer)
{
    tradeOffer = null;
    var resp = webApi.GetTradeOffer(offerId);
    if (resp != null)
    {
        if (IsOfferValid(resp.Offer))
        {
            tradeOffer = new TradeOffer(session, resp.Offer);
            return true;
        }
        else
        {
            //todo: log steam api is giving us invalid offers.
            Console.WriteLine("Offer returned from steam api is not valid : " + resp.Offer.TradeOfferId);
        }
    }
    return false;
}

соответственно. Предложение недействительно. Как он может быть нулевым? Я мог бы отметить, что все работает, когда бот отправляет на мою учетную запись, но когда он отправляет на другую учетную запись, он падает.

ОТРЕДАКТИРОВАНО №2:

Хорошо, я нашел ошибку. Это проблема, получив ответ. Когда я вызываю это(http://api.steampowered.com/IEconService/GetTradeOffer/v1/?key=48B9FCE3FE8A74ADDA29174BFD47441B&tradeofferid=530787948&language=en_us):

{
"response": {

}

}

Когда я вызываю это(http://api.steampowered.com/IEconService/GetTradeOffer/v1/?key=48B9FCE3FE8A74ADDA29174BFD47441B&tradeofferid=530796219&language=en_us):

{
"response": {
    "offer": {
        "tradeofferid": "530796219",
        "accountid_other": 213128749,
        "message": "Security Code: HqaMyUDN",
        "expiration_time": 1435675048,
        "trade_offer_state": 2,
        "items_to_receive": [
            {
                "appid": "730",
                "contextid": "2",
                "assetid": "2275856684",
                "classid": "310776767",
                "instanceid": "0",
                "amount": "1",
                "missing": false
            }
        ]
        ,
        "is_our_offer": false,
        "time_created": 1434465448,
        "time_updated": 1434465448,
        "from_real_time_trade": false
    },...

Есть идеи, почему один ответ пустой, а другой нормальный?


person Robis    schedule 16.06.2015    source источник
comment
возможный дубликат Что такое NullReferenceException и как его исправить это?   -  person Sayse    schedule 16.06.2015
comment
Как упоминалось в Sayse, проверьте ваше исключение Nullreference Exception. Отладьте свой код, проверьте, где и почему возникает исключение, и исправьте его. Если вам нужна более конкретная помощь, вы также должны быть более конкретными.   -  person Dolgsthrasir    schedule 16.06.2015
comment
Вы можете использовать декомпилятор для исследования кода IsOfferValid.   -  person Viacheslav Smityukh    schedule 16.06.2015
comment
Взгляните на РЕДАКТИРОВАТЬ   -  person Robis    schedule 16.06.2015
comment
Я не очень разбираюсь в этой конкретной технологии, но соотв. Предложение может быть нулевым, не понимаю, почему бы и нет. Как создается этот объект webApi? Вы уверены, что offerId существует в том контексте, в котором его ищет GetTradeOffer? вы сказали, что это работает для одной учетной записи, а не для другой. Может быть, он ищет, есть ли в этом аккаунте это предложение? В любом случае, мне кажется, что GetTradeOffer может вернуть нулевое предложение, поэтому вам нужно разобраться с этим, проверить, какая другая информация у вас есть, это может дать вам подсказку.   -  person Dzyann    schedule 16.06.2015
comment
Информация в соотв. разная. Почему?   -  person Robis    schedule 16.06.2015


Ответы (1)


Похоже, вы используете библиотеку SteamBot. Поскольку его исходный код легко доступен, взгляните на исходный код метода GetTradeOffer, который можно найти здесь: Исходный код TradeOfferWebApi

Понятно, что получение ненулевого ответа от этого метода НЕ гарантирует, что он будет содержать допустимый объект Offer. Поэтому ваша проверка на resp.Offer должна сначала убедиться, что она не равна нулю:

    if (resp != null)
    {
        if (resp.Offer != null && IsOfferValid(resp.Offer))

Что касается определения, почему это не пустое значение: загрузите исходный код в SteamBot, запустите свое приложение + проект SteamBot в отладчике и перейдите к методу. Судя по исходному коду метода GetTradeOffer, он, скорее всего, генерирует исключение.

Библиотека в любом случае находится в стадии разработки, учитывая количество комментариев «todo» в коде, поэтому запуск с исходным кодом SteamBot может быть полезен для целей отладки (вы можете легко изменить исходный код, чтобы фактически регистрировать исключения для места назначения, которое будет вам полезно).

EDIT (в ответ на редактирование OP № 2): из документации в Steam IEconService API учетная запись может получать информацию о предложении только для этой учетной записи или из нее. Вероятное объяснение заключается в том, что либо вы передаете неверный идентификатор предложения (который вы, вероятно, исключили), либо учетная запись, под которой работает ваше приложение, не имеет прав на просмотр этого предложения.

person SWalters    schedule 16.06.2015
comment
Взгляните на EDITED # 2. Почему один отзыв пустой, а другой нормальный? - person Robis; 16.06.2015