1+ using System ;
2+ using System . Collections . Generic ;
3+ using System . IO ;
4+ using System . Linq ;
5+ using System . Net . WebSockets ;
6+ using System . Text ;
7+ using System . Threading ;
8+ using System . Threading . Tasks ;
9+ using System . Windows . Forms ;
10+ using Newtonsoft . Json ;
11+
12+ namespace DeepBotPointFucker
13+ {
14+ public class PointDownloader
15+ {
16+ private readonly ClientWebSocket _socket ;
17+
18+ public PointDownloader ( )
19+ {
20+ _socket = new ClientWebSocket ( ) ;
21+ }
22+
23+ public async Task < bool > Connect ( string apiKey )
24+ {
25+ try
26+ {
27+ Log ( "Establishing connection." ) ;
28+
29+ const string url = "ws://localhost:3337" ;
30+
31+ Log ( $ "Connecting to `{ url } `.") ;
32+
33+ await _socket . ConnectAsync ( new Uri ( url ) , CancellationToken . None ) ;
34+ }
35+ catch
36+ {
37+ Log ( "Connection failed." ) ;
38+
39+ return false ;
40+ }
41+
42+ try
43+ {
44+ var command = $ "api|register|{ apiKey } ";
45+
46+ Log ( $ "Sending command `{ command } `.") ;
47+
48+ await SendMessage ( command ) ;
49+ }
50+ catch
51+ {
52+ Log ( "Command failed." ) ;
53+
54+ return false ;
55+ }
56+
57+ try
58+ {
59+ var registerResult = await ReceiveMessage ( ) ;
60+
61+ Log ( "Response received." ) ;
62+
63+ if ( registerResult ? . Message == "success" )
64+ {
65+ Log ( "Registering with DeepBot's API was successful." ) ;
66+
67+ return true ;
68+ }
69+ }
70+ catch
71+ {
72+ // ignored
73+ }
74+
75+ Log ( "Registering with DeepBot's API was not successful." ) ;
76+
77+ return false ;
78+ }
79+
80+ public async Task < List < UserResult > > Download ( )
81+ {
82+ var allUsers = new List < UserResult > ( ) ;
83+ var currentOffset = 0 ;
84+ const int limit = 100 ;
85+
86+ var command = $ "api|get_users|{ currentOffset } |{ limit } ";
87+
88+ List < UserResult > users ;
89+ do
90+ {
91+ users = await GetUsers ( command ) ;
92+
93+ allUsers . AddRange ( users ) ;
94+
95+ currentOffset += users . Count ;
96+ } while ( users . Any ( ) ) ;
97+
98+ return allUsers ;
99+ }
100+
101+ private async Task < List < UserResult > > GetUsers ( string command )
102+ {
103+ try
104+ {
105+ Log ( $ "Sending command `{ command } `.") ;
106+
107+ await SendMessage ( command ) ;
108+ }
109+ catch
110+ {
111+ Log ( "Command failed." ) ;
112+
113+ return new List < UserResult > ( ) ;
114+ }
115+
116+ try
117+ {
118+ var result = await ReceiveMessage ( ) ;
119+
120+ Log ( "Response received." ) ;
121+
122+ return JsonConvert . DeserializeObject < List < UserResult > > ( result . Message ) ;
123+ }
124+ catch
125+ {
126+ Log ( "There was an error receiving the response." ) ;
127+
128+ return new List < UserResult > ( ) ;
129+ }
130+ }
131+
132+ private void Log ( string message )
133+ {
134+ Console . WriteLine ( message ) ;
135+ }
136+
137+ private async Task SendMessage ( string message )
138+ {
139+ using ( var memoryStream = new MemoryStream ( ) )
140+ {
141+ using ( var writer = new StreamWriter ( memoryStream , Encoding . UTF8 ) )
142+ {
143+ await writer . WriteLineAsync ( message ) ;
144+ }
145+
146+ var arraySegment = new ArraySegment < byte > ( memoryStream . ToArray ( ) ) ;
147+
148+ await _socket . SendAsync ( arraySegment , WebSocketMessageType . Text , true , CancellationToken . None ) ;
149+ }
150+ }
151+
152+ private async Task < CommandResult > ReceiveMessage ( )
153+ {
154+ using ( var memoryStream = new MemoryStream ( ) )
155+ {
156+ var buffer = new ArraySegment < byte > ( new byte [ 8192 ] ) ;
157+ WebSocketReceiveResult result ;
158+ do
159+ {
160+ result = await _socket . ReceiveAsync ( buffer , CancellationToken . None ) ;
161+ memoryStream . Write ( buffer . Array , buffer . Offset , result . Count ) ;
162+ } while ( ! result . EndOfMessage ) ;
163+
164+ memoryStream . Seek ( 0 , SeekOrigin . Begin ) ;
165+
166+ if ( result . MessageType != WebSocketMessageType . Text )
167+ {
168+ return null ;
169+ }
170+
171+ using ( var reader = new StreamReader ( memoryStream , Encoding . UTF8 ) )
172+ {
173+ var message = await reader . ReadToEndAsync ( ) ;
174+
175+ return JsonConvert . DeserializeObject < CommandResult > ( message ) ;
176+ }
177+ }
178+ }
179+
180+ public void WriteResultsToFile ( List < UserResult > results )
181+ {
182+ var ofd = new OpenFileDialog ( ) ;
183+ if ( ofd . ShowDialog ( ) != DialogResult . OK )
184+ {
185+ return ;
186+ }
187+
188+ var stringBuilder = new StringBuilder ( ) ;
189+ stringBuilder . AppendLine ( "User,Points" ) ;
190+
191+ var text = results . Aggregate ( stringBuilder , ( builder , result ) => builder . AppendLine ( $ "{ result . User } ,{ result . Points } ") , builder => builder . ToString ( ) ) ;
192+
193+ File . WriteAllText ( ofd . FileName , text ) ;
194+ }
195+ }
196+ }
0 commit comments