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 .order .OrderNotFoundException ;
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 .order .ParsedOrder ;
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,86 @@ public List<ParsedTransaction> parseTransactions(String goldenKey, long userId,
497475 return parseTransactionsInternal (goldenKey , userId , null , pages );
498476 }
499477
478+ /** {@inheritDoc} */
479+ @ Override
480+ public ParsedOrder parseOrder (String goldenKey , String orderId )
481+ throws FunPayApiException , OrderNotFoundException {
482+ try (Response funPayHtmlResponse =
483+ httpClient
484+ .newCall (
485+ new Request .Builder ()
486+ .get ()
487+ .addHeader ("Cookie" , "golden_key=" + goldenKey )
488+ .url (baseURL + "/orders/" + orderId + "/" )
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 OrderNotFoundException (
497+ "Order with orderId " + orderId + " does not found" );
498+ }
499+
500+ List <String > statuses = new ArrayList <>();
501+
502+ List <Element > pageContentChildren =
503+ funPayDocument .getElementsByClass ("page-content" ).first ().children ();
504+
505+ Element pageHeader = pageContentChildren .get (0 );
506+ for (Element statusElement : pageHeader .children ()) {
507+ statuses .add (statusElement .text ());
508+ }
509+
510+ Element paramList = pageContentChildren .get (1 );
511+
512+ Map <String , String > params = new HashMap <>();
513+
514+ for (Element col : paramList .getElementsByClass ("row" ).first ().children ()) {
515+ List <Element > paramItemChildren =
516+ col .getElementsByClass ("param-item" ).first ().children ();
517+ params .put (paramItemChildren .get (0 ).text (), paramItemChildren .get (1 ).text ());
518+ }
519+
520+ List <Element > paramRows = paramList .getElementsByClass ("row" );
521+
522+ Double price = null ;
523+
524+ for (Element paramRow : paramRows ) {
525+ for (Element paramCol : paramRow .children ()) {
526+ List <Element > paramItemChildren =
527+ paramCol .getElementsByClass ("param-item" ).first ().children ();
528+ if (paramItemChildren .get (0 ).text ().equals ("Сумма" )) {
529+ price =
530+ Double .parseDouble (
531+ paramItemChildren .get (1 ).children ().get (0 ).text ());
532+ } else {
533+ params .put (
534+ paramItemChildren .get (0 ).text (), paramItemChildren .get (1 ).text ());
535+ }
536+ }
537+ }
538+
539+ List <Element > paramListChildren = paramList .children ();
540+
541+ String shortDescription = paramListChildren .get (1 ).children ().get (1 ).text ();
542+ String detailedDescription = paramListChildren .get (2 ).children ().get (1 ).text ();
543+
544+ return ParsedOrder .builder ()
545+ .id (orderId )
546+ .statuses (statuses )
547+ .params (params )
548+ .shortDescription (shortDescription )
549+ .detailedDescription (detailedDescription )
550+ .price (price )
551+ .other (extractPreviewUserFromProductPage (funPayDocument ))
552+ .build ();
553+ } catch (IOException e ) {
554+ throw new FunPayApiException (e .getLocalizedMessage ());
555+ }
556+ }
557+
500558 /** {@inheritDoc} */
501559 @ Override
502560 public CsrfTokenAndPHPSESSID parseCsrfTokenAndPHPSESSID (@ NonNull String goldenKey )
@@ -923,6 +981,38 @@ private List<ParsedSellerReview> parseSellerReviewsInternal(
923981 return currentSellerReviews ;
924982 }
925983
984+ private ParsedPreviewUser extractPreviewUserFromProductPage (Document funPayDocument ) {
985+ System .out .println ();
986+ Element previewSellerUsernameElement =
987+ funPayDocument .getElementsByClass ("media-user-name" ).first ().selectFirst ("a" );
988+ Element previewSellerImgElement =
989+ funPayDocument .getElementsByClass ("media-user" ).first ().selectFirst ("img" );
990+ Element previewSellerReviewCountElement =
991+ funPayDocument .getElementsByClass ("text-mini text-light mb5" ).first ();
992+
993+ String previewSellerUsernameElementHrefAttributeValue =
994+ previewSellerUsernameElement .attr ("href" );
995+
996+ long previewSellerUserId =
997+ Long .parseLong (
998+ previewSellerUsernameElementHrefAttributeValue .substring (
999+ 25 , previewSellerUsernameElementHrefAttributeValue .length () - 1 ));
1000+ String previewSellerUsername = previewSellerUsernameElement .text ();
1001+ String previewSellerAvatarPhotoLink = previewSellerImgElement .attr ("src" );
1002+
1003+ // if the previewUser has a regular photo
1004+ if (previewSellerAvatarPhotoLink .equals ("/img/layout/avatar.png" ))
1005+ previewSellerAvatarPhotoLink = null ;
1006+ boolean isPreviewSellerOnline =
1007+ funPayDocument .getElementsByClass ("media media-user online" ).first () != null ;
1008+ return ParsedPreviewUser .builder ()
1009+ .userId (previewSellerUserId )
1010+ .username (previewSellerUsername )
1011+ .avatarPhotoLink (previewSellerAvatarPhotoLink )
1012+ .isOnline (isPreviewSellerOnline )
1013+ .build ();
1014+ }
1015+
9261016 private void extractReviewsFromReviewsHtml (
9271017 Document reviewsHtml , List <ParsedSellerReview > currentSellerReviews ) {
9281018 List <Element > reviewContainerElements = reviewsHtml .getElementsByClass ("review-container" );
0 commit comments