2011-10-03 14:41:19 -04:00
|
|
|
#include "cHeartBeat.h"
|
|
|
|
#include "cMCLogger.h"
|
|
|
|
#include "md5/md5.h"
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#include "cRoot.h"
|
|
|
|
#include "cServer.h"
|
|
|
|
#include "cSleep.h"
|
|
|
|
|
2011-10-21 17:25:29 -04:00
|
|
|
#ifndef _WIN32
|
|
|
|
#define sprintf_s(dst, size, format, ...) sprintf(dst, format, __VA_ARGS__ )
|
|
|
|
#endif
|
|
|
|
|
2011-10-03 14:41:19 -04:00
|
|
|
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 );
|
|
|
|
}
|
|
|
|
}
|