diff --git a/build.gradle b/build.gradle index d335f04..997dedb 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { allprojects { group = 'ru.funpay4j' - version = '1.0.6' + version = '1.0.7' repositories { mavenCentral() diff --git a/client/src/main/java/com/panic08/funpay4j/exceptions/order/OrderNotFoundException.java b/client/src/main/java/com/panic08/funpay4j/exceptions/order/OrderNotFoundException.java new file mode 100644 index 0000000..0e820ab --- /dev/null +++ b/client/src/main/java/com/panic08/funpay4j/exceptions/order/OrderNotFoundException.java @@ -0,0 +1,33 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.panic08.funpay4j.exceptions.order; + +/** + * Base class for exception related to the fact that the order is not found + * + * @author panic08 + * @since 1.0.7 + */ +public class OrderNotFoundException extends RuntimeException { + + /** + * Initializes a new OrderNotFoundException exception + * + * @param message exception message + */ + public OrderNotFoundException(String message) { + super(message); + } +} diff --git a/client/src/main/java/com/panic08/funpay4j/objects/order/ParsedOrder.java b/client/src/main/java/com/panic08/funpay4j/objects/order/ParsedOrder.java new file mode 100644 index 0000000..a58b137 --- /dev/null +++ b/client/src/main/java/com/panic08/funpay4j/objects/order/ParsedOrder.java @@ -0,0 +1,50 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.panic08.funpay4j.objects.order; + +import java.util.List; +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import com.panic08.funpay4j.objects.user.ParsedPreviewUser; + +/** + * This object represents the parsed FunPay order + * + * @author panic08 + * @since 1.0.7 + */ +@Data +@AllArgsConstructor +@Builder +public class ParsedOrder { + + private String id; + + private List statuses; + + private String shortDescription; + + private String detailedDescription; + + private Map params; + + private double price; + + private ParsedPreviewUser other; +} diff --git a/client/src/main/java/com/panic08/funpay4j/parser/FunPayParser.java b/client/src/main/java/com/panic08/funpay4j/parser/FunPayParser.java index 02ba359..1ef547b 100644 --- a/client/src/main/java/com/panic08/funpay4j/parser/FunPayParser.java +++ b/client/src/main/java/com/panic08/funpay4j/parser/FunPayParser.java @@ -20,11 +20,13 @@ import com.panic08.funpay4j.exceptions.InvalidGoldenKeyException; import com.panic08.funpay4j.exceptions.lot.LotNotFoundException; import com.panic08.funpay4j.exceptions.offer.OfferNotFoundException; +import com.panic08.funpay4j.exceptions.order.OrderNotFoundException; import com.panic08.funpay4j.exceptions.user.UserNotFoundException; import com.panic08.funpay4j.objects.CsrfTokenAndPHPSESSID; import com.panic08.funpay4j.objects.game.ParsedPromoGame; import com.panic08.funpay4j.objects.lot.ParsedLot; import com.panic08.funpay4j.objects.offer.ParsedOffer; +import com.panic08.funpay4j.objects.order.ParsedOrder; import com.panic08.funpay4j.objects.transaction.ParsedTransaction; import com.panic08.funpay4j.objects.transaction.ParsedTransactionType; import com.panic08.funpay4j.objects.user.ParsedSellerReview; @@ -173,6 +175,18 @@ List parseTransactions( List parseTransactions(String goldenKey, long userId, int pages) throws FunPayApiException, UserNotFoundException, InvalidGoldenKeyException; + /** + * Parse order authorized + * + * @param goldenKey golden key which will be used to authorize the user + * @param orderId order id by which order will be parsed + * @return order + * @throws FunPayApiException if the other api-related exception + * @throws OrderNotFoundException if the order with id does not found + */ + ParsedOrder parseOrder(String goldenKey, String orderId) + throws FunPayApiException, OrderNotFoundException; + /** * Parse csrf-token and PHPSESSID * diff --git a/client/src/main/java/com/panic08/funpay4j/parser/JsoupFunPayParser.java b/client/src/main/java/com/panic08/funpay4j/parser/JsoupFunPayParser.java index e469722..f1f5554 100644 --- a/client/src/main/java/com/panic08/funpay4j/parser/JsoupFunPayParser.java +++ b/client/src/main/java/com/panic08/funpay4j/parser/JsoupFunPayParser.java @@ -40,6 +40,7 @@ import com.panic08.funpay4j.exceptions.InvalidGoldenKeyException; import com.panic08.funpay4j.exceptions.lot.LotNotFoundException; import com.panic08.funpay4j.exceptions.offer.OfferNotFoundException; +import com.panic08.funpay4j.exceptions.order.OrderNotFoundException; import com.panic08.funpay4j.exceptions.user.UserNotFoundException; import com.panic08.funpay4j.objects.CsrfTokenAndPHPSESSID; import com.panic08.funpay4j.objects.game.ParsedPromoGame; @@ -48,14 +49,11 @@ import com.panic08.funpay4j.objects.lot.ParsedLotCounter; import com.panic08.funpay4j.objects.offer.ParsedOffer; import com.panic08.funpay4j.objects.offer.ParsedPreviewOffer; +import com.panic08.funpay4j.objects.order.ParsedOrder; import com.panic08.funpay4j.objects.transaction.ParsedTransaction; import com.panic08.funpay4j.objects.transaction.ParsedTransactionStatus; import com.panic08.funpay4j.objects.transaction.ParsedTransactionType; -import com.panic08.funpay4j.objects.user.ParsedAdvancedSellerReview; -import com.panic08.funpay4j.objects.user.ParsedPreviewSeller; -import com.panic08.funpay4j.objects.user.ParsedSeller; -import com.panic08.funpay4j.objects.user.ParsedSellerReview; -import com.panic08.funpay4j.objects.user.ParsedUser; +import com.panic08.funpay4j.objects.user.*; /** * This implementation of FunPayParser uses Jsoup to parse @@ -389,34 +387,14 @@ public ParsedOffer parseOffer(long offerId) throws FunPayApiException, OfferNotF parameters.put(key, value); } - Element previewSellerUsernameElement = - funPayDocument.getElementsByClass("media-user-name").first().selectFirst("a"); - Element previewSellerImgElement = - funPayDocument.getElementsByClass("media-user").first().selectFirst("img"); Element previewSellerReviewCountElement = funPayDocument.getElementsByClass("text-mini text-light mb5").first(); - String previewSellerUsernameElementHrefAttributeValue = - previewSellerUsernameElement.attr("href"); - - long previewSellerUserId = - Long.parseLong( - previewSellerUsernameElementHrefAttributeValue.substring( - 25, - previewSellerUsernameElementHrefAttributeValue.length() - 1)); - String previewSellerUsername = previewSellerUsernameElement.text(); - String previewSellerAvatarPhotoLink = previewSellerImgElement.attr("src"); - - // if the previewUser has a regular photo - if (previewSellerAvatarPhotoLink.equals("/img/layout/avatar.png")) - previewSellerAvatarPhotoLink = null; - // Select rating from string like "219 reviews over 2 years" int previewSellerReviewCount = Integer.parseInt( previewSellerReviewCountElement.text().replaceAll("\\D.*", "")); - boolean isPreviewSellerOnline = - funPayDocument.getElementsByClass("media media-user online").first() != null; + ParsedPreviewUser parsedPreviewUser = extractPreviewUserFromProductPage(funPayDocument); return ParsedOffer.builder() .id(offerId) @@ -428,11 +406,11 @@ public ParsedOffer parseOffer(long offerId) throws FunPayApiException, OfferNotF .parameters(parameters) .seller( ParsedPreviewSeller.builder() - .userId(previewSellerUserId) - .username(previewSellerUsername) - .avatarPhotoLink(previewSellerAvatarPhotoLink) + .userId(parsedPreviewUser.getUserId()) + .avatarPhotoLink(parsedPreviewUser.getAvatarPhotoLink()) + .username(parsedPreviewUser.getUsername()) + .isOnline(parsedPreviewUser.isOnline()) .reviewCount(previewSellerReviewCount) - .isOnline(isPreviewSellerOnline) .build()) .build(); } catch (IOException e) { @@ -497,6 +475,86 @@ public List parseTransactions(String goldenKey, long userId, return parseTransactionsInternal(goldenKey, userId, null, pages); } + /** {@inheritDoc} */ + @Override + public ParsedOrder parseOrder(String goldenKey, String orderId) + throws FunPayApiException, OrderNotFoundException { + try (Response funPayHtmlResponse = + httpClient + .newCall( + new Request.Builder() + .get() + .addHeader("Cookie", "golden_key=" + goldenKey) + .url(baseURL + "/orders/" + orderId + "/") + .build()) + .execute()) { + String funPayHtmlPageBody = funPayHtmlResponse.body().string(); + + Document funPayDocument = Jsoup.parse(funPayHtmlPageBody); + + if (isNonExistentFunPayPage(funPayDocument)) { + throw new OrderNotFoundException( + "Order with orderId " + orderId + " does not found"); + } + + List statuses = new ArrayList<>(); + + List pageContentChildren = + funPayDocument.getElementsByClass("page-content").first().children(); + + Element pageHeader = pageContentChildren.get(0); + for (Element statusElement : pageHeader.children()) { + statuses.add(statusElement.text()); + } + + Element paramList = pageContentChildren.get(1); + + Map params = new HashMap<>(); + + for (Element col : paramList.getElementsByClass("row").first().children()) { + List paramItemChildren = + col.getElementsByClass("param-item").first().children(); + params.put(paramItemChildren.get(0).text(), paramItemChildren.get(1).text()); + } + + List paramRows = paramList.getElementsByClass("row"); + + Double price = null; + + for (Element paramRow : paramRows) { + for (Element paramCol : paramRow.children()) { + List paramItemChildren = + paramCol.getElementsByClass("param-item").first().children(); + if (paramItemChildren.get(0).text().equals("Сумма")) { + price = + Double.parseDouble( + paramItemChildren.get(1).children().get(0).text()); + } else { + params.put( + paramItemChildren.get(0).text(), paramItemChildren.get(1).text()); + } + } + } + + List paramListChildren = paramList.children(); + + String shortDescription = paramListChildren.get(1).children().get(1).text(); + String detailedDescription = paramListChildren.get(2).children().get(1).text(); + + return ParsedOrder.builder() + .id(orderId) + .statuses(statuses) + .params(params) + .shortDescription(shortDescription) + .detailedDescription(detailedDescription) + .price(price) + .other(extractPreviewUserFromProductPage(funPayDocument)) + .build(); + } catch (IOException e) { + throw new FunPayApiException(e.getLocalizedMessage()); + } + } + /** {@inheritDoc} */ @Override public CsrfTokenAndPHPSESSID parseCsrfTokenAndPHPSESSID(@NonNull String goldenKey) @@ -923,6 +981,38 @@ private List parseSellerReviewsInternal( return currentSellerReviews; } + private ParsedPreviewUser extractPreviewUserFromProductPage(Document funPayDocument) { + System.out.println(); + Element previewSellerUsernameElement = + funPayDocument.getElementsByClass("media-user-name").first().selectFirst("a"); + Element previewSellerImgElement = + funPayDocument.getElementsByClass("media-user").first().selectFirst("img"); + Element previewSellerReviewCountElement = + funPayDocument.getElementsByClass("text-mini text-light mb5").first(); + + String previewSellerUsernameElementHrefAttributeValue = + previewSellerUsernameElement.attr("href"); + + long previewSellerUserId = + Long.parseLong( + previewSellerUsernameElementHrefAttributeValue.substring( + 25, previewSellerUsernameElementHrefAttributeValue.length() - 1)); + String previewSellerUsername = previewSellerUsernameElement.text(); + String previewSellerAvatarPhotoLink = previewSellerImgElement.attr("src"); + + // if the previewUser has a regular photo + if (previewSellerAvatarPhotoLink.equals("/img/layout/avatar.png")) + previewSellerAvatarPhotoLink = null; + boolean isPreviewSellerOnline = + funPayDocument.getElementsByClass("media media-user online").first() != null; + return ParsedPreviewUser.builder() + .userId(previewSellerUserId) + .username(previewSellerUsername) + .avatarPhotoLink(previewSellerAvatarPhotoLink) + .isOnline(isPreviewSellerOnline) + .build(); + } + private void extractReviewsFromReviewsHtml( Document reviewsHtml, List currentSellerReviews) { List reviewContainerElements = reviewsHtml.getElementsByClass("review-container"); diff --git a/client/src/test/java/com/panic08/funpay4j/parser/JsoupFunPayParserTest.java b/client/src/test/java/com/panic08/funpay4j/parser/JsoupFunPayParserTest.java index 05972e4..d88f9b2 100644 --- a/client/src/test/java/com/panic08/funpay4j/parser/JsoupFunPayParserTest.java +++ b/client/src/test/java/com/panic08/funpay4j/parser/JsoupFunPayParserTest.java @@ -37,6 +37,7 @@ import com.panic08.funpay4j.exceptions.lot.LotNotFoundException; import com.panic08.funpay4j.exceptions.offer.OfferNotFoundException; +import com.panic08.funpay4j.exceptions.order.OrderNotFoundException; import com.panic08.funpay4j.exceptions.user.UserNotFoundException; import com.panic08.funpay4j.objects.CsrfTokenAndPHPSESSID; import com.panic08.funpay4j.objects.game.ParsedPromoGame; @@ -45,6 +46,7 @@ import com.panic08.funpay4j.objects.lot.ParsedLotCounter; import com.panic08.funpay4j.objects.offer.ParsedOffer; import com.panic08.funpay4j.objects.offer.ParsedPreviewOffer; +import com.panic08.funpay4j.objects.order.ParsedOrder; import com.panic08.funpay4j.objects.transaction.ParsedTransaction; import com.panic08.funpay4j.objects.user.ParsedAdvancedSellerReview; import com.panic08.funpay4j.objects.user.ParsedPreviewSeller; @@ -73,6 +75,8 @@ class JsoupFunPayParserTest { "src/test/resources/html/client/getSellerReviewsResponse.html"; private static final String GET_TRANSACTIONS_HTML_RESPONSE_PATH = "src/test/resources/html/client/getTransactionsResponse.html"; + private static final String GET_ORDER_HTML_RESPONSE_PATH = + "src/test/resources/html/client/getOrderResponse.html"; private static final String BASE_URL = "/"; @BeforeEach @@ -332,6 +336,49 @@ void testParseTransactionsUserNotFound() throws Exception { () -> parser.parseTransactions(goldenKey, userId, pages)); } + @Test + void testParseOrder() throws Exception { + String htmlContent = + new String(Files.readAllBytes(Paths.get(GET_ORDER_HTML_RESPONSE_PATH))); + mockWebServer.enqueue(new MockResponse().setBody(htmlContent).setResponseCode(200)); + + String goldenKey = "some_golden_key"; + String orderId = "GFHMZY4Z"; + + ParsedOrder order = parser.parseOrder(goldenKey, orderId); + + assertNotNull(order); + assertNotNull(order.getStatuses()); + assertFalse(order.getStatuses().isEmpty()); + assertEquals(orderId, order.getId()); + assertNotNull(order.getShortDescription()); + assertNotNull(order.getDetailedDescription()); + assertTrue(order.getPrice() > 0); + + assertNotNull(order.getParams()); + assertFalse(order.getParams().isEmpty()); + for (Map.Entry entry : order.getParams().entrySet()) { + assertNotNull(entry.getKey()); + assertFalse(entry.getKey().isEmpty()); + assertNotNull(entry.getValue()); + } + assertNotNull(order.getOther()); + assertTrue(order.getOther().getUserId() > 0); + assertNotNull(order.getOther().getUsername()); + } + + @Test + void testParseOrderNotFound() throws Exception { + String notFoundHtml = + "
"; + mockWebServer.enqueue(new MockResponse().setBody(notFoundHtml).setResponseCode(400)); + + String goldenKey = "some_golden_key"; + String orderId = "999999"; + + assertThrows(OrderNotFoundException.class, () -> parser.parseOrder(goldenKey, orderId)); + } + @Test void testParseCsrfTokenAndPHPSESSID() throws Exception { String goldenKey = "some_golden_key"; diff --git a/client/src/test/resources/html/client/getOrderResponse.html b/client/src/test/resources/html/client/getOrderResponse.html new file mode 100644 index 0000000..fbc94b8 --- /dev/null +++ b/client/src/test/resources/html/client/getOrderResponse.html @@ -0,0 +1,567 @@ +
+
+ + +
+
+
+
+
+
+
+
+
+

+ Заказ #LM1NTL13
+ Закрыт + Возврат +

+ +
+ +
+
+
+
Игра
+
Dota 2
+
+
+
+
+
Категория
+ +
+
+
+
+
Тип предмета
+
Одежда
+
+
+
+
+
Герой
+
Arc Warden
+
+
+
+
+
Раритетность
+
Immortal
+
+
+
+
+
Качество
+
Standard
+
+
+
+
+
Краткое описание
+
🟥 Плечи на арка 🟥 Wraithbinder 🟥
+
+
+
Подробное описание
+
🟥 Плечи на арка 🟥 Wraithbinder 🟥
+
+ +
+
+
+
+
Количество
+
1 шт.
+
+
+
+
+
Ссылка на обмен в Steam
+
+ https://steamcommunity.com/tradeoffer/new/?partner=1160208447&token=_SShaDuF +
+
+
+
+
+
+
+
Открыт
+
+ 29 ноября 2022 в 19:06 (2 года назад) +
+
+
+
+
+
Закрыт
+
+ 30 ноября 2022 в 14:43 (2 года назад) +
+
+
+
+
+
Сумма
+
90 +
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
Был 3 года назад
+
+
+
+ + + + +
+
+ + +
+
+
+
25 июля 2022
+ +
+ + + +
+ FunPay оповещение +
25.07.22
+
+ +
+ + + +
+ +
+
+ +
+ + + +
+ Zaratrusta
25.07.22
+
+ +
+
Здравствуйте, ещё актуально?
+ + +
+ +
+
+ +
+ + + +
+ Sashar19481
25.07.22
+
+ +
+
Да, актуально
+ + +
+ +
+
+ +
+ + + + +
+
Пока-что
+ + +
+ +
+
+ +
+ + + + +
+
2 человека забронировали, но еще ничего не оплачивали
+ + +
+ +
+
+ +
+ + + +
+ Zaratrusta
25.07.22
+
+ +
+
Оплатить нельзя тоесть? 😅
+ + +
+ +
+
+ +
+ + + +
+ Sashar19481
25.07.22
+
+ +
+
vj;yj
+ + +
+ +
+
+ +
+ + + +
+ Zaratrusta
25.07.22
+
+ +
+
Сейчас переведу
+ + +
+ +
+
+ +
+ + + +
+ FunPay оповещение +
25.07.22
+
+ +
+ + + +
+ +
+
+ +
+ + + +
+ Zaratrusta
25.07.22
+
+ +
+
Пришло?
+ + +
+ +
+
+ +
+ + + +
+ Sashar19481
25.07.22
+
+ +
+
Да
+ + +
+ +
+
+ +
+ + + +
+ Zaratrusta
25.07.22
+
+ +
+
Нужно ссылку на стим?
+ + +
+ +
+
+ +
+ + + +
+ Sashar19481
25.07.22
+
+ +
+
Извините что задерживаюсь
+ + +
+ +
+
+ +
+ + + + +
+
Играю, извините
+ + +
+ +
+
+ +
+ + + + +
+
Сейчас добавлю
+ + +
+ +
+
+ +
+ + + + +
+
Добавил
+ + +
+ +
+
+ +
+ + + +
+ Zaratrusta
25.07.22
+
+ +
+
Ничего страшного, все равно месяц ждать
+ + +
+ +
+
+
1 августа 2022
+ +
+ + + +
+ Zaratrusta
01.08.22
+
+ +
+
Здравствуйте, можете пожалуйста не отправлять на этот аккаунт,он больше не мой. Если что я отправлю вам другую ссылку, извините 😭
+ + +
+ +
+
+
8 августа 2022
+ +
+ + + +
+ Sashar19481
08.08.22
+
+ +
+
как скажете
+ + +
+ +
+
+
11 августа 2022
+ +
+ + + +
+ FunPay оповещение +
11.08.22
+
+ +
+ + + +
+ +
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ Отзыв + скрыт +
+ +
+
+
+
+
+ Отсутствует. +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
\ No newline at end of file diff --git a/core/src/main/java/com/panic08/funpay4j/AuthorizedFunPayExecutor.java b/core/src/main/java/com/panic08/funpay4j/AuthorizedFunPayExecutor.java index 505c8f3..0a0337a 100644 --- a/core/src/main/java/com/panic08/funpay4j/AuthorizedFunPayExecutor.java +++ b/core/src/main/java/com/panic08/funpay4j/AuthorizedFunPayExecutor.java @@ -27,6 +27,7 @@ import com.panic08.funpay4j.commands.offer.DeleteOffer; import com.panic08.funpay4j.commands.offer.EditOffer; import com.panic08.funpay4j.commands.offer.RaiseAllOffers; +import com.panic08.funpay4j.commands.order.GetOrder; import com.panic08.funpay4j.commands.transaction.GetTransactions; import com.panic08.funpay4j.commands.user.GetSellerReviews; import com.panic08.funpay4j.commands.user.GetUser; @@ -35,8 +36,11 @@ import com.panic08.funpay4j.exceptions.InvalidCsrfTokenOrPHPSESSIDException; import com.panic08.funpay4j.exceptions.InvalidGoldenKeyException; import com.panic08.funpay4j.exceptions.offer.OfferAlreadyRaisedException; +import com.panic08.funpay4j.exceptions.order.OrderNotFoundException; import com.panic08.funpay4j.exceptions.user.UserNotFoundException; import com.panic08.funpay4j.objects.CsrfTokenAndPHPSESSID; +import com.panic08.funpay4j.objects.order.Order; +import com.panic08.funpay4j.objects.order.ParsedOrder; import com.panic08.funpay4j.objects.transaction.ParsedTransaction; import com.panic08.funpay4j.objects.transaction.ParsedTransactionType; import com.panic08.funpay4j.objects.transaction.Transaction; @@ -351,6 +355,27 @@ public List execute(GetTransactions command) .collect(Collectors.toList()); } + /** + * Execute to get order authorized + * + * @param command command that will be executed + * @return order + * @throws FunPayApiException if the other api-related exception + * @throws OrderNotFoundException if the order with id does not found + */ + public Order execute(GetOrder command) throws FunPayApiException, OrderNotFoundException { + ParsedOrder parsedOrder = funPayParser.parseOrder(goldenKey, command.getOrderId()); + return Order.builder() + .id(parsedOrder.getId()) + .statuses(parsedOrder.getStatuses()) + .shortDescription(parsedOrder.getShortDescription()) + .detailedDescription(parsedOrder.getDetailedDescription()) + .price(parsedOrder.getPrice()) + .params(parsedOrder.getParams()) + .other(parsedOrder.getOther()) + .build(); + } + /** * Execute to get seller reviews authorized * diff --git a/core/src/main/java/com/panic08/funpay4j/commands/order/GetOrder.java b/core/src/main/java/com/panic08/funpay4j/commands/order/GetOrder.java new file mode 100644 index 0000000..0761f93 --- /dev/null +++ b/core/src/main/java/com/panic08/funpay4j/commands/order/GetOrder.java @@ -0,0 +1,36 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.panic08.funpay4j.commands.order; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; + +/** + * Use this command to get order + * + * @author panic08 + * @since 1.0.7 + */ +@Getter +@Setter +@Builder +@AllArgsConstructor +public class GetOrder { + + @NonNull private String orderId; +} diff --git a/core/src/main/java/com/panic08/funpay4j/objects/order/Order.java b/core/src/main/java/com/panic08/funpay4j/objects/order/Order.java new file mode 100644 index 0000000..f3e0051 --- /dev/null +++ b/core/src/main/java/com/panic08/funpay4j/objects/order/Order.java @@ -0,0 +1,50 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.panic08.funpay4j.objects.order; + +import java.util.List; +import java.util.Map; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import com.panic08.funpay4j.objects.user.ParsedPreviewUser; + +/** + * This object represents the FunPay order + * + * @author panic08 + * @since 1.0.7 + */ +@Data +@AllArgsConstructor +@Builder +public class Order { + + private String id; + + private List statuses; + + private String shortDescription; + + private String detailedDescription; + + private Map params; + + private double price; + + private ParsedPreviewUser other; +} diff --git a/core/src/test/java/com/panic08/funpay4j/AuthorizedFunPayExecutorTest.java b/core/src/test/java/com/panic08/funpay4j/AuthorizedFunPayExecutorTest.java index 75ab626..405a7a1 100644 --- a/core/src/test/java/com/panic08/funpay4j/AuthorizedFunPayExecutorTest.java +++ b/core/src/test/java/com/panic08/funpay4j/AuthorizedFunPayExecutorTest.java @@ -37,10 +37,12 @@ import com.panic08.funpay4j.commands.offer.DeleteOffer; import com.panic08.funpay4j.commands.offer.EditOffer; import com.panic08.funpay4j.commands.offer.RaiseAllOffers; +import com.panic08.funpay4j.commands.order.GetOrder; import com.panic08.funpay4j.commands.transaction.GetTransactions; import com.panic08.funpay4j.commands.user.UpdateAvatar; import com.panic08.funpay4j.exceptions.InvalidGoldenKeyException; import com.panic08.funpay4j.exceptions.offer.OfferAlreadyRaisedException; +import com.panic08.funpay4j.objects.order.Order; import com.panic08.funpay4j.objects.transaction.Transaction; /** @@ -56,6 +58,8 @@ class AuthorizedFunPayExecutorTest { "src/test/resources/html/client/getCsrfTokenAndPHPSESSIDResponse.html"; private static final String GET_TRANSACTIONS_HTML_RESPONSE_PATH = "src/test/resources/html/client/getTransactionsResponse.html"; + private static final String GET_ORDER_HTML_RESPONSE_PATH = + "src/test/resources/html/client/getOrderResponse.html"; @BeforeEach void setUp() throws Exception { @@ -289,4 +293,30 @@ void testGetTransactions() throws Exception { assertNotNull(firstTransaction.getDate()); assertFalse(firstTransaction.getTitle().isEmpty()); } + + @Test + void testGetOrder() throws Exception { + String orderId = "GFHMZY4Z"; + + String htmlContent = + new String(Files.readAllBytes(Paths.get(GET_ORDER_HTML_RESPONSE_PATH))); + + mockWebServer.enqueue( + new MockResponse() + .setResponseCode(200) + .setBody(htmlContent) + .setHeader("Content-Type", "application/json")); + + Order order = funPayExecutor.execute(GetOrder.builder().orderId(orderId).build()); + + assertNotNull(order); + assertEquals(orderId, order.getId()); + assertNotNull(order.getStatuses()); + assertFalse(order.getStatuses().isEmpty()); + assertNotNull(order.getShortDescription()); + assertNotNull(order.getDetailedDescription()); + assertEquals(90.0, order.getPrice()); + assertNotNull(order.getParams()); + assertNotNull(order.getOther()); + } } diff --git a/core/src/test/resources/html/client/getOrderResponse.html b/core/src/test/resources/html/client/getOrderResponse.html new file mode 100644 index 0000000..fbc94b8 --- /dev/null +++ b/core/src/test/resources/html/client/getOrderResponse.html @@ -0,0 +1,567 @@ +
+
+ + +
+
+
+
+
+
+
+
+
+

+ Заказ #LM1NTL13
+ Закрыт + Возврат +

+ +
+ +
+
+
+
Игра
+
Dota 2
+
+
+
+
+
Категория
+ +
+
+
+
+
Тип предмета
+
Одежда
+
+
+
+
+
Герой
+
Arc Warden
+
+
+
+
+
Раритетность
+
Immortal
+
+
+
+
+
Качество
+
Standard
+
+
+
+
+
Краткое описание
+
🟥 Плечи на арка 🟥 Wraithbinder 🟥
+
+
+
Подробное описание
+
🟥 Плечи на арка 🟥 Wraithbinder 🟥
+
+ +
+
+
+
+
Количество
+
1 шт.
+
+
+
+
+
Ссылка на обмен в Steam
+
+ https://steamcommunity.com/tradeoffer/new/?partner=1160208447&token=_SShaDuF +
+
+
+
+
+
+
+
Открыт
+
+ 29 ноября 2022 в 19:06 (2 года назад) +
+
+
+
+
+
Закрыт
+
+ 30 ноября 2022 в 14:43 (2 года назад) +
+
+
+
+
+
Сумма
+
90 +
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
Был 3 года назад
+
+
+
+ + + + +
+
+ + +
+
+
+
25 июля 2022
+ +
+ + + +
+ FunPay оповещение +
25.07.22
+
+ +
+ + + +
+ +
+
+ +
+ + + +
+ Zaratrusta
25.07.22
+
+ +
+
Здравствуйте, ещё актуально?
+ + +
+ +
+
+ +
+ + + +
+ Sashar19481
25.07.22
+
+ +
+
Да, актуально
+ + +
+ +
+
+ +
+ + + + +
+
Пока-что
+ + +
+ +
+
+ +
+ + + + +
+
2 человека забронировали, но еще ничего не оплачивали
+ + +
+ +
+
+ +
+ + + +
+ Zaratrusta
25.07.22
+
+ +
+
Оплатить нельзя тоесть? 😅
+ + +
+ +
+
+ +
+ + + +
+ Sashar19481
25.07.22
+
+ +
+
vj;yj
+ + +
+ +
+
+ +
+ + + +
+ Zaratrusta
25.07.22
+
+ +
+
Сейчас переведу
+ + +
+ +
+
+ +
+ + + +
+ FunPay оповещение +
25.07.22
+
+ +
+ + + +
+ +
+
+ +
+ + + +
+ Zaratrusta
25.07.22
+
+ +
+
Пришло?
+ + +
+ +
+
+ +
+ + + +
+ Sashar19481
25.07.22
+
+ +
+
Да
+ + +
+ +
+
+ +
+ + + +
+ Zaratrusta
25.07.22
+
+ +
+
Нужно ссылку на стим?
+ + +
+ +
+
+ +
+ + + +
+ Sashar19481
25.07.22
+
+ +
+
Извините что задерживаюсь
+ + +
+ +
+
+ +
+ + + + +
+
Играю, извините
+ + +
+ +
+
+ +
+ + + + +
+
Сейчас добавлю
+ + +
+ +
+
+ +
+ + + + +
+
Добавил
+ + +
+ +
+
+ +
+ + + +
+ Zaratrusta
25.07.22
+
+ +
+
Ничего страшного, все равно месяц ждать
+ + +
+ +
+
+
1 августа 2022
+ +
+ + + +
+ Zaratrusta
01.08.22
+
+ +
+
Здравствуйте, можете пожалуйста не отправлять на этот аккаунт,он больше не мой. Если что я отправлю вам другую ссылку, извините 😭
+ + +
+ +
+
+
8 августа 2022
+ +
+ + + +
+ Sashar19481
08.08.22
+
+ +
+
как скажете
+ + +
+ +
+
+
11 августа 2022
+ +
+ + + +
+ FunPay оповещение +
11.08.22
+
+ +
+ + + +
+ +
+
+
+ +
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ Отзыв + скрыт +
+ +
+
+
+
+
+ Отсутствует. +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
\ No newline at end of file diff --git a/examples/src/main/java/com/panic08/funpay4j/order/GetOrder.java b/examples/src/main/java/com/panic08/funpay4j/order/GetOrder.java new file mode 100644 index 0000000..02aeedb --- /dev/null +++ b/examples/src/main/java/com/panic08/funpay4j/order/GetOrder.java @@ -0,0 +1,41 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.panic08.funpay4j.order; + +import com.panic08.funpay4j.AuthorizedFunPayExecutor; +import com.panic08.funpay4j.exceptions.FunPayApiException; +import com.panic08.funpay4j.exceptions.InvalidGoldenKeyException; + +import java.net.InetSocketAddress; +import java.net.Proxy; + +public class GetOrder { + public static void main(String[] args) { + //if we want to use a proxy + Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress("127.0.0.1", 8000)); + + AuthorizedFunPayExecutor executor = new AuthorizedFunPayExecutor("test-golden-key", proxy); + + try { + System.out.println(executor.execute(com.panic08.funpay4j.commands.order.GetOrder.builder() + .orderId("YOUR ORDER ID") + .build())); + } catch (FunPayApiException e) { + throw new RuntimeException(e); + } catch (InvalidGoldenKeyException e) { + System.out.println("golden key is invalid!"); + } + } +}