First working version

This commit is contained in:
Szymon Porwolik
2019-02-23 17:47:38 +01:00
parent a2da2e39fc
commit 02eebc5f1e
10 changed files with 283 additions and 75 deletions

View File

@@ -7,16 +7,19 @@
-- ########### SETTINGS ########### -- ########### SETTINGS ###########
Perun.Refresh = 15 -- base refresh rate in secounds (values lower than 60 may affect performance!) Perun.Refresh = 15 -- base refresh rate in secounds (values lower than 60 may affect performance!)
Perun.JsonLocation = "Scripts\\Json\\perun_export.json" -- relatve do user's SaveGames DCS folder Perun.JsonLocation = "Scripts\\Json\\perun_export.json" -- relatve do user's SaveGames DCS folder
Perun.UDPTargetPort = 48620 -- UDP port to send data to Perun.UDPTargetPort = 48620 -- UDP port to send data to
Perun.MOTD_L1 = "Witamy na serwerze Gildia.org" -- Message send to players connecting the server - Line 1
Perun.MOTD_L2 = "Wymagamy obecno<6E>ci na 255Mhz (DCS SRS)" -- Message send to players connecting the server - Line 2
Perun.MOTD_L3 = "Udanej zabawy" -- Message send to players connecting the server - Line 3
-- ########### END OF SETTINGS ########### -- ########### END OF SETTINGS ###########
-- Variable init -- Variable init
Perun.Version = "v0.1.1" Perun.Version = "v0.2.1"
Perun.StatusData = {} Perun.StatusData = {}
Perun.MissionData = {} Perun.SlotsData = {}
Perun.VersionData = {} Perun.VersionData = {}
Perun.lastSent =0 Perun.lastSent =0
Perun.JsonLocation = lfs.writedir() .. Perun.JsonLocation Perun.JsonLocation = lfs.writedir() .. Perun.JsonLocation
@@ -25,7 +28,6 @@
Perun.UDP:settimeout(0) Perun.UDP:settimeout(0)
Perun.UDP:setsockname("*", 48621) Perun.UDP:setsockname("*", 48621)
Perun.UDP:setpeername("127.0.0.1",Perun.UDPTargetPort) Perun.UDP:setpeername("127.0.0.1",Perun.UDPTargetPort)
Perun.UDP:send("{'type':999,'payload':'Perun is onlne!'}") -- send welcome message
-- Function definition -- Function definition
Perun.AddLog = function(text) Perun.AddLog = function(text)
@@ -38,7 +40,7 @@
TempData={} TempData={}
TempData["1"]=Perun.VersionData TempData["1"]=Perun.VersionData
TempData["2"]=Perun.StatusData TempData["2"]=Perun.StatusData
TempData["3"]=Perun.MissionData TempData["3"]=Perun.SlotsData
io.open(Perun.JsonLocation,"w"):close() io.open(Perun.JsonLocation,"w"):close()
perun_export = io.open(Perun.JsonLocation, "w") perun_export = io.open(Perun.JsonLocation, "w")
@@ -79,7 +81,6 @@
-- 1 - Mission -- 1 - Mission
temp={} temp={}
temp['name']=DCS.getMissionName() temp['name']=DCS.getMissionName()
temp['filename']=DCS.getMissionFilename()
temp['modeltime']=DCS.getModelTime() temp['modeltime']=DCS.getModelTime()
temp['realtime']=DCS.getRealTime() temp['realtime']=DCS.getRealTime()
temp['pause']=DCS.getPause() temp['pause']=DCS.getPause()
@@ -101,22 +102,36 @@
-- Main function for mission information updates -- Main function for mission information updates
-- Update Mission data -- Update Mission data
Perun.MissionData['name']=DCS.getMissionName() Perun.SlotsData['coalitions']=DCS.getAvailableCoalitions()
Perun.MissionData['description']=DCS.getMissionDescription() Perun.SlotsData['slots']={}
Perun.MissionData['filename']=DCS.getMissionFilename()
Perun.MissionData['modeltime']=DCS.getModelTime()
Perun.MissionData['realtime']=DCS.getRealTime()
Perun.MissionData['data']=DCS.getCurrentMission()
Perun.MissionData['coalitions']=DCS.getAvailableCoalitions()
Perun.MissionData['slots']={}
for j, i in pairs(Perun.MissionData['coalitions']) do for j, i in pairs(Perun.SlotsData['coalitions']) do
Perun.MissionData['slots'][j]=DCS.getAvailableSlots(j) Perun.SlotsData['slots'][j]=DCS.getAvailableSlots(j)
end end
-- Send -- Send
Perun.Send(3,Perun.MissionData) Perun.Send(3,Perun.SlotsData)
end
Perun.LogChat = function(playerID,msg,all)
-- Log chat messages
data={}
data['player']= net.get_player_info(playerID, "name")
data['msg']=msg
data['all']=all
Perun.Send(50,data)
end
Perun.LogEvent = function(log_type,log_content)
-- Log chat messages
data={}
data['log_type']= log_type
data['log_content']=log_content
Perun.Send(51,data)
end end
--- Event callbacks --- Event callbacks
Perun.onSimulationFrame = function() Perun.onSimulationFrame = function()
@@ -137,6 +152,74 @@
Perun.UpdateMission() Perun.UpdateMission()
Perun.UpdateJson() Perun.UpdateJson()
end end
Perun.onPlayerStart = function (id)
net.send_chat(Perun.MOTD_L1, id);
net.send_chat(Perun.MOTD_L2, id);
net.send_chat(Perun.MOTD_L3, id);
end
Perun.onPlayerTrySendChat = function (playerID, msg, all)
Perun.LogChat(playerID,msg,all)
return msg
end
Perun.onGameEvent = function (eventName,arg1,arg2,arg3,arg4)
if eventName == "friendly_fire" then
--"friendly_fire", playerID, weaponName, victimPlayerID
Perun.LogEvent(eventName,net.get_player_info(arg1, "name").." killed " .. net.get_player_info(arg3, "name") .. " using " .. arg2);
elseif eventName == "mission_end" then
--"mission_end", winner, msg
Perun.LogEvent(eventName,"Mission end, winner " .. arg1 .. " message: " .. arg2);
elseif eventName == "kill" then
--"kill", killerPlayerID, killerUnitType, killerSide, victimPlayerID, victimUnitType, victimSide, weaponName
Perun.LogEvent(eventName,net.get_player_info(arg1, "name").. " in " .. arg3 .. " " .. arg2 .. " killed " .. net.get_player_info(arg4, "name") .. " in " .. arg6 .. " " .. arg5 .. " using " .. arg7);
elseif eventName == "self_kill" then
--"self_kill", playerID
Perun.LogEvent(eventName,net.get_player_info(arg1, "name") .. " killed himself");
elseif eventName == "change_slot" then
--"change_slot", playerID, slotID, prevSide
Perun.LogEvent(eventName,net.get_player_info(arg1, "name") .. " changed slot to " .. arg2);
elseif eventName == "connect" then
--"connect", playerID, name
Perun.LogEvent(eventName,net.get_player_info(arg1, "name") .. " connected");
elseif eventName == "disconnect" then
--"disconnect", playerID, name, playerSide, reason_code
Perun.LogEvent(eventName,net.get_player_info(arg1, "name") .. " disconnected; reason: " .. arg4);
elseif eventName == "crash" then
--"crash", playerID, unit_missionID
Perun.LogEvent(eventName,net.get_player_info(arg1, "name") .. " crashed");
elseif eventName == "eject" then
--"eject", playerID, unit_missionID
Perun.LogEvent(eventName,net.get_player_info(arg1, "name") .. " ejected");
elseif eventName == "takeoff" then
--"takeoff", playerID, unit_missionID, airdromeName
Perun.LogEvent(eventName,net.get_player_info(arg1, "name") .. " took off from " .. arg3);
elseif eventName == "landing" then
--"landing", playerID, unit_missionID, airdromeName
Perun.LogEvent(eventName,net.get_player_info(arg1, "name") .. " landed at " .. arg3);
elseif eventName == "pilot_death" then
--"pilot_death", playerID, unit_missionID
Perun.LogEvent(eventName,net.get_player_info(arg1, "name") .. "died");
else
Perun.LogEvent(eventName,"Unknown event type");
end
end
-- Finalize and set callbacks -- Finalize and set callbacks
DCS.setUserCallbacks(Perun) DCS.setUserCallbacks(Perun)

