144 lines
2.4 KiB
C++
144 lines
2.4 KiB
C++
|
|
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
|
|
|
|
#include "HeartBeat.h"
|
|
#include "MCLogger.h"
|
|
#include "md5/md5.h"
|
|
|
|
#include "Root.h"
|
|
#include "Server.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();
|
|
AString Msg;
|
|
AString sPort;
|
|
Printf(sPort, "%i", Port);
|
|
AString sChecksum = md5( m_ServerID + sPort );
|
|
Printf(Msg, "GET http://master.mc-server.org/?update=%s&checksum=%s&port=%d\n", m_ServerID.c_str(), sChecksum.c_str(), Port);
|
|
SendMessage(Msg.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);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|