summaryrefslogtreecommitdiffstats
path: root/source/cHeartBeat.cpp
diff options
context:
space:
mode:
authorfaketruth <faketruth@0a769ca7-a7f5-676a-18bf-c427514a06d6>2011-10-03 20:41:19 +0200
committerfaketruth <faketruth@0a769ca7-a7f5-676a-18bf-c427514a06d6>2011-10-03 20:41:19 +0200
commit386d58b5862d8b76925c6523721594887606e82a (patch)
treeef073e7a843f4b75a4008d4b7383f7cdf08ceee5 /source/cHeartBeat.cpp
parentVisual Studio 2010 solution and project files (diff)
downloadcuberite-386d58b5862d8b76925c6523721594887606e82a.tar
cuberite-386d58b5862d8b76925c6523721594887606e82a.tar.gz
cuberite-386d58b5862d8b76925c6523721594887606e82a.tar.bz2
cuberite-386d58b5862d8b76925c6523721594887606e82a.tar.lz
cuberite-386d58b5862d8b76925c6523721594887606e82a.tar.xz
cuberite-386d58b5862d8b76925c6523721594887606e82a.tar.zst
cuberite-386d58b5862d8b76925c6523721594887606e82a.zip
Diffstat (limited to '')
-rw-r--r--source/cHeartBeat.cpp119
1 files changed, 119 insertions, 0 deletions
diff --git a/source/cHeartBeat.cpp b/source/cHeartBeat.cpp
new file mode 100644
index 000000000..b518a753a
--- /dev/null
+++ b/source/cHeartBeat.cpp
@@ -0,0 +1,119 @@
+#include "cHeartBeat.h"
+#include "cMCLogger.h"
+#include "md5/md5.h"
+
+#include <stdio.h>
+
+#include "cRoot.h"
+#include "cServer.h"
+#include "cSleep.h"
+
+cHeartBeat::cHeartBeat()
+{
+ m_State = 0;
+ Authenticate();
+}
+
+cHeartBeat::~cHeartBeat()
+{
+}
+
+void cHeartBeat::ReceivedData( char a_Data[256], int a_Size )
+{
+ if( a_Size < 0 ) // Disconnected
+ return;
+
+ char MySalt[] = "1234567890";
+
+ if( a_Size == 0 )
+ {
+ Authenticate();
+ return;
+ }
+
+ bool bLoop = false;
+ do
+ {
+ switch (m_State)
+ {
+ case 1:
+ {
+ m_ServerID = std::string( a_Data, a_Size );
+ LOGINFO("Got server ID %s", m_ServerID.c_str() );
+ std::string Hash = md5( m_ServerID + std::string( MySalt ) );
+ CloseSocket();
+ if( Connect( "mc-server.org", 80 ) )
+ {
+ SendMessage( (std::string("GET http://master.mc-server.org/?hash=") + Hash + std::string("&server=") + m_ServerID + "\n").c_str() );
+ m_State = 2;
+ }
+ }
+ break;
+ case 2:
+ {
+ std::string ReturnedString = std::string( a_Data, a_Size );
+ if( ReturnedString.compare("VALIDATED") == 0 )
+ {
+ LOGINFO("Successfully validated server on master server list");
+ }
+ else
+ {
+ LOGINFO("Could not validate server! Will try again later.");
+ cSleep::MilliSleep( 10*1000 );
+ Authenticate();
+ return;
+ }
+ m_State = 3;
+ } // Don't break, but fall through and update server info
+ case 3:
+ {
+ cSleep::MilliSleep( 10*1000 );
+ SendUpdate();
+ m_State = 4;
+ }
+ break;
+ case 4:
+ {
+ if( a_Data[0] == '0' )
+ {
+ LOGINFO("Successfully updated server info!");
+ cSleep::MilliSleep( 10*1000 );
+ SendUpdate();
+ }
+ else
+ {
+ LOGINFO("Failed to update server info, reauthenticating");
+ Authenticate();
+ }
+ }
+ default:
+ break;
+ };
+ } while( bLoop );
+}
+
+void cHeartBeat::SendUpdate()
+{
+ CloseSocket();
+ if( Connect( "mc-server.org", 80 ) )
+ {
+ int Port = cRoot::Get()->GetServer()->GetPort();
+ char c_Port[16];
+ sprintf_s( c_Port, 16, "%i", Port );
+
+ std::string sPort = std::string( c_Port );
+ std::string sChecksum = md5( m_ServerID + sPort );
+ SendMessage( (std::string("GET http://master.mc-server.org/?update=") + m_ServerID + std::string("&checksum=") + sChecksum + std::string("&port=") + sPort + "\n").c_str() );
+ }
+}
+
+void cHeartBeat::Authenticate()
+{
+ CloseSocket();
+ if( Connect( "mc-server.org", 80 ) )
+ {
+ m_State = 1;
+ int RetVal = SendMessage( "GET http://master.mc-server.org/\r\n\r\n");
+ LOGINFO("Returned %i", RetVal );
+ }
+}