View File

@@ -2,6 +2,7 @@
<configuration> <configuration>
<configSections> <configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > <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" />
<section name="Perun.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> <section name="Perun.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup> </sectionGroup>
</configSections> </configSections>
@@ -9,6 +10,35 @@
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup> </startup>
<userSettings> <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 />
</setting>
</Perun_v1.Properties.Settings>
<Perun.Properties.Settings> <Perun.Properties.Settings>
<setting name="MYSQL_Server" serializeAs="String"> <setting name="MYSQL_Server" serializeAs="String">
<value /> <value />

View File

@@ -7,7 +7,7 @@
<ProjectGuid>{5A710507-92E9-4664-9B91-918B8B82F107}</ProjectGuid> <ProjectGuid>{5A710507-92E9-4664-9B91-918B8B82F107}</ProjectGuid>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<RootNamespace>Perun_v1</RootNamespace> <RootNamespace>Perun_v1</RootNamespace>
<AssemblyName>Perun_v1</AssemblyName> <AssemblyName>Perun</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
@@ -23,8 +23,9 @@
<UpdatePeriodically>false</UpdatePeriodically> <UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired> <UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions> <MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>1</ApplicationRevision> <AutorunEnabled>true</AutorunEnabled>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion> <ApplicationRevision>2</ApplicationRevision>
<ApplicationVersion>0.2.1.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust> <UseApplicationTrust>false</UseApplicationTrust>
<PublishWizardCompleted>true</PublishWizardCompleted> <PublishWizardCompleted>true</PublishWizardCompleted>
<BootstrapperEnabled>true</BootstrapperEnabled> <BootstrapperEnabled>true</BootstrapperEnabled>
@@ -55,7 +56,8 @@
<ManifestCertificateThumbprint>2ACE4C8C2C325A04CA5986B1CD76744B4B03755D</ManifestCertificateThumbprint> <ManifestCertificateThumbprint>2ACE4C8C2C325A04CA5986B1CD76744B4B03755D</ManifestCertificateThumbprint>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<ManifestKeyFile>Perun_v1_TemporaryKey.pfx</ManifestKeyFile> <ManifestKeyFile>
</ManifestKeyFile>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<GenerateManifests>true</GenerateManifests> <GenerateManifests>true</GenerateManifests>
@@ -144,5 +146,8 @@
<ItemGroup> <ItemGroup>
<Content Include="perun_logo.ico" /> <Content Include="perun_logo.ico" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project> </Project>

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.1.0.0")] [assembly: AssemblyVersion("0.2.0.0")]
[assembly: AssemblyFileVersion("0.1.0.0")] [assembly: AssemblyFileVersion("0.2.0.0")]
[assembly: NeutralResourcesLanguage("en")] [assembly: NeutralResourcesLanguage("en")]

