X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/85ce9d3ecb3e6888dae590b3a8e347e0a2131bd9..6be91de866c2d7a5dda3c2618171e222a76287dd:/gameserv/tcpclient.cpp diff --git a/gameserv/tcpclient.cpp b/gameserv/tcpclient.cpp index 54706fc..723b546 100644 --- a/gameserv/tcpclient.cpp +++ b/gameserv/tcpclient.cpp @@ -13,73 +13,105 @@ */ #include "sockhelp.h" +#include "options.h" #include "list.h" #include "aClient.h" #include "extern.h" #include #include #include -#include -#include -#include +#include #include +using std::ofstream; +using std::ifstream; + +char *PACKAGE = "GameServ"; +char *VERSION = "1.1.7"; int sock; +long timestamp; + List clients; -int main(int argc, char *argv[]) +void save_timestamp(); +void load_timestamp(); + +int main() { - char buffer[1024], buf[1024], input[1024], uplink[80], kb[1024]; + char buffer[1024], buf[1024]; int connected = 1; char *cmd, *source = NULL; srand(time(NULL)); + - load_config_file(); + load_config_file(); // default = gameserv.conf - if (argc == 1) { - argc = 3; - argv[1] = remoteserver; - argv[2] = remoteport; - } - if (argc != 3) { - fprintf(stderr,"Usage: tcpclient host port\n"); - fprintf(stderr,"where host is the machine which is running the\n"); - fprintf(stderr,"tcpserver program, and port is the port it is\n"); - fprintf(stderr,"listening on.\n"); - exit(EXIT_FAILURE); - } ignore_pipe(); - sock = make_connection(argv[2], SOCK_STREAM, argv[1]); + sock = make_connection(remoteport, SOCK_STREAM, remoteserver); if (sock == -1) { fprintf(stderr,"make_connection failed.\n"); unload_config_file(); return -1; } +#ifdef UNREAL raw("PROTOCTL NICKv2 VHP"); raw("PASS :%s", remotepass); - raw("SERVER %s 1 :Testing Server", servername); - raw("NICK %S 1 %d %S %s %s %d +owghraAxNt %s :GameServ", time(NULL), gshost, - servername, time(NULL), gshost); + raw("SERVER %s 1 :%s", servername, servername); + raw("NICK %S 1 %d %S %s %s %d +owghraAxNt %s :%s v%s", time(NULL), gshost, + servername, time(NULL), gshost, PACKAGE, VERSION); raw(":%S JOIN %s", c_Forest); + raw(":%S MODE %s +mtn", c_Forest); +#elif defined(BAHAMUT) + raw("PASS %s :TS", remotepass); + raw("SERVER %s 1 :%s", servername, servername); + raw("NICK %S 1 %d +o %s %s %s 0 :GameServ", time(NULL), gsident, gshost, + servername); + raw(":%s SJOIN %d %d %s +mnt :@%S", servername, time(NULL), time(NULL), c_Forest); +#elif defined(P10) + // Server numeric is: [] <-- must be unique + raw("PASS :%s", remotepass); + raw("SERVER %s 1 %d %d P10 []AAF :%s", servername, time(NULL), time(NULL), servername); + raw("[] N %S 1 %d %s %s DAqAoB %s :%S", time(NULL), gsident, gshost, gsnum); + raw("[] B %s %d +tnm %s:o", c_Forest, time(NULL) - 864000, gsnum); +#endif + +#if defined(P10) + raw("%s T %s :%s", gsnum, c_Forest, c_ForestTopic); + raw("[] EB"); // End burst +#else raw(":%S MODE %s +o %S", c_Forest); - raw(":%S MODE %s +ntm", c_Forest); + raw(":%S TOPIC %s :%s", c_Forest, c_ForestTopic); +#endif sock_gets(sock,buffer,sizeof(buffer)-1); /* -1 added thanks to David Duchene for pointing out the possible buffer overflow resulting from the linefeed added below. */ - printf("Server: %s\n",buffer); - init_monsters(); - //load_gs_dbase(); + #ifdef DEBUGMODE + log("Server: %s",buffer); + #endif + + init_masters(); + load_gs_dbase(); + load_timestamp(); + long int loadtime = time(NULL); + long int currentTime; + long int oldTime = loadtime; + bool loaded = false; + + if (load_monsters() == false) + goto end; + while (connected) { if (sock_gets(sock,buffer,sizeof(buffer)) == -1) { connected = 0; } strcpy(buf, buffer); + #if !defined(P10) if (buffer[0] == ':') { source = strtok(buf, " "); @@ -87,18 +119,57 @@ int main(int argc, char *argv[]) } else cmd = strtok(buf, " "); + #else + source = strtok(buf, " "); + cmd = strtok(NULL, " "); + #endif + + #ifdef DEBUGMODE + log("Server: %s", buffer); + #endif + + // Wait N seconds then we're loaded. + if (!loaded) + { + if (time(NULL) >= welcomedelay + loadtime) + loaded = true; + } - cout << "Server: " << buffer << endl; + // Save the player data every updateperiod seconds + currentTime = time(NULL); + if (currentTime - oldTime >= updateperiod) + { + oldTime = currentTime; + save_gs_dbase(); + } + + + #if !defined(P10) if (stricmp(cmd, "PING") == 0) { - char *times; - times = strtok(NULL, ""); - printf("input: PONG %s \n", times); - raw("PONG %s ", times); + char *timestamp; + timestamp = strtok(NULL, ""); + raw("PONG %s", timestamp); + #else + if (stricmp(cmd, "G") == 0) { + char *timestamp; + timestamp = strtok(NULL, " "); + raw("[] Z [] %s 0 %s", timestamp + 1, timestamp); + #endif + #ifdef P10 + } else if (stricmp(cmd, "EB") == 0) { + raw("[] EA"); + #endif + } else if (stricmp(cmd, "VERSION") == 0) { + char *server; + server = strtok(NULL, " "); + server++; + raw(":%s 351 %s %s %s. %s", servername, source+1, PACKAGE, VERSION, servername); + #if !defined(P10) } else if (strncmp(cmd, "NICK", 4) == 0) { if (buffer[0] == ':') { aClient *tempPtr; - if (tempPtr = find((source + 1))) + if ((tempPtr = find((source + 1)))) { char *nick; nick = strtok(NULL, " "); @@ -108,36 +179,133 @@ int main(int argc, char *argv[]) else { char *nick; + #else + } else if (stricmp(cmd, "N") == 0 && strlen(source) == 2) { + { + char *nick; + + for (int x = 0; x < 6; x++) + nick = strtok(NULL, " "); + + if (nick[0] == '+') + { + #ifdef DEBUGMODE + log ("aClient has modes"); + #endif + + // Searching for the +r mode (extra parameter) + for (unsigned int count = 1; count < strlen(nick); count++) + { + if (nick[count] == 'r') + { + nick = strtok(NULL, " "); + break; + } + } + nick = strtok(NULL, " "); + } + #endif aClient *newuser; + nick = strtok(NULL, " "); + newuser = new aClient(nick); + if (loaded) + notice(s_GameServ, nick, welcomemsg, nick); + clients.insertAtBack(newuser); delete newuser; } + #if defined(P10) + } else if (stricmp(cmd, "Q") == 0) { + #else } else if (stricmp(cmd, "QUIT") == 0) { + #endif aClient *quitter; - if (quitter = find(source + 1)) + char z = source[0]; + + if (z == ':') + source++; + + if ((quitter = find(source))) clients.remove(quitter); + if ((quitter = findIRCplayer(source))) + { + quitter->setNick("!NULL!"); + quitter->stats->user = NULL; // Unidentify them + } + + if (z == ':') + source--; + + #if defined(P10) + } else if (stricmp(cmd, "P") == 0) { + char *rest, *dest; + char *longname; + longname = new char[strlen(s_GameServ) + strlen(servername) + 2]; + + sprintf(longname, "%S@%s", servername); + dest = strtok(NULL, " "); + rest = strtok(NULL, ""); + if (stricmp(dest, gsnum) == 0 || stricmp(dest, longname) == 0) + { + delete [] longname; + gameserv(source, rest); + } + else if (stricmp(dest, c_Forest) == 0) + { + delete [] longname; + forest(source, rest); + } + #else } else if (stricmp(cmd, "PRIVMSG") == 0) { char *rest, *dest; dest = strtok(NULL, " "); rest = strtok(NULL, ""); - if (stricmp(dest, s_GameServ) == 0) + if (strnicmp(dest, s_GameServ, strlen(s_GameServ)) == 0) gameserv(source, rest); else if (stricmp(dest, c_Forest) == 0) forest(source, rest); + #endif } else if (stricmp(cmd, "JOIN") == 0) { char *channel; channel = strtok(NULL, " "); if (stricmp(channel, c_Forest) == 0 && is_playing(source + 1)) raw(":%S MODE %s +v %s", c_Forest, (source + 1)); + + #if defined(BAHAMUT) + } else if (stricmp(cmd, "SJOIN") == 0) { + char *channel, *nick; + strtok(NULL, " "); // Ignore the TS + strtok(NULL, " "); // Ignore the TS + channel = strtok(NULL, " "); + strtok(NULL, " "); + nick = strtok(NULL, " "); + nick++; // Get rid of the : + if (stricmp(channel, c_Forest) == 0 && is_playing(nick)) + raw(":%S MODE %s +v %s", channel, nick); + #endif + } else { - // cout << "Unrecognized Message: cmd = " << cmd << setw(30) << "source = " << - // source << endl; + #ifdef DEBUGMODE + log("Unrecognized Message: cmd = %s source = %s", cmd, source); + #endif } } - printf("\n"); + + end: + + save_gs_dbase(); + save_timestamp(); + + delete_monsters(); + delete_masters(); + + #ifdef DEBUGMODE + log(""); + #endif + close(sock); unload_config_file(); return 0; @@ -172,6 +340,35 @@ aClient *findbynick(char *nick) return client; } +aClient *findIRCplayer(const char *nick) +{ + ListNode *newPtr; + aClient *p = NULL; + + for (newPtr = players.First(); newPtr; newPtr = newPtr->Next()) + { + p = newPtr->getData(); + if (stricmp(p->getNick(), nick) == 0) + return p; + p = NULL; + } + return NULL; +} +aClient *findplayer(const char *name) +{ + ListNode *newPtr; + Player *p = NULL; + + for (newPtr = players.First(); newPtr; newPtr = newPtr->Next()) + { + p = newPtr->getData()->stats; + if (stricmp(p->name, name) == 0) + return newPtr->getData(); + p = NULL; + } + return NULL; +} + aClient *findbynick(const char *nick) { ListNode *newPtr; @@ -190,3 +387,51 @@ aClient *findbynick(const char *nick) return client; } +void load_timestamp() +{ + ifstream infile; + + infile.open(".gstimestamp"); + + if (infile.fail()) + { + #ifdef DEBUGMODE + log("Error opening .gstimestamp"); + #endif + + generate: + #ifdef DEBUGMODE + log("Generating new timestamp"); + #endif + timestamp = midnight(); + save_timestamp(); + return; + } + + infile >> timestamp; + infile.close(); + if (timestamp < 1000000) + goto generate; +} + +void save_timestamp() +{ + ofstream outfile; + + outfile.open(".gstimestamp"); + + if (outfile.fail()) + { + log("Error creating new file .gstimestamp"); + return; + } + + outfile << timestamp << endl; + + outfile.close(); +} + +long int midnight(long int offset) +{ + return (time(NULL) - (time(NULL) % 86400)) + (offset * 3600); +}