Skip to content

Commit c1e5cd5

Browse files
committed
Add fix against null purchase_receipt_info
1 parent 7ea0dda commit c1e5cd5

File tree

2 files changed

+32
-19
lines changed

2 files changed

+32
-19
lines changed

ArchiSteamFarm/Steam/Bot.cs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3650,26 +3650,30 @@ private async void RedeemGamesInBackground(object? state = null) {
36503650
continue;
36513651
}
36523652

3653-
EResult result = (EResult) response.purchase_receipt_info.purchase_status;
3654-
EPurchaseResultDetail purchaseResultDetail = (EPurchaseResultDetail) response.purchase_result_details;
3655-
3653+
EResult result = EResult.Timeout;
3654+
EPurchaseResultDetail purchaseResultDetail = EPurchaseResultDetail.NoDetail;
36563655
string? balanceText = null;
36573656

3658-
if ((purchaseResultDetail == EPurchaseResultDetail.CannotRedeemCodeFromClient) || ((purchaseResultDetail == EPurchaseResultDetail.BadActivationCode) && assumeWalletKeyOnBadActivationCode)) {
3659-
// If it's a wallet code, we try to redeem it first, then handle the inner result as our primary one
3660-
(EResult Result, EPurchaseResultDetail? PurchaseResult, string? BalanceText)? walletResult = await ArchiWebHandler.RedeemWalletKey(key).ConfigureAwait(false);
3661-
3662-
if (walletResult != null) {
3663-
result = walletResult.Value.Result;
3664-
purchaseResultDetail = walletResult.Value.PurchaseResult.GetValueOrDefault(walletResult.Value.Result == EResult.OK ? EPurchaseResultDetail.NoDetail : EPurchaseResultDetail.BadActivationCode); // BadActivationCode is our smart guess in this case
3665-
balanceText = walletResult.Value.BalanceText;
3666-
} else {
3667-
result = EResult.Timeout;
3668-
purchaseResultDetail = EPurchaseResultDetail.Timeout;
3657+
if (response.purchase_receipt_info != null) {
3658+
result = (EResult) response.purchase_receipt_info.purchase_status;
3659+
purchaseResultDetail = (EPurchaseResultDetail) response.purchase_result_details;
3660+
3661+
if ((purchaseResultDetail == EPurchaseResultDetail.CannotRedeemCodeFromClient) || ((purchaseResultDetail == EPurchaseResultDetail.BadActivationCode) && assumeWalletKeyOnBadActivationCode)) {
3662+
// If it's a wallet code, we try to redeem it first, then handle the inner result as our primary one
3663+
(EResult Result, EPurchaseResultDetail? PurchaseResult, string? BalanceText)? walletResult = await ArchiWebHandler.RedeemWalletKey(key).ConfigureAwait(false);
3664+
3665+
if (walletResult != null) {
3666+
result = walletResult.Value.Result;
3667+
purchaseResultDetail = walletResult.Value.PurchaseResult.GetValueOrDefault(walletResult.Value.Result == EResult.OK ? EPurchaseResultDetail.NoDetail : EPurchaseResultDetail.BadActivationCode); // BadActivationCode is our smart guess in this case
3668+
balanceText = walletResult.Value.BalanceText;
3669+
} else {
3670+
result = EResult.Timeout;
3671+
purchaseResultDetail = EPurchaseResultDetail.Timeout;
3672+
}
36693673
}
36703674
}
36713675

3672-
Dictionary<uint, string>? items = response.purchase_receipt_info.line_items.Count > 0 ? response.purchase_receipt_info.line_items.ToDictionary(static lineItem => lineItem.packageid, static lineItem => lineItem.line_item_description) : null;
3676+
Dictionary<uint, string>? items = response.purchase_receipt_info?.line_items.Count > 0 ? response.purchase_receipt_info.line_items.ToDictionary(static lineItem => lineItem.packageid, static lineItem => lineItem.line_item_description) : null;
36733677

36743678
ArchiLogger.LogGenericDebug(items?.Count > 0 ? Strings.FormatBotRedeemWithItems(key, $"{result}/{purchaseResultDetail}{(!string.IsNullOrEmpty(balanceText) ? $"/{balanceText}" : "")}", string.Join(", ", items)) : Strings.FormatBotRedeem(key, $"{result}/{purchaseResultDetail}{(!string.IsNullOrEmpty(balanceText) ? $"/{balanceText}" : "")}"));
36753679

ArchiSteamFarm/Steam/Interaction/Commands.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2652,16 +2652,19 @@ internal void OnNewLicenseList() {
26522652
if (!skipRequest) {
26532653
CStore_RegisterCDKey_Response? redeemResult = await currentBot.Actions.RedeemKey(key).ConfigureAwait(false);
26542654

2655-
if (redeemResult != null) {
2655+
if (redeemResult == null) {
2656+
result = EResult.Timeout;
2657+
purchaseResultDetail = EPurchaseResultDetail.Timeout;
2658+
} else if (redeemResult.purchase_receipt_info == null) {
2659+
result = EResult.Timeout;
2660+
purchaseResultDetail = EPurchaseResultDetail.NoDetail;
2661+
} else {
26562662
result = (EResult) redeemResult.purchase_receipt_info.purchase_status;
26572663
purchaseResultDetail = (EPurchaseResultDetail) redeemResult.purchase_result_details;
26582664

26592665
if (redeemResult.purchase_receipt_info.line_items.Count > 0) {
26602666
items = redeemResult.purchase_receipt_info.line_items.ToDictionary(static lineItem => lineItem.packageid, static lineItem => lineItem.line_item_description);
26612667
}
2662-
} else {
2663-
result = EResult.Timeout;
2664-
purchaseResultDetail = EPurchaseResultDetail.Timeout;
26652668
}
26662669
}
26672670

@@ -2747,6 +2750,12 @@ internal void OnNewLicenseList() {
27472750
continue;
27482751
}
27492752

2753+
if (redeemResponse.purchase_receipt_info == null) {
2754+
response.AppendLine(FormatBotResponse(Strings.FormatBotRedeem(key, $"{EResult.Timeout}/{EPurchaseResultDetail.NoDetail}"), innerBot.BotName));
2755+
2756+
continue;
2757+
}
2758+
27502759
triedBots.Add(innerBot);
27512760

27522761
EResult redeemResult = (EResult) redeemResponse.purchase_receipt_info.purchase_status;

0 commit comments

Comments
 (0)