View File

@@ -46,7 +46,7 @@
mimetype: application/x-microsoft.net.object.binary.base64 mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64 mimetype: application/x-microsoft.net.object.soap.base64
@@ -60,6 +60,7 @@
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
--> -->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
@@ -68,9 +69,10 @@
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" /> <xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" /> <xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="assembly"> <xsd:element name="assembly">
@@ -85,9 +87,10 @@
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="resheader"> <xsd:element name="resheader">
@@ -109,9 +112,9 @@
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.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>
</root> </root>

View File

@@ -118,5 +118,17 @@ namespace Perun_v1.Properties {
this["OTHER_SRS_USE"] = value; this["OTHER_SRS_USE"] = value;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string MYSQL_Port {
get {
return ((string)(this["MYSQL_Port"]));
}
set {
this["MYSQL_Port"] = value;
}
}
} }
} }

View File

@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Perun.Properties" GeneratedClassName="Settings"> <SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="Perun_v1.Properties" GeneratedClassName="Settings">
<Profiles /> <Profiles />
<Settings> <Settings>
<Setting Name="MYSQL_Server" Type="System.String" Scope="User"> <Setting Name="MYSQL_Server" Type="System.String" Scope="User">
@@ -26,5 +26,8 @@
<Setting Name="OTHER_SRS_USE" Type="System.Boolean" Scope="User"> <Setting Name="OTHER_SRS_USE" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value> <Value Profile="(Default)">False</Value>
</Setting> </Setting>
<Setting Name="MYSQL_Port" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings> </Settings>
</SettingsFile> </SettingsFile>

