11
11
12
12
namespace DeepBotPointFucker
13
13
{
14
- public class PointDownloader
14
+ public interface IPointDownloader
15
15
{
16
+ void Initialize ( ) ;
17
+ Task < bool > Connect ( ) ;
18
+ Task < List < User > > Download ( ) ;
19
+ void WriteResultsToFile ( List < User > results ) ;
20
+ }
21
+
22
+ public class PointDownloader : IPointDownloader
23
+ {
24
+ private const int ApiLimit = 100 ;
16
25
private readonly ClientWebSocket _socket ;
26
+ private string _apiKey ;
27
+ private int _minimumPointValue ;
17
28
18
29
public PointDownloader ( )
19
30
{
20
31
_socket = new ClientWebSocket ( ) ;
21
32
}
22
33
23
- public async Task < bool > Connect ( string apiKey )
34
+ #region IPointDownloader Members
35
+ public void Initialize ( )
36
+ {
37
+ _apiKey = GetValueFromConsole ( "Please enter your DeepBot Api Key. This is located in your master settings." ,
38
+ value => new Box < string > { HasValue = ! string . IsNullOrWhiteSpace ( value ) , Value = value } ) ;
39
+
40
+ _minimumPointValue = GetValueFromConsole ( "Please enter the minimum number of points required for export." ,
41
+ value =>
42
+ {
43
+ var box = new Box < int > ( ) ;
44
+
45
+ int outVal ;
46
+ if ( int . TryParse ( value , out outVal ) )
47
+ {
48
+ box . HasValue = true ;
49
+ box . Value = outVal ;
50
+ }
51
+
52
+ return box ;
53
+ } ) ;
54
+ }
55
+
56
+ public async Task < bool > Connect ( )
24
57
{
25
58
try
26
59
{
@@ -41,9 +74,7 @@ public async Task<bool> Connect(string apiKey)
41
74
42
75
try
43
76
{
44
- var command = $ "api|register|{ apiKey } ";
45
-
46
- Log ( $ "Sending command `{ command } `.") ;
77
+ var command = $ "api|register|{ _apiKey } ";
47
78
48
79
await SendCommand ( command ) ;
49
80
}
@@ -58,8 +89,6 @@ public async Task<bool> Connect(string apiKey)
58
89
{
59
90
var registerResult = await ReceiveMessage < RegisterResult > ( ) ;
60
91
61
- Log ( "Response received." ) ;
62
-
63
92
if ( registerResult ? . Message == "success" )
64
93
{
65
94
Log ( "Registering with DeepBot's API was successful." ) ;
@@ -69,10 +98,10 @@ public async Task<bool> Connect(string apiKey)
69
98
}
70
99
catch
71
100
{
72
- // ignored
73
- }
101
+ Log ( "Registering with DeepBot's API was not successful." ) ;
74
102
75
- Log ( "Registering with DeepBot's API was not successful." ) ;
103
+ return false ;
104
+ }
76
105
77
106
return false ;
78
107
}
@@ -82,53 +111,94 @@ public async Task<List<User>> Download()
82
111
Log ( "Beginning download." ) ;
83
112
var allUsers = new List < User > ( ) ;
84
113
var currentOffset = 0 ;
85
- const int limit = 100 ;
86
114
87
115
do
88
116
{
89
- string command = $ "api|get_users|{ currentOffset } |{ limit } ";
117
+ var command = $ "api|get_users|{ currentOffset } |{ ApiLimit } ";
90
118
91
119
var users = await GetUsers ( command ) ;
92
120
121
+ if ( users == null )
122
+ {
123
+ break ;
124
+ }
125
+
93
126
allUsers . AddRange ( users ) ;
94
127
95
128
currentOffset += users . Count ;
96
- } while ( currentOffset % limit == 0 ) ;
129
+ } while ( currentOffset % ApiLimit == 0 ) ;
97
130
98
131
Log ( "Finished download." ) ;
132
+
99
133
return allUsers ;
100
134
}
101
135
136
+ public void WriteResultsToFile ( List < User > results )
137
+ {
138
+ Log ( "Beginning writing results to file." ) ;
139
+
140
+ var stringBuilder = new StringBuilder ( ) ;
141
+ stringBuilder . AppendLine ( "User,Points" ) ;
142
+
143
+ var text = results . Where ( x => x . Points >= _minimumPointValue )
144
+ . OrderByDescending ( x => x . Points )
145
+ . Aggregate ( stringBuilder , ( builder , result ) => builder . AppendLine ( $ "{ result . Name } ,{ result . Points } ") , builder => builder . ToString ( ) ) ;
146
+
147
+ var filePath = Path . Combine ( AppDomain . CurrentDomain . BaseDirectory , "results.txt" ) ;
148
+
149
+ if ( ! File . Exists ( filePath ) )
150
+ {
151
+ File . Create ( filePath ) ;
152
+ }
153
+
154
+ File . WriteAllText ( filePath , text ) ;
155
+
156
+ Log ( "Completed writing results to file." ) ;
157
+ }
158
+ #endregion
159
+
160
+ private T GetValueFromConsole < T > ( string initMessage , Func < string , Box < T > > handler )
161
+ {
162
+ Box < T > box ;
163
+
164
+ Log ( initMessage ) ;
165
+
166
+ do
167
+ {
168
+ var value = Console . ReadLine ( ) ;
169
+
170
+ box = handler ( value ) ;
171
+ } while ( ! box . HasValue ) ;
172
+
173
+ return box . Value ;
174
+ }
175
+
102
176
private async Task < List < User > > GetUsers ( string command )
103
177
{
104
178
try
105
179
{
106
- Log ( $ "Sending command `{ command } `.") ;
107
-
108
180
await SendCommand ( command ) ;
109
181
}
110
182
catch
111
183
{
112
184
Log ( "Command failed." ) ;
113
185
114
- return new List < User > ( ) ;
186
+ return null ;
115
187
}
116
188
117
189
try
118
190
{
119
191
var result = await ReceiveMessage < UserResult > ( ) ;
120
192
121
- Log ( "Response received." ) ;
122
-
123
193
return result . Message ;
124
194
}
125
195
catch ( Exception e )
126
196
{
127
- Log ( e . Message ) ;
128
-
129
197
Log ( "There was an error receiving the response." ) ;
130
198
131
- return new List < User > ( ) ;
199
+ Log ( e . Message ) ;
200
+
201
+ return null ;
132
202
}
133
203
}
134
204
@@ -139,6 +209,8 @@ private void Log(string message)
139
209
140
210
private async Task SendCommand ( string command )
141
211
{
212
+ Log ( $ "Sending command `{ command } `.") ;
213
+
142
214
var buffer = Encoding . UTF8 . GetBytes ( command ) ;
143
215
var arraySegment = new ArraySegment < byte > ( buffer ) ;
144
216
@@ -157,6 +229,8 @@ private async Task<T> ReceiveMessage<T>()
157
229
memoryStream . Write ( buffer . Array , buffer . Offset , result . Count ) ;
158
230
} while ( ! result . EndOfMessage ) ;
159
231
232
+ Log ( "Response received." ) ;
233
+
160
234
memoryStream . Seek ( 0 , SeekOrigin . Begin ) ;
161
235
162
236
if ( result . MessageType != WebSocketMessageType . Text )
@@ -172,28 +246,5 @@ private async Task<T> ReceiveMessage<T>()
172
246
}
173
247
}
174
248
}
175
-
176
- public void WriteResultsToFile ( List < User > results )
177
- {
178
- Log ( "Beginning writing results to file." ) ;
179
-
180
- var stringBuilder = new StringBuilder ( ) ;
181
- stringBuilder . AppendLine ( "User,Points" ) ;
182
-
183
- var text = results . Where ( x => x . Points > 100 )
184
- . OrderByDescending ( x => x . Points )
185
- . Aggregate ( stringBuilder , ( builder , result ) => builder . AppendLine ( $ "{ result . Name } ,{ result . Points } ") , builder => builder . ToString ( ) ) ;
186
-
187
- var filePath = Path . Combine ( AppDomain . CurrentDomain . BaseDirectory , "results.txt" ) ;
188
-
189
- if ( ! File . Exists ( filePath ) )
190
- {
191
- File . Create ( filePath ) ;
192
- }
193
-
194
- File . WriteAllText ( filePath , text ) ;
195
-
196
- Log ( "Completed writing results to file." ) ;
197
- }
198
249
}
199
250
}
0 commit comments