13
13
using System . Diagnostics ;
14
14
using Heroes . ReplayParser ;
15
15
using System . Collections . Concurrent ;
16
+ using System . Net . Http ;
17
+ using Newtonsoft . Json ;
18
+ using MpqBattlelobby = Heroes . ReplayParser . MPQFiles . StandaloneBattleLobbyParser ;
19
+ using MpqHeader = Heroes . ReplayParser . MPQFiles . MpqHeader ;
20
+ using MpqAttributeEvents = Heroes . ReplayParser . MPQFiles . ReplayAttributeEvents ;
21
+ using MpqDetails = Heroes . ReplayParser . MPQFiles . ReplayDetails ;
22
+ //using MpqGameEvents = Heroes.ReplayParser.MPQFiles.ReplayGameEvents;
23
+ using MpqInitData = Heroes . ReplayParser . MPQFiles . ReplayInitData ;
24
+ //using MpqMessageEvents = Heroes.ReplayParser.MPQFiles.ReplayMessageEvents;
25
+ //using MpqResumableEvents = Heroes.ReplayParser.MPQFiles.ReplayResumableEvents;
26
+ using MpqTrackerEvents = Heroes . ReplayParser . MPQFiles . ReplayTrackerEvents ;
27
+ using Statistics = Heroes . ReplayParser . Statistics ;
28
+ //using GameEventType = Heroes.ReplayParser.MPQFiles.GameEventType;
29
+
16
30
17
31
namespace Heroesprofile . Uploader . Common
18
32
{
@@ -36,9 +50,12 @@ public class Manager : INotifyPropertyChanged
36
50
private IUploader _uploader ;
37
51
private IAnalyzer _analyzer ;
38
52
private IMonitor _monitor ;
53
+ private PreMatchIMonitor _prematch_monitor ;
39
54
40
55
public event PropertyChangedEventHandler PropertyChanged ;
41
56
57
+ private int prematch_id = 0 ;
58
+ public bool PreMatchPage { get ; set ; }
42
59
private string _status = "" ;
43
60
/// <summary>
44
61
/// Current uploader status
@@ -91,7 +108,7 @@ public Manager(IReplayStorage storage)
91
108
/// <summary>
92
109
/// Start uploading and watching for new replays
93
110
/// </summary>
94
- public async void Start ( IMonitor monitor , IAnalyzer analyzer , IUploader uploader )
111
+ public async void Start ( IMonitor monitor , PreMatchIMonitor prematch_monitor , IAnalyzer analyzer , IUploader uploader )
95
112
{
96
113
if ( _initialized ) {
97
114
return ;
@@ -101,19 +118,116 @@ public async void Start(IMonitor monitor, IAnalyzer analyzer, IUploader uploader
101
118
_uploader = uploader ;
102
119
_analyzer = analyzer ;
103
120
_monitor = monitor ;
121
+ _prematch_monitor = prematch_monitor ;
104
122
105
123
var replays = ScanReplays ( ) ;
106
124
Files . AddRange ( replays ) ;
107
125
replays . Where ( x => x . UploadStatus == UploadStatus . None ) . Reverse ( ) . Map ( x => processingQueue . Add ( x ) ) ;
108
126
127
+
128
+
109
129
_monitor . ReplayAdded += async ( _ , e ) => {
110
130
await EnsureFileAvailable ( e . Data , 3000 ) ;
111
131
var replay = new ReplayFile ( e . Data ) ;
112
132
Files . Insert ( 0 , replay ) ;
113
133
processingQueue . Add ( replay ) ;
134
+ if ( PreMatchPage ) {
135
+ _prematch_monitor . Start ( ) ;
136
+ }
114
137
} ;
115
138
_monitor . Start ( ) ;
116
139
140
+
141
+ _prematch_monitor . TempBattleLobbyCreated += async ( _ , e ) => {
142
+ if ( PreMatchPage ) {
143
+ prematch_id = 0 ;
144
+ _prematch_monitor . Stop ( ) ;
145
+ Thread . Sleep ( 1000 ) ;
146
+ var tmpPath = Path . GetTempFileName ( ) ;
147
+ await SafeCopy ( e . Data , tmpPath , true ) ;
148
+ byte [ ] bytes = System . IO . File . ReadAllBytes ( tmpPath ) ;
149
+ Replay replay = MpqBattlelobby . Parse ( bytes ) ;
150
+ await runPreMatch ( replay ) ;
151
+ }
152
+ } ;
153
+ _prematch_monitor . Start ( ) ;
154
+
155
+
156
+ /*
157
+ _prematch_monitor.StormSaveCreated += async (_, e) => {
158
+ var tmpPath = Path.GetTempFileName();
159
+ await SafeCopy(e.Data, tmpPath, true);
160
+ var replay = new Replay();
161
+
162
+ MpqHeader.ParseHeader(replay, e.Data);
163
+
164
+ using (var archive = new Foole.Mpq.MpqArchive(tmpPath)) {
165
+ archive.AddListfileFilenames();
166
+
167
+
168
+ //Gets Players
169
+ MpqDetails.Parse(replay, DataParser.GetMpqFile(archive, "save.details"), true);
170
+
171
+ //Gets which Heroes each player played
172
+ if (archive.FileExists("replay.attributes.events")) {
173
+ MpqAttributeEvents.Parse(replay, DataParser.GetMpqFile(archive, "replay.attributes.events"));
174
+ }
175
+
176
+
177
+ //Get Game Mode
178
+ if (archive.FileExists("save.initData")) {
179
+ MpqInitData.Parse(replay, DataParser.GetMpqFile(archive, "save.initData"));
180
+ }
181
+
182
+ ////Fails
183
+ //
184
+ //if (archive.FileExists("replay.game.events")) {
185
+ // MpqGameEvents.Parse(DataParser.GetMpqFile(archive, "replay.game.events"), replay.Players, replay.ReplayBuild, replay.ReplayVersionMajor, false);
186
+ //}
187
+ //
188
+ //
189
+
190
+ //
191
+ //
192
+ ////Not Needed
193
+ //
194
+ //if (archive.FileExists("replay.message.events")) {
195
+ // MpqMessageEvents.Parse(replay, DataParser.GetMpqFile(archive, "replay.message.events"));
196
+ //}
197
+ //
198
+ //
199
+ ////Fails
200
+ //
201
+ //if (archive.FileExists("replay.resumable.events")) {
202
+ // MpqResumableEvents.Parse(replay, DataParser.GetMpqFile(archive, "replay.resumable.events"));
203
+ //}
204
+
205
+
206
+
207
+ for (int i = 0; i < replay.Players.Length; i++) {
208
+ replay.Players[i].Talents = new Talent[7];
209
+ for (int j = 0; j < replay.Players[i].Talents.Length; j++) {
210
+ replay.Players[i].Talents[j] = new Talent();
211
+ }
212
+ }
213
+
214
+ if (archive.FileExists("replay.tracker.events")) {
215
+ replay.TrackerEvents = MpqTrackerEvents.Parse(DataParser.GetMpqFile(archive, "replay.tracker.events"));
216
+ }
217
+
218
+
219
+ Statistics.Parse(replay);
220
+
221
+ }
222
+
223
+
224
+ await updatePreMatch(replay);
225
+ };
226
+ */
227
+ //_prematch_monitor.Start();
228
+
229
+
230
+
117
231
_analyzer . MinimumBuild = await _uploader . GetMinimumBuild ( ) ;
118
232
119
233
for ( int i = 0 ; i < MaxThreads ; i ++ ) {
@@ -127,6 +241,42 @@ public void Stop()
127
241
processingQueue . CompleteAdding ( ) ;
128
242
}
129
243
244
+ private async Task runPreMatch ( Replay replayData )
245
+ {
246
+ HttpClient client = new HttpClient ( ) ;
247
+ var values = new Dictionary < string , string >
248
+ {
249
+ { "data" , JsonConvert . SerializeObject ( replayData . Players ) } ,
250
+ } ;
251
+
252
+ var content = new FormUrlEncodedContent ( values ) ;
253
+
254
+ var response = await client . PostAsync ( "https://www.heroesprofile.com/PreMatch/" , content ) ;
255
+
256
+ var responseString = await response . Content . ReadAsStringAsync ( ) ;
257
+
258
+
259
+ prematch_id = Convert . ToInt32 ( responseString ) ;
260
+
261
+ System . Diagnostics . Process . Start ( "https://www.heroesprofile.com/PreMatch/Results/?prematchID=" + prematch_id ) ;
262
+ }
263
+
264
+ private async Task updatePreMatch ( Replay replayData )
265
+ {
266
+ HttpClient client = new HttpClient ( ) ;
267
+ var values = new Dictionary < string , string >
268
+ {
269
+ { "prematch_id" , prematch_id . ToString ( ) } ,
270
+ { "game_type" , replayData . GameMode . ToString ( ) } ,
271
+ { "game_map" , replayData . Map . ToString ( ) } ,
272
+ { "data" , JsonConvert . SerializeObject ( replayData . Players ) } ,
273
+ } ;
274
+
275
+ var content = new FormUrlEncodedContent ( values ) ;
276
+
277
+ var response = await client . PostAsync ( "https://www.heroesprofile.com/PreMatch/Update" , content ) ;
278
+ }
279
+
130
280
private async Task UploadLoop ( )
131
281
{
132
282
while ( await processingQueue . OutputAvailableAsync ( ) ) {
@@ -248,5 +398,24 @@ private bool ShouldDelete(ReplayFile file, Replay replay)
248
398
DeleteAfterUpload . HasFlag ( DeleteFiles . StormLeague ) && replay . GameMode == GameMode . StormLeague
249
399
) ;
250
400
}
401
+ private static async Task SafeCopy ( string source , string dest , bool overwrite )
402
+ {
403
+ var watchdog = 10 ;
404
+ var retry = false ;
405
+ do {
406
+ try {
407
+ File . Copy ( source , dest , overwrite ) ;
408
+ retry = false ;
409
+ }
410
+ catch ( Exception ex ) {
411
+ Debug . WriteLine ( $ "Failed to copy ${ source } to ${ dest } . Counter at ${ watchdog } CAUSED BY ${ ex } ") ;
412
+ if ( watchdog <= 0 ) {
413
+ throw ;
414
+ }
415
+ retry = true ;
416
+ }
417
+ await Task . Delay ( 1000 ) ;
418
+ } while ( watchdog -- > 0 && retry ) ;
419
+ }
251
420
}
252
421
}
0 commit comments