View File

@@ -36,6 +36,8 @@
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_1000ms = 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.con_txt_mysql_port = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label();
this.con_txt_mysql_username = new System.Windows.Forms.TextBox(); this.con_txt_mysql_username = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label();
@@ -83,7 +85,7 @@
// //
// con_Button_Listen_ON // con_Button_Listen_ON
// //
this.con_Button_Listen_ON.Location = new System.Drawing.Point(12, 405); this.con_Button_Listen_ON.Location = new System.Drawing.Point(12, 434);
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;
@@ -94,7 +96,7 @@
// 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, 405); this.con_Button_Listen_OFF.Location = new System.Drawing.Point(104, 434);
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;
@@ -105,9 +107,9 @@
// 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, 235); this.con_GroupBox_1.Location = new System.Drawing.Point(12, 261);
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, 164); this.con_GroupBox_1.Size = new System.Drawing.Size(324, 167);
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 = "UDP log";
@@ -119,6 +121,8 @@
// //
// con_GroupBox_2 // con_GroupBox_2
// //
this.con_GroupBox_2.Controls.Add(this.label6);
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_port);
this.con_GroupBox_2.Controls.Add(this.label4); this.con_GroupBox_2.Controls.Add(this.label4);
this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_username); this.con_GroupBox_2.Controls.Add(this.con_txt_mysql_username);
this.con_GroupBox_2.Controls.Add(this.label3); this.con_GroupBox_2.Controls.Add(this.label3);
@@ -129,15 +133,31 @@
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(12, 27);
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, 127); this.con_GroupBox_2.Size = new System.Drawing.Size(324, 154);
this.con_GroupBox_2.TabIndex = 5; this.con_GroupBox_2.TabIndex = 5;
this.con_GroupBox_2.TabStop = false; this.con_GroupBox_2.TabStop = false;
this.con_GroupBox_2.Text = "MySQL"; this.con_GroupBox_2.Text = "MySQL";
// //
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(41, 48);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(59, 13);
this.label6.TabIndex = 9;
this.label6.Text = "Server port";
//
// con_txt_mysql_port
//
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.Size = new System.Drawing.Size(207, 20);
this.con_txt_mysql_port.TabIndex = 8;
//
// label4 // label4
// //
this.label4.AutoSize = true; this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(45, 74); this.label4.Location = new System.Drawing.Point(45, 100);
this.label4.Name = "label4"; this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(55, 13); this.label4.Size = new System.Drawing.Size(55, 13);
this.label4.TabIndex = 7; this.label4.TabIndex = 7;
@@ -145,7 +165,7 @@
// //
// con_txt_mysql_username // con_txt_mysql_username
// //
this.con_txt_mysql_username.Location = new System.Drawing.Point(106, 71); this.con_txt_mysql_username.Location = new System.Drawing.Point(106, 97);
this.con_txt_mysql_username.Name = "con_txt_mysql_username"; this.con_txt_mysql_username.Name = "con_txt_mysql_username";
this.con_txt_mysql_username.Size = new System.Drawing.Size(207, 20); this.con_txt_mysql_username.Size = new System.Drawing.Size(207, 20);
this.con_txt_mysql_username.TabIndex = 6; this.con_txt_mysql_username.TabIndex = 6;
@@ -153,7 +173,7 @@
// label3 // label3
// //
this.label3.AutoSize = true; this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(47, 100); this.label3.Location = new System.Drawing.Point(47, 126);
this.label3.Name = "label3"; this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(53, 13); this.label3.Size = new System.Drawing.Size(53, 13);
this.label3.TabIndex = 5; this.label3.TabIndex = 5;
@@ -162,7 +182,7 @@
// label2 // label2
// //
this.label2.AutoSize = true; this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(47, 48); this.label2.Location = new System.Drawing.Point(47, 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(53, 13);
this.label2.TabIndex = 4; this.label2.TabIndex = 4;
@@ -179,7 +199,7 @@
// //
// con_txt_mysql_database // con_txt_mysql_database
// //
this.con_txt_mysql_database.Location = new System.Drawing.Point(106, 45); this.con_txt_mysql_database.Location = new System.Drawing.Point(106, 71);
this.con_txt_mysql_database.Name = "con_txt_mysql_database"; this.con_txt_mysql_database.Name = "con_txt_mysql_database";
this.con_txt_mysql_database.Size = new System.Drawing.Size(207, 20); this.con_txt_mysql_database.Size = new System.Drawing.Size(207, 20);
this.con_txt_mysql_database.TabIndex = 2; this.con_txt_mysql_database.TabIndex = 2;
@@ -193,7 +213,7 @@
// //
// con_txt_mysql_password // con_txt_mysql_password
// //
this.con_txt_mysql_password.Location = new System.Drawing.Point(106, 97); this.con_txt_mysql_password.Location = new System.Drawing.Point(106, 123);
this.con_txt_mysql_password.Name = "con_txt_mysql_password"; this.con_txt_mysql_password.Name = "con_txt_mysql_password";
this.con_txt_mysql_password.PasswordChar = '*'; this.con_txt_mysql_password.PasswordChar = '*';
this.con_txt_mysql_password.Size = new System.Drawing.Size(207, 20); this.con_txt_mysql_password.Size = new System.Drawing.Size(207, 20);
@@ -205,9 +225,9 @@
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, 160); this.con_GroupBox_3.Location = new System.Drawing.Point(12, 187);
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, 69); 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";
@@ -250,7 +270,7 @@
// //
// con_Button_Quit // con_Button_Quit
// //
this.con_Button_Quit.Location = new System.Drawing.Point(250, 405); this.con_Button_Quit.Location = new System.Drawing.Point(250, 434);
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;
@@ -298,14 +318,14 @@
// //
// tim_10000ms // tim_10000ms
// //
this.tim_10000ms.Interval = 10000; this.tim_10000ms.Interval = 30000;
this.tim_10000ms.Tick += new System.EventHandler(this.tim_10000ms_Tick); this.tim_10000ms.Tick += new System.EventHandler(this.tim_10000ms_Tick);
// //
// 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(348, 456); this.ClientSize = new System.Drawing.Size(349, 483);
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);
@@ -361,6 +381,8 @@
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_10000ms;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.TextBox con_txt_mysql_port;
} }
} }

