]>
jfr.im git - irc/gameservirc.git/blob - gameserv/tcpclient.cpp
2 * This file is provided for use with the unix-socket-faq. It is public
3 * domain, and may be copied freely. There is no copyright on it. The
4 * original work was by Vic Metcalfe (vic@brutus.tlug.org), and any
5 * modifications made to that work were made with the understanding that
6 * the finished work would be in the public domain.
8 * If you have found a bug, please pass it on to me at the above address
9 * acknowledging that there will be no copyright on your work.
11 * The most recent version of this file, and the unix-socket-faq can be
12 * found at http://www.interlog.com/~vic/sock-faq/.
28 char *PACKAGE
= "GameServ";
29 char *VERSION
= "1.1.7";
34 List
<aClient
> clients
;
36 void save_timestamp();
37 void load_timestamp();
39 int main(int argc
, char *argv
[])
41 char buffer
[1024], buf
[1024];
43 char *cmd
, *source
= NULL
;
50 argv
[1] = remoteserver
;
54 fprintf(stderr
,"Usage: tcpclient host port\n");
55 fprintf(stderr
,"where host is the machine which is running the\n");
56 fprintf(stderr
,"tcpserver program, and port is the port it is\n");
57 fprintf(stderr
,"listening on.\n");
61 sock
= make_connection(argv
[2], SOCK_STREAM
, argv
[1]);
63 fprintf(stderr
,"make_connection failed.\n");
69 raw("PROTOCTL NICKv2 VHP");
70 raw("PASS :%s", remotepass
);
71 raw("SERVER %s 1 :%s", servername
, servername
);
72 raw("NICK %S 1 %d %S %s %s %d +owghraAxNt %s :%s v%s", time(NULL
), gshost
,
73 servername
, time(NULL
), gshost
, PACKAGE
, VERSION
);
74 raw(":%S JOIN %s", c_Forest
);
75 raw(":%S MODE %s +mtn", c_Forest
);
76 #elif defined(BAHAMUT)
77 raw("PASS %s :TS", remotepass
);
78 raw("SERVER %s 1 :%s", servername
, servername
);
79 raw("NICK %S 1 %d +o %s %s %s 0 :GameServ", time(NULL
), gsident
, gshost
,
81 raw(":%s SJOIN %d %d %s +mnt :@%S", servername
, time(NULL
), time(NULL
), c_Forest
);
83 raw(":%S MODE %s +o %S", c_Forest
);
84 raw(":%S TOPIC %s :%s", c_Forest
, c_ForestTopic
);
86 sock_gets(sock
,buffer
,sizeof(buffer
)-1); /* -1 added thanks to
87 David Duchene <dave@ltd.com> for pointing out the possible
88 buffer overflow resulting from the linefeed added below. */
91 printf("Server: %s\n",buffer
);
95 long int loadtime
= time(NULL
);
97 long int oldTime
= loadtime
;
100 if (load_monsters() == false)
104 if (sock_gets(sock
,buffer
,sizeof(buffer
)) == -1) {
109 if (buffer
[0] == ':')
111 source
= strtok(buf
, " ");
112 cmd
= strtok(NULL
, " ");
115 cmd
= strtok(buf
, " ");
117 cout
<< "Server: " << buffer
<< endl
<< flush
;
119 // Wait N seconds then we're loaded.
122 if (time(NULL
) >= welcomedelay
+ loadtime
)
126 // Save the player data every updateperiod seconds
127 currentTime
= time(NULL
);
128 if (currentTime
- oldTime
>= updateperiod
)
130 oldTime
= currentTime
;
134 if (stricmp(cmd
, "PING") == 0) {
136 timestamp
= strtok(NULL
, "");
137 raw("PONG %s", timestamp
);
138 } else if (stricmp(cmd
, "VERSION") == 0) {
140 server
= strtok(NULL
, " ");
142 raw(":%s 351 %s %s %s. %s", servername
, source
+1, PACKAGE
, VERSION
, servername
);
143 } else if (strncmp(cmd
, "NICK", 4) == 0) {
144 if (buffer
[0] == ':')
147 if ((tempPtr
= find((source
+ 1))))
150 nick
= strtok(NULL
, " ");
151 tempPtr
->setNick(nick
);
158 nick
= strtok(NULL
, " ");
159 newuser
= new aClient(nick
);
161 notice(s_GameServ
, nick
, welcomemsg
, nick
);
163 clients
.insertAtBack(newuser
);
166 } else if (stricmp(cmd
, "QUIT") == 0) {
168 if ((quitter
= find(source
+ 1)))
169 clients
.remove(quitter
);
170 if ((quitter
= findIRCplayer(source
+ 1)))
172 quitter
->setNick("!NULL!");
173 quitter
->stats
->user
= NULL
; // Unidentify them
176 } else if (stricmp(cmd
, "PRIVMSG") == 0) {
178 dest
= strtok(NULL
, " ");
179 rest
= strtok(NULL
, "");
180 if (strnicmp(dest
, s_GameServ
, strlen(s_GameServ
)) == 0)
181 gameserv(source
, rest
);
182 else if (stricmp(dest
, c_Forest
) == 0)
183 forest(source
, rest
);
184 } else if (stricmp(cmd
, "JOIN") == 0) {
186 channel
= strtok(NULL
, " ");
187 if (stricmp(channel
, c_Forest
) == 0 && is_playing(source
+ 1))
188 raw(":%S MODE %s +v %s", c_Forest
, (source
+ 1));
191 } else if (stricmp(cmd
, "SJOIN") == 0) {
192 char *channel
, *nick
;
193 strtok(NULL
, " "); // Ignore the TS
194 strtok(NULL
, " "); // Ignore the TS
195 channel
= strtok(NULL
, " ");
197 nick
= strtok(NULL
, " ");
198 nick
++; // Get rid of the :
199 if (stricmp(channel
, c_Forest
) == 0 && is_playing(nick
))
200 raw(":%S MODE %s +v %s", channel
, nick
);
204 // cout << "Unrecognized Message: cmd = " << cmd << setw(30) << "source = " <<
217 printf("<CLOSED>\n");
219 unload_config_file();
223 aClient
*find(char *nick
)
225 return findbynick(nick
);
228 aClient
*find(const char *nick
)
230 return findbynick(nick
);
234 aClient
*findbynick(char *nick
)
236 ListNode
<aClient
> *newPtr
;
237 newPtr
= clients
.First();
239 aClient
*client
= NULL
;
243 client
= newPtr
->getData();
244 if (stricmp(client
->getNick(), nick
) == 0)
247 newPtr
= newPtr
->Next();
252 aClient
*findIRCplayer(const char *nick
)
254 ListNode
<aClient
> *newPtr
;
257 for (newPtr
= players
.First(); newPtr
; newPtr
= newPtr
->Next())
259 p
= newPtr
->getData();
260 if (stricmp(p
->getNick(), nick
) == 0)
266 aClient
*findplayer(const char *name
)
268 ListNode
<aClient
> *newPtr
;
271 for (newPtr
= players
.First(); newPtr
; newPtr
= newPtr
->Next())
273 p
= newPtr
->getData()->stats
;
274 if (stricmp(p
->name
, name
) == 0)
275 return newPtr
->getData();
281 aClient
*findbynick(const char *nick
)
283 ListNode
<aClient
> *newPtr
;
284 newPtr
= clients
.First();
286 aClient
*client
= NULL
;
290 client
= newPtr
->getData();
291 if (stricmp(client
->getNick(), nick
) == 0)
294 newPtr
= newPtr
->Next();
299 void load_timestamp()
303 infile
.open(".gstimestamp");
307 cout
<< "Error opening .gstimestamp" << endl
;
308 cout
<< "Generating new timestamp" << endl
;
310 timestamp
= midnight();
317 if (timestamp
< 1000000)
321 void save_timestamp()
325 outfile
.open(".gstimestamp");
329 cout
<< "Error creating new file." << endl
;
333 outfile
<< timestamp
<< endl
;
338 long int midnight(long int offset
)
340 return (time(NULL
) - (time(NULL
) % 86400)) + (offset
* 3600);