152 Commits

Author SHA1 Message Date
VladMordock
f42a3e60a2 Merge pull request #28 from szporwolik/dev
9.3
2019-12-23 13:52:16 +01:00
VladMordock
ff78ba1cfe Merge branch 'master' into dev 2019-12-23 13:52:02 +01:00
szporowolik
a117d37bc0 Update and sync with 0.9.3 2019-12-23 13:48:50 +01:00
szporowolik
c36befd5a0 Changes related to #27 .
This shall prevent SQL injection.
2019-12-23 13:43:19 +01:00
VladMordock
1cadd04092 Fix for error when MySQL is running in TRADITIONAL mode
https://www.got-it.ai/solutions/sqlquerychat/sql-help/data-manipulation/handling-overflow-and-out-of-range-errors-in-mysql/
2019-11-18 18:26:14 +01:00
szporowolik
4cca5ee405 v0.9.3 preparation 2019-11-18 01:50:17 +01:00
szporowolik
ca48b4bc0a v0.9.3 preparation 2019-11-18 01:49:46 +01:00
szporowolik
c55c4efaf8 9.2 final 2019-11-18 01:48:03 +01:00
VladMordock
30502e6fcc Merge pull request #26 from szporwolik/dev
v0.9.2
2019-11-18 01:37:48 +01:00
VladMordock
7d16dc197c Merge branch 'master' into dev 2019-11-18 01:37:27 +01:00
szporowolik
7ad493f5f0 Shall be ready for final testing and v0.9.2 release 2019-11-11 02:46:45 +01:00
szporowolik
2821ee9cd6 Final fix for #25 ; all stats cache mechanism was improved. 2019-11-11 02:25:43 +01:00
szporowolik
946d60c5f5 Database upgrade to add feature #25 2019-11-11 00:22:17 +01:00
szporowolik
c831835dfa First approach for feature request #25 - shall work, testing is required 2019-11-11 00:20:38 +01:00
szporowolik
28b614662b Minor fixes 2019-11-08 00:04:42 +01:00
szporowolik
5fbd071b9b Commented pulling of all mission data, shall improve performance. 2019-11-07 23:53:39 +01:00
szporowolik
26bf326e0a Code clean up for takeoffs and landings 2019-11-07 23:39:20 +01:00
szporowolik
fc6b1d9629 Deleted JSON export 2019-11-07 23:22:55 +01:00
szporowolik
c1fc566f03 Removed json export 2019-11-07 23:22:31 +01:00
VladMordock
382def09da Update README.md
Removed references about JSON export.
2019-11-07 23:17:38 +01:00
szporowolik
fdcb82cafa Fixed issue #19 - disconnect event 2019-11-07 23:11:00 +01:00
szporowolik
fe2b9cd3f1 Changes trying to get player disconnect event hanlder to work 2019-11-07 01:18:23 +01:00
szporowolik
15707672d2 Fixed date format in Perun log file 2019-11-07 01:12:39 +01:00
VladMordock
63fbb0b3bb Update m1081_perun.sql
Another trouble with MySQL compatibility fixed
2019-11-07 00:58:14 +01:00
szporowolik
885bbf2989 Shall fix the lag issue when connection is not available. 2019-11-07 00:20:01 +01:00
VladMordock
9349309645 Update m1081_perun.sql
Fix for "ERROR MySQL - error id: 1364" on specific MySQL config
2019-11-06 23:46:45 +01:00
VladMordock
8c6e87120e Update README.md
Update about 1364 mysql error.
2019-11-06 23:32:31 +01:00
VladMordock
18bebf887b Update README.md 2019-11-06 23:19:42 +01:00
VladMordock
5b22ddd66e Update README.md 2019-11-06 23:18:20 +01:00
VladMordock
01d8b6ceba Update README.md 2019-11-06 23:12:37 +01:00
VladMordock
4d989167ba Update README.md
Updated to avoid confusion.
2019-11-06 16:59:39 +01:00
szporowolik
1c13b8896a Preparation for 0.9.2 2019-11-04 00:33:42 +01:00
VladMordock
a9e87b1049 Update README.md 2019-11-03 01:17:12 +01:00
VladMordock
c8b7abc41c Merge pull request #21 from szporwolik/dev
Dev
2019-11-02 23:18:00 +01:00
szporowolik
7270ff8bab v0.9.1 2019-11-02 23:13:40 +01:00
szporowolik
ed8ed6d62a Db update for v0.9.1 2019-11-02 23:10:41 +01:00
szporowolik
9b54a0be8d Fix for disconnects not beeing tracked 2019-11-02 18:25:06 +01:00
szporowolik
becbce25c0 v0.9.1 preparation 2019-11-02 18:23:04 +01:00
szporowolik
7c1b533d79 Version check will not run for DEBUG builds 2019-11-02 18:22:20 +01:00
szporowolik
6c10f5bace Update for DCS SRS 1.7.2 ( SRS's JSON file format was changed) 2019-11-02 18:18:40 +01:00
szporowolik
c2b5f6258b Update build information 2019-11-02 17:29:11 +01:00
VladMordock
61d2a1b16e Update README.md
Added information about stats for FARP and Carrier operations.
2019-10-31 23:32:12 +01:00
VladMordock
7f9a74f57b Merge pull request #18 from szporwolik/dev
Pull requst of v0.9.0
2019-10-31 23:20:15 +01:00
VladMordock
0385aa8ee5 Update README.md
Information about contributing edited.
2019-10-31 23:19:30 +01:00
szporowolik
6423f6534c DB structure upadated and frozen for v0.9.0 2019-10-31 10:28:00 +01:00
szporowolik
ddd72adea3 Fixed "landed at" bug 2019-10-31 10:25:06 +01:00
VladMordock
a6e809a3b1 Update m1081_perun.sql
Fixed landing bug
2019-10-29 00:07:51 +01:00
VladMordock
c01d5da10f Update README.md
Readme fix
2019-10-28 17:05:48 +01:00
VladMordock
087dbe84af Update README.md
Update with information about data display
2019-10-28 17:04:41 +01:00
szporowolik
078ba09cc7 MySQL structure cleanup 2019-10-28 16:49:02 +01:00
szporowolik
14c5a8896f DCS will now inform that Perun connection is broken 2019-10-28 16:48:05 +01:00
szporowolik
57f90954d3 Fixes for multicrew support 2019-10-28 00:11:53 +01:00
VladMordock
a341d06dc8 Changed screenshot 2019-10-27 21:12:18 +01:00
szporowolik
75f1e0d316 Database update to v0.9.0 2019-10-26 21:15:18 +02:00
szporowolik
4bd536f556 Occupied seat will be stored in the database, for easier displaying 2019-10-25 13:03:24 +02:00
szporowolik
fcdf6ed0be Multicrew support in the decent form was added 2019-10-24 01:49:30 +02:00
szporowolik
6d64f7f6e0 Huge Lua improvments for multicrew support 2019-10-24 00:30:31 +02:00
szporowolik
5b0ee02e11 v0.9.0 & code cleanup in lua file 2019-10-23 20:19:25 +02:00
szporowolik
55fe32f0fd Code clean up 2019-10-23 01:34:41 +02:00
szporowolik
ec1d6b3a5e v9.0.0 config 2019-10-23 00:10:48 +02:00
VladMordock
9a807834d2 Merge pull request #17 from szporwolik/dev
v0.8.3
2019-10-22 17:43:13 +02:00
szporowolik
e1cfdba2cc Database upgrade to v0.8.3 2019-10-22 17:40:20 +02:00
szporowolik
9770c26b93 Added version checking of database, dcs hook and windows app - in case of mismatch , app is terminating 2019-10-22 17:36:36 +02:00
szporowolik
a0c9a249f6 Code clean up 2019-10-22 16:30:47 +02:00
szporowolik
53aade262e Code cleanup 2019-10-22 16:13:12 +02:00
szporowolik
a78ad87312 Improved MySQL connection status; performane improvment 2019-10-22 15:12:07 +02:00
szporowolik
ab86b3bcec Fixed mysql error couter 2019-10-22 14:48:21 +02:00
szporowolik
b8087f6333 First approach for multicrew stats 2019-10-22 01:15:48 +02:00
szporowolik
83ce2bd490 Improved log files - events 2019-10-21 20:22:18 +02:00
szporowolik
1f110321b4 Not send srs/lotatc data if there is no game connection. 2019-10-21 20:21:01 +02:00
szporowolik
efc215f58a Further logging improvment 2019-10-21 18:09:23 +02:00
szporowolik
4e1456e432 Merge branch 'dev' of https://github.com/szporwolik/perun into dev 2019-10-21 17:50:14 +02:00
szporowolik
5908f8f332 Logging improvment - GUI and log file shall be much easier to read and contain more information 2019-10-21 17:50:04 +02:00
szporowolik
5889bc6ddf SRS and LotATC sending will now look better in log files 2019-10-21 16:55:44 +02:00
szporowolik
2084d88117 Keep alive information added to logs 2019-10-21 16:47:26 +02:00
szporowolik
49495ba9c4 Log file and GUI improvment 2019-10-21 16:41:10 +02:00
szporowolik
1a73404c4c Fixed logging to gui (removed date), file log will keep the log date 2019-10-21 15:34:46 +02:00
VladMordock
c66daec294 Update readme
Added gildia.org logo and perun log
2019-10-21 15:24:04 +02:00
szporowolik
38853937be Merge branch 'dev' of https://github.com/szporwolik/perun into dev 2019-10-21 15:11:36 +02:00
VladMordock
488d4dfcac Update Readme - image update and added FAQ 2019-10-21 15:05:59 +02:00
szporowolik
fb96745ede Added user marker button 2019-10-21 14:51:19 +02:00
szporowolik
9d06065d70 GUI updated, added graphical header and logo 2019-10-21 14:47:25 +02:00
szporowolik
464261f09f Fixed folder structure 2019-10-21 14:37:35 +02:00
szporowolik
9123619ad1 Updated file naming and remobed unused images 2019-10-21 14:12:12 +02:00
szporowolik
cabd8d28bb Update to v.0.8.3 of lua file 2019-10-21 01:54:43 +02:00
szporowolik
67eda5d79b v0.8.3 - hotfix for disconnections issues , further network code improvment 2019-10-21 01:53:49 +02:00
VladMordock
afb935da72 Merge pull request #16 from szporwolik/dev
v8.2.0 pull request
2019-10-20 15:11:54 +02:00
szporowolik
61e201b261 Code cleanup 2019-10-20 15:00:24 +02:00
szporowolik
fc009892f2 Code cleanup 2019-10-20 14:58:04 +02:00
szporowolik
732f8b5fce Code cleanup 2019-10-20 14:26:38 +02:00
szporowolik
ceec3a7616 Code cleanup 2019-10-20 13:44:34 +02:00
szporowolik
763e6e3314 Code clean-up 2019-10-20 13:43:44 +02:00
szporowolik
2ad1a531b8 Removed NativeMethods - not used as we allow multiple instances now; changed tray icon hover text 2019-10-20 13:40:53 +02:00
szporowolik
c35c216c78 Code cleanup 2019-10-20 13:34:23 +02:00
szporowolik
0a17fcf0b2 Code cleanup 2019-10-20 13:33:10 +02:00
szporowolik
b36127c272 Code cleanup 2019-10-20 13:30:17 +02:00
szporowolik
bd0769c997 Fixed resources namming 2019-10-20 13:26:44 +02:00
szporowolik
27c2163784 Network code improved 2019-10-20 13:25:06 +02:00
VladMordock
624347b1a0 Update to 8.2 2019-10-20 02:50:20 +02:00
VladMordock
8bbac989cd Update README.md
Update to v8.2.0
2019-10-20 02:39:34 +02:00
szporowolik
fcb007bc98 Network code improvment 2019-10-20 01:06:14 +02:00
szporowolik
2f7d2d07bb Added status icons and better connection handling 2019-10-19 23:00:54 +02:00
szporowolik
48f60abbfa New feature - added simple logging to file 2019-10-19 21:31:17 +02:00
szporowolik
20d19b2670 More information about MySQL errors wil be displayed to user 2019-10-19 18:37:24 +02:00
szporowolik
49e35bcd5e v8.2.0 configuration and first build for testing 2019-10-19 14:27:51 +02:00
VladMordock
7a8a36e91b Merge pull request #15 from szporwolik/dev
v8.1.0
2019-10-19 14:27:00 +02:00
szporowolik
a0742c8c43 Performance upgrade - icons reloading will not affect performance 2019-10-19 13:34:50 +02:00
szporowolik
666c3a859f Performance upgrade - status icons reloaded only when really needed 2019-10-19 13:22:44 +02:00
szporowolik
fb0620d178 Performance upgrae - history control update only when it's really needed 2019-10-19 13:13:20 +02:00
szporowolik
1d6b32872b Configuration change 2019-10-19 12:43:13 +02:00
szporowolik
af4bc135da Block quit button, while server is connected. 2019-10-19 12:39:29 +02:00
szporowolik
57483ad4c8 v8.1.0 2019-10-19 12:26:27 +02:00
szporowolik
fcb2f62646 Fixed version displayed in title bar 2019-10-19 12:26:18 +02:00
VladMordock
255eb35e7f Merge pull request #14 from szporwolik/dev
v8.0.0 release move to master branch
2019-10-19 11:30:26 +02:00
VladMordock
22168d281f Merge branch 'master' into dev 2019-10-19 11:27:47 +02:00
szporowolik
1438e55686 v8.0 build 2019-10-19 11:24:12 +02:00
szporowolik
fd92b1c287 Updated readme - added information about db structure and multiinstance support within one database 2019-10-17 17:34:18 +02:00
szporowolik
548281a3d7 Updated lua script for v0.8 2019-10-17 17:27:58 +02:00
VladMordock
e8d3338d9b Update README.md
Minor update of the formatting
2019-10-17 17:24:13 +02:00
VladMordock
40302fed4b Update README.md
Added information about command line arguments
2019-10-17 17:17:24 +02:00
VladMordock
edc1133023 Update README.md
Updated readme to match v0.8
2019-10-17 17:06:13 +02:00
VladMordock
bdb89a4bf9 Update README.md
.NET Framework upgrade to 4.8
2019-10-17 16:57:39 +02:00
VladMordock
0bb396eae4 Update README.md
Updated data flow
2019-10-17 16:49:38 +02:00
VladMordock
f58c24be74 Update README.md
Flow chart update for TCP
2019-10-17 16:49:00 +02:00
VladMordock
a58eced7bf Update README.md
Updates to match v0.8 release
2019-10-17 16:39:17 +02:00
VladMordock
22d87b8a62 Update m1081_perun.sql 2019-10-17 16:36:23 +02:00
VladMordock
ff9ae98887 Update m1081_perun.sql
Sync with current status of the development database
2019-10-17 16:35:01 +02:00
szporowolik
44da46083e Added command line support for srs and lotatc 2019-10-04 14:48:29 +02:00
szporowolik
5916ccedb3 Debug only - check performance 2019-10-04 14:43:43 +02:00
szporowolik
35d63d072c Clean up 2019-10-04 14:21:21 +02:00
szporowolik
09d379d611 Added support for command line arguments 2019-10-04 14:17:15 +02:00
szporowolik
fcb189a4cd Reconnecting issue solved 2019-09-13 15:56:56 +02:00
szporowolik
9d42ccc1d4 General cleanup 2019-09-13 15:13:12 +02:00
szporowolik
238f6e29ae Working mysql connection icon 2019-09-13 13:31:03 +02:00
szporowolik
ddb2527eb8 Added icon resources 2019-09-13 13:30:44 +02:00
szporowolik
97a4c0aa45 Added connection status icons 2019-09-13 12:43:57 +02:00
szporowolik
4b975b1892 Added tango theme 2019-09-13 12:43:36 +02:00
szporowolik
74e227ae27 VS projecy update to 8.0.0 2019-09-13 12:32:05 +02:00
szporowolik
69501b4623 WIP 2019-09-13 12:28:40 +02:00
szporowolik
36c713ba3f Updated perun.lua for 8.0.0 2019-09-12 18:14:05 +02:00
szporowolik
17a2905b14 Readme update 2019-09-12 17:57:46 +02:00
szporowolik
df7155f061 Switched to TCP 2019-09-12 17:48:41 +02:00
szporowolik
52ecfda6c5 WIP - main form change 2019-09-12 16:00:53 +02:00
szporowolik
4900ef4888 WIP 2019-09-12 15:22:16 +02:00
szporowolik
150a9ab502 Added actual nuget references 2019-09-12 14:55:09 +02:00
szporowolik
d3ba6c008a Switched to .net 4.8.0 2019-09-12 14:34:37 +02:00
VladMordock
f1eb4b64d1 Added 5 minut time limit to remove spawn deads from mission stats 2019-08-28 01:05:04 +02:00
Szymon Porwolik
976feec650 Quick fix related to exception handler thrown while LotATC or SRS data cannot be usd. 2019-08-25 19:09:52 +02:00
Szymon Porwolik
073b9a72e2 Added support for 2 instances. 2019-08-24 22:03:32 +02:00
Szymon Porwolik
ad299b227b Changed MOTD dla gildia.org 2019-03-25 00:41:03 +01:00
Szymon Porwolik
7d3b99c1fd Fixed missing raw data when long slot list. 2019-03-25 00:38:32 +01:00
VladMordock
57771d94b7 Update Perun.lua
Fix for friendly fire not being properly logged
2019-03-15 10:26:31 +01:00
30 changed files with 2330 additions and 996 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@

View File

@@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15 # Visual Studio Version 16
VisualStudioVersion = 15.0.28307.421 VisualStudioVersion = 16.0.29306.81
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Perun_v1", "Perun_v1\Perun_v1.csproj", "{5A710507-92E9-4664-9B91-918B8B82F107}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Perun_v1", "Perun_v1\Perun_v1.csproj", "{5A710507-92E9-4664-9B91-918B8B82F107}"
EndProject EndProject

View File

@@ -3,127 +3,236 @@ using MySql.Data.MySqlClient;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
internal class DatabaseController public class DatabaseController
{ {
public static string strMySQLConnectionString; // MySQL connection string public string DatabaseConnectionString; // MySQL connection string
public MySqlConnection DatabaseConnection;
public bool DatabaseStatus;
public static void SendToMySql(string strRawUDPFrame) public int SendToMySql(string RawTCPFrame, bool CheckConnection = false)
{ {
// Main function to send data to mysql // Main function to send data to mysql
dynamic strUDPFrame = JsonConvert.DeserializeObject(strRawUDPFrame); // Deserialize raw data if (CheckConnection)
string strUDPFrameType = strUDPFrame.type; {
string strUDPFrameTimestamp = strUDPFrame.timestamp; RawTCPFrame = "{\"type\": \"-1\"}";
string strUDPFrameInstance = strUDPFrame.instance; }
string strUDPFramePayload = ""; dynamic TCPFrame = JsonConvert.DeserializeObject(RawTCPFrame); // Deserialize raw data
string strUDPFramePayload_Perun = ""; string TCPFrameType = TCPFrame.type;
string strSQLQueryTxt = ""; string TCPFrameTimestamp = TCPFrame.timestamp;
string TCPFrameInstance = TCPFrame.instance;
string TCPFramePayload;
string SQLQueryTxt;
int ReturnValue = 1;
// Some frames may come without timestamp, use database currrent timestampe then // Some frames may come without timestamp, use database currrent timestampe then
if (strUDPFrameTimestamp != null) if (TCPFrameTimestamp != null)
{ {
strUDPFrameTimestamp = "'" + strUDPFrameTimestamp + "'"; TCPFrameTimestamp = "'" + TCPFrameTimestamp + "'";
} }
else else
{ {
strUDPFrameTimestamp = "CURRENT_TIMESTAMP()"; TCPFrameTimestamp = "CURRENT_TIMESTAMP()";
} }
// Modify specific types // Modify specific types
if (strUDPFrameType == "1") if (TCPFrameType == "1")
{ {
strUDPFrame.payload["v_win"] = "v" + Globals.strPerunVersion; // Inject app version information TCPFrame.payload["v_win"] = "v" + Globals.VersionPerun; // Inject app version information
// Pull DCS hook version
Globals.VersionDCSHook = TCPFrame.payload.v_dcs_hook;
} }
// Specific SQL // Specific SQL per each frame type
if (strUDPFrameType == "50") if (TCPFrameType == "50")
{ {
// Add entry to chat log // Add entry to chat log
strSQLQueryTxt = "INSERT INTO `pe_DataPlayers` (`pe_DataPlayers_ucid`) SELECT '" + strUDPFrame.payload.ucid + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataPlayers` where `pe_DataPlayers_ucid` = '" + strUDPFrame.payload.ucid + "' );"; SQLQueryTxt = "INSERT INTO `pe_DataPlayers` (`pe_DataPlayers_ucid`) SELECT '" + TCPFrame.payload.ucid + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataPlayers` where `pe_DataPlayers_ucid` = '" + TCPFrame.payload.ucid + "' );";
strSQLQueryTxt += "UPDATE `pe_DataPlayers` SET `pe_DataPlayers_updated` = " + strUDPFrameTimestamp + ",`pe_DataPlayers_lastname`='" + strUDPFrame.payload.player + "' WHERE `pe_DataPlayers_ucid`='" + strUDPFrame.payload.ucid + "' ;"; SQLQueryTxt += "UPDATE `pe_DataPlayers` SET `pe_DataPlayers_updated` = " + TCPFrameTimestamp + ",`pe_DataPlayers_lastname`=@PAR_payload_player WHERE `pe_DataPlayers_ucid`='" + TCPFrame.payload.ucid + "' ;";
strSQLQueryTxt += "INSERT INTO `pe_DataMissionHashes` (`pe_DataMissionHashes_hash`,`pe_DataMissionHashes_instance`) SELECT '" + strUDPFrame.payload.missionhash + "','" + strUDPFrameInstance + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataMissionHashes` where `pe_DataMissionHashes_hash` ='" + strUDPFrame.payload.missionhash + "' AND `pe_DataMissionHashes_instance`="+ strUDPFrameInstance + ");"; SQLQueryTxt += "INSERT INTO `pe_DataMissionHashes` (`pe_DataMissionHashes_hash`,`pe_DataMissionHashes_instance`) SELECT '" + TCPFrame.payload.missionhash + "','" + TCPFrameInstance + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataMissionHashes` where `pe_DataMissionHashes_hash` ='" + TCPFrame.payload.missionhash + "' AND `pe_DataMissionHashes_instance`=" + TCPFrameInstance + ");";
strSQLQueryTxt += "UPDATE `pe_DataMissionHashes` SET `pe_DataMissionHashes_datetime` = " + strUDPFrameTimestamp + " WHERE `pe_DataMissionHashes_hash` = '" + strUDPFrame.payload.missionhash + "' AND `pe_DataMissionHashes_instance`=" + strUDPFrameInstance + " ;"; SQLQueryTxt += "UPDATE `pe_DataMissionHashes` SET `pe_DataMissionHashes_datetime` = " + TCPFrameTimestamp + " WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.missionhash + "' AND `pe_DataMissionHashes_instance`=" + TCPFrameInstance + " ;";
strSQLQueryTxt += "INSERT INTO `pe_LogChat` (`pe_LogChat_id`,`pe_LogChat_datetime`, `pe_LogChat_playerid`, `pe_LogChat_msg`, `pe_LogChat_all`,`pe_LogChat_missionhash_id`) VALUES (NULL,'" + strUDPFrame.payload.datetime + "', (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + strUDPFrame.payload.ucid + "'), '" + strUDPFrame.payload.msg + "', '" + strUDPFrame.payload.all + "',(SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + strUDPFrame.payload.missionhash + "'));"; SQLQueryTxt += "INSERT INTO `pe_LogChat` (`pe_LogChat_id`,`pe_LogChat_datetime`, `pe_LogChat_playerid`, `pe_LogChat_msg`, `pe_LogChat_all`,`pe_LogChat_missionhash_id`) VALUES (NULL,'" + TCPFrame.payload.datetime + "', (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + TCPFrame.payload.ucid + "'), @PAR_payload_msg, '" + TCPFrame.payload.all + "',(SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.missionhash + "'));";
} }
else if (strUDPFrameType == "51") else if (TCPFrameType == "51")
{ {
// Add entry to event log // Add entry to event log
strSQLQueryTxt = "INSERT INTO `pe_DataMissionHashes` (`pe_DataMissionHashes_hash`,`pe_DataMissionHashes_instance`) SELECT '" + strUDPFrame.payload.log_missionhash + "','" + strUDPFrameInstance + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataMissionHashes` where `pe_DataMissionHashes_hash` = '" + strUDPFrame.payload.log_missionhash + "' AND `pe_DataMissionHashes_instance`=" + strUDPFrameInstance + ");"; SQLQueryTxt = "INSERT INTO `pe_DataMissionHashes` (`pe_DataMissionHashes_hash`,`pe_DataMissionHashes_instance`) SELECT '" + TCPFrame.payload.log_missionhash + "','" + TCPFrameInstance + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataMissionHashes` where `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.log_missionhash + "' AND `pe_DataMissionHashes_instance`=" + TCPFrameInstance + ");";
strSQLQueryTxt += "UPDATE `pe_DataMissionHashes` SET `pe_DataMissionHashes_datetime` = " + strUDPFrameTimestamp + " WHERE `pe_DataMissionHashes_hash` = '" + strUDPFrame.payload.log_missionhash + "' AND `pe_DataMissionHashes_instance`=" + strUDPFrameInstance + ";"; SQLQueryTxt += "UPDATE `pe_DataMissionHashes` SET `pe_DataMissionHashes_datetime` = " + TCPFrameTimestamp + " WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.log_missionhash + "' AND `pe_DataMissionHashes_instance`=" + TCPFrameInstance + ";";
strSQLQueryTxt += "INSERT INTO `pe_LogEvent` (`pe_LogEvent_arg1`,`pe_LogEvent_arg2`,`pe_LogEvent_id`, `pe_LogEvent_datetime`, `pe_LogEvent_type`, `pe_LogEvent_content`,`pe_LogEvent_missionhash_id`) VALUES ('"+ strUDPFrame.payload.log_arg_1 + "','"+ strUDPFrame.payload.log_arg_2 + "', NULL, '" + strUDPFrame.payload.log_datetime + "', '" + strUDPFrame.payload.log_type + "', '" + strUDPFrame.payload.log_content + "', (SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + strUDPFrame.payload.log_missionhash + "'));"; SQLQueryTxt += "INSERT INTO `pe_LogEvent` (`pe_LogEvent_arg1`,`pe_LogEvent_arg2`,`pe_LogEvent_id`, `pe_LogEvent_datetime`, `pe_LogEvent_type`, `pe_LogEvent_content`,`pe_LogEvent_missionhash_id`) VALUES ('" + TCPFrame.payload.log_arg_1 + "','" + TCPFrame.payload.log_arg_2 + "', NULL, '" + TCPFrame.payload.log_datetime + "', '" + TCPFrame.payload.log_type + "', @PAR_log_content, (SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.log_missionhash + "'));";
} }
else if (strUDPFrameType == "52") else if (TCPFrameType == "52")
{ {
// Update user stats // Update user stats
strUDPFramePayload = JsonConvert.SerializeObject(strUDPFrame.payload.stat_data_dcs); // Deserialize payload SQLQueryTxt = "INSERT INTO `pe_DataMissionHashes` (`pe_DataMissionHashes_hash`,`pe_DataMissionHashes_instance`) SELECT '" + TCPFrame.payload.stat_missionhash + "','" + TCPFrameInstance + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataMissionHashes` where `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.stat_missionhash + "' AND `pe_DataMissionHashes_instance`=" + TCPFrameInstance + ");";
strUDPFramePayload_Perun = JsonConvert.SerializeObject(strUDPFrame.payload.stat_data_perun); // Deserialize payload SQLQueryTxt += "UPDATE `pe_DataMissionHashes` SET `pe_DataMissionHashes_datetime` = " + TCPFrameTimestamp + " WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.stat_missionhash + "' AND `pe_DataMissionHashes_instance`=" + TCPFrameInstance + " ;";
SQLQueryTxt += "INSERT INTO `pe_DataPlayers` (`pe_DataPlayers_ucid`) SELECT '" + TCPFrame.payload.stat_ucid + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataPlayers` where `pe_DataPlayers_ucid` = '" + TCPFrame.payload.stat_ucid + "');";
strSQLQueryTxt = "INSERT INTO `pe_DataMissionHashes` (`pe_DataMissionHashes_hash`,`pe_DataMissionHashes_instance`) SELECT '" + strUDPFrame.payload.stat_missionhash + "','" + strUDPFrameInstance + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataMissionHashes` where `pe_DataMissionHashes_hash` = '" + strUDPFrame.payload.stat_missionhash + "' AND `pe_DataMissionHashes_instance`=" + strUDPFrameInstance + ");"; SQLQueryTxt += "UPDATE `pe_DataPlayers` SET `pe_DataPlayers_updated`=" + TCPFrameTimestamp + " WHERE `pe_DataPlayers_ucid`='" + TCPFrame.payload.stat_ucid + "';";
strSQLQueryTxt += "UPDATE `pe_DataMissionHashes` SET `pe_DataMissionHashes_datetime` = " + strUDPFrameTimestamp + " WHERE `pe_DataMissionHashes_hash` = '" + strUDPFrame.payload.stat_missionhash + "' AND `pe_DataMissionHashes_instance`=" + strUDPFrameInstance + " ;"; SQLQueryTxt += "INSERT INTO `pe_DataTypes` (`pe_DataTypes_name`) SELECT '" + TCPFrame.payload.stat_data_type + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataTypes` where `pe_DataTypes_name` = '" + TCPFrame.payload.stat_data_type + "');";
strSQLQueryTxt += "INSERT INTO `pe_DataPlayers` (`pe_DataPlayers_ucid`) SELECT '" + strUDPFrame.payload.stat_ucid + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataPlayers` where `pe_DataPlayers_ucid` = '" + strUDPFrame.payload.stat_ucid + "');"; SQLQueryTxt += "INSERT INTO `pe_LogStats` (`pe_LogStats_playerid`,`pe_LogStats_missionhash_id`,`pe_LogStats_typeid`) SELECT (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + TCPFrame.payload.stat_ucid + "'), (SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.stat_missionhash + "'), (SELECT pe_DataTypes_id FROM `pe_DataTypes` where `pe_DataTypes_name` = '" + TCPFrame.payload.stat_data_type + "') FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_LogStats` WHERE `pe_LogStats_missionhash_id`=(SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.stat_missionhash + "') AND `pe_LogStats_playerid` = (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + TCPFrame.payload.stat_ucid + "') AND `pe_LogStats_typeid`= (SELECT pe_DataTypes_id FROM `pe_DataTypes` where `pe_DataTypes_name` = '" + TCPFrame.payload.stat_data_type + "'));";
strSQLQueryTxt += "UPDATE `pe_DataPlayers` SET `pe_DataPlayers_updated`=" + strUDPFrameTimestamp + " WHERE `pe_DataPlayers_ucid`='" + strUDPFrame.payload.stat_ucid + "';"; SQLQueryTxt += "UPDATE `pe_LogStats` SET `ps_time`=" + TCPFrame.payload.stat_data_perun.ps_time + ",`pe_LogStats_seat`=" + TCPFrame.payload.stat_data_subslot + ",`pe_LogStats_masterslot`=" + TCPFrame.payload.stat_data_masterslot + ",`ps_kills_fortification`=" + TCPFrame.payload.stat_data_perun.ps_kills_fortification + ",`ps_other_landings`=" + TCPFrame.payload.stat_data_perun.ps_other_landings + ",`ps_other_takeoffs`=" + TCPFrame.payload.stat_data_perun.ps_other_takeoffs + ",`ps_pvp`=" + TCPFrame.payload.stat_data_perun.ps_pvp + ",`ps_deaths`=" + TCPFrame.payload.stat_data_perun.ps_deaths + ",`ps_ejections`=" + TCPFrame.payload.stat_data_perun.ps_ejections + ",`ps_crashes`=" + TCPFrame.payload.stat_data_perun.ps_crashes + ",`ps_teamkills`=" + TCPFrame.payload.stat_data_perun.ps_teamkills + ",`ps_kills_planes`=" + TCPFrame.payload.stat_data_perun.ps_kills_planes + ",`ps_kills_helicopters`=" + TCPFrame.payload.stat_data_perun.ps_kills_helicopters + ",`ps_kills_air_defense`=" + TCPFrame.payload.stat_data_perun.ps_kills_air_defense + ",`ps_kills_armor`=" + TCPFrame.payload.stat_data_perun.ps_kills_armor + ",`ps_kills_unarmed`=" + TCPFrame.payload.stat_data_perun.ps_kills_unarmed + ",`ps_kills_infantry`=" + TCPFrame.payload.stat_data_perun.ps_kills_infantry + ",`ps_kills_ships`=" + TCPFrame.payload.stat_data_perun.ps_kills_ships + ",`ps_kills_other`=" + TCPFrame.payload.stat_data_perun.ps_kills_other + ",`ps_airfield_takeoffs`=" + TCPFrame.payload.stat_data_perun.ps_airfield_takeoffs + ",`ps_airfield_landings`=" + TCPFrame.payload.stat_data_perun.ps_airfield_landings + ",`ps_ship_takeoffs`=" + TCPFrame.payload.stat_data_perun.ps_ship_takeoffs + ",`ps_ship_landings`=" + TCPFrame.payload.stat_data_perun.ps_ship_landings + ",`ps_farp_takeoffs`=" + TCPFrame.payload.stat_data_perun.ps_farp_takeoffs + ",`ps_farp_landings`=" + TCPFrame.payload.stat_data_perun.ps_farp_landings + ", `pe_LogStats_datetime`='" + TCPFrame.payload.stat_datetime + "',`pe_LogStats_playerid` = (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + TCPFrame.payload.stat_ucid + "'),`pe_LogStats_missionhash_id`=(SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.stat_missionhash + "') WHERE `pe_LogStats_missionhash_id`=(SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + TCPFrame.payload.stat_missionhash + "') AND `pe_LogStats_playerid` = (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + TCPFrame.payload.stat_ucid + "') AND `pe_LogStats_typeid`=(SELECT pe_DataTypes_id FROM `pe_DataTypes` where `pe_DataTypes_name` = '" + TCPFrame.payload.stat_data_type + "');";
strSQLQueryTxt += "INSERT INTO `pe_DataTypes` (`pe_DataTypes_name`) SELECT '" + strUDPFrame.payload.stat_data_type + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataTypes` where `pe_DataTypes_name` = '" + strUDPFrame.payload.stat_data_type + "');";
strSQLQueryTxt += "INSERT INTO `pe_LogStats` (`pe_LogStats_playerid`,`pe_LogStats_missionhash_id`,`pe_LogStats_typeid`) SELECT (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + strUDPFrame.payload.stat_ucid + "'), (SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + strUDPFrame.payload.stat_missionhash + "'), (SELECT pe_DataTypes_id FROM `pe_DataTypes` where `pe_DataTypes_name` = '" + strUDPFrame.payload.stat_data_type + "') FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_LogStats` WHERE `pe_LogStats_missionhash_id`=(SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + strUDPFrame.payload.stat_missionhash + "') AND `pe_LogStats_playerid` = (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + strUDPFrame.payload.stat_ucid + "') AND `pe_LogStats_typeid`= (SELECT pe_DataTypes_id FROM `pe_DataTypes` where `pe_DataTypes_name` = '" + strUDPFrame.payload.stat_data_type + "'));";
strSQLQueryTxt += "UPDATE `pe_LogStats` SET `ps_kills_fortification`=" + strUDPFrame.payload.stat_data_perun.ps_kills_fortification + ",`ps_other_landings`=" + strUDPFrame.payload.stat_data_perun.ps_other_landings + ",`ps_other_takeoffs`=" + strUDPFrame.payload.stat_data_perun.ps_other_takeoffs + ",`ps_pvp`=" + strUDPFrame.payload.stat_data_perun.ps_pvp + ",`ps_deaths`=" + strUDPFrame.payload.stat_data_perun.ps_deaths + ",`ps_ejections`=" + strUDPFrame.payload.stat_data_perun.ps_ejections + ",`ps_crashes`=" + strUDPFrame.payload.stat_data_perun.ps_crashes + ",`ps_teamkills`=" + strUDPFrame.payload.stat_data_perun.ps_teamkills + ",`ps_kills_planes`=" + strUDPFrame.payload.stat_data_perun.ps_kills_planes + ",`ps_kills_helicopters`=" + strUDPFrame.payload.stat_data_perun.ps_kills_helicopters + ",`ps_kills_air_defense`=" + strUDPFrame.payload.stat_data_perun.ps_kills_air_defense + ",`ps_kills_armor`=" + strUDPFrame.payload.stat_data_perun.ps_kills_armor + ",`ps_kills_unarmed`=" + strUDPFrame.payload.stat_data_perun.ps_kills_unarmed + ",`ps_kills_infantry`=" + strUDPFrame.payload.stat_data_perun.ps_kills_infantry + ",`ps_kills_ships`=" + strUDPFrame.payload.stat_data_perun.ps_kills_ships + ",`ps_kills_other`=" + strUDPFrame.payload.stat_data_perun.ps_kills_other + ",`ps_airfield_takeoffs`=" + strUDPFrame.payload.stat_data_perun.ps_airfield_takeoffs + ",`ps_airfield_landings`=" + strUDPFrame.payload.stat_data_perun.ps_airfield_landings + ",`ps_ship_takeoffs`=" + strUDPFrame.payload.stat_data_perun.ps_ship_takeoffs + ",`ps_ship_landings`=" + strUDPFrame.payload.stat_data_perun.ps_ship_landings + ",`ps_farp_takeoffs`=" + strUDPFrame.payload.stat_data_perun.ps_farp_takeoffs + ",`ps_farp_landings`=" + strUDPFrame.payload.stat_data_perun.ps_farp_landings + ", `pe_LogStats_datetime`='" + strUDPFrame.payload.stat_datetime + "',`pe_LogStats_playerid` = (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + strUDPFrame.payload.stat_ucid + "'),`pe_LogStats_missionhash_id`=(SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + strUDPFrame.payload.stat_missionhash + "') WHERE `pe_LogStats_missionhash_id`=(SELECT `pe_DataMissionHashes_id` FROM `pe_DataMissionHashes` WHERE `pe_DataMissionHashes_hash` = '" + strUDPFrame.payload.stat_missionhash + "') AND `pe_LogStats_playerid` = (SELECT `pe_DataPlayers_id` from `pe_DataPlayers` WHERE `pe_DataPlayers_ucid` = '" + strUDPFrame.payload.stat_ucid + "') AND `pe_LogStats_typeid`=(SELECT pe_DataTypes_id FROM `pe_DataTypes` where `pe_DataTypes_name` = '" + strUDPFrame.payload.stat_data_type + "');";
} }
else if (strUDPFrameType == "53") else if (TCPFrameType == "53")
{ {
// User logged in to DCS server // User logged in to DCS server
strSQLQueryTxt = "INSERT INTO `pe_DataPlayers` (`pe_DataPlayers_ucid`) SELECT '" + strUDPFrame.payload.login_ucid + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataPlayers` where pe_DataPlayers_ucid='" + strUDPFrame.payload.login_ucid + "');"; SQLQueryTxt = "INSERT INTO `pe_DataPlayers` (`pe_DataPlayers_ucid`) SELECT '" + TCPFrame.payload.login_ucid + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataPlayers` where pe_DataPlayers_ucid='" + TCPFrame.payload.login_ucid + "');";
strSQLQueryTxt += "UPDATE `pe_DataPlayers` SET pe_DataPlayers_lastip='" + strUDPFrame.payload.login_ipaddr + "', pe_DataPlayers_lastname='" + strUDPFrame.payload.login_name + "',pe_DataPlayers_updated='" + strUDPFrame.payload.login_datetime + "' WHERE `pe_DataPlayers_ucid`= '" + strUDPFrame.payload.login_ucid + "';"; SQLQueryTxt += "UPDATE `pe_DataPlayers` SET pe_DataPlayers_lastip='" + TCPFrame.payload.login_ipaddr + "', pe_DataPlayers_lastname=@PAR_login_name,pe_DataPlayers_updated='" + TCPFrame.payload.login_datetime + "' WHERE `pe_DataPlayers_ucid`= '" + TCPFrame.payload.login_ucid + "';";
strSQLQueryTxt += "INSERT INTO `pe_LogLogins` (`pe_LogLogins_datetime`, `pe_LogLogins_playerid`, `pe_LogLogins_name`, `pe_LogLogins_ip`,`pe_LogLogins_instance`) VALUES ('" + strUDPFrame.payload.login_datetime + "', (SELECT pe_DataPlayers_id from pe_DataPlayers WHERE pe_DataPlayers_ucid = '" + strUDPFrame.payload.login_ucid + "'), '" + strUDPFrame.payload.login_name + "', '" + strUDPFrame.payload.login_ipaddr + "','"+ strUDPFrameInstance + "');"; SQLQueryTxt += "INSERT INTO `pe_LogLogins` (`pe_LogLogins_datetime`, `pe_LogLogins_playerid`, `pe_LogLogins_name`, `pe_LogLogins_ip`,`pe_LogLogins_instance`) VALUES ('" + TCPFrame.payload.login_datetime + "', (SELECT pe_DataPlayers_id from pe_DataPlayers WHERE pe_DataPlayers_ucid = '" + TCPFrame.payload.login_ucid + "'), @PAR_login_name, '" + TCPFrame.payload.login_ipaddr + "','" + TCPFrameInstance + "');";
}
else if (TCPFrameType == "-1")
{
// Keep alive message
SQLQueryTxt = "SELECT `pe_Config_payload` FROM `pe_Config` WHERE `pe_Config_id` = 1;";
} }
else else
{ {
// General definition used for 1-10 type packets // General definition used for 1-10 type packets
strUDPFramePayload = JsonConvert.SerializeObject(strUDPFrame.payload); // Deserialize payload
strSQLQueryTxt = "INSERT INTO `pe_DataRaw` (`pe_dataraw_type`,`pe_dataraw_instance`) SELECT '" + strUDPFrameType + "','"+ strUDPFrameInstance + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataRaw` WHERE `pe_dataraw_type` = '" + strUDPFrameType + "' AND `pe_dataraw_instance` = " + strUDPFrameInstance + ");";
strSQLQueryTxt += "UPDATE `pe_DataRaw` SET `pe_dataraw_payload` = JSON_QUOTE('" + strUDPFramePayload + "'), `pe_dataraw_updated`=" + strUDPFrameTimestamp + " WHERE `pe_dataraw_type`=" + strUDPFrameType + " AND `pe_dataraw_instance` = "+ strUDPFrameInstance + ";"; SQLQueryTxt = "INSERT INTO `pe_DataRaw` (`pe_dataraw_type`,`pe_dataraw_instance`) SELECT '" + TCPFrameType + "','" + TCPFrameInstance + "' FROM DUAL WHERE NOT EXISTS (SELECT * FROM `pe_DataRaw` WHERE `pe_dataraw_type` = '" + TCPFrameType + "' AND `pe_dataraw_instance` = " + TCPFrameInstance + ");";
SQLQueryTxt += "UPDATE `pe_DataRaw` SET `pe_dataraw_payload` = JSON_QUOTE(@PAR_TCPFramePayload), `pe_dataraw_updated`=" + TCPFrameTimestamp + " WHERE `pe_dataraw_type`=" + TCPFrameType + " AND `pe_dataraw_instance` = " + TCPFrameInstance + ";";
} }
// Connect to mysql and execute sql // Connect to mysql and execute sql
MySqlConnection connMySQL = new MySqlConnection(DatabaseController.strMySQLConnectionString);
try try
{ {
Console.WriteLine("Sending data to MySQL - Begin"); DatabaseConnection = new MySqlConnection(DatabaseConnectionString);
connMySQL.Open();
MySqlCommand cmdMySQL = new MySqlCommand(strSQLQueryTxt, connMySQL); try
MySqlDataReader rdrMySQL = cmdMySQL.ExecuteReader(); {
Console.WriteLine("Sending data to MySQL - Begin");
DatabaseConnection.Open();
DatabaseStatus = true;
MySqlCommand DatabaseCommand = new MySqlCommand(SQLQueryTxt, DatabaseConnection);
// Add parameters - prevent SQL injection
if (TCPFrameType == "50")
{
DatabaseCommand.Parameters.AddWithValue("@PAR_payload_player", TCPFrame.payload.player);
DatabaseCommand.Parameters.AddWithValue("@PAR_payload_msg", TCPFrame.payload.msg);
}
else if (TCPFrameType == "51")
{
DatabaseCommand.Parameters.AddWithValue("@PAR_log_content", TCPFrame.payload.log_content);
}
else if (TCPFrameType == "53")
{
DatabaseCommand.Parameters.AddWithValue("@PAR_login_name", TCPFrame.payload.login_name);
}
else
{
TCPFramePayload = JsonConvert.SerializeObject(TCPFrame.payload); // Deserialize payload
DatabaseCommand.Parameters.AddWithValue("@PAR_TCPFramePayload", TCPFramePayload);
}
// End of add parameters
MySqlDataReader DatabaseReader = DatabaseCommand.ExecuteReader();
if (DatabaseReader.HasRows)
{
while (DatabaseReader.Read())
{
if (TCPFrameType == "-1")
{
Globals.VersionDatabase= DatabaseReader.GetString(0);
}
}
}
else
{
// Do nothing
}
DatabaseReader.Close();
switch (Int32.Parse(TCPFrameType))
{
case 1:
PerunHelper.AddLog(ref Globals.AppLogHistory, "Connected players: " + TCPFrame.payload["c_players"], 1,0,"1");
break;
case 2:
PerunHelper.AddLog(ref Globals.AppLogHistory, "Mission: \"" + TCPFrame.payload["mission"]["name"]+"\""+ ", time:" + TCPFrame.payload["mission"]["modeltime"], 1, 0, "2");
break;
case 3:
PerunHelper.AddLog(ref Globals.AppLogHistory, "Slots data updated", 1, 0, "3");
break;
case 50:
PerunHelper.AddLog(ref Globals.AppLogHistory, "Player's \""+ TCPFrame.payload.player + "\" chat message saved", 1, 0, "50");
break;
case 51:
PerunHelper.AddLog(ref Globals.AppLogHistory, "Game event: \""+ TCPFrame.payload.log_content +"\"", 1, 0, "51");
break;
case 52:
PerunHelper.AddLog(ref Globals.AppLogHistory, "Player's \""+ TCPFrame.payload.stat_name + "\" stats saved", 1, 0, "52");
break;
case 53:
PerunHelper.AddLog(ref Globals.AppLogHistory, "Player \""+ TCPFrame.payload.login_name + "\" logged in", 1, 0, "53");
break;
case 100:
PerunHelper.AddLog(ref Globals.AppLogHistory, "SRS data send", 1,0,"100");
break;
case 101:
PerunHelper.AddLog(ref Globals.AppLogHistory, "LotATC data send", 1,0,"101");
break;
case -1:
break;
default:
PerunHelper.AddLog(ref Globals.AppLogHistory, "Data send", 1,0, TCPFrameType);
break;
}
while (rdrMySQL.Read())
{
Console.WriteLine(rdrMySQL[0] + " -- " + rdrMySQL[1]);
} }
rdrMySQL.Close(); catch (ArgumentException a_ex)
PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "MySQL updated, package type: " + strUDPFrameType);
}
catch (ArgumentException a_ex)
{
// General exception found
Console.WriteLine(a_ex.ToString());
PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - package type: " + strUDPFrameType);
}
catch (MySqlException m_ex)
{
// MySQL exception found
PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - package type: " + strUDPFrameType);
switch (m_ex.Number)
{ {
case 1042: // Unable to connect to any of the specified MySQL hosts (Check Server,Port) // General exception found
PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - unable to connect"); Console.WriteLine(a_ex.ToString());
break; PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - error: " + a_ex.Message,1,1, TCPFrameType);
case 0: // Access denied (Check DB name,username,password) Globals.ErrorsGame++;
PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - access denied"); DatabaseStatus = false;
break; ReturnValue = 0;
default:
PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "ERROR MySQL - " + m_ex.Number);
break;
} }
catch (MySqlException m_ex)
{
// MySQL exception found
switch (m_ex.Number)
{
case 1042: // Unable to connect to any of the specified MySQL hosts (Check Server,Port)
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - unable to connect, error: " + m_ex.Message,1,1, TCPFrameType);
DatabaseStatus = false;
ReturnValue = 0;
break;
case 0: // Access denied (Check DB name,username,password)
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - access denied, error: " + m_ex.Message,1,1, TCPFrameType);
DatabaseStatus = false;
ReturnValue = 0;
break;
case 1064: // Incorrect query
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - query: " + SQLQueryTxt, 1, 1, TCPFrameType);
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - error: " + m_ex.Message, 1, 1, TCPFrameType);
DatabaseStatus = true; // True as connection is not broken
ReturnValue = 1; // Return a value to remove this query from quae
break;
default:
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - error id: " + m_ex.Number,1,1, TCPFrameType);
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - query: " + SQLQueryTxt, 1, 1, TCPFrameType);
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - error: " + m_ex.Message,1,1, TCPFrameType);
DatabaseStatus = false;
ReturnValue = 0;
break;
}
Globals.ErrorsGame++;
}
DatabaseConnection.Close();
Console.WriteLine("Sending data to MySQL - Done");
} }
connMySQL.Close(); catch (ArgumentException x_ex)
Console.WriteLine("Sending data to MySQL - Done"); {
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR MySQL - unable to connect, error: " + x_ex.Message,1,1, TCPFrameType);
ReturnValue = 0;
Globals.ErrorsGame++;
}
return ReturnValue;
} }
} }

View File

@@ -1,7 +1,26 @@
// This class gathers all global variables // This class gathers all global variable
internal class Globals internal class Globals
{ {
public static string strPerunVersion = "DEBUG"; // Helper for pulling version definition public static string[] AppLogHistory = new string[10]; // Log history for GUI
public static string[] arrLogHistory = new string[10]; // Log history for GUI public static bool AppUpdateGUI = true; // Flag if log control requires update
public static string AppTitle = ""; // Helper to update title
public static int AppInstanceID = 0; // Kepp the instance ID
public static bool AppForceIconReload = true; // Force main window icons reload
public static bool StatusDatabase = false; // Historic db connection status
public static bool StatusSRS = false; // Historic srs connection status
public static bool StatusLotATC = false; // Historic lotatc connection status
public static bool StatusHistoryConnection = false; // Historic tcp connection status
public static bool StatusConnection = false; // Flag if is TCP connectionstill alive
public static int ErrorsDatabase = 0; // MySQL - Error counter
public static int ErrorsGame = 0; // TCP connection - Error counter
public static int ErrorsHistoryGame = 0; // TCP connection - historic value of Error counter
public static int ErrorsSRS = 0; // DCS SRS - error counter
public static int ErrorsLotATC = 0; // LotATC - error counter
public static string VersionDCSHook = ""; // Version - DCS hook
public static string VersionDatabase = ""; // Version - Database
public static string VersionPerun = "DEBUG"; // Version - Perun
} }

View File

@@ -0,0 +1,45 @@
using System;
using System.IO;
class LogController
{
// TBD - done via https://stackoverflow.com/questions/20185015/how-to-write-log-file-in-c
public static void WriteLog(string strLog)
{
StreamWriter LogStreamWriter;
FileStream LogFileStream = null;
DirectoryInfo LogDirectoryInfo = null;
FileInfo LogFileInfo;
string LogFilePath = Path.Combine(Environment.ExpandEnvironmentVariables("%userprofile%"), "Documents") + "\\Perun\\";
LogFilePath = LogFilePath + "Perun_Log_" + System.DateTime.Today.ToString("yyyyddMM") + "." + "txt";
LogFileInfo = new FileInfo(LogFilePath);
LogDirectoryInfo = new DirectoryInfo(LogFileInfo.DirectoryName);
if (!LogDirectoryInfo.Exists) LogDirectoryInfo.Create();
if (!LogFileInfo.Exists)
{
LogFileStream = LogFileInfo.Create();
}
else
{
try
{
LogFileStream = new FileStream(LogFilePath, FileMode.Append);
}
catch
{
// Do nothing
}
}
try
{
LogStreamWriter = new StreamWriter(LogFileStream);
LogStreamWriter.WriteLine(strLog);
LogStreamWriter.Close();
}
catch
{
// Do nothing
}
}
}

View File

@@ -1,13 +0,0 @@
// This class just wraps some Win32 stuff that we're going to use for blocking of multiple instances
using System;
using System.Runtime.InteropServices;
internal class NativeMethods
{
public const int HWND_BROADCAST = 0xffff;
public static readonly int WM_SHOWME = RegisterWindowMessage("WM_SHOWME");
[DllImport("user32")]
public static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
[DllImport("user32")]
public static extern int RegisterWindowMessage(string message);
}

View File

@@ -1,26 +1,98 @@
// This class gathers all helper functions // This class gathers all helper functions
using System; using System;
using System.Reflection;
using System.Text.RegularExpressions;
internal class PerunHelper internal class PerunHelper
{ {
public static void LogHistoryAdd(ref string[] arrLogHistory, string strEntryToAdd) public static void AddLog(ref string[] arrLogHistory, string strEntryToAdd, int intDirection = 0, int intMarker = 0, string strType = " ", bool bSkipGui = false)
{ {
// Add entry to log history and rotate // Declare values
for (int i = 0; i < arrLogHistory.Length - 1; i++) string LogDirection;
string LogMarker;
// Set direction marker
switch (intDirection)
{ {
arrLogHistory[i] = arrLogHistory[i + 1]; // Shift one down case 1:
LogDirection = ">";
break;
case 2:
LogDirection = "<";
break;
case 3:
LogDirection = "^";
break;
default:
LogDirection = " ";
break;
} }
arrLogHistory[arrLogHistory.Length - 1] = DateTime.Now.ToString("HH:mm:ss") + " > " + strEntryToAdd; // Add entry at the last position // Set marker for user flags (markers)
LogMarker = (intMarker>0) ? "X" : " ";
// Set frame type
strType=strType.PadLeft(3, ' ');
if (!bSkipGui)
{
// Rotate log history
for (int i = 0; i < arrLogHistory.Length - 1; i++)
{
arrLogHistory[i] = arrLogHistory[i + 1]; // Shift one down
}
// Add new entry
arrLogHistory[arrLogHistory.Length - 1] = DateTime.Now.ToString("HH:mm:ss") + " " + LogDirection + " " + strEntryToAdd; // Add entry at the last position
// Update control at my window
Globals.AppUpdateGUI = true;
}
// Add the entry to log file
LogController.WriteLog(DateTime.Now.ToString("yyyy-MM-dd ") + " " + DateTime.Now.ToString("HH:mm:ss") + " | Instance: "+ Globals.AppInstanceID + " | " + LogMarker + " | "+ LogDirection + " | "+ strType + " | " + strEntryToAdd);
} }
public static string GetAppVersion(string strBeginning) public static string GetAppVersion(string strBeginning)
{ {
// Gets build version // Gets build version
if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed) Globals.VersionPerun = Assembly.GetExecutingAssembly().GetName().Version.ToString();
return strBeginning + "v" + Globals.VersionPerun;
}
public static int CheckVersions()
{
#if !DEBUG
// Checks the versions of APP, DCS Hook and MySQL database
Match match = Regex.Match(Globals.VersionPerun, @"^\d+.\d+.\d+", RegexOptions.Compiled | RegexOptions.IgnoreCase);
string VersionApp = "v" + match.Groups[0].Value;
int ReturnValue = 1;
if (!String.IsNullOrEmpty(Globals.VersionDatabase))
{ {
System.Deployment.Application.ApplicationDeployment cd = System.Deployment.Application.ApplicationDeployment.CurrentDeployment; // Check database
Globals.strPerunVersion = cd.CurrentVersion.ToString(); if(VersionApp != Globals.VersionDatabase)
{
// Incorrect database version
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR Incorrect database revision : "+ Globals.VersionDatabase, 1, 1, "?");
Globals.ErrorsDatabase++;
ReturnValue = 0;
}
} }
return strBeginning+"v" + Globals.strPerunVersion;
if (!String.IsNullOrEmpty(Globals.VersionDCSHook))
{
// Check database
if (VersionApp != Globals.VersionDCSHook)
{
// Incorrect dcs script version
PerunHelper.AddLog(ref Globals.AppLogHistory, "ERROR Incorrect DCS hook revision : " + Globals.VersionDCSHook, 2, 1, "?");
Globals.ErrorsGame++;
ReturnValue = 0;
}
}
return ReturnValue;
#else
return 1;
#endif
} }
} }

View File

@@ -1,5 +1,4 @@
using System; using System;
using System.Threading;
using System.Windows.Forms; using System.Windows.Forms;
namespace Perun_v1 namespace Perun_v1
@@ -10,38 +9,20 @@ namespace Perun_v1
/// Main entry point to app /// Main entry point to app
/// </summary> /// </summary>
// Mutex to block multiple instances
static Mutex mutex = new Mutex(true, "{5a710507-92e9-4664-9b91-918b8b82f107}");
[STAThread] [STAThread]
static void Main() static void Main()
{ {
// Check if no other instances running // Main entry point to the app
if (mutex.WaitOne(TimeSpan.Zero, true)) Application.EnableVisualStyles();
{ Application.SetCompatibleTextRenderingDefault(false);
// Only instance Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
void Application_ApplicationExit(object sender, EventArgs e) void Application_ApplicationExit(object sender, EventArgs e)
{
Properties.Settings.Default.Save(); // We will save settings on exit
}
Application.Run(new form_Main()); // Run main form
mutex.ReleaseMutex(); // Release mutex
}
else
{ {
// Multiple instance - send our Win32 message to make the currently running instance jump to front Properties.Settings.Default.Save(); // We will save settings on exit
NativeMethods.PostMessage(
(IntPtr)NativeMethods.HWND_BROADCAST,
NativeMethods.WM_SHOWME,
IntPtr.Zero,
IntPtr.Zero);
MessageBox.Show("Only one Perun instance is allowed.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Information);
} }
Application.Run(new form_Main()); // Run main form
} }
} }
} }

View File

@@ -0,0 +1,206 @@
// This class handles TCP communication
using Newtonsoft.Json;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
public class TCPController
{
// Main class for TCP listener
public int intListenPort; // Port to connect to
public bool bCloseConnection; // Helper to exit main loop without killing thread
public string[] arrGUILogHistory; // Log history for GUI
public string[] arrMySQLSendBuffer; // MySQL send buffer
public Thread thrTCPListener; // Seperate thread for TCP
public void Create(int par_intListenPort, ref string[] par_arrLogHistory, ref string[] par_arrSendBuffer)
{
// Create class and map creation arguments to class
intListenPort = par_intListenPort;
arrGUILogHistory = par_arrLogHistory;
arrMySQLSendBuffer = par_arrSendBuffer;
bCloseConnection = false;
}
public void StopListen()
{
// Stop listening
bCloseConnection = true;
// Clear send buffer
for (int i = 0; i < arrMySQLSendBuffer.Length - 1; i++)
{
arrMySQLSendBuffer[i] = null;
}
}
public void StartListen()
{
// Start listening
NetworkStream nsReadStream = null;
TcpClient tcpClient = null;
bool bTCPConnectionOnline = false;
string strReceiveBuffer;
// Main loop - do until diconnect button is clicked
while (!bCloseConnection)
{
Console.WriteLine("TCP Listen start");
TcpListener tcpServer = new TcpListener(IPAddress.Any, intListenPort); ; // Create listener object
try
{
// Start listening to TCP
string strReceivedData;
// Start the main loop
tcpServer.Start();
// While user do not clicked Disconnect button
while (!bCloseConnection)
{
// Start listening
Console.WriteLine("TCP: Waiting for connection");
Globals.StatusConnection = false;
// Wait for pending connection
if (tcpServer.Pending())
{
Console.WriteLine("TCP: Connected");
bTCPConnectionOnline = true;
tcpClient = tcpServer.AcceptTcpClient(); //if a connection exists, the server will accept it
nsReadStream = tcpClient.GetStream(); //networkstream is used to send/receive messages
nsReadStream.ReadTimeout = 10000;
tcpClient.ReceiveTimeout = 10000;
while (tcpClient.Connected && !bCloseConnection && bTCPConnectionOnline) //while the client is connected, we look for incoming messages
{
StringBuilder CompleteMessage = new StringBuilder();
Globals.StatusConnection = true;
if (nsReadStream.CanRead)
{
Console.WriteLine("TCP: Can read");
byte[] ReadBuffer = new byte[1024];
CompleteMessage = new StringBuilder();
int numberOfBytesRead = 0;
// Incoming message may be larger than the buffer size.
do
{
Console.WriteLine("TCP: Read");
numberOfBytesRead = nsReadStream.Read(ReadBuffer, 0, ReadBuffer.Length);
CompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(ReadBuffer, 0, numberOfBytesRead));
if (numberOfBytesRead == 0)
{
break;
}
}
while (nsReadStream.DataAvailable && nsReadStream.CanRead && tcpClient.Connected);
}
strReceivedData = CompleteMessage.ToString();
Console.WriteLine("Sender: {0} Payload: {1}", null, strReceivedData);
string pattern = @"(\<SOT\>)+?.*?(\<EOT\>)+?";
foreach (Match match in Regex.Matches(strReceivedData, pattern))
{
strReceiveBuffer = match.Value;
Console.WriteLine("Found '{0}' at position {1} end {2}",match.Value, match.Index,match.Length);
Console.WriteLine("Prepared {0}", strReceiveBuffer.Substring(5, match.Length-10));
strReceivedData = strReceiveBuffer.Substring(5, match.Length - 10);
try
{
if (strReceivedData != "")
{
dynamic dynamicRawTCPFrame = JsonConvert.DeserializeObject(strReceivedData); // Deserialize received frame
string strRawTCPFrameType = dynamicRawTCPFrame.type;
// Check if this is NOT keep alive
if (Int32.Parse(strRawTCPFrameType) != 0)
{
// Add to mySQL send buffer (find first empty slot)
PerunHelper.AddLog(ref arrGUILogHistory, "Packet received" , 2,0, strRawTCPFrameType,true);
bool AddedDataToBuffer = false;
for (int i = 0; i < arrMySQLSendBuffer.Length - 1; i++)
{
if (arrMySQLSendBuffer[i] == null)
{
arrMySQLSendBuffer[i] = strReceivedData;
AddedDataToBuffer = true;
break;
}
}
if (!AddedDataToBuffer)
{
PerunHelper.AddLog(ref arrGUILogHistory, "ERROR package was dropped", 1, 1, strRawTCPFrameType);
}
} else
{
// Keep alive
PerunHelper.AddLog(ref arrGUILogHistory, "Keep-alive received", 2,0,"0",true);
}
}
else
{
bTCPConnectionOnline = false;
}
}
catch (Exception e)
{
Globals.ErrorsGame++;
Console.WriteLine(e.ToString());
PerunHelper.AddLog(ref arrGUILogHistory, "ERROR while message parsing , error: " + e.Message,2,1,"?");
bTCPConnectionOnline = false;
}
// Send empty byte to check if connection is still alive
try
{
tcpClient.Client.Send(new byte[] { 0 }, 1, 0);
}
catch (SocketException e)
{
Console.WriteLine(e.ToString());
PerunHelper.AddLog(ref arrGUILogHistory, "TCP ERROR cannot check connection, error: " + e.Message,2,1,"?");
}
}
}
}
System.Threading.Thread.Sleep(500);
}
tcpServer.Stop();
}
catch (Exception e)
{
Globals.ErrorsGame++;
Console.WriteLine(e.ToString());
PerunHelper.AddLog(ref arrGUILogHistory, "TCP error - connection closed or port in use, error: " + e.Message,1,1,"?");
bTCPConnectionOnline = false;
}
// Clean up and prepare for next connection
if (!(nsReadStream is null))
{
nsReadStream.Flush();
nsReadStream.Close();
}
if (!(tcpClient is null))
{
tcpClient.Close();
}
if (!(tcpServer is null))
{
tcpServer.Stop();
}
Console.WriteLine("TCP listen stop");
}
}
}

View File

@@ -1,91 +0,0 @@
// This class handles UDP communication
using Newtonsoft.Json;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
internal class UDPController
{
// Main class for UDP listener
public static int intListenPort; // Port to listen at
public static bool boolDone; // Helper to exit main loop without killing thread
public static UdpClient udpListener; // Listener object
public static string[] arrLogHistory; // Log history for GUI
public static string[] arrSendBuffer; // Mysql send buffer
public static Thread thrUDPListener; // Seperate thread for UDP
public static void Create(int intListenPort, ref string[] arrLogHistory, ref string[] arrSendBuffer)
{
// Create class
UDPController.intListenPort = intListenPort;
UDPController.arrLogHistory = arrLogHistory;
UDPController.arrSendBuffer = arrSendBuffer;
}
public static void StopListen()
{
// FInish listening
UDPController.boolDone = true;
UDPController.udpListener.Close();
UDPController.udpListener = null;
for (int i = 0; i < arrSendBuffer.Length - 1; i++)
{
arrSendBuffer[i] = null;
}
}
public static void StartListen()
{
Console.WriteLine("UDP Listen start");
try
{
// Start listening to UDP
udpListener = new UdpClient(intListenPort);
IPEndPoint ipendpointGroupEP = new IPEndPoint(IPAddress.Loopback, intListenPort);
string strReceivedData;
byte[] arrReceiveByteArray;
// Start the main loop
UDPController.boolDone = false;
while (!UDPController.boolDone)
{
// Start listening
Console.WriteLine("UDP: Waiting for packet");
arrReceiveByteArray = udpListener.Receive(ref ipendpointGroupEP);
strReceivedData = Encoding.ASCII.GetString(arrReceiveByteArray, 0, arrReceiveByteArray.Length);
Console.WriteLine("Sender: {0} Payload: {1}", ipendpointGroupEP.ToString(), strReceivedData);
// Add to log history and rotate
dynamic dynamicRawUDPFrame = JsonConvert.DeserializeObject(strReceivedData); // Deserialize received frame
string strRawUDPFrameType = dynamicRawUDPFrame.type;
PerunHelper.LogHistoryAdd(ref arrLogHistory, "UDP packet received, type: " + strRawUDPFrameType);
// Add to mySQL send buffer (find first empty slot)
for (int i = 0; i < arrSendBuffer.Length - 1; i++)
{
if (arrSendBuffer[i] == null)
{
arrSendBuffer[i] = strReceivedData;
break;
}
}
}
udpListener.Close(); // Close port
}
catch (Exception e)
{
// General exception found
if (e.HResult != -2147467259) {
Console.WriteLine(e.ToString());
PerunHelper.LogHistoryAdd(ref arrLogHistory, "ERROR UDP - port may be in use");
}
}
Console.WriteLine("UDP listen stop");
}
}

View File

@@ -34,7 +34,7 @@
this.con_Button_Listen_ON = new System.Windows.Forms.Button(); this.con_Button_Listen_ON = new System.Windows.Forms.Button();
this.con_Button_Listen_OFF = new System.Windows.Forms.Button(); this.con_Button_Listen_OFF = new System.Windows.Forms.Button();
this.con_GroupBox_1 = new System.Windows.Forms.GroupBox(); this.con_GroupBox_1 = new System.Windows.Forms.GroupBox();
this.tim_1000ms = new System.Windows.Forms.Timer(this.components); this.tim_GUI = new System.Windows.Forms.Timer(this.components);
this.con_GroupBox_2 = new System.Windows.Forms.GroupBox(); this.con_GroupBox_2 = new System.Windows.Forms.GroupBox();
this.label6 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label();
this.con_txt_mysql_port = new System.Windows.Forms.TextBox(); this.con_txt_mysql_port = new System.Windows.Forms.TextBox();
@@ -57,12 +57,35 @@
this.trayIconMain = new System.Windows.Forms.NotifyIcon(this.components); this.trayIconMain = new System.Windows.Forms.NotifyIcon(this.components);
this.openFileDialog_SRS = new System.Windows.Forms.OpenFileDialog(); this.openFileDialog_SRS = new System.Windows.Forms.OpenFileDialog();
this.openFileDialog_LotATC = new System.Windows.Forms.OpenFileDialog(); this.openFileDialog_LotATC = new System.Windows.Forms.OpenFileDialog();
this.tim_10000ms = new System.Windows.Forms.Timer(this.components); this.tim_3rdparties = new System.Windows.Forms.Timer(this.components);
this.tim_200ms = new System.Windows.Forms.Timer(this.components); this.tim_MySQL = new System.Windows.Forms.Timer(this.components);
this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); this.groupBox1 = new System.Windows.Forms.GroupBox();
this.label8 = new System.Windows.Forms.Label();
this.con_txt_dcs_instance = new System.Windows.Forms.MaskedTextBox();
this.label7 = new System.Windows.Forms.Label();
this.con_txt_dcs_server_port = new System.Windows.Forms.MaskedTextBox();
this.label9 = new System.Windows.Forms.Label();
this.label10 = new System.Windows.Forms.Label();
this.label11 = new System.Windows.Forms.Label();
this.label12 = new System.Windows.Forms.Label();
this.con_Button_Reset_Flags = new System.Windows.Forms.Button();
this.label13 = new System.Windows.Forms.Label();
this.label14 = new System.Windows.Forms.Label();
this.con_img_logo = new System.Windows.Forms.PictureBox();
this.con_img_lotATC = new System.Windows.Forms.PictureBox();
this.con_img_srs = new System.Windows.Forms.PictureBox();
this.con_img_dcs = new System.Windows.Forms.PictureBox();
this.con_img_db = new System.Windows.Forms.PictureBox();
this.con_Button_Add_Marker = new System.Windows.Forms.Button();
this.con_GroupBox_1.SuspendLayout(); this.con_GroupBox_1.SuspendLayout();
this.con_GroupBox_2.SuspendLayout(); this.con_GroupBox_2.SuspendLayout();
this.con_GroupBox_3.SuspendLayout(); this.con_GroupBox_3.SuspendLayout();
this.groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.con_img_logo)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.con_img_lotATC)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.con_img_srs)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.con_img_dcs)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.con_img_db)).BeginInit();
this.SuspendLayout(); this.SuspendLayout();
// //
// con_List_Received // con_List_Received
@@ -70,47 +93,47 @@
this.con_List_Received.Enabled = false; this.con_List_Received.Enabled = false;
this.con_List_Received.FormattingEnabled = true; this.con_List_Received.FormattingEnabled = true;
this.con_List_Received.Items.AddRange(new object[] { this.con_List_Received.Items.AddRange(new object[] {
"Welcome to Perun for DCS World!"}); "Not connected"});
this.con_List_Received.Location = new System.Drawing.Point(6, 19); this.con_List_Received.Location = new System.Drawing.Point(11, 19);
this.con_List_Received.Name = "con_List_Received"; this.con_List_Received.Name = "con_List_Received";
this.con_List_Received.Size = new System.Drawing.Size(307, 134); this.con_List_Received.Size = new System.Drawing.Size(307, 134);
this.con_List_Received.TabIndex = 0; this.con_List_Received.TabIndex = 0;
// //
// con_Button_Listen_ON // con_Button_Listen_ON
// //
this.con_Button_Listen_ON.Location = new System.Drawing.Point(12, 434); this.con_Button_Listen_ON.Location = new System.Drawing.Point(12, 602);
this.con_Button_Listen_ON.Name = "con_Button_Listen_ON"; this.con_Button_Listen_ON.Name = "con_Button_Listen_ON";
this.con_Button_Listen_ON.Size = new System.Drawing.Size(86, 39); this.con_Button_Listen_ON.Size = new System.Drawing.Size(86, 39);
this.con_Button_Listen_ON.TabIndex = 2; this.con_Button_Listen_ON.TabIndex = 2;
this.con_Button_Listen_ON.Text = "Connect"; this.con_Button_Listen_ON.Text = "Start";
this.con_Button_Listen_ON.UseVisualStyleBackColor = true; this.con_Button_Listen_ON.UseVisualStyleBackColor = true;
this.con_Button_Listen_ON.Click += new System.EventHandler(this.con_Button_Listen_ON_Click); this.con_Button_Listen_ON.Click += new System.EventHandler(this.con_Button_Listen_ON_Click);
// //
// con_Button_Listen_OFF // con_Button_Listen_OFF
// //
this.con_Button_Listen_OFF.Enabled = false; this.con_Button_Listen_OFF.Enabled = false;
this.con_Button_Listen_OFF.Location = new System.Drawing.Point(104, 434); this.con_Button_Listen_OFF.Location = new System.Drawing.Point(104, 602);
this.con_Button_Listen_OFF.Name = "con_Button_Listen_OFF"; this.con_Button_Listen_OFF.Name = "con_Button_Listen_OFF";
this.con_Button_Listen_OFF.Size = new System.Drawing.Size(86, 39); this.con_Button_Listen_OFF.Size = new System.Drawing.Size(86, 39);
this.con_Button_Listen_OFF.TabIndex = 3; this.con_Button_Listen_OFF.TabIndex = 3;
this.con_Button_Listen_OFF.Text = "Disconnect"; this.con_Button_Listen_OFF.Text = "Stop";
this.con_Button_Listen_OFF.UseVisualStyleBackColor = true; this.con_Button_Listen_OFF.UseVisualStyleBackColor = true;
this.con_Button_Listen_OFF.Click += new System.EventHandler(this.con_Button_Listen_OFF_Click); this.con_Button_Listen_OFF.Click += new System.EventHandler(this.con_Button_Listen_OFF_Click);
// //
// con_GroupBox_1 // con_GroupBox_1
// //
this.con_GroupBox_1.Controls.Add(this.con_List_Received); this.con_GroupBox_1.Controls.Add(this.con_List_Received);
this.con_GroupBox_1.Location = new System.Drawing.Point(12, 261); this.con_GroupBox_1.Location = new System.Drawing.Point(12, 434);
this.con_GroupBox_1.Name = "con_GroupBox_1"; this.con_GroupBox_1.Name = "con_GroupBox_1";
this.con_GroupBox_1.Size = new System.Drawing.Size(324, 167); this.con_GroupBox_1.Size = new System.Drawing.Size(324, 162);
this.con_GroupBox_1.TabIndex = 4; this.con_GroupBox_1.TabIndex = 4;
this.con_GroupBox_1.TabStop = false; this.con_GroupBox_1.TabStop = false;
this.con_GroupBox_1.Text = "UDP log"; this.con_GroupBox_1.Text = "Data log";
// //
// tim_1000ms // tim_GUI
// //
this.tim_1000ms.Interval = 1000; this.tim_GUI.Interval = 200;
this.tim_1000ms.Tick += new System.EventHandler(this.timer1_Tick); this.tim_GUI.Tick += new System.EventHandler(this.Tim_GUI_Tick);
// //
// con_GroupBox_2 // con_GroupBox_2
// //
@@ -124,7 +147,7 @@
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_database); this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_database);
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_server); this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_server);
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_password); this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_password);
this.con_GroupBox_2.Location = new System.Drawing.Point(12, 27); this.con_GroupBox_2.Location = new System.Drawing.Point(14, 54);
this.con_GroupBox_2.Name = "con_GroupBox_2"; this.con_GroupBox_2.Name = "con_GroupBox_2";
this.con_GroupBox_2.Size = new System.Drawing.Size(324, 154); this.con_GroupBox_2.Size = new System.Drawing.Size(324, 154);
this.con_GroupBox_2.TabIndex = 5; this.con_GroupBox_2.TabIndex = 5;
@@ -134,15 +157,14 @@
// label6 // label6
// //
this.label6.AutoSize = true; this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(41, 48); this.label6.Location = new System.Drawing.Point(19, 48);
this.label6.Name = "label6"; this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(59, 13); this.label6.Size = new System.Drawing.Size(81, 13);
this.label6.TabIndex = 9; this.label6.TabIndex = 9;
this.label6.Text = "Server port"; this.label6.Text = "MySQL DB port";
// //
// con_txt_mysql_port // con_txt_mysql_port
// //
this.con_txt_mysql_port.Enabled = false;
this.con_txt_mysql_port.Location = new System.Drawing.Point(106, 45); this.con_txt_mysql_port.Location = new System.Drawing.Point(106, 45);
this.con_txt_mysql_port.Name = "con_txt_mysql_port"; this.con_txt_mysql_port.Name = "con_txt_mysql_port";
this.con_txt_mysql_port.Size = new System.Drawing.Size(207, 20); this.con_txt_mysql_port.Size = new System.Drawing.Size(207, 20);
@@ -176,20 +198,20 @@
// label2 // label2
// //
this.label2.AutoSize = true; this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(47, 74); this.label2.Location = new System.Drawing.Point(18, 74);
this.label2.Name = "label2"; this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(53, 13); this.label2.Size = new System.Drawing.Size(82, 13);
this.label2.TabIndex = 4; this.label2.TabIndex = 4;
this.label2.Text = "Database"; this.label2.Text = "Database name";
// //
// label1 // label1
// //
this.label1.AutoSize = true; this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(22, 22); this.label1.Location = new System.Drawing.Point(3, 22);
this.label1.Name = "label1"; this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(78, 13); this.label1.Size = new System.Drawing.Size(100, 13);
this.label1.TabIndex = 3; this.label1.TabIndex = 3;
this.label1.Text = "Server address"; this.label1.Text = "MySQL DB address";
// //
// con_txt_mysql_database // con_txt_mysql_database
// //
@@ -219,12 +241,12 @@
this.con_GroupBox_3.Controls.Add(this.con_txt_3rd_srs); this.con_GroupBox_3.Controls.Add(this.con_txt_3rd_srs);
this.con_GroupBox_3.Controls.Add(this.con_check_3rd_lotatc); this.con_GroupBox_3.Controls.Add(this.con_check_3rd_lotatc);
this.con_GroupBox_3.Controls.Add(this.con_check_3rd_srs); this.con_GroupBox_3.Controls.Add(this.con_check_3rd_srs);
this.con_GroupBox_3.Location = new System.Drawing.Point(12, 187); this.con_GroupBox_3.Location = new System.Drawing.Point(14, 288);
this.con_GroupBox_3.Name = "con_GroupBox_3"; this.con_GroupBox_3.Name = "con_GroupBox_3";
this.con_GroupBox_3.Size = new System.Drawing.Size(324, 68); this.con_GroupBox_3.Size = new System.Drawing.Size(324, 68);
this.con_GroupBox_3.TabIndex = 6; this.con_GroupBox_3.TabIndex = 6;
this.con_GroupBox_3.TabStop = false; this.con_GroupBox_3.TabStop = false;
this.con_GroupBox_3.Text = "3rd Party"; this.con_GroupBox_3.Text = "3rd party";
// //
// con_txt_3rd_lotatc // con_txt_3rd_lotatc
// //
@@ -264,7 +286,7 @@
// //
// con_Button_Quit // con_Button_Quit
// //
this.con_Button_Quit.Location = new System.Drawing.Point(250, 434); this.con_Button_Quit.Location = new System.Drawing.Point(251, 602);
this.con_Button_Quit.Name = "con_Button_Quit"; this.con_Button_Quit.Name = "con_Button_Quit";
this.con_Button_Quit.Size = new System.Drawing.Size(86, 39); this.con_Button_Quit.Size = new System.Drawing.Size(86, 39);
this.con_Button_Quit.TabIndex = 7; this.con_Button_Quit.TabIndex = 7;
@@ -275,9 +297,10 @@
// con_lab_github // con_lab_github
// //
this.con_lab_github.AutoSize = true; this.con_lab_github.AutoSize = true;
this.con_lab_github.Location = new System.Drawing.Point(141, 9); this.con_lab_github.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.con_lab_github.Location = new System.Drawing.Point(183, 39);
this.con_lab_github.Name = "con_lab_github"; this.con_lab_github.Name = "con_lab_github";
this.con_lab_github.Size = new System.Drawing.Size(181, 13); this.con_lab_github.Size = new System.Drawing.Size(155, 12);
this.con_lab_github.TabIndex = 8; this.con_lab_github.TabIndex = 8;
this.con_lab_github.TabStop = true; this.con_lab_github.TabStop = true;
this.con_lab_github.Text = "https://github.com/szporwolik/perun"; this.con_lab_github.Text = "https://github.com/szporwolik/perun";
@@ -286,9 +309,10 @@
// label5 // label5
// //
this.label5.AutoSize = true; this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(15, 9); this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label5.Location = new System.Drawing.Point(183, 27);
this.label5.Name = "label5"; this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(120, 13); this.label5.Size = new System.Drawing.Size(102, 12);
this.label5.TabIndex = 9; this.label5.TabIndex = 9;
this.label5.Text = "Manual and bugtracker:"; this.label5.Text = "Manual and bugtracker:";
// //
@@ -310,29 +334,219 @@
// //
this.openFileDialog_LotATC.FileName = "openFileDialog1"; this.openFileDialog_LotATC.FileName = "openFileDialog1";
// //
// tim_10000ms // tim_3rdparties
// //
this.tim_10000ms.Interval = 30000; this.tim_3rdparties.Interval = 30000;
this.tim_10000ms.Tick += new System.EventHandler(this.tim_10000ms_Tick); this.tim_3rdparties.Tick += new System.EventHandler(this.tim_3rdparties_Tick);
// //
// tim_200ms // tim_MySQL
// //
this.tim_200ms.Tick += new System.EventHandler(this.tim_200ms_Tick); this.tim_MySQL.Tick += new System.EventHandler(this.Tim_MySQL_Tick);
// //
// notifyIcon1 // groupBox1
// //
this.notifyIcon1.Text = "notifyIcon1"; this.groupBox1.Controls.Add(this.label8);
this.notifyIcon1.Visible = true; this.groupBox1.Controls.Add(this.con_txt_dcs_instance);
this.groupBox1.Controls.Add(this.label7);
this.groupBox1.Controls.Add(this.con_txt_dcs_server_port);
this.groupBox1.Location = new System.Drawing.Point(14, 214);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(324, 68);
this.groupBox1.TabIndex = 7;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "DCS Connection";
//
// label8
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(7, 45);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(93, 13);
this.label8.TabIndex = 12;
this.label8.Text = "Perun Instance ID";
//
// con_txt_dcs_instance
//
this.con_txt_dcs_instance.Location = new System.Drawing.Point(106, 42);
this.con_txt_dcs_instance.Name = "con_txt_dcs_instance";
this.con_txt_dcs_instance.Size = new System.Drawing.Size(207, 20);
this.con_txt_dcs_instance.TabIndex = 11;
//
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(44, 19);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(56, 13);
this.label7.TabIndex = 10;
this.label7.Text = "Perun port";
//
// con_txt_dcs_server_port
//
this.con_txt_dcs_server_port.Location = new System.Drawing.Point(106, 16);
this.con_txt_dcs_server_port.Name = "con_txt_dcs_server_port";
this.con_txt_dcs_server_port.Size = new System.Drawing.Size(207, 20);
this.con_txt_dcs_server_port.TabIndex = 3;
//
// label9
//
this.label9.AutoSize = true;
this.label9.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.label9.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label9.Location = new System.Drawing.Point(21, 396);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(61, 13);
this.label9.TabIndex = 1;
this.label9.Text = "Database";
//
// label10
//
this.label10.AutoSize = true;
this.label10.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.label10.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label10.Location = new System.Drawing.Point(117, 396);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(39, 13);
this.label10.TabIndex = 14;
this.label10.Text = "Game";
//
// label11
//
this.label11.AutoSize = true;
this.label11.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.label11.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label11.Location = new System.Drawing.Point(205, 396);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(32, 13);
this.label11.TabIndex = 15;
this.label11.Text = "SRS";
//
// label12
//
this.label12.AutoSize = true;
this.label12.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.label12.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label12.Location = new System.Drawing.Point(282, 396);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(49, 13);
this.label12.TabIndex = 16;
this.label12.Text = "LotATC";
//
// con_Button_Reset_Flags
//
this.con_Button_Reset_Flags.Enabled = false;
this.con_Button_Reset_Flags.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.con_Button_Reset_Flags.Location = new System.Drawing.Point(224, 414);
this.con_Button_Reset_Flags.Name = "con_Button_Reset_Flags";
this.con_Button_Reset_Flags.Size = new System.Drawing.Size(114, 20);
this.con_Button_Reset_Flags.TabIndex = 17;
this.con_Button_Reset_Flags.Text = "Reset error flags";
this.con_Button_Reset_Flags.UseVisualStyleBackColor = true;
this.con_Button_Reset_Flags.Click += new System.EventHandler(this.con_Button_Reset_Flags_Click);
//
// label13
//
this.label13.AutoSize = true;
this.label13.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label13.Location = new System.Drawing.Point(63, 7);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(74, 25);
this.label13.TabIndex = 19;
this.label13.Text = "Perun";
//
// label14
//
this.label14.AutoSize = true;
this.label14.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label14.Location = new System.Drawing.Point(65, 32);
this.label14.Name = "label14";
this.label14.Size = new System.Drawing.Size(88, 13);
this.label14.TabIndex = 20;
this.label14.Text = "for DCS World";
//
// con_img_logo
//
this.con_img_logo.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
this.con_img_logo.Image = global::Perun_v1.Properties.Resources.perun_logo;
this.con_img_logo.Location = new System.Drawing.Point(12, 7);
this.con_img_logo.Name = "con_img_logo";
this.con_img_logo.Size = new System.Drawing.Size(45, 41);
this.con_img_logo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.con_img_logo.TabIndex = 18;
this.con_img_logo.TabStop = false;
//
// con_img_lotATC
//
this.con_img_lotATC.Location = new System.Drawing.Point(292, 362);
this.con_img_lotATC.Name = "con_img_lotATC";
this.con_img_lotATC.Size = new System.Drawing.Size(29, 28);
this.con_img_lotATC.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.con_img_lotATC.TabIndex = 13;
this.con_img_lotATC.TabStop = false;
//
// con_img_srs
//
this.con_img_srs.Location = new System.Drawing.Point(207, 362);
this.con_img_srs.Name = "con_img_srs";
this.con_img_srs.Size = new System.Drawing.Size(29, 28);
this.con_img_srs.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.con_img_srs.TabIndex = 12;
this.con_img_srs.TabStop = false;
//
// con_img_dcs
//
this.con_img_dcs.Location = new System.Drawing.Point(122, 362);
this.con_img_dcs.Name = "con_img_dcs";
this.con_img_dcs.Size = new System.Drawing.Size(29, 28);
this.con_img_dcs.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.con_img_dcs.TabIndex = 11;
this.con_img_dcs.TabStop = false;
//
// con_img_db
//
this.con_img_db.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
this.con_img_db.Location = new System.Drawing.Point(37, 362);
this.con_img_db.Name = "con_img_db";
this.con_img_db.Size = new System.Drawing.Size(29, 28);
this.con_img_db.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.con_img_db.TabIndex = 10;
this.con_img_db.TabStop = false;
//
// con_Button_Add_Marker
//
this.con_Button_Add_Marker.Enabled = false;
this.con_Button_Add_Marker.Font = new System.Drawing.Font("Microsoft Sans Serif", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.con_Button_Add_Marker.Location = new System.Drawing.Point(12, 414);
this.con_Button_Add_Marker.Name = "con_Button_Add_Marker";
this.con_Button_Add_Marker.Size = new System.Drawing.Size(114, 20);
this.con_Button_Add_Marker.TabIndex = 21;
this.con_Button_Add_Marker.Text = "Add log marker";
this.con_Button_Add_Marker.UseVisualStyleBackColor = true;
this.con_Button_Add_Marker.Click += new System.EventHandler(this.con_Button_Add_Marker_Click);
// //
// form_Main // form_Main
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(349, 483); this.ClientSize = new System.Drawing.Size(349, 653);
this.Controls.Add(this.con_Button_Add_Marker);
this.Controls.Add(this.label14);
this.Controls.Add(this.label13);
this.Controls.Add(this.con_img_logo);
this.Controls.Add(this.con_Button_Reset_Flags);
this.Controls.Add(this.label12);
this.Controls.Add(this.label11);
this.Controls.Add(this.label10);
this.Controls.Add(this.label9);
this.Controls.Add(this.con_img_lotATC);
this.Controls.Add(this.con_img_srs);
this.Controls.Add(this.con_img_dcs);
this.Controls.Add(this.con_img_db);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.con_GroupBox_3);
this.Controls.Add(this.label5); this.Controls.Add(this.label5);
this.Controls.Add(this.con_lab_github); this.Controls.Add(this.con_lab_github);
this.Controls.Add(this.con_Button_Quit); this.Controls.Add(this.con_Button_Quit);
this.Controls.Add(this.con_GroupBox_3);
this.Controls.Add(this.con_GroupBox_2); this.Controls.Add(this.con_GroupBox_2);
this.Controls.Add(this.con_GroupBox_1); this.Controls.Add(this.con_GroupBox_1);
this.Controls.Add(this.con_Button_Listen_OFF); this.Controls.Add(this.con_Button_Listen_OFF);
@@ -340,10 +554,9 @@
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false; this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "form_Main"; this.Name = "form_Main";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Perun for DCS World"; this.Text = "Perun for DCS";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.form_Main_FormClosing); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.form_Main_FormClosing);
this.Load += new System.EventHandler(this.form_Main_Load); this.Load += new System.EventHandler(this.form_Main_Load);
this.con_GroupBox_1.ResumeLayout(false); this.con_GroupBox_1.ResumeLayout(false);
@@ -351,6 +564,13 @@
this.con_GroupBox_2.PerformLayout(); this.con_GroupBox_2.PerformLayout();
this.con_GroupBox_3.ResumeLayout(false); this.con_GroupBox_3.ResumeLayout(false);
this.con_GroupBox_3.PerformLayout(); this.con_GroupBox_3.PerformLayout();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.con_img_logo)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.con_img_lotATC)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.con_img_srs)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.con_img_dcs)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.con_img_db)).EndInit();
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();
@@ -362,7 +582,7 @@
private System.Windows.Forms.Button con_Button_Listen_ON; private System.Windows.Forms.Button con_Button_Listen_ON;
private System.Windows.Forms.Button con_Button_Listen_OFF; private System.Windows.Forms.Button con_Button_Listen_OFF;
private System.Windows.Forms.GroupBox con_GroupBox_1; private System.Windows.Forms.GroupBox con_GroupBox_1;
private System.Windows.Forms.Timer tim_1000ms; private System.Windows.Forms.Timer tim_GUI;
private System.Windows.Forms.GroupBox con_GroupBox_2; private System.Windows.Forms.GroupBox con_GroupBox_2;
private System.Windows.Forms.GroupBox con_GroupBox_3; private System.Windows.Forms.GroupBox con_GroupBox_3;
private System.Windows.Forms.TextBox con_txt_mysql_database; private System.Windows.Forms.TextBox con_txt_mysql_database;
@@ -383,11 +603,28 @@
private System.Windows.Forms.NotifyIcon trayIconMain; private System.Windows.Forms.NotifyIcon trayIconMain;
private System.Windows.Forms.OpenFileDialog openFileDialog_SRS; private System.Windows.Forms.OpenFileDialog openFileDialog_SRS;
private System.Windows.Forms.OpenFileDialog openFileDialog_LotATC; private System.Windows.Forms.OpenFileDialog openFileDialog_LotATC;
private System.Windows.Forms.Timer tim_10000ms; private System.Windows.Forms.Timer tim_3rdparties;
private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label6;
private System.Windows.Forms.TextBox con_txt_mysql_port; private System.Windows.Forms.TextBox con_txt_mysql_port;
private System.Windows.Forms.Timer tim_200ms; private System.Windows.Forms.Timer tim_MySQL;
private System.Windows.Forms.NotifyIcon notifyIcon1; private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.MaskedTextBox con_txt_dcs_server_port;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.MaskedTextBox con_txt_dcs_instance;
private System.Windows.Forms.PictureBox con_img_db;
private System.Windows.Forms.PictureBox con_img_dcs;
private System.Windows.Forms.PictureBox con_img_srs;
private System.Windows.Forms.PictureBox con_img_lotATC;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.Button con_Button_Reset_Flags;
private System.Windows.Forms.PictureBox con_img_logo;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.Label label14;
private System.Windows.Forms.Button con_Button_Add_Marker;
} }
} }

View File

@@ -1,25 +1,77 @@
using System; using Newtonsoft.Json;
using System;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing;
using System.Threading; using System.Threading;
using System.Windows.Forms; using System.Windows.Forms;
using Newtonsoft.Json;
namespace Perun_v1 namespace Perun_v1
{ {
public partial class form_Main : Form public partial class form_Main : Form
{ {
// Variable definitions // Variable definitions
public string[] arrSendBuffer = new string[100]; // Mysql send buffer public string[] DatabaseSendBuffer = new string[50]; // MySQL send buffer
public bool boolLetMeOut = false; // Helper to handle system tray public bool AppCanClose = false; // Helper to handle system tray - true needed to quit the app
public DatabaseController DatabaseConnection = new DatabaseController(); // Main MySQL controller
public TCPController TCPServer = new TCPController(); // Main TCP controller
public bool ExtSRSStatus; // True if to use empty/default SRS status
public bool ExtLotATCStatus; // True if to use empty/default LotATC status
// ################################ Main ################################ // ################################ Main ################################
private void form_Main_Load(object sender, EventArgs e) private void form_Main_Load(object sender, EventArgs e)
{ {
// Form loaded - fill controls with default values // Form loaded
Globals.AppLogHistory[0] = DateTime.Now.ToString("HH:mm:ss") + " > " + "Perun started"; // Add information to the log control
form_Main_LoadSettings(); // Load settings from registry
Globals.arrLogHistory[0] = DateTime.Now.ToString("HH:mm:ss") + " > " + "Perun started"; // Display build version in title bar
form_Main_LoadSettings(); // Load settings Globals.AppTitle = PerunHelper.GetAppVersion(this.Text + " - ");
this.Text = PerunHelper.GetAppVersion(this.Text + " - "); // Display build version in title bar this.Text = Globals.AppTitle;
// Use command line parameters
string[] args = Environment.GetCommandLineArgs();
if (args.Length > 1)
{
// Get argument server port
if (args[1] != null)
{
con_txt_dcs_server_port.Text = args[1];
}
}
if (args.Length > 2)
{
// Get argument instance id
if (args[2] != null)
{
con_txt_dcs_instance.Text = args[2];
}
}
if (args.Length > 3)
{
// Get argument DCS SRS file path
if (args[3] != null)
{
con_txt_3rd_srs.Text = args[3];
con_check_3rd_srs.Checked = true;
}
}
if (args.Length > 4)
{
// Get argument lotATC file path
if (args[4] != null)
{
con_txt_3rd_lotatc.Text = args[4];
con_check_3rd_lotatc.Checked = true;
}
}
// Initialize controls
con_img_db.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
} }
public form_Main() public form_Main()
@@ -31,7 +83,7 @@ namespace Perun_v1
// ################################ Helpers ################################ // ################################ Helpers ################################
private void form_Main_LoadSettings() private void form_Main_LoadSettings()
{ {
// Loads settings // Loads registry settings
con_txt_mysql_database.Text = Properties.Settings.Default.MYSQL_DB; con_txt_mysql_database.Text = Properties.Settings.Default.MYSQL_DB;
con_txt_mysql_username.Text = Properties.Settings.Default.MYSQL_User; con_txt_mysql_username.Text = Properties.Settings.Default.MYSQL_User;
con_txt_mysql_password.Text = Properties.Settings.Default.MYSQL_Password; con_txt_mysql_password.Text = Properties.Settings.Default.MYSQL_Password;
@@ -41,11 +93,13 @@ namespace Perun_v1
con_txt_3rd_srs.Text = Properties.Settings.Default.OTHER_SRS_FILE; con_txt_3rd_srs.Text = Properties.Settings.Default.OTHER_SRS_FILE;
con_check_3rd_lotatc.Checked = Properties.Settings.Default.OTHER_LOTATC_USE; con_check_3rd_lotatc.Checked = Properties.Settings.Default.OTHER_LOTATC_USE;
con_check_3rd_srs.Checked = Properties.Settings.Default.OTHER_SRS_USE; con_check_3rd_srs.Checked = Properties.Settings.Default.OTHER_SRS_USE;
con_txt_dcs_server_port.Text = Properties.Settings.Default.DCS_Server_Port.ToString();
con_txt_dcs_instance.Text = Properties.Settings.Default.DCS_Instance.ToString();
} }
private void form_Main_SaveSettings() private void form_Main_SaveSettings()
{ {
// Saves settings // Saves registry settings
Properties.Settings.Default.MYSQL_Server = con_txt_mysql_database.Text; Properties.Settings.Default.MYSQL_Server = con_txt_mysql_database.Text;
Properties.Settings.Default.MYSQL_DB = con_txt_mysql_database.Text; Properties.Settings.Default.MYSQL_DB = con_txt_mysql_database.Text;
Properties.Settings.Default.MYSQL_User = con_txt_mysql_username.Text; Properties.Settings.Default.MYSQL_User = con_txt_mysql_username.Text;
@@ -57,15 +111,20 @@ namespace Perun_v1
Properties.Settings.Default.OTHER_SRS_FILE = con_txt_3rd_srs.Text; Properties.Settings.Default.OTHER_SRS_FILE = con_txt_3rd_srs.Text;
Properties.Settings.Default.OTHER_LOTATC_USE = con_check_3rd_lotatc.Checked; Properties.Settings.Default.OTHER_LOTATC_USE = con_check_3rd_lotatc.Checked;
Properties.Settings.Default.OTHER_SRS_USE = con_check_3rd_srs.Checked; Properties.Settings.Default.OTHER_SRS_USE = con_check_3rd_srs.Checked;
Properties.Settings.Default.DCS_Server_Port = Int32.Parse(con_txt_dcs_server_port.Text);
Properties.Settings.Default.DCS_Instance = Int32.Parse(con_txt_dcs_instance.Text);
Properties.Settings.Default.Save(); Properties.Settings.Default.Save();
} }
private void form_Main_DisableControls() private void form_Main_SetControlsToConnected()
{ {
// Disables controls // Disables controls
con_Button_Listen_ON.Enabled = false; con_Button_Add_Marker.Enabled = true;
con_Button_Listen_OFF.Enabled = true; con_Button_Listen_OFF.Enabled = true;
con_Button_Listen_ON.Enabled = false;
con_Button_Quit.Enabled = false;
con_Button_Reset_Flags.Enabled = true;
con_txt_mysql_database.Enabled = false; con_txt_mysql_database.Enabled = false;
con_txt_mysql_username.Enabled = false; con_txt_mysql_username.Enabled = false;
con_txt_mysql_password.Enabled = false; con_txt_mysql_password.Enabled = false;
@@ -75,64 +134,126 @@ namespace Perun_v1
con_txt_3rd_srs.Enabled = false; con_txt_3rd_srs.Enabled = false;
con_check_3rd_lotatc.Enabled = false; con_check_3rd_lotatc.Enabled = false;
con_check_3rd_srs.Enabled = false; con_check_3rd_srs.Enabled = false;
con_txt_dcs_server_port.Enabled = false;
con_txt_dcs_instance.Enabled = false;
} }
private void form_Main_EnableControls() private void form_Main_SetControlsToDisconnected()
{ {
// Enables controls // Enables controls
con_Button_Listen_ON.Enabled = true; con_Button_Reset_Flags.Enabled = false;
con_Button_Listen_OFF.Enabled = false; con_Button_Listen_OFF.Enabled = false;
con_Button_Listen_ON.Enabled = true;
con_Button_Quit.Enabled = true;
con_Button_Add_Marker.Enabled = false;
con_txt_mysql_database.Enabled = true; con_txt_mysql_database.Enabled = true;
con_txt_mysql_username.Enabled = true; con_txt_mysql_username.Enabled = true;
con_txt_mysql_password.Enabled = true; con_txt_mysql_password.Enabled = true;
//con_txt_mysql_port.Enabled = true; // TBD - protect against writting text in the port field con_txt_mysql_port.Enabled = true;
con_txt_mysql_server.Enabled = true; con_txt_mysql_server.Enabled = true;
con_txt_3rd_lotatc.Enabled = true; con_txt_3rd_lotatc.Enabled = true;
con_txt_3rd_srs.Enabled = true; con_txt_3rd_srs.Enabled = true;
con_check_3rd_lotatc.Enabled = true; con_check_3rd_lotatc.Enabled = true;
con_check_3rd_srs.Enabled = true; con_check_3rd_srs.Enabled = true;
con_txt_dcs_server_port.Enabled = true;
con_txt_dcs_instance.Enabled = true;
} }
// ################################ User input ################################ // ################################ User input ################################
private void con_Button_Listen_ON_Click(object sender, EventArgs e) private void con_Button_Listen_ON_Click(object sender, EventArgs e)
{ {
// Start listening // Start listening
UDPController.Create(48620, ref Globals.arrLogHistory, ref arrSendBuffer); // Set globals
UDPController.thrUDPListener = new Thread(UDPController.StartListen); Globals.AppInstanceID = Int32.Parse(con_txt_dcs_instance.Text);
UDPController.thrUDPListener.Start(); Globals.AppForceIconReload = true;
UDPController.thrUDPListener.Name = "UDPThread"; Globals.ErrorsDatabase = 0; // Reset error counter
Globals.ErrorsGame = 0; // Reset error counter
Globals.ErrorsSRS = 0; // Reset error counter
Globals.ErrorsLotATC = 0; // Reset error counter
Globals.StatusConnection = false; // Reset connection status
form_Main_DisableControls(); // Disable controlls // Prepare GUI
form_Main_SaveSettings(); // Save settings form_Main_SetControlsToConnected();
form_Main_SaveSettings();
this.Text = "[#" + con_txt_dcs_instance.Text + "] " + Globals.AppTitle; // Set title bar
trayIconMain.Text = this.Text; // Set notification icon text
// Prepare connection string // Prepare MySQL connection string
DatabaseController.strMySQLConnectionString = "server=" + con_txt_mysql_server.Text + ";user=" + con_txt_mysql_username.Text + ";database=" + con_txt_mysql_database.Text + ";port=" + con_txt_mysql_port.Text + ";password=" + con_txt_mysql_password.Text; DatabaseConnection.DatabaseConnectionString = "server=" + con_txt_mysql_server.Text + ";user=" + con_txt_mysql_username.Text + ";database=" + con_txt_mysql_database.Text + ";port=" + con_txt_mysql_port.Text + ";password=" + con_txt_mysql_password.Text;
// Start listening
PerunHelper.AddLog(ref Globals.AppLogHistory, "Opening connections",0,1);
TCPServer.Create(Int32.Parse(con_txt_dcs_server_port.Text), ref Globals.AppLogHistory, ref DatabaseSendBuffer);
TCPServer.thrTCPListener = new Thread(TCPServer.StartListen);
TCPServer.thrTCPListener.Start();
TCPServer.thrTCPListener.Name = "TCPThread";
// Start timmers // Start timmers
tim_200ms.Enabled = true; tim_MySQL.Enabled = true;
tim_1000ms.Enabled = true; tim_GUI.Enabled = true;
tim_10000ms.Enabled = true; tim_3rdparties.Enabled = true;
// Send initial data
Tim_MySQL_Tick(null, null);
tim_3rdparties_Tick(null, null);
} }
private void con_Button_Listen_OFF_Click(object sender, EventArgs e) private void con_Button_Listen_OFF_Click(object sender, EventArgs e)
{ {
// Stop listening // Stop listening
// Prepare GUI
PerunHelper.AddLog(ref Globals.AppLogHistory, "Closing connections",0,1);
con_Button_Listen_OFF.Enabled = false;
Tim_GUI_Tick(null, null);
this.Refresh();
Application.DoEvents();
// Stop timmers
tim_GUI.Enabled = false;
tim_3rdparties.Enabled = false;
tim_MySQL.Enabled = false;
try try
{ {
UDPController.StopListen(); // Stop the server
TCPServer.StopListen();
} }
catch (Exception ex) catch (Exception ex)
{ {
PerunHelper.AddLog(ref Globals.AppLogHistory, "TCP ERROR, error: " + ex.Message, 2, 1, "?");
Console.WriteLine(ex.ToString()); Console.WriteLine(ex.ToString());
} }
form_Main_EnableControls(); // Enable controls while (TCPServer.thrTCPListener.IsAlive)
{
// Wait untill TCP server closed connection
Thread.Sleep(200); //ms
}
form_Main_SetControlsToDisconnected(); // Enable controls
// Stop timmers // Load status images
tim_1000ms.Enabled = false; con_img_db.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
tim_10000ms.Enabled = false; con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
tim_200ms.Enabled = false; con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected");
// Display information about closed connections
PerunHelper.AddLog(ref Globals.AppLogHistory, "Connections closed",0,1);
Tim_GUI_Tick(null, null);
// Set title bar
this.Text = Globals.AppTitle;
trayIconMain.Text = this.Text;
// Set globals
Globals.AppInstanceID = 0;
Globals.AppUpdateGUI = false;
Globals.StatusDatabase = false;
Globals.StatusHistoryConnection = false;
Globals.StatusSRS = false;
Globals.StatusLotATC = false;
Globals.StatusConnection = false;
} }
private void con_lab_github_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) private void con_lab_github_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
@@ -175,13 +296,13 @@ namespace Perun_v1
// ################################ Form state ################################ // ################################ Form state ################################
private void con_Button_Quit_Click(object sender, EventArgs e) private void con_Button_Quit_Click(object sender, EventArgs e)
{ {
// Close app // Try to close app
DialogResult dialogResult = MessageBox.Show("Are you sure to exit Perun?", "Question", MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question); DialogResult dialogResult = MessageBox.Show("Are you sure to exit Perun?", "Question", MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question);
if (dialogResult == DialogResult.Yes) if (dialogResult == DialogResult.Yes)
{ {
form_Main_SaveSettings(); form_Main_SaveSettings();
boolLetMeOut = true; // Save settings on exit AppCanClose = true; // Save settings on exit
this.Close(); // Allow to exit application this.Close(); // Allow to exit application
} }
else if (dialogResult == DialogResult.No) else if (dialogResult == DialogResult.No)
@@ -190,16 +311,6 @@ namespace Perun_v1
} }
} }
protected override void WndProc(ref Message m)
{
// Try to run of 2nd instance
if (m.Msg == NativeMethods.WM_SHOWME)
{
form_Main_BringFromTray();
}
base.WndProc(ref m);
}
private void form_Main_SendToTray() private void form_Main_SendToTray()
{ {
// Sends app to system tray // Sends app to system tray
@@ -227,11 +338,10 @@ namespace Perun_v1
TopMost = top; TopMost = top;
} }
private void form_Main_FormClosing(object sender, FormClosingEventArgs e) private void form_Main_FormClosing(object sender, FormClosingEventArgs e)
{ {
// Minimize to try on clicking "X" // Minimize to try on clicking "X"
if (e.CloseReason == CloseReason.UserClosing && !boolLetMeOut) if (e.CloseReason == CloseReason.UserClosing && !AppCanClose)
{ {
e.Cancel = true; e.Cancel = true;
form_Main_SendToTray(); // Send app to system tray form_Main_SendToTray(); // Send app to system tray
@@ -245,132 +355,286 @@ namespace Perun_v1
} }
// ################################ Timers ################################ // ################################ Timers ################################
private void timer1_Tick(object sender, EventArgs e) private void Tim_GUI_Tick(object sender, EventArgs e)
{ {
// Main timer to sync GUI with background tasks and flush buffers // Main timer to sync GUI with background tasks and flush buffers
// Refresh Log Window // Refresh Log Window
con_List_Received.Items.Clear(); if (Globals.AppUpdateGUI)
foreach (string i in Globals.arrLogHistory)
{ {
if (i != null) con_List_Received.Items.Clear();
foreach (string i in Globals.AppLogHistory)
{ {
con_List_Received.Items.Add(i); if (i != null)
}
}
}
private void tim_200ms_Tick(object sender, EventArgs e)
{
// Send buffer to MySQL
for (int i = 0; i < arrSendBuffer.Length - 1; i++)
{
if (arrSendBuffer[i] != null)
{
DatabaseController.SendToMySql(arrSendBuffer[i]);
arrSendBuffer[i] = null;
}
}
}
private void tim_10000ms_Tick(object sender, EventArgs e)
{
// Main timer to send JSON files to MySQL
string strSRSJson = "";
string strLotATCJson = "";
bool boolSRSdefault = true;
bool boolLotATCdefault = true;
// Handle SRS
if (con_check_3rd_srs.Checked)
{
try
{
strSRSJson = System.IO.File.ReadAllText(con_txt_3rd_srs.Text);
dynamic raw_lotatc = JsonConvert.DeserializeObject(strSRSJson);
for (int i = 0; i < raw_lotatc.Count; i++)
{ {
con_List_Received.Items.Add(i);
if (raw_lotatc[i].RadioInfo != null)
{
int temp = raw_lotatc[i].RadioInfo.radios.Count - 1;
for (int j = temp; j >= 0; j--)
{
raw_lotatc[i].RadioInfo.radios[j].enc.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].encKey.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].encMode.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].freqMax.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].freqMin.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].modulation.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].freqMode.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].volMode.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].expansion.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].channel.Parent.Remove();
raw_lotatc[i].RadioInfo.radios[j].simul.Parent.Remove();
if (raw_lotatc[i].RadioInfo.radios[j].name == "No Radio")
{
raw_lotatc[i].RadioInfo.radios[j].Remove();
}
}
raw_lotatc[i].ClientChannelId.Parent.Remove();
raw_lotatc[i].RadioInfo.simultaneousTransmission.Parent.Remove();
}
} }
}
Globals.AppUpdateGUI = false;
}
else
{
// Do nothing , control does not require update
}
if (raw_lotatc.Count > 0) // Update status icons at main form - MySQL
if ((DatabaseConnection.DatabaseStatus != Globals.StatusDatabase) || Globals.AppForceIconReload)
{
if (DatabaseConnection.DatabaseStatus)
{
if (Globals.ErrorsDatabase == 0)
{ {
strSRSJson = JsonConvert.SerializeObject(raw_lotatc); con_img_db.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected");
strSRSJson = "{'type':'100','instance':'1','payload':'" + strSRSJson + "'}";
} }
else else
{ {
strSRSJson = "{'type':'100','instance':'1','payload':{'ignore':'false'}}"; // No SRS clients connected con_img_db.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected_error");
} }
boolSRSdefault = false;
PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "SRS data loaded");
} }
catch else
{ {
PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "SRS data ERROR"); con_img_db.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected_error");
} }
Globals.StatusDatabase = DatabaseConnection.DatabaseStatus;
} }
if (boolSRSdefault) // Update status icons at main form - DCS
if ((Globals.StatusConnection != Globals.StatusHistoryConnection) || Globals.AppForceIconReload || Globals.ErrorsGame != Globals.ErrorsHistoryGame)
{ {
strSRSJson = "{'type':'100','instance':'1','payload':{'ignore':'true'}}"; if (Globals.StatusConnection)
{
if (Globals.ErrorsGame == 0)
{
con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected");
}
else
{
con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected_error");
}
}
else
{
con_img_dcs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected_error");
}
Globals.StatusHistoryConnection = Globals.StatusConnection;
Globals.ErrorsHistoryGame = Globals.ErrorsGame;
}
// Update status icons at main form - SRS
if ((ExtSRSStatus != Globals.StatusSRS) || Globals.AppForceIconReload)
{
if (ExtSRSStatus && con_check_3rd_srs.Checked)
{
if (Globals.ErrorsSRS == 0)
{
con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected");
}
else
{
con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected_error");
}
}
else
{
con_img_srs.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected_error");
}
Globals.StatusSRS = ExtSRSStatus;
}
// Update status icons at main form - LotATC
if ((ExtLotATCStatus != Globals.StatusLotATC) || Globals.AppForceIconReload)
{
if (ExtLotATCStatus && con_check_3rd_lotatc.Checked)
{
if (Globals.ErrorsLotATC == 0)
{
con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected");
}
else
{
con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_connected_error");
}
}
else
{
con_img_lotATC.Image = (Image)Properties.Resources.ResourceManager.GetObject("status_disconnected_error");
}
Globals.StatusLotATC = ExtLotATCStatus;
}
Globals.AppForceIconReload = false;
}
private void Tim_MySQL_Tick(object sender, EventArgs e)
{
// Send buffer to MySQL
for (int i = 0; i < DatabaseSendBuffer.Length - 1; i++)
{
if (DatabaseSendBuffer[i] != null)
{
if (DatabaseConnection.SendToMySql(DatabaseSendBuffer[i]) > 0)
{
DatabaseSendBuffer[i] = null; // If packet was send then delete it from send buffer
}
}
}
}
private void tim_3rdparties_Tick(object sender, EventArgs e)
{
// Main timer to check MySQL connection and send JSON files to MySQL
// Send ping to check for possible connection issues
DatabaseConnection.SendToMySql("", true);
if (PerunHelper.CheckVersions()==0)
{
MessageBox.Show("Version mismatch detected - please check log files and update.\n\nPerun will now terminate.", "Perun ERROR!",MessageBoxButtons.OK,MessageBoxIcon.Error);
con_Button_Listen_OFF_Click(null, null);
}
// Take care of 3rd party stuff
string ExtSRSJson = "";
string ExtLotATCJson = "";
bool ExtSRSUseDefault = true;
bool ExtLotATCUseDefault = true;
// Handle SRS
if (Globals.StatusConnection)
{
if (con_check_3rd_srs.Checked)
{
try
{
ExtSRSJson = System.IO.File.ReadAllText(con_txt_3rd_srs.Text);
dynamic raw_lotatc = JsonConvert.DeserializeObject(ExtSRSJson);
for (int i = 0; i < raw_lotatc.Clients.Count; i++)
{
if (raw_lotatc.Clients[i].RadioInfo != null)
{
int temp = raw_lotatc.Clients[i].RadioInfo.radios.Count - 1;
for (int j = temp; j >= 0; j--)
{
raw_lotatc.Clients[i].RadioInfo.radios[j].enc.Parent.Remove();
raw_lotatc.Clients[i].RadioInfo.radios[j].encKey.Parent.Remove();
raw_lotatc.Clients[i].RadioInfo.radios[j].encMode.Parent.Remove();
raw_lotatc.Clients[i].RadioInfo.radios[j].freqMax.Parent.Remove();
raw_lotatc.Clients[i].RadioInfo.radios[j].freqMin.Parent.Remove();
raw_lotatc.Clients[i].RadioInfo.radios[j].modulation.Parent.Remove();
raw_lotatc.Clients[i].RadioInfo.radios[j].freqMode.Parent.Remove();
raw_lotatc.Clients[i].RadioInfo.radios[j].volMode.Parent.Remove();
raw_lotatc.Clients[i].RadioInfo.radios[j].expansion.Parent.Remove();
raw_lotatc.Clients[i].RadioInfo.radios[j].channel.Parent.Remove();
raw_lotatc.Clients[i].RadioInfo.radios[j].simul.Parent.Remove();
if (raw_lotatc.Clients[i].RadioInfo.radios[j].name == "No Radio")
{
raw_lotatc.Clients[i].RadioInfo.radios[j].Remove();
}
}
raw_lotatc.Clients[i].ClientChannelId.Parent.Remove();
raw_lotatc.Clients[i].RadioInfo.simultaneousTransmission.Parent.Remove();
}
}
ExtSRSJson = JsonConvert.SerializeObject(raw_lotatc);
ExtSRSJson = "{'type':'100','instance':'" + Int32.Parse(con_txt_dcs_instance.Text) + "','payload':'" + ExtSRSJson + "'}";
ExtSRSUseDefault = false;
PerunHelper.AddLog(ref Globals.AppLogHistory, "SRS data loaded", 3, 0, "100", true);
ExtSRSStatus = true;
}
catch (Exception exc_srs)
{
PerunHelper.AddLog(ref Globals.AppLogHistory, "SRS data ERROR , error: " + exc_srs.Message, 3, 1, "100");
ExtSRSStatus = false;
Globals.ErrorsSRS++;
}
}
if (ExtSRSUseDefault)
{
ExtSRSJson = "{'type':'100','instance':'" + Int32.Parse(con_txt_dcs_instance.Text) + "','payload':{'ignore':'true'}}";
}
if (ExtSRSStatus)
{
DatabaseConnection.SendToMySql(ExtSRSJson);
}
} }
DatabaseController.SendToMySql(strSRSJson);
// Handle LotATC // Handle LotATC
if (con_check_3rd_lotatc.Checked) if (Globals.StatusConnection)
{ {
try if (con_check_3rd_lotatc.Checked)
{ {
strLotATCJson = System.IO.File.ReadAllText(con_txt_3rd_lotatc.Text); try
dynamic raw_srs = JsonConvert.DeserializeObject(strLotATCJson); {
ExtLotATCJson = System.IO.File.ReadAllText(con_txt_3rd_lotatc.Text);
dynamic raw_srs = JsonConvert.DeserializeObject(ExtLotATCJson);
ExtLotATCJson = "{'type':'101','instance':'" + Int32.Parse(con_txt_dcs_instance.Text) + "','payload':'" + ExtLotATCJson + "'}";
ExtLotATCUseDefault = false;
PerunHelper.AddLog(ref Globals.AppLogHistory, "LotATC data loaded", 3, 0, "101", true);
ExtLotATCStatus = true;
}
catch (Exception exc_lotatc)
{
PerunHelper.AddLog(ref Globals.AppLogHistory, "LotATC data ERROR, error: " + exc_lotatc.Message, 3, 1, "101");
ExtLotATCStatus = false;
Globals.ErrorsLotATC++;
}
strLotATCJson = "{'type':'101','instance':'1','payload':'" + strLotATCJson + "'}";
boolLotATCdefault = false;
PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "LotATC data loaded");
} }
catch if (ExtLotATCUseDefault)
{ {
PerunHelper.LogHistoryAdd(ref Globals.arrLogHistory, "LotATC data ERROR"); ExtLotATCJson = "{'type':'101','instance':'" + Int32.Parse(con_txt_dcs_instance.Text) + "','payload':{'ignore':'true'}}"; // No LotATC controller connected
}
if (ExtLotATCStatus)
{
DatabaseConnection.SendToMySql(ExtLotATCJson);
} }
} }
if (boolLotATCdefault) // Let's do not risk int overload
Globals.ErrorsDatabase = (Globals.ErrorsDatabase > 999) ? 999 : Globals.ErrorsDatabase;
Globals.ErrorsGame = (Globals.ErrorsGame > 999) ? 999 : Globals.ErrorsGame;
Globals.ErrorsSRS = (Globals.ErrorsSRS > 999) ? 999 : Globals.ErrorsSRS;
Globals.ErrorsLotATC = (Globals.ErrorsLotATC > 999) ? 999 : Globals.ErrorsLotATC;
}
private void con_Button_Reset_Flags_Click(object sender, EventArgs e)
{
// Reset error flags
DialogResult dialogResult = MessageBox.Show("Are you sure to reset error flags?", "Question", MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question);
if (dialogResult == DialogResult.Yes)
{ {
strLotATCJson = "{'type':'101','instance':'1','payload':{'ignore':'true'}}"; // No LotATC controller connected // Reset errors counter
Globals.ErrorsDatabase = 0; // MySQL - Error counter
Globals.ErrorsGame = 0; // TCP connection - Error counter
Globals.ErrorsHistoryGame = 0; // TCP connection - historic value of Error counter
Globals.ErrorsSRS = 0; // DCS SRS - error counter
Globals.ErrorsLotATC = 0; // LotATC - error counter
// Force icons reload
Globals.AppForceIconReload = true;
// Add information
PerunHelper.AddLog(ref Globals.AppLogHistory, "Resetted error counter",0,1);
} }
DatabaseController.SendToMySql(strLotATCJson); else if (dialogResult == DialogResult.No)
{
// Do nothing
}
}
private void con_Button_Add_Marker_Click(object sender, EventArgs e)
{
// Added user marker
PerunHelper.AddLog(ref Globals.AppLogHistory, "User Marker",0,1);
} }
} }
} }

View File

@@ -117,7 +117,7 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<metadata name="tim_1000ms.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="tim_GUI.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value> <value>17, 17</value>
</metadata> </metadata>
<metadata name="trayIconMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="trayIconMain.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@@ -413,14 +413,14 @@
<metadata name="openFileDialog_LotATC.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="openFileDialog_LotATC.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>397, 17</value> <value>397, 17</value>
</metadata> </metadata>
<metadata name="tim_10000ms.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="tim_3rdparties.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>563, 19</value> <value>563, 19</value>
</metadata> </metadata>
<metadata name="tim_200ms.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="tim_MySQL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>687, 19</value> <value>687, 19</value>
</metadata> </metadata>
<metadata name="notifyIcon1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>797, 19</value> <value>26</value>
</metadata> </metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 B

View File

@@ -8,32 +8,31 @@
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<RootNamespace>Perun_v1</RootNamespace> <RootNamespace>Perun_v1</RootNamespace>
<AssemblyName>Perun</AssemblyName> <AssemblyName>Perun</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic> <Deterministic>true</Deterministic>
<IsWebBootstrapper>true</IsWebBootstrapper> <IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>ftp://s18.mydevil.net/perun/</PublishUrl> <TargetFrameworkProfile />
<PublishUrl>C:\Users\DCS\Desktop\Perun\</PublishUrl>
<Install>true</Install> <Install>true</Install>
<InstallFrom>Web</InstallFrom> <InstallFrom>Disk</InstallFrom>
<UpdateEnabled>true</UpdateEnabled> <UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode> <UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval> <UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits> <UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically> <UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired> <UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions> <MapFileExtensions>true</MapFileExtensions>
<InstallUrl>http://share.porwolik.com/ftp/perun/</InstallUrl>
<SupportUrl>https://github.com/szporwolik/perun</SupportUrl> <SupportUrl>https://github.com/szporwolik/perun</SupportUrl>
<ErrorReportUrl>https://github.com/szporwolik/perun</ErrorReportUrl> <ErrorReportUrl>https://github.com/szporwolik/perun</ErrorReportUrl>
<TargetCulture>en</TargetCulture> <TargetCulture>en</TargetCulture>
<ProductName>Perun for DCS World</ProductName> <ProductName>Perun for DCS World</ProductName>
<PublisherName>szporwolik</PublisherName> <PublisherName>szporwolik</PublisherName>
<SuiteName>Perun</SuiteName> <SuiteName>Perun</SuiteName>
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>Perun.htm</WebPage> <WebPage>Perun.htm</WebPage>
<ApplicationRevision>2</ApplicationRevision> <ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>0.5.4.%2a</ApplicationVersion> <ApplicationVersion>0.9.3.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust> <UseApplicationTrust>false</UseApplicationTrust>
<CreateDesktopShortcut>true</CreateDesktopShortcut> <CreateDesktopShortcut>true</CreateDesktopShortcut>
<PublishWizardCompleted>true</PublishWizardCompleted> <PublishWizardCompleted>true</PublishWizardCompleted>
@@ -48,6 +47,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<CodeAnalysisRuleSet>SecurityRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
@@ -74,7 +74,7 @@
<GenerateManifests>true</GenerateManifests> <GenerateManifests>true</GenerateManifests>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<SignManifests>true</SignManifests> <SignManifests>false</SignManifests>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<SignAssembly>false</SignAssembly> <SignAssembly>false</SignAssembly>
@@ -87,14 +87,20 @@
<ApplicationManifest>Properties\app.manifest</ApplicationManifest> <ApplicationManifest>Properties\app.manifest</ApplicationManifest>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Google.Protobuf, Version=3.5.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL"> <Reference Include="BouncyCastle.Crypto, Version=1.8.3.0, Culture=neutral, PublicKeyToken=0e99375e54769942">
<HintPath>..\packages\Google.Protobuf.3.5.1\lib\net45\Google.Protobuf.dll</HintPath> <HintPath>..\packages\BouncyCastle.1.8.3.1\lib\BouncyCastle.Crypto.dll</HintPath>
</Reference> </Reference>
<Reference Include="MySql.Data, Version=8.0.15.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL"> <Reference Include="Google.Protobuf, Version=3.6.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.15\lib\net452\MySql.Data.dll</HintPath> <HintPath>..\packages\Google.Protobuf.3.6.1\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="MySql.Data, Version=8.0.17.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.17\lib\net452\MySql.Data.dll</HintPath>
</Reference> </Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="Renci.SshNet, Version=2016.1.0.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL">
<HintPath>..\packages\SSH.NET.2016.1.0\lib\net40\Renci.SshNet.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.ComponentModel" /> <Reference Include="System.ComponentModel" />
@@ -116,39 +122,44 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="01_Classes\UDPController.cs" /> <Compile Include="01_Classes\LogController.cs" />
<Compile Include="01_Classes\TCPController.cs" />
<Compile Include="01_Classes\Globals.cs" /> <Compile Include="01_Classes\Globals.cs" />
<Compile Include="01_Classes\DatabaseController.cs" /> <Compile Include="01_Classes\DatabaseController.cs" />
<Compile Include="01_Classes\PerunHelper.cs" /> <Compile Include="01_Classes\PerunHelper.cs" />
<Compile Include="01_Classes\NativeMethods.cs" />
<Compile Include="02_Forms\form_Main.cs"> <Compile Include="02_Forms\form_Main.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Compile> </Compile>
<Compile Include="02_Forms\form_Main.Designer.cs"> <Compile Include="02_Forms\form_Main.Designer.cs">
<DependentUpon>form_Main.cs</DependentUpon> <DependentUpon>form_Main.cs</DependentUpon>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Compile> </Compile>
<Compile Include="01_Classes\Program.cs" /> <Compile Include="01_Classes\Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="02_Forms\form_Main.resx"> <EmbeddedResource Include="02_Forms\form_Main.resx">
<DependentUpon>form_Main.cs</DependentUpon> <DependentUpon>form_Main.cs</DependentUpon>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx"> <EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator> <Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType> <SubType>Designer</SubType>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource> </EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="00_Config\packages.config" /> <None Include="00_Config\packages.config" />
<None Include="00_Config\Perun_v1_TemporaryKey.pfx" /> <None Include="00_Config\Perun_v1_TemporaryKey.pfx" />
<None Include="app.config" />
<None Include="packages.config" />
<None Include="Properties\app.manifest" /> <None Include="Properties\app.manifest" />
<None Include="Properties\Settings.settings"> <None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator> <Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput> <LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None> </None>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs"> <Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen> <AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon> <DependentUpon>Settings.settings</DependentUpon>
@@ -161,7 +172,7 @@
<ItemGroup> <ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.6.1"> <BootstrapperPackage Include=".NETFramework,Version=v4.6.1">
<Visible>False</Visible> <Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.6.1 %28x86 i x64%29</ProductName> <ProductName>Microsoft .NET Framework 4.6.1 %28x86 and x64%29</ProductName>
<Install>true</Install> <Install>true</Install>
</BootstrapperPackage> </BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1"> <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
@@ -172,6 +183,12 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="03_Resources\perun_logo.ico" /> <Content Include="03_Resources\perun_logo.ico" />
<None Include="03_Resources\perun_logo.png" />
<None Include="Resources\perun_logo.png" />
<None Include="Resources\status-connected-error.png" />
<None Include="Resources\status-disconnected-error.png" />
<None Include="Resources\status-disconnected.png" />
<None Include="Resources\status-connected.png" />
</ItemGroup> </ItemGroup>
<ItemGroup /> <ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

View File

@@ -33,7 +33,7 @@ using System.Runtime.InteropServices;
// Możesz określić wszystkie wartości lub użyć domyślnych numerów kompilacji i poprawki // Możesz określić wszystkie wartości lub użyć domyślnych numerów kompilacji i poprawki
// przy użyciu symbolu „*”, tak jak pokazano poniżej: // przy użyciu symbolu „*”, tak jak pokazano poniżej:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.5.0.0")] [assembly: AssemblyVersion("0.9.3.0")]
[assembly: AssemblyFileVersion("0.5.0.0")] [assembly: AssemblyFileVersion("0.9.3.0")]
[assembly: NeutralResourcesLanguage("en")] [assembly: NeutralResourcesLanguage("en")]

View File

@@ -1,10 +1,10 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// Ten kod został wygenerowany przez narzędzie. // This code was generated by a tool.
// Wersja wykonawcza:4.0.30319.42000 // Runtime Version:4.0.30319.42000
// //
// Zmiany w tym pliku mogą spowodować nieprawidłowe zachowanie i zostaną utracone, jeśli // Changes to this file may cause incorrect behavior and will be lost if
// kod zostanie ponownie wygenerowany. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -13,13 +13,13 @@ namespace Perun_v1.Properties {
/// <summary> /// <summary>
/// Klasa zasobu wymagająca zdefiniowania typu do wyszukiwania zlokalizowanych ciągów itd. /// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary> /// </summary>
// Ta klasa została automatycznie wygenerowana za pomocą klasy StronglyTypedResourceBuilder // This class was auto-generated by the StronglyTypedResourceBuilder
// przez narzędzie, takie jak ResGen lub Visual Studio. // class via a tool like ResGen or Visual Studio.
// Aby dodać lub usunąć składową, edytuj plik ResX, a następnie ponownie uruchom narzędzie ResGen // To add or remove a member, edit your .ResX file then rerun ResGen
// z opcją /str lub ponownie utwórz projekt VS. // with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources { internal class Resources {
@@ -33,7 +33,7 @@ namespace Perun_v1.Properties {
} }
/// <summary> /// <summary>
/// Zwraca buforowane wystąpienie ResourceManager używane przez tę klasę. /// Returns the cached ResourceManager instance used by this class.
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager { internal static global::System.Resources.ResourceManager ResourceManager {
@@ -47,8 +47,8 @@ namespace Perun_v1.Properties {
} }
/// <summary> /// <summary>
/// Przesłania właściwość CurrentUICulture bieżącego wątku dla wszystkich /// Overrides the current thread's CurrentUICulture property for all
/// przypadków przeszukiwania zasobów za pomocą tej klasy zasobów wymagającej zdefiniowania typu. /// resource lookups using this strongly typed resource class.
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture { internal static global::System.Globalization.CultureInfo Culture {
@@ -59,5 +59,55 @@ namespace Perun_v1.Properties {
resourceCulture = value; resourceCulture = value;
} }
} }
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap perun_logo {
get {
object obj = ResourceManager.GetObject("perun_logo", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap status_connected {
get {
object obj = ResourceManager.GetObject("status_connected", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap status_connected_error {
get {
object obj = ResourceManager.GetObject("status_connected_error", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap status_disconnected {
get {
object obj = ResourceManager.GetObject("status_disconnected", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap status_disconnected_error {
get {
object obj = ResourceManager.GetObject("status_disconnected_error", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
} }
} }

View File

@@ -117,4 +117,20 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="perun_logo" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\03_Resources\perun_logo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="status_connected" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\03_Resources\status-connected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="status_connected_error" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\03_Resources\status-connected-error.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="status_disconnected" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\03_Resources\status-disconnected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="status_disconnected_error" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\03_Resources\status-disconnected-error.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root> </root>

View File

@@ -1,10 +1,10 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// Ten kod został wygenerowany przez narzędzie. // This code was generated by a tool.
// Wersja wykonawcza:4.0.30319.42000 // Runtime Version:4.0.30319.42000
// //
// Zmiany w tym pliku mogą spowodować nieprawidłowe zachowanie i zostaną utracone, jeśli // Changes to this file may cause incorrect behavior and will be lost if
// kod zostanie ponownie wygenerowany. // the code is regenerated.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -12,7 +12,7 @@ namespace Perun_v1.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.2.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@@ -130,5 +130,29 @@ namespace Perun_v1.Properties {
this["MYSQL_Port"] = value; this["MYSQL_Port"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("48620")]
public int DCS_Server_Port {
get {
return ((int)(this["DCS_Server_Port"]));
}
set {
this["DCS_Server_Port"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("1")]
public int DCS_Instance {
get {
return ((int)(this["DCS_Instance"]));
}
set {
this["DCS_Instance"] = value;
}
}
} }
} }

View File

@@ -29,5 +29,11 @@
<Setting Name="MYSQL_Port" Type="System.String" Scope="User"> <Setting Name="MYSQL_Port" Type="System.String" Scope="User">
<Value Profile="(Default)">3306</Value> <Value Profile="(Default)">3306</Value>
</Setting> </Setting>
<Setting Name="DCS_Server_Port" Type="System.Int32" Scope="User">
<Value Profile="(Default)">48620</Value>
</Setting>
<Setting Name="DCS_Instance" Type="System.Int32" Scope="User">
<Value Profile="(Default)">1</Value>
</Setting>
</Settings> </Settings>
</SettingsFile> </SettingsFile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="Perun_v1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
</sectionGroup>
</configSections>
<userSettings>
<Perun_v1.Properties.Settings>
<setting name="MYSQL_Server" serializeAs="String">
<value />
</setting>
<setting name="MYSQL_User" serializeAs="String">
<value />
</setting>
<setting name="MYSQL_Password" serializeAs="String">
<value />
</setting>
<setting name="MYSQL_DB" serializeAs="String">
<value />
</setting>
<setting name="OTHER_LOTATC_FILE" serializeAs="String">
<value />
</setting>
<setting name="OTHER_SRS_FILE" serializeAs="String">
<value />
</setting>
<setting name="OTHER_LOTATC_USE" serializeAs="String">
<value>False</value>
</setting>
<setting name="OTHER_SRS_USE" serializeAs="String">
<value>False</value>
</setting>
<setting name="MYSQL_Port" serializeAs="String">
<value>3306</value>
</setting>
<setting name="DCS_Server_Port" serializeAs="String">
<value>48620</value>
</setting>
<setting name="DCS_Instance" serializeAs="String">
<value>1</value>
</setting>
</Perun_v1.Properties.Settings>
</userSettings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="BouncyCastle" version="1.8.3.1" targetFramework="net48" />
<package id="Google.Protobuf" version="3.6.1" targetFramework="net48" />
<package id="MySql.Data" version="8.0.17" targetFramework="net48" />
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net48" />
<package id="SSH.NET" version="2016.1.0" targetFramework="net48" />
</packages>

View File

@@ -3,23 +3,21 @@ SET AUTOCOMMIT = 0;
START TRANSACTION; START TRANSACTION;
SET time_zone = "+00:00"; SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */; /*!40101 SET NAMES utf8mb4 */;
--
-- Baza danych: `m1081_perun`
--
CREATE DATABASE IF NOT EXISTS `m1081_perun` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `m1081_perun`;
-- -------------------------------------------------------- DROP TABLE IF EXISTS `pe_Config`;
CREATE TABLE IF NOT EXISTS `pe_Config` (
`pe_Config_id` int(11) NOT NULL,
`pe_Config_payload` varchar(255) DEFAULT NULL,
PRIMARY KEY (`pe_Config_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- INSERT INTO `pe_Config` (`pe_Config_id`, `pe_Config_payload`) VALUES
-- Struktura tabeli dla tabeli `pe_DataMissionHashes` (1, 'v0.9.3');
--
DROP TABLE IF EXISTS `pe_DataMissionHashes`; DROP TABLE IF EXISTS `pe_DataMissionHashes`;
CREATE TABLE IF NOT EXISTS `pe_DataMissionHashes` ( CREATE TABLE IF NOT EXISTS `pe_DataMissionHashes` (
@@ -30,46 +28,31 @@ CREATE TABLE IF NOT EXISTS `pe_DataMissionHashes` (
PRIMARY KEY (`pe_DataMissionHashes_id`), PRIMARY KEY (`pe_DataMissionHashes_id`),
UNIQUE KEY `UNIQUE_hash` (`pe_DataMissionHashes_hash`), UNIQUE KEY `UNIQUE_hash` (`pe_DataMissionHashes_hash`),
KEY `pe_DataMissionHashes_instance` (`pe_DataMissionHashes_instance`) KEY `pe_DataMissionHashes_instance` (`pe_DataMissionHashes_instance`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_DataPlayers`
--
DROP TABLE IF EXISTS `pe_DataPlayers`; DROP TABLE IF EXISTS `pe_DataPlayers`;
CREATE TABLE IF NOT EXISTS `pe_DataPlayers` ( CREATE TABLE IF NOT EXISTS `pe_DataPlayers` (
`pe_DataPlayers_id` bigint(20) NOT NULL AUTO_INCREMENT, `pe_DataPlayers_id` bigint(20) NOT NULL AUTO_INCREMENT,
`pe_DataPlayers_ucid` varchar(150) NOT NULL, `pe_DataPlayers_ucid` varchar(150) NOT NULL,
`pe_DataPlayers_lastname` varchar(150) NOT NULL, `pe_DataPlayers_lastname` varchar(150) DEFAULT NULL,
`pe_DataPlayers_lastip` varchar(100) NOT NULL, `pe_DataPlayers_lastip` varchar(100) DEFAULT NULL,
`pe_DataPlayers_updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `pe_DataPlayers_updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`pe_DataPlayers_id`), PRIMARY KEY (`pe_DataPlayers_id`),
UNIQUE KEY `UNIQUE_UCID` (`pe_DataPlayers_ucid`) UNIQUE KEY `UNIQUE_UCID` (`pe_DataPlayers_ucid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_DataRaw`
--
DROP TABLE IF EXISTS `pe_DataRaw`; DROP TABLE IF EXISTS `pe_DataRaw`;
CREATE TABLE IF NOT EXISTS `pe_DataRaw` ( CREATE TABLE IF NOT EXISTS `pe_DataRaw` (
`pe_dataraw_type` tinyint(4) NOT NULL, `pe_dataraw_type` tinyint(4) NOT NULL,
`pe_dataraw_instance` smallint(5) UNSIGNED NOT NULL, `pe_dataraw_instance` smallint(5) UNSIGNED NOT NULL,
`pe_dataraw_payload` text NOT NULL, `pe_dataraw_payload` text,
`pe_dataraw_updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `pe_dataraw_updated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`pe_dataraw_type`,`pe_dataraw_instance`) PRIMARY KEY (`pe_dataraw_type`,`pe_dataraw_instance`),
KEY `pe_dataraw_type_pe_dataraw_instance` (`pe_dataraw_type`,`pe_dataraw_instance`),
KEY `pe_dataraw_updated` (`pe_dataraw_updated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_DataTypes`
--
DROP TABLE IF EXISTS `pe_DataTypes`; DROP TABLE IF EXISTS `pe_DataTypes`;
CREATE TABLE IF NOT EXISTS `pe_DataTypes` ( CREATE TABLE IF NOT EXISTS `pe_DataTypes` (
`pe_DataTypes_id` int(11) NOT NULL AUTO_INCREMENT, `pe_DataTypes_id` int(11) NOT NULL AUTO_INCREMENT,
@@ -79,12 +62,6 @@ CREATE TABLE IF NOT EXISTS `pe_DataTypes` (
UNIQUE KEY `UNIQUE_TYPE_NAME` (`pe_DataTypes_name`) UNIQUE KEY `UNIQUE_TYPE_NAME` (`pe_DataTypes_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_LogChat`
--
DROP TABLE IF EXISTS `pe_LogChat`; DROP TABLE IF EXISTS `pe_LogChat`;
CREATE TABLE IF NOT EXISTS `pe_LogChat` ( CREATE TABLE IF NOT EXISTS `pe_LogChat` (
`pe_LogChat_id` bigint(20) NOT NULL AUTO_INCREMENT, `pe_LogChat_id` bigint(20) NOT NULL AUTO_INCREMENT,
@@ -95,15 +72,11 @@ CREATE TABLE IF NOT EXISTS `pe_LogChat` (
`pe_LogChat_all` varchar(10) NOT NULL, `pe_LogChat_all` varchar(10) NOT NULL,
PRIMARY KEY (`pe_LogChat_id`), PRIMARY KEY (`pe_LogChat_id`),
KEY `pe_LogChat_missionhash_id` (`pe_LogChat_missionhash_id`), KEY `pe_LogChat_missionhash_id` (`pe_LogChat_missionhash_id`),
KEY `pe_LogChat_playerid` (`pe_LogChat_playerid`) KEY `pe_LogChat_playerid` (`pe_LogChat_playerid`),
KEY `pe_LogChat_datetime` (`pe_LogChat_datetime`),
KEY `pe_LogChat_all` (`pe_LogChat_all`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_LogEvent`
--
DROP TABLE IF EXISTS `pe_LogEvent`; DROP TABLE IF EXISTS `pe_LogEvent`;
CREATE TABLE IF NOT EXISTS `pe_LogEvent` ( CREATE TABLE IF NOT EXISTS `pe_LogEvent` (
`pe_LogEvent_id` bigint(20) NOT NULL AUTO_INCREMENT, `pe_LogEvent_id` bigint(20) NOT NULL AUTO_INCREMENT,
@@ -113,16 +86,13 @@ CREATE TABLE IF NOT EXISTS `pe_LogEvent` (
`pe_LogEvent_content` text NOT NULL, `pe_LogEvent_content` text NOT NULL,
`pe_LogEvent_arg1` varchar(150) DEFAULT NULL, `pe_LogEvent_arg1` varchar(150) DEFAULT NULL,
`pe_LogEvent_arg2` varchar(150) DEFAULT NULL, `pe_LogEvent_arg2` varchar(150) DEFAULT NULL,
`pe_LogEvent_argPlayers` varchar(150) DEFAULT NULL,
PRIMARY KEY (`pe_LogEvent_id`), PRIMARY KEY (`pe_LogEvent_id`),
KEY `pe_LogEvent_missionhash_id` (`pe_LogEvent_missionhash_id`) KEY `pe_LogEvent_missionhash_id` (`pe_LogEvent_missionhash_id`),
KEY `pe_LogEvent_datetime` (`pe_LogEvent_datetime`),
KEY `pe_LogEvent_type_2` (`pe_LogEvent_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_LogLogins`
--
DROP TABLE IF EXISTS `pe_LogLogins`; DROP TABLE IF EXISTS `pe_LogLogins`;
CREATE TABLE IF NOT EXISTS `pe_LogLogins` ( CREATE TABLE IF NOT EXISTS `pe_LogLogins` (
`pe_LogLogins_id` bigint(20) NOT NULL AUTO_INCREMENT, `pe_LogLogins_id` bigint(20) NOT NULL AUTO_INCREMENT,
@@ -132,15 +102,11 @@ CREATE TABLE IF NOT EXISTS `pe_LogLogins` (
`pe_LogLogins_name` varchar(150) NOT NULL, `pe_LogLogins_name` varchar(150) NOT NULL,
`pe_LogLogins_ip` varchar(100) NOT NULL, `pe_LogLogins_ip` varchar(100) NOT NULL,
PRIMARY KEY (`pe_LogLogins_id`), PRIMARY KEY (`pe_LogLogins_id`),
KEY `pe_LogLogins_playerid` (`pe_LogLogins_playerid`) KEY `pe_LogLogins_playerid` (`pe_LogLogins_playerid`),
KEY `pe_LogLogins_datetime` (`pe_LogLogins_datetime`),
KEY `pe_LogLogins_instance` (`pe_LogLogins_instance`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Struktura tabeli dla tabeli `pe_LogStats`
--
DROP TABLE IF EXISTS `pe_LogStats`; DROP TABLE IF EXISTS `pe_LogStats`;
CREATE TABLE IF NOT EXISTS `pe_LogStats` ( CREATE TABLE IF NOT EXISTS `pe_LogStats` (
`pe_LogStats_id` bigint(20) NOT NULL AUTO_INCREMENT, `pe_LogStats_id` bigint(20) NOT NULL AUTO_INCREMENT,
@@ -148,7 +114,8 @@ CREATE TABLE IF NOT EXISTS `pe_LogStats` (
`pe_LogStats_missionhash_id` bigint(20) DEFAULT NULL, `pe_LogStats_missionhash_id` bigint(20) DEFAULT NULL,
`pe_LogStats_playerid` bigint(20) DEFAULT NULL, `pe_LogStats_playerid` bigint(20) DEFAULT NULL,
`pe_LogStats_typeid` int(11) DEFAULT NULL, `pe_LogStats_typeid` int(11) DEFAULT NULL,
`ps_kills` int(11) UNSIGNED NOT NULL DEFAULT '0', `pe_LogStats_masterslot` int(11) DEFAULT NULL,
`pe_LogStats_seat` int(10) DEFAULT NULL,
`ps_pvp` int(11) UNSIGNED NOT NULL DEFAULT '0', `ps_pvp` int(11) UNSIGNED NOT NULL DEFAULT '0',
`ps_deaths` int(11) UNSIGNED NOT NULL DEFAULT '0', `ps_deaths` int(11) UNSIGNED NOT NULL DEFAULT '0',
`ps_ejections` int(11) UNSIGNED NOT NULL DEFAULT '0', `ps_ejections` int(11) UNSIGNED NOT NULL DEFAULT '0',
@@ -171,9 +138,48 @@ CREATE TABLE IF NOT EXISTS `pe_LogStats` (
`ps_farp_landings` int(11) UNSIGNED NOT NULL DEFAULT '0', `ps_farp_landings` int(11) UNSIGNED NOT NULL DEFAULT '0',
`ps_other_landings` int(10) UNSIGNED NOT NULL DEFAULT '0', `ps_other_landings` int(10) UNSIGNED NOT NULL DEFAULT '0',
`ps_other_takeoffs` int(10) UNSIGNED NOT NULL DEFAULT '0', `ps_other_takeoffs` int(10) UNSIGNED NOT NULL DEFAULT '0',
`ps_time` int(10) UNSIGNED NOT NULL DEFAULT '0',
`pe_LogStats_mstatus` enum('?','RTB','MIA','KIA') DEFAULT NULL,
PRIMARY KEY (`pe_LogStats_id`), PRIMARY KEY (`pe_LogStats_id`),
UNIQUE KEY `UNIQUE_STATS_PER_MISSION_AND_UCID_AND_TYPE` (`pe_LogStats_playerid`,`pe_LogStats_missionhash_id`,`pe_LogStats_typeid`) USING BTREE UNIQUE KEY `UNIQUE_STATS_PER_MISSION_AND_UCID_AND_TYPE` (`pe_LogStats_playerid`,`pe_LogStats_missionhash_id`,`pe_LogStats_typeid`) USING BTREE,
KEY `pe_LogStats_missionhash_id` (`pe_LogStats_missionhash_id`),
KEY `pe_LogStats_playerid` (`pe_LogStats_playerid`),
KEY `pe_LogStats_typeid` (`pe_LogStats_typeid`),
KEY `pe_LogStats_masterslot` (`pe_LogStats_masterslot`),
KEY `pe_LogStats_mstatus` (`pe_LogStats_mstatus`),
KEY `pe_LogStats_seat` (`pe_LogStats_seat`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TRIGGER IF EXISTS `pe_LogStats_UPDATE`;
DELIMITER $$
CREATE TRIGGER `pe_LogStats_UPDATE` BEFORE UPDATE ON `pe_LogStats` FOR EACH ROW BEGIN
IF NEW.ps_ejections > 0 THEN
SET NEW.pe_LogStats_mstatus = "MIA";
ELSEIF NEW.ps_deaths > 0 THEN
SET NEW.pe_LogStats_mstatus = "KIA";
ELSEIF (NEW.ps_airfield_landings + NEW.ps_farp_landings + NEW.ps_other_landings + NEW.ps_ship_landings) >= (NEW.ps_airfield_takeoffs + NEW.ps_farp_takeoffs + NEW.ps_other_takeoffs + NEW.ps_ship_takeoffs) THEN
IF (NEW.ps_airfield_takeoffs + NEW.ps_farp_takeoffs + NEW.ps_other_takeoffs + NEW.ps_ship_takeoffs) > 0 or (NEW.ps_airfield_landings + NEW.ps_farp_landings + NEW.ps_other_landings + NEW.ps_ship_landings) > 0 THEN
SET NEW.pe_LogStats_mstatus = "RTB";
ELSE
SET NEW.pe_LogStats_mstatus = "?";
END IF;
ELSEIF (NEW.ps_airfield_takeoffs + NEW.ps_farp_takeoffs + NEW.ps_other_takeoffs + NEW.ps_ship_takeoffs) > (NEW.ps_airfield_landings + NEW.ps_farp_landings + NEW.ps_other_landings + NEW.ps_ship_landings) and NEW.ps_ejections=0 and NEW.ps_deaths=0 THEN
SET NEW.pe_LogStats_mstatus = "MIA";
ELSE
SET NEW.pe_LogStats_mstatus = "?";
END IF;
END
$$
DELIMITER ;
ALTER TABLE `pe_DataMissionHashes` ADD FULLTEXT KEY `pe_DataMissionHashes_hash` (`pe_DataMissionHashes_hash`);
ALTER TABLE `pe_DataPlayers` ADD FULLTEXT KEY `pe_DataPlayers_ucid` (`pe_DataPlayers_ucid`);
ALTER TABLE `pe_DataTypes` ADD FULLTEXT KEY `pe_DataTypes_name` (`pe_DataTypes_name`);
ALTER TABLE `pe_LogChat` ADD FULLTEXT KEY `pe_LogChat_msg` (`pe_LogChat_msg`);
COMMIT; COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

120
README.md
View File

@@ -1,87 +1,133 @@
![Discord](https://img.shields.io/discord/641759751780302866)
![alt text](https://img.shields.io/github/license/szporwolik/perun.svg "MIT") ![alt text](https://img.shields.io/github/license/szporwolik/perun.svg "MIT")
![alt text](https://img.shields.io/github/release-pre/szporwolik/perun.svg "Latest release") ![alt text](https://img.shields.io/github/release-pre/szporwolik/perun.svg "Latest release")
![alt text](https://img.shields.io/github/release-date-pre/szporwolik/perun.svg "Latest release date") ![alt text](https://img.shields.io/github/release-date-pre/szporwolik/perun.svg "Latest release date")
![Perun logo](https://i.imgur.com/JkeHYjJ.png)
# Perun for DCS World # Perun for DCS World
Included lua script extracts data from DCS World multiplayer server and sends information to TCP port for further processing.
This toolset extracts data from DCS World server and sends information to the local Json file and UDP port for further processing. Provided windows app puts received TCP packets to MySQL database; additionaly Perun windows application can be used to merge LotATC and DCS SRS data in one database making Perun for DCS World wannabe ultimate integration tool for the server admins.
Provided windows app puts received UDP packets to MySQL database. Additionaly Perun windows application can be used to merge LotATC and DCS SRS data in one database making Perun for DCS World wannabe ultimate integration tool for the server admins. However, this software is intended to be used by experienced users - the output is MySQL data; you will need to process/display it yourself.
However, this software is intended to be used by experienced users - the output is Json data and MySQL; you will need to process/display it yourself. ![Perun in action](https://i.imgur.com/JIlLENa.png)
![Data flow](https://i.imgur.com/JbNu77l.png)
![Perun in action](https://i.imgur.com/ougQMPq.png) Discord server: https://discord.gg/MTahREx
![Data flow](https://i.imgur.com/sHDQoLM.png)
### Prerequisites
## Prerequisites
Core: Core:
* For JSON Export: * MySQL database with read/write access running at min. 5.7 server (tested with v5.7.21; native JSON support is required)
* DCS World stable or DCS World beta * .NET Framework 4.8.0
* **(Optional)** For MySQL Export:
* MySQL server with read/write access (tested with v5.7.21)
* .NET Framework 4.6.1
3rd party applications support: 3rd party applications support:
* for [DCS SRS](https://github.com/ciribob/DCS-SimpleRadioStandalone/releases) integration location of the clients-list.json file will be required (by default: SRS Server folder), "Auto Export List" option has to be enabled - see [SRS documentation](https://github.com/ciribob/DCS-SimpleRadioStandalone/wiki) * for [DCS SRS](https://github.com/ciribob/DCS-SimpleRadioStandalone/releases) integration location of the clients-list.json file will be required (by default: SRS Server folder), "Auto Export List" option has to be enabled - see [SRS documentation](https://github.com/ciribob/DCS-SimpleRadioStandalone/wiki)
* for [LotATC](https://www.lotatc.com/) you will need location of stats.json file and proper LotATC configuration with JSON data export enabled - see [LotATC documentation](https://www.lotatc.com/documentation/server_configuration.html) * for [LotATC](https://www.lotatc.com/) you will need location of stats.json file and proper LotATC configuration with JSON data export enabled - see [LotATC documentation](https://www.lotatc.com/documentation/server_configuration.html)
### Installing ## Installing
* Download latest [release](https://github.com/szporwolik/perun/releases)
* Download latest [release](https://github.com/szporwolik/perun/releases), **optionaly** together with windows binary file for MySQL export - [DOWNLOAD](http://share.porwolik.com/ftp/perun/Perun.htm)
* Copy contents of [01_DCS](https://github.com/szporwolik/perun/tree/master/01_DCS) to your \Scripts folder (located inside DCS folder in your Saved Games) * Copy contents of [01_DCS](https://github.com/szporwolik/perun/tree/master/01_DCS) to your \Scripts folder (located inside DCS folder in your Saved Games)
* **optionaly** Create MySQL server using SQL script located in [03_MySQL](https://github.com/szporwolik/perun/tree/master/03_MySQL) * Create MySQL database using SQL script located in [03_MySQL](https://github.com/szporwolik/perun/tree/master/03_MySQL); note that you need just a one database per DCS server machine - multiple instances pushing data to the one database are supported
* **optionaly** Run the Win32 application
* set MySQL connection data
* point LotATC json file location
* point DCS SRS json file location
* click connect and leave the app running in the background
* Start DCS World and host multiplayer session
* by default the JSON is written into Scripts\Json folder located in your Saved Games DCS folder tree
* by default the UDP port 48620 is in use as target port
* Data shall be filling your MySQL database
## Data packets ## Running
* Start DCS World and host multiplayer session
* by default the TCP port 48620 is in use as target port - ensure that port and instance ID in the options sections of the Lua file matches data
* run the Win32 application
* set MySQL connection data
* **optionaly** point LotATC json file location
* **optionaly** point DCS SRS json file location
* click connect and leave the app running in the background
* **data shall now be filling your MySQL database**
### Windows APP - command line arguments (for expert users)
Windows app supports command line arguments, what may be handy in case of multiple instance of DCS servers running at the same machine.
The following arguments are accepted (keep the order!):
* server port (shall be the same as in the lua file!)
* instance ID (shall be the same as in the lua file!)
* path to SRS client-list.json
* path to LotATC stats.json
Example for windows shortcut:
```
C:\Perun_v1\Perun.exe 48621 1 "G:\DCS SRS\clients-list.json" "C:\Users\DCS\Saved Games\DCS\Mods\tech\LotAtc\stats.json"
```
## Displaying data
Data displaying and handling is not in the current scope of this project. Since the end of 2018 the Perun data displaying has been hardcoded at forum.gildia.org , website for the Polish DCS community; examples:
![Who is online](https://i.imgur.com/5lVwsJw.png)
![Mission statistics](https://i.imgur.com/uiRSa9e.png)
Due to resource limitations, "Perun for DCS World" will focus on pulling the data from DCS (and external modules) and pushing it to MySQL server, but if anyone would like to develop open sourced PHP applets for data/statistics displaying we're willing to cooperate and support such projects. Unfortunetly it's not possible to share the hardcoded code from forum.gildia.org.
## Troubleshooting - FAQ
- [I keep getting 1305 MySQL error](#i-keep-getting-1305-mysql-error)
- [Carrier landing are not tracked correctly](#carrier-landing-are-not-tracked-correctly)
### I keep getting 1305 MySQL error
That probably means that your database does not support JSON functions, you shall upgrade your MySQL server to at lease 5.7 version.
### I keep getting 1364 MySQL error
Make sure that STRICT_TRANS_TABLES is disabled at your MySQL server, see: https://stackoverflow.com/questions/37964325/how-to-find-and-disable-mysql-strict-mode
### Carrier landing are not tracked correctly
DCS API does not track carrier or FARP operations natively, so there is a trick to achive that. At this point of time to detect FARP operations, the FARPs shall have "FARP" string in the group name (set in mission editor). For carrier operations the string "SHIP" is required within group name.
# API documentation (for expert users)
## MySQL database structure
* table: pe_DataMissionHashes - holds mission hashes, unique hashes created per each mission start at server
* table: pe_DataPlayers - holds players UCIDs together with last login information
* table: pe_DataRaw - holds raw data received from perun windows app, containing debug/version information together with DCS SRS and LotATC data
* table: pe_DataTypes - names of all model depende class names detected in DCS
* table: pe_LogChat - holds chat history
* table: pe_LogEvent - holds event history
* table: pe_LogLogins - holds login to server event history
* table: pe_LogStats - holds static information
## Data packets - send from lua to TCP port
* ```ID: 1```, contains version/diagnostic information * ```ID: 1```, contains version/diagnostic information
* perun version - for server administration usage
* player count - actual number of connected players
* ```ID: 2```, contains status data in the following sections * ```ID: 2```, contains status data in the following sections
* mission - minimal information about mission * mission name - name of the mission file
* model time - simulation time
* real time - real time
* pause - information if server is paused
* multiplayer - information if this is multiplayer game (always true for dedicated server usage)
* theather - information about area of operation
* weather - basic weather information
* players - connected players * players - connected players
* ```ID: 3```, available slots list and coalitions * ```ID: 3```, available slots list and coalitions
* coalitions - available coalitions * coalitions - available coalitions
* slots - available slots * slots - available slots
* ```ID: 4```, stores mission data **WIP: not yet implemented** * ```ID: 4```, stores mission data ; idea is to have whole DCS.getCurrentMission() result - currenlty commented out due to performance issues
* ```ID: 50```, chat event * ```ID: 50```, chat event
* ```ID: 51```, game event * ```ID: 51```, game event
* ```ID: 52```, player stats **WIP: not yet implemented** * ```ID: 52```, player stats ; note that as DSC native stats are not reliable, seperate stats couting methods are used
* ```ID: 53```, player login to DCS server * ```ID: 53```, player login to DCS server
* ```ID: 100```, DCS SRS's client-list.json * ```ID: 100```, DCS SRS's client-list.json
* ```ID: 101```, LotATC's stats.json * ```ID: 101```, LotATC's stats.json
# Project information
## Built With ## Built With
* [VisualStudio 2017 Community](https://visualstudio.microsoft.com/vs/community/) * [VisualStudio 2017 Community](https://visualstudio.microsoft.com/vs/community/)
* [Notepad++](https://notepad-plus-plus.org/) * [Notepad++](https://notepad-plus-plus.org/)
* [TortoiseGit](https://tortoisegit.org/)
## Contributing ## Contributing
Please contact me if you'd like to contribute. Short rule is that all pull request shall come to "dev" branch, pull requests to "master" will be deleted.
Please contact me if you'd like to contribute.
## Versioning ## Versioning
We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/szporwolik/perun/tags). We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/szporwolik/perun/tags).
## Authors ## Authors
* **Szymon Porwolik** - *Initial work* - [szporwolik](https://github.com/szporwolik) * **Szymon Porwolik** - *Initial work* - [szporwolik](https://github.com/szporwolik)
See also the list of [contributors](https://github.com/szporwolik/perun/contributors) who participated in this project. See also the list of [contributors](https://github.com/szporwolik/perun/contributors) who participated in this project.
## License ## License
This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details
## Acknowledgments ## Acknowledgments
![Gildia.org Logo](https://images.weserv.nl/?url=https://i.imgur.com/nFHxQMy.png&w=140&il)
* Thanks to [Gildia DCS](https://forum.gildia.org) Polish community of DCS World pilots. Thanks to [Gildia DCS](https://forum.gildia.org) Polish community of DCS World pilots.