#include "ChatServerVoice.h" void ChatServerVoice::onLoad() { ServerModule* sm = (ServerModule*) moduleInstances[ServerModule()]; sm->startServer(9932); } //void ChatServerVoice::run() {} bool ChatServerVoice::onEvent(const Archimedes::Event& event) { unsigned int type = app->getEventType(event); static ServerModule* sm; /*if(type == app->getEventType("DataSentEvent")) { //we did this? return true; } else */ if(type == app->getEventType(Archimedes::DataRecievedEvent())) { { sm = (ServerModule*) moduleInstances[ServerModule()]; } Archimedes::DataRecievedEvent& e = (Archimedes::DataRecievedEvent&) event; static std::string s; if(std::string((const char*)e.msg->m_pData, 6) == "client") { s = std::string((const char*)e.msg->m_pData + 6, e.msg->m_cbSize - 6); for(auto& it : sm->getClients()) { if(it.first != e.msg->m_conn) sm->sendReliable(it.first, e.msg->m_pData, e.msg->m_cbSize); else sm->sendReliable(e.msg->m_conn, "client\nMessage sent\n", strlen("client\nMessage sent\n")); } } else if(std::string((const char*)e.msg->m_pData, 6) == "srvcmd") { s = std::string((const char*)e.msg->m_pData + 6, e.msg->m_cbSize - 6); int cmdCode = stoi(s); switch(cmdCode) { case 0: break; case 1: //disconnect sm->disconnectClient(e.msg->m_conn); break; case 2: for(auto& it : sm->getClients()) { sm->sendReliable(it.first, "server2", strlen("server2")); } sm->stopServer(); app->end(); break; default: break; } } else /*if(std::string((const char*)e.msg->m_pData, 6) == "audio:")*/ { s = "audio data"; for(auto& it : sm->getClients()) { if(it.first != e.msg->m_conn) sm->sendReliable(it.first, e.msg->m_pData, e.msg->m_cbSize); } } //std::cerr << "Server Recieved: " << s << std::endl; return true; } else if(type == app->getEventType("ConnectionStatusChangedEvent")) { Archimedes::ConnectionStatusChangedEvent& e = (Archimedes::ConnectionStatusChangedEvent&) event; { sm = (ServerModule*) moduleInstances[ServerModule()]; } unsigned int numClients; (void)sm->getClients(&numClients); switch(e.info->m_info.m_eState) { case k_ESteamNetworkingConnectionState_None: // NOTE: We will get callbacks here when we destroy connections. You can ignore these. break; case k_ESteamNetworkingConnectionState_ClosedByPeer: case k_ESteamNetworkingConnectionState_ProblemDetectedLocally: { if(numClients < 2) { for(auto& it : sm->getClients()) { sm->sendReliable(it.first, "server1", strlen("server1")); } } break; } case k_ESteamNetworkingConnectionState_Connecting: { break; } case k_ESteamNetworkingConnectionState_Connected: //OnConnect if(numClients == 2) { for(auto& it : sm->getClients()) { sm->sendReliable(it.first, "server0", strlen("server0")); } } else if(numClients > 2) { sm->sendReliable(e.info->m_hConn, "server0", strlen("server0")); } break; default: // Silences -Wswitch break; } return false; } return false; }