View File

@@ -36,16 +36,15 @@ namespace Perun_v1
public void SendToMySql(string raw_udp_frame) public void SendToMySql(string raw_udp_frame)
{ {
// Main function to send data to mysql // Main function to send data to mysql
// TODO : persistent connection and error handling
dynamic udp_frame = JsonConvert.DeserializeObject(raw_udp_frame); dynamic udp_frame = JsonConvert.DeserializeObject(raw_udp_frame);
// Cut raw data to type and paylod for proper mysql insert // Cut raw data to type and paylod for proper mysql insert
string type = udp_frame.type; string type = udp_frame.type;
string payload = "";
string sql = "";
// Type specyfic // Modify specific
if (type == "1") // Inject app version information if (type == "1") // Inject app version information
{ {
Assembly assembly = Assembly.GetExecutingAssembly(); Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location); FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
@@ -53,7 +52,21 @@ namespace Perun_v1
udp_frame.payload["v_win"] = "v"+version; udp_frame.payload["v_win"] = "v"+version;
} }
string payload = JsonConvert.SerializeObject(udp_frame.payload); // Specific SQL
if(type == "50")
{
sql = "INSERT INTO `pe_LogChat` (`pe_LogChat_id`, `pe_LogChat_playerid`, `pe_LogChat_msg`, `pe_LogChat_all`) VALUES (NULL, '"+udp_frame.payload.player+ "', '" + udp_frame.payload.msg + "', '" + udp_frame.payload.all + "');";
}
else if(type == "51")
{
sql = "INSERT INTO `pe_LogEvent` (`pe_LogEvent_id`, `pe_LogEvent_datetime`, `pe_LogEvent_type`, `pe_LogEvent_content`) VALUES (NULL, CURRENT_TIMESTAMP, '" + udp_frame.payload.log_type + "', '" + udp_frame.payload.log_content + "');";
}
else
{
payload = JsonConvert.SerializeObject(udp_frame.payload);
sql = "INSERT INTO pe_DataRaw(pe_dataraw_type,pe_dataraw_payload) VALUES (" + type + ",JSON_QUOTE('" + payload + "')) ON DUPLICATE KEY UPDATE pe_dataraw_payload = JSON_QUOTE('" + payload + "')";
}
// Connect to mysql // Connect to mysql
MySqlConnection conn = new MySqlConnection(MySql_connStr); MySqlConnection conn = new MySqlConnection(MySql_connStr);
try try
@@ -61,8 +74,6 @@ namespace Perun_v1
Console.WriteLine("Sending data to MySQL - Begin"); Console.WriteLine("Sending data to MySQL - Begin");
conn.Open(); conn.Open();
string sql = "INSERT INTO pe_DataRaw(pe_dataraw_type,pe_dataraw_payload) VALUES (" + type+",JSON_QUOTE('" + payload + "')) ON DUPLICATE KEY UPDATE pe_dataraw_payload = JSON_QUOTE('" + payload + "')";
MySqlCommand cmd = new MySqlCommand(sql, conn); MySqlCommand cmd = new MySqlCommand(sql, conn);
MySqlDataReader rdr = cmd.ExecuteReader(); MySqlDataReader rdr = cmd.ExecuteReader();
@@ -162,10 +173,16 @@ namespace Perun_v1
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;
con_txt_mysql_server.Text = Properties.Settings.Default.MYSQL_Server; con_txt_mysql_server.Text = Properties.Settings.Default.MYSQL_Server;
con_txt_mysql_port.Text = Properties.Settings.Default.MYSQL_Port;
con_txt_3rd_lotatc.Text = Properties.Settings.Default.OTHER_LOTATC_FILE; con_txt_3rd_lotatc.Text = Properties.Settings.Default.OTHER_LOTATC_FILE;
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;
// Version to title header
Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
this.Text = this.Text + " - v" + fileVersionInfo.ProductVersion;
} }
private void con_Button_Listen_ON_Click(object sender, EventArgs e) private void con_Button_Listen_ON_Click(object sender, EventArgs e)
@@ -178,21 +195,22 @@ namespace Perun_v1
// Update form controls // Update form controls
con_Button_Listen_ON.Enabled = false; con_Button_Listen_ON.Enabled = false;
con_Button_Listen_OFF.Enabled = true; con_Button_Listen_OFF.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;
con_txt_mysql_server.Enabled = false; con_txt_mysql_server.Enabled = false;
con_txt_mysql_port.Enabled = false;
con_txt_3rd_lotatc.Enabled = false; con_txt_3rd_lotatc.Enabled = false;
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;
// Prepare connection string // Prepare connection string
MySql_connStr = "server="+con_txt_mysql_server.Text+";user="+con_txt_mysql_username.Text+";database="+con_txt_mysql_database.Text+";port=3306;password="+con_txt_mysql_password.Text; MySql_connStr = "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 timmers // Start timmers
tim_1000ms.Enabled = true; tim_1000ms.Enabled = true;
tim_10000ms.Enabled = true; tim_10000ms.Enabled = true;
} }
private void con_Button_Listen_OFF_Click(object sender, EventArgs e) private void con_Button_Listen_OFF_Click(object sender, EventArgs e)
@@ -207,6 +225,7 @@ namespace Perun_v1
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;
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;
@@ -261,7 +280,9 @@ namespace Perun_v1
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;
Properties.Settings.Default.MYSQL_Password = con_txt_mysql_password.Text; Properties.Settings.Default.MYSQL_Password = con_txt_mysql_password.Text;
Properties.Settings.Default.MYSQL_Port = con_txt_mysql_port.Text;
Properties.Settings.Default.MYSQL_Server = con_txt_mysql_server.Text; Properties.Settings.Default.MYSQL_Server = con_txt_mysql_server.Text;
Properties.Settings.Default.MYSQL_Port = con_txt_mysql_port.Text;
Properties.Settings.Default.OTHER_LOTATC_FILE = con_txt_3rd_lotatc.Text; Properties.Settings.Default.OTHER_LOTATC_FILE = con_txt_3rd_lotatc.Text;
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;
@@ -333,14 +354,31 @@ namespace Perun_v1
private void tim_10000ms_Tick(object sender, EventArgs e) private void tim_10000ms_Tick(object sender, EventArgs e)
{ {
// Main timer to send JSON files to MySQL // Main timer to send JSON files to MySQL
string strSRSJson = System.IO.File.ReadAllText(con_txt_3rd_srs.Text); string strSRSJson;
LogHistoryAdd(ref LogHistory, "SRS data loaded"); string strLotATCJson;
string strLotATCJson = System.IO.File.ReadAllText(con_txt_3rd_lotatc.Text);
LogHistoryAdd(ref LogHistory, "LotATC data loaded"); if (con_check_3rd_srs.Checked)
{
strSRSJson = System.IO.File.ReadAllText(con_txt_3rd_srs.Text);
LogHistoryAdd(ref LogHistory, "SRS data loaded");
strSRSJson = "{'type':'100','payload':'" + strSRSJson + "'}";
}
else
{
strSRSJson = "{'type':'100','payload':{'ignore':'true'}}";
}
strSRSJson = "{'type':'100','payload':'" + strSRSJson + "'}";
SendToMySql(strSRSJson); SendToMySql(strSRSJson);
strLotATCJson = "{'type':'101','payload':'" + strLotATCJson + "'}"; if (con_check_3rd_lotatc.Checked)
{
strLotATCJson = System.IO.File.ReadAllText(con_txt_3rd_lotatc.Text);
LogHistoryAdd(ref LogHistory, "LotATC data loaded");
strLotATCJson = "{'type':'101','payload':'" + strLotATCJson + "'}";
} else
{
strLotATCJson = "{'type':'101','payload':{'ignore':'true'}}";
}
SendToMySql(strLotATCJson); SendToMySql(strLotATCJson);
} }
} }

