Files
SLikeNet/Samples/Lobby2Server_PGSQL/Lobby2ServerSample_PGSQL.cpp
2025-11-24 14:19:51 +05:30

181 lines
6.5 KiB
C++

/*
* Original work: Copyright (c) 2014, Oculus VR, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* RakNet License.txt file in the licenses directory of this source tree. An additional grant
* of patent rights can be found in the RakNet Patents.txt file in the same directory.
*
*
* Modified work: Copyright (c) 2016-2018, SLikeSoft UG (haftungsbeschränkt)
*
* This source code was modified by SLikeSoft. Modifications are licensed under the MIT-style
* license found in the license.txt file in the root directory of this source tree.
*/
#include "Lobby2Message.h"
#include "slikenet/peerinterface.h"
#include "slikenet/MessageIdentifiers.h"
#include "slikenet/Kbhit.h"
#include "slikenet/sleep.h"
#include "Lobby2Server_PGSQL.h"
#include "Lobby2Message_PGSQL.h"
#include "ProfanityFilter.h"
#include <ctype.h>
#include <stdlib.h>
#include <limits> // used for std::numeric_limits
#include "slikenet/Gets.h"
#include "slikenet/linux_adapter.h"
#include "slikenet/osx_adapter.h"
#ifdef __INTEGRATE_LOBBY2_WITH_ROOMS_PLUGIN
#include "RoomsPlugin.h"
#endif
//#define _ALSO_ACT_AS_NAT_PUNCH_SERVER
#include "slikenet/NatPunchthroughServer.h"
#include "slikenet/UDPProxyCoordinator.h"
#include "slikenet/UDPProxyServer.h"
#include "slikenet/NatTypeDetectionServer.h"
#include "slikenet/SocketLayer.h"
static const char *COORDINATOR_PASSWORD="Dummy Coordinator Password";
void main(void)
{
printf("The 2nd interaction of the lobby server.\n");
printf("Difficulty: Intermediate\n\n");
char serverPort[30];
SLNet::RakPeerInterface *rakPeer= SLNet::RakPeerInterface::GetInstance();
rakPeer->SetTimeoutTime(5000, SLNet::UNASSIGNED_SYSTEM_ADDRESS);
//rakPeer->SetTimeoutTime(3000,SLNet::UNASSIGNED_SYSTEM_ADDRESS);
puts("Enter the rakPeer port to listen on");
serverPort[0]=0;
Gets(serverPort,sizeof(serverPort));
if (serverPort[0]==0)
strcpy_s(serverPort, "61111");
const int intServerPort = atoi(serverPort);
if ((intServerPort < 0) || (intServerPort > std::numeric_limits<unsigned short>::max())) {
printf("Specified server port %d is outside valid bounds [0, %u]", intServerPort, std::numeric_limits<unsigned short>::max());
return;
}
SLNet::SocketDescriptor socketDescriptor(static_cast<unsigned short>(intServerPort),0);
rakPeer->SetMaximumIncomingConnections(32);
if (rakPeer->Startup(32,&socketDescriptor, 1)!= SLNet::RAKNET_STARTED)
{
printf("Startup call failed\n");
return;
}
else
printf("Started on port %i\n", socketDescriptor.port);
// Attach the plugin Lobby2Server
// The class factory will create messages with server functionality
SLNet::Lobby2Server_PGSQL lobby2Server;
rakPeer->AttachPlugin(&lobby2Server);
SLNet::Lobby2MessageFactory_PGSQL messageFactory;
lobby2Server.SetMessageFactory(&messageFactory);
// This is optional:
#ifdef __INTEGRATE_LOBBY2_WITH_ROOMS_PLUGIN
SLNet::RoomsPlugin roomsPluginServer;
rakPeer->AttachPlugin(&roomsPluginServer);
lobby2Server.SetRoomsPlugin(&roomsPluginServer);
SLNet::ProfanityFilter profanityFilter;
profanityFilter.AddWord("Penis");
roomsPluginServer.SetProfanityFilter(&profanityFilter);
roomsPluginServer.roomsContainer.AddTitle("Test Title Name");
#endif
printf("Enter database password:\n");
char connectionString[256],password[128];
char username[256];
strcpy_s(username, "postgres");
password[0]=0;
Gets(password,sizeof(password));
if (password[0]==0) strcpy_s(password, "aaaa");
strcpy_s(connectionString, "user=");
strcat(connectionString, username);
strcat(connectionString, " password=");
strcat(connectionString, password);
if (lobby2Server.ConnectToDB(connectionString, 4)==false)
{
printf("Database connection failed\n");
return;
}
printf("Lobby2Server started and waiting for connections\n");
SLNet::Lobby2Server::ConfigurationProperties c;
c.requiresEmailAddressValidationToLogin=false;
c.requiresTitleToLogin=true;
c.accountRegistrationRequiresCDKey=false;
c.accountRegistrationRequiredAgeYears=0;
lobby2Server.SetConfigurationProperties(c);
#ifdef _ALSO_ACT_AS_NAT_PUNCH_SERVER
SLNet::NatPunchthroughServer natPunchthroughServer;
SLNet::UDPProxyCoordinator udpProxyCoordinator;
SLNet::UDPProxyServer udpProxyServer;
SLNet::NatTypeDetectionServer natTypeDetectionServer;
udpProxyCoordinator.SetRemoteLoginPassword(COORDINATOR_PASSWORD);
rakPeer->AttachPlugin(&natPunchthroughServer);
rakPeer->AttachPlugin(&udpProxyServer);
rakPeer->AttachPlugin(&udpProxyCoordinator);
rakPeer->AttachPlugin(&natTypeDetectionServer);
char ipListStr[ MAXIMUM_NUMBER_OF_INTERNAL_IDS ][ 128 ];
SLNet::SystemAddress ipList[ MAXIMUM_NUMBER_OF_INTERNAL_IDS ];
for (int i=0; i < MAXIMUM_NUMBER_OF_INTERNAL_IDS; i++)
ipList[i].ToString(false,ipListStr[i]);
SLNet::SocketLayer::GetMyIP( ipList );
natTypeDetectionServer.Startup(ipListStr[1], ipListStr[2], ipListStr[3]);
// Login proxy server to proxy coordinator
// Normally the proxy server is on a different computer. Here, we login to our own IP address since the plugin is on the same system
// This makes it take high CPU usage, comment out of not wanted
udpProxyServer.LoginToCoordinator(COORDINATOR_PASSWORD, rakPeer->GetMyBoundAddress());
#endif
SLNet::Packet *packet;
// Loop for input
for(;;)
{
for (packet=rakPeer->Receive(); packet; rakPeer->DeallocatePacket(packet), packet=rakPeer->Receive())
{
switch (packet->data[0])
{
case ID_DISCONNECTION_NOTIFICATION:
// Connection lost normally
printf("ID_DISCONNECTION_NOTIFICATION\n");
break;
case ID_NEW_INCOMING_CONNECTION:
// Connection lost normally
printf("ID_NEW_INCOMING_CONNECTION\n");
printf("Allowing all operations from remote client for testing (insecure)\n");
printf("Use Lobby2Server::ExecuteCommand for local server operations\n");
// For this test, allow all operations
lobby2Server.AddAdminAddress(packet->systemAddress);
lobby2Server.AddRankingAddress(packet->systemAddress);
break;
case ID_CONNECTION_LOST:
// Couldn't deliver a reliable packet - i.e. the other system was abnormally
// terminated
printf("ID_CONNECTION_LOST\n");
break;
}
}
// This sleep keeps RakNet responsive
RakSleep(30);
//printf("%i ", lobby2Server.GetUsers().Size());
}
// #med - add proper termination handling (then reenable the following code)
// SLNet::RakPeerInterface::DestroyInstance(rakPeer);
}