4040import com .panic08 .funpay4j .exceptions .InvalidGoldenKeyException ;
4141import com .panic08 .funpay4j .exceptions .lot .LotNotFoundException ;
4242import com .panic08 .funpay4j .exceptions .offer .OfferNotFoundException ;
43+ import com .panic08 .funpay4j .exceptions .sale .SaleNotFoundException ;
4344import com .panic08 .funpay4j .exceptions .user .UserNotFoundException ;
4445import com .panic08 .funpay4j .objects .CsrfTokenAndPHPSESSID ;
4546import com .panic08 .funpay4j .objects .game .ParsedPromoGame ;
4849import com .panic08 .funpay4j .objects .lot .ParsedLotCounter ;
4950import com .panic08 .funpay4j .objects .offer .ParsedOffer ;
5051import com .panic08 .funpay4j .objects .offer .ParsedPreviewOffer ;
52+ import com .panic08 .funpay4j .objects .sale .ParsedSale ;
5153import com .panic08 .funpay4j .objects .transaction .ParsedTransaction ;
5254import com .panic08 .funpay4j .objects .transaction .ParsedTransactionStatus ;
5355import com .panic08 .funpay4j .objects .transaction .ParsedTransactionType ;
54- import com .panic08 .funpay4j .objects .user .ParsedAdvancedSellerReview ;
55- import com .panic08 .funpay4j .objects .user .ParsedPreviewSeller ;
56- import com .panic08 .funpay4j .objects .user .ParsedSeller ;
57- import com .panic08 .funpay4j .objects .user .ParsedSellerReview ;
58- import com .panic08 .funpay4j .objects .user .ParsedUser ;
56+ import com .panic08 .funpay4j .objects .user .*;
5957
6058/**
6159 * This implementation of FunPayParser uses Jsoup to parse
@@ -389,34 +387,14 @@ public ParsedOffer parseOffer(long offerId) throws FunPayApiException, OfferNotF
389387 parameters .put (key , value );
390388 }
391389
392- Element previewSellerUsernameElement =
393- funPayDocument .getElementsByClass ("media-user-name" ).first ().selectFirst ("a" );
394- Element previewSellerImgElement =
395- funPayDocument .getElementsByClass ("media-user" ).first ().selectFirst ("img" );
396390 Element previewSellerReviewCountElement =
397391 funPayDocument .getElementsByClass ("text-mini text-light mb5" ).first ();
398392
399- String previewSellerUsernameElementHrefAttributeValue =
400- previewSellerUsernameElement .attr ("href" );
401-
402- long previewSellerUserId =
403- Long .parseLong (
404- previewSellerUsernameElementHrefAttributeValue .substring (
405- 25 ,
406- previewSellerUsernameElementHrefAttributeValue .length () - 1 ));
407- String previewSellerUsername = previewSellerUsernameElement .text ();
408- String previewSellerAvatarPhotoLink = previewSellerImgElement .attr ("src" );
409-
410- // if the previewUser has a regular photo
411- if (previewSellerAvatarPhotoLink .equals ("/img/layout/avatar.png" ))
412- previewSellerAvatarPhotoLink = null ;
413-
414393 // Select rating from string like "219 reviews over 2 years"
415394 int previewSellerReviewCount =
416395 Integer .parseInt (
417396 previewSellerReviewCountElement .text ().replaceAll ("\\ D.*" , "" ));
418- boolean isPreviewSellerOnline =
419- funPayDocument .getElementsByClass ("media media-user online" ).first () != null ;
397+ ParsedPreviewUser parsedPreviewUser = extractPreviewUserFromProductPage (funPayDocument );
420398
421399 return ParsedOffer .builder ()
422400 .id (offerId )
@@ -428,11 +406,11 @@ public ParsedOffer parseOffer(long offerId) throws FunPayApiException, OfferNotF
428406 .parameters (parameters )
429407 .seller (
430408 ParsedPreviewSeller .builder ()
431- .userId (previewSellerUserId )
432- .username (previewSellerUsername )
433- .avatarPhotoLink (previewSellerAvatarPhotoLink )
409+ .userId (parsedPreviewUser .getUserId ())
410+ .avatarPhotoLink (parsedPreviewUser .getAvatarPhotoLink ())
411+ .username (parsedPreviewUser .getUsername ())
412+ .isOnline (parsedPreviewUser .isOnline ())
434413 .reviewCount (previewSellerReviewCount )
435- .isOnline (isPreviewSellerOnline )
436414 .build ())
437415 .build ();
438416 } catch (IOException e ) {
@@ -497,6 +475,85 @@ public List<ParsedTransaction> parseTransactions(String goldenKey, long userId,
497475 return parseTransactionsInternal (goldenKey , userId , null , pages );
498476 }
499477
478+ /** {@inheritDoc} */
479+ @ Override
480+ public ParsedSale parseSale (String goldenKey , String saleId )
481+ throws FunPayApiException , SaleNotFoundException , InvalidGoldenKeyException {
482+ try (Response funPayHtmlResponse =
483+ httpClient
484+ .newCall (
485+ new Request .Builder ()
486+ .get ()
487+ .addHeader ("Cookie" , "golden_key=" + goldenKey )
488+ .url (baseURL + "/orders/" + saleId + "/" )
489+ .build ())
490+ .execute ()) {
491+ String funPayHtmlPageBody = funPayHtmlResponse .body ().string ();
492+
493+ Document funPayDocument = Jsoup .parse (funPayHtmlPageBody );
494+
495+ if (isNonExistentFunPayPage (funPayDocument )) {
496+ throw new SaleNotFoundException ("Sale with saleId " + saleId + " does not found" );
497+ }
498+
499+ List <String > statuses = new ArrayList <>();
500+
501+ List <Element > pageContentChildren =
502+ funPayDocument .getElementsByClass ("page-content" ).first ().children ();
503+
504+ Element pageHeader = pageContentChildren .get (0 );
505+ for (Element statusElement : pageHeader .children ()) {
506+ statuses .add (statusElement .text ());
507+ }
508+
509+ Element paramList = pageContentChildren .get (1 );
510+
511+ Map <String , String > params = new HashMap <>();
512+
513+ for (Element col : paramList .getElementsByClass ("row" ).first ().children ()) {
514+ List <Element > paramItemChildren =
515+ col .getElementsByClass ("param-item" ).first ().children ();
516+ params .put (paramItemChildren .get (0 ).text (), paramItemChildren .get (1 ).text ());
517+ }
518+
519+ List <Element > paramRows = paramList .getElementsByClass ("row" );
520+
521+ Double price = null ;
522+
523+ for (Element paramRow : paramRows ) {
524+ for (Element paramCol : paramRow .children ()) {
525+ List <Element > paramItemChildren =
526+ paramCol .getElementsByClass ("param-item" ).first ().children ();
527+ if (paramItemChildren .get (0 ).text ().equals ("Сумма" )) {
528+ price =
529+ Double .parseDouble (
530+ paramItemChildren .get (1 ).children ().get (0 ).text ());
531+ } else {
532+ params .put (
533+ paramItemChildren .get (0 ).text (), paramItemChildren .get (1 ).text ());
534+ }
535+ }
536+ }
537+
538+ List <Element > paramListChildren = paramList .children ();
539+
540+ String shortDescription = paramListChildren .get (1 ).children ().get (1 ).text ();
541+ String detailedDescription = paramListChildren .get (2 ).children ().get (1 ).text ();
542+
543+ return ParsedSale .builder ()
544+ .id (saleId )
545+ .statuses (statuses )
546+ .params (params )
547+ .shortDescription (shortDescription )
548+ .detailedDescription (detailedDescription )
549+ .price (price )
550+ .customer (extractPreviewUserFromProductPage (funPayDocument ))
551+ .build ();
552+ } catch (IOException e ) {
553+ throw new FunPayApiException (e .getLocalizedMessage ());
554+ }
555+ }
556+
500557 /** {@inheritDoc} */
501558 @ Override
502559 public CsrfTokenAndPHPSESSID parseCsrfTokenAndPHPSESSID (@ NonNull String goldenKey )
@@ -923,6 +980,38 @@ private List<ParsedSellerReview> parseSellerReviewsInternal(
923980 return currentSellerReviews ;
924981 }
925982
983+ private ParsedPreviewUser extractPreviewUserFromProductPage (Document funPayDocument ) {
984+ System .out .println ();
985+ Element previewSellerUsernameElement =
986+ funPayDocument .getElementsByClass ("media-user-name" ).first ().selectFirst ("a" );
987+ Element previewSellerImgElement =
988+ funPayDocument .getElementsByClass ("media-user" ).first ().selectFirst ("img" );
989+ Element previewSellerReviewCountElement =
990+ funPayDocument .getElementsByClass ("text-mini text-light mb5" ).first ();
991+
992+ String previewSellerUsernameElementHrefAttributeValue =
993+ previewSellerUsernameElement .attr ("href" );
994+
995+ long previewSellerUserId =
996+ Long .parseLong (
997+ previewSellerUsernameElementHrefAttributeValue .substring (
998+ 25 , previewSellerUsernameElementHrefAttributeValue .length () - 1 ));
999+ String previewSellerUsername = previewSellerUsernameElement .text ();
1000+ String previewSellerAvatarPhotoLink = previewSellerImgElement .attr ("src" );
1001+
1002+ // if the previewUser has a regular photo
1003+ if (previewSellerAvatarPhotoLink .equals ("/img/layout/avatar.png" ))
1004+ previewSellerAvatarPhotoLink = null ;
1005+ boolean isPreviewSellerOnline =
1006+ funPayDocument .getElementsByClass ("media media-user online" ).first () != null ;
1007+ return ParsedPreviewUser .builder ()
1008+ .userId (previewSellerUserId )
1009+ .username (previewSellerUsername )
1010+ .avatarPhotoLink (previewSellerAvatarPhotoLink )
1011+ .isOnline (isPreviewSellerOnline )
1012+ .build ();
1013+ }
1014+
9261015 private void extractReviewsFromReviewsHtml (
9271016 Document reviewsHtml , List <ParsedSellerReview > currentSellerReviews ) {
9281017 List <Element > reviewContainerElements = reviewsHtml .getElementsByClass ("review-container" );
0 commit comments