#include #include #include #include #include #include #include #include #include using std::endl; using std::cout; using std::cerr; bool queryDone = false, failure = false, exactTime = false; void erisLog(Eris::LogLevel, const std::string& msg) { cerr << "ERIS: " << msg << endl; } void gotServerList(int count) { cerr << "metaserver knows about " << count << " servers." << endl; } void gotServer(const Eris::ServerInfo& info) { cerr << "got info for server: " << info.getServername() << '/' << info.getHostname() << endl; } void queriesDone() { cerr << "query complete" << endl; queryDone = true; } void queryFailed(const std::string& msg) { cerr << "got query failure: " << msg << endl; failure = true; } std::string timeFormat(double time) { std::string times[] = { "secs", "mins", "hours", "days", "weeks" }; int precs[] = { 0, 1, 1, 2, 2, 2 }; int divi = 0; std::stringstream result; if(exactTime == false) { int divs[] = { 60, 60, 24, 7, 0 }; while((divs[divi] > 0) && (time > divs[divi])) { time /= divs[divi++]; } } result << std::fixed << std::setprecision(precs[divi]) << time << ' ' << times[divi]; return result.str(); } void dumpToScreen(const Eris::Meta& meta) { for (unsigned int S=0; S < meta.getGameServerCount(); ++S) { const Eris::ServerInfo& sv = meta.getInfoForServer(S); cout << S << ": " << sv.getServername() << '/'<< sv.getHostname() << endl; switch (sv.getStatus()) { case Eris::ServerInfo::VALID: cout << "\tserver: " << sv.getServer() << " " << sv.getVersion() << " (builddate " << sv.getBuildDate() << ")" << endl; cout << "\truleset:" << sv.getRuleset() << endl; cout << "\tuptime:" << timeFormat(sv.getUptime()) << endl; cout << "\tping:" << sv.getPing() << endl; cout << "\tconnected clients:" << sv.getNumClients() << endl; break; case Eris::ServerInfo::TIMEOUT: cout << "Timed out." << endl; break; case Eris::ServerInfo::QUERYING: cout << "Something is broken, all queries should be done" << endl; break; default: cout << "Query failed" << endl; } } // of server iteration } void dumpToXML(const Eris::Meta & meta) { cout << "" << endl; for(unsigned int S=0; S < meta.getGameServerCount(); ++S) { const Eris::ServerInfo& sv = meta.getInfoForServer(S); cout << "" << endl; cout << "
" << sv.getHostname() << "
" << endl; if(sv.getStatus() == Eris::ServerInfo::VALID) { cout << "valid" << endl; cout << "" << sv.getServername() << "" << endl; cout << "" << sv.getServer() << "" << endl; cout << "" << sv.getRuleset() << "" << endl; cout << "" << timeFormat(sv.getUptime()) << "" << endl; cout << "" << sv.getPing() << "" << endl; cout << "" << sv.getNumClients() << "" << endl; cout << "" << sv.getBuildDate() << "" << endl; cout << "" << sv.getVersion() << "" << endl; } cout << "
" << endl; } // of server iteration cout << "
" << endl; } void dumpToHTML(const Eris::Meta& meta) { cout << "
" << endl; cout << "
" << endl; for (unsigned int S=0; S < meta.getGameServerCount(); ++S) { const Eris::ServerInfo& sv = meta.getInfoForServer(S); cout << "
" << sv.getHostname() << " :: " << sv.getServername() << "
" << endl; cout << "
" << endl; switch (sv.getStatus()) { case Eris::ServerInfo::VALID: cout << "Server: " << sv.getServer() << " " << sv.getVersion() << " (builddate " << sv.getBuildDate() << ")
" << endl; cout << "Ruleset: " << sv.getRuleset() << "
" << endl; cout << "Up: " << timeFormat(sv.getUptime()) << " (" << sv.getPing() << " ping)
" << endl; cout << "Clients: " << sv.getNumClients() << endl; break; case Eris::ServerInfo::TIMEOUT: cout << "Timed out." << endl; break; case Eris::ServerInfo::QUERYING: cout << "Something is broken, all queries should be done" << endl; break; default: cout << "Query failed" << endl; } cout << "
" << endl; } // of server iteration cout << "
" << endl; cout << "
" << endl; } int main(int argc, char* argv[]) { std::string metaServer = "metaserver.worldforge.org"; std::vector< std::string > args(argv, argv + argc); void (* dumper)(const Eris::Meta &) = dumpToScreen; Eris::setLogLevel(Eris::LOG_DEBUG); Eris::Logged.connect(SigC::slot(&erisLog)); if(args.size() > 1) { if(args[1].substr(0, 2) != "--") { metaServer = argv[1]; } if(find(args.begin(), args.end(), "--html") != args.end()) { dumper = dumpToHTML; } else if(find(args.begin(), args.end(), "--xml") != args.end()) { dumper = dumpToXML; } if(find(args.begin(), args.end(), "--exact") != args.end()) { exactTime = true; } } // maximum of 5 simultaneous queries Eris::Meta meta(metaServer, 5); meta.CompletedServerList.connect(SigC::slot(&gotServerList)); meta.AllQueriesDone.connect(SigC::slot(&queriesDone)); meta.ReceivedServerInfo.connect(SigC::slot(&gotServer)); meta.Failure.connect(SigC::slot(&queryFailed)); cerr << "querying " << metaServer << endl; meta.refresh(); while (!queryDone && !failure) { Eris::PollDefault::poll(10); } if (failure) { cerr << "querying meta server at " << metaServer << " failed" << endl; return EXIT_FAILURE; } cerr << "final list contains " << meta.getGameServerCount() << " servers." << endl; dumper(meta); return EXIT_SUCCESS; }