1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . Threading . Tasks ;
4+ using HtmlAgilityPack ;
5+ using NetStone . Definitions ;
6+ using NetStone . Definitions . Model ;
7+ using NetStone . Definitions . Model . CWLS ;
8+ using NetStone . Search . CWLS ;
9+
10+ namespace NetStone . Model . Parseables . Search . CWLS ;
11+
12+ /// <summary>
13+ /// Models cross world link shell search results
14+ /// </summary>
15+ public class CrossWorldLinkShellSearchPage : LodestoneParseable , IPaginatedResult < CrossWorldLinkShellSearchPage >
16+ {
17+ private readonly LodestoneClient client ;
18+ private readonly CrossWorldLinkShellSearchQuery currentQuery ;
19+
20+ private readonly PagedDefinition < CrossWorldLinkShellSearchEntryDefinition > pageDefinition ;
21+
22+ /// <summary>
23+ /// Constructs character search results
24+ /// </summary>
25+ /// <param name="client"></param>
26+ /// <param name="rootNode"></param>
27+ /// <param name="pageDefinition"></param>
28+ /// <param name="currentQuery"></param>
29+ public CrossWorldLinkShellSearchPage ( LodestoneClient client , HtmlNode rootNode , PagedDefinition < CrossWorldLinkShellSearchEntryDefinition > pageDefinition ,
30+ CrossWorldLinkShellSearchQuery currentQuery ) : base ( rootNode )
31+ {
32+ this . client = client ;
33+ this . currentQuery = currentQuery ;
34+ this . pageDefinition = pageDefinition ;
35+ }
36+
37+ /// <summary>
38+ /// Indicates if any results are present
39+ /// </summary>
40+ public bool HasResults => ! HasNode ( this . pageDefinition . NoResultsFound ) ;
41+
42+ private CrossWorldLinkShellSearchEntry [ ] ? parsedResults ;
43+
44+ /// <summary>
45+ /// List all results
46+ /// </summary>
47+ public IEnumerable < CrossWorldLinkShellSearchEntry > Results
48+ {
49+ get
50+ {
51+ if ( ! this . HasResults )
52+ return Array . Empty < CrossWorldLinkShellSearchEntry > ( ) ;
53+
54+ if ( this . parsedResults == null )
55+ ParseSearchResults ( ) ;
56+
57+ return this . parsedResults ! ;
58+ }
59+ }
60+
61+ private void ParseSearchResults ( )
62+ {
63+ var container = QueryContainer ( this . pageDefinition ) ;
64+
65+ this . parsedResults = new CrossWorldLinkShellSearchEntry [ container . Length ] ;
66+ for ( var i = 0 ; i < this . parsedResults . Length ; i ++ )
67+ {
68+ this . parsedResults [ i ] = new CrossWorldLinkShellSearchEntry ( this . client , container [ i ] , this . pageDefinition . Entry ) ;
69+ }
70+ }
71+
72+ private int ? currentPageVal ;
73+
74+ ///<inheritdoc />
75+ public int CurrentPage
76+ {
77+ get
78+ {
79+ if ( ! this . HasResults )
80+ return 0 ;
81+
82+ if ( ! this . currentPageVal . HasValue )
83+ ParsePagesCount ( ) ;
84+
85+ return this . currentPageVal ! . Value ;
86+ }
87+ }
88+
89+ private int ? numPagesVal ;
90+
91+ ///<inheritdoc />
92+ public int NumPages
93+ {
94+ get
95+ {
96+ if ( ! this . HasResults )
97+ return 0 ;
98+
99+ if ( ! this . numPagesVal . HasValue )
100+ ParsePagesCount ( ) ;
101+
102+ return this . numPagesVal ! . Value ;
103+ }
104+ }
105+
106+ private void ParsePagesCount ( )
107+ {
108+ var results = ParseRegex ( this . pageDefinition . PageInfo ) ;
109+
110+ this . currentPageVal = int . Parse ( results [ "CurrentPage" ] . Value ) ;
111+ this . numPagesVal = int . Parse ( results [ "NumPages" ] . Value ) ;
112+ }
113+
114+ ///<inheritdoc />
115+ public async Task < CrossWorldLinkShellSearchPage ? > GetNextPage ( )
116+ {
117+ if ( ! this . HasResults )
118+ return null ;
119+
120+ if ( this . CurrentPage == this . NumPages )
121+ return null ;
122+
123+ return await this . client . SearchCrossWorldLinkshell ( this . currentQuery , this . CurrentPage + 1 ) ;
124+ }
125+ }
0 commit comments