View File

@@ -1,18 +1,17 @@
# Perun for DCS World # Perun for DCS World
This toolset extracts data from DCS World server and export it to local json file and UDP port. **Optional** windows app puts JSON data to MySQL database. This toolset extracts data from DCS World server and export it to local json file and UDP port. **Optional** windows app puts JSON data to MySQL database.
Additionaly windows app can be used to merge LotATC and DCS SRS data in one database making Perun for DCS World ultimate integration tool for server admins.
## Getting Started ## Getting Started
You can use this toolkit with or without Windows app. Simple DCS export scripts will create JSON file which can be used for further processing. You can use this toolkit with or without Windows app. Simple DCS export scripts will create JSON file which can be used for further processing, by default this file is created in Scripts\Json folder located in your Saved Games DCS folder tree.
### Prerequisites ### Prerequisites
Core: Core:
* For JSON Export: * For JSON Export:
* DCS World stable or DCS World beta * DCS World stable or DCS World beta
* For UDP Export:
* Windows app which handles UDP readouts
* **(Optional)** For MySQL Export: * **(Optional)** For MySQL Export:
* MySQL server with read/write access * MySQL server with read/write access
@@ -24,15 +23,28 @@ Core:
* Download latest [release](https://github.com/szporwolik/perun/releases) **optionaly** together with Win32 binary file for MySQL export * Download latest [release](https://github.com/szporwolik/perun/releases) **optionaly** together with Win32 binary file for MySQL export
* Copy contents of DCS folder to you \Scripts folder (inside DCS folder in your Saved Games) * Copy contents of DCS folder to you \Scripts folder (inside DCS folder in your Saved Games)
* Add the following line to your Export.lua : TBD * create MySQL server 03_MySQL folder contains creation SQL file
* Run the Win32 application * **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
* Start DCS World and host multiplayer session * Start DCS World and host multiplayer session
* by default the JSON is written into : TBD * by default the JSON is written into Scripts\Json folder located in your Saved Games DCS folder tree
* by default the UDP port TBD is in use * by default the UDP port 48620 is in use as target
## Testing ## Data packets
* ID: 1, contains version information
TBD * ID: 2, contains status data in the following sections
* mission
* players
* ID: 3, available slots list and coalitions
* coalitions
* slots
* ID: 50, chat event
* ID: 51, game event
* ID: 100, DCS SRS's client-list.json
* ID: 101, LotATC's stats.json
## Built With ## Built With