3
* Author: Brent Hendricks
4
* Project: GGZ Text Client
6
* $Id: server.c 7147 2005-04-24 06:36:47Z josef $
8
* Functions for handling server events
10
* Copyright (C) 2000 Brent Hendricks.
12
* This program is free software; you can redistribute it and/or modify
13
* it under the terms of the GNU General Public License as published by
14
* the Free Software Foundation; either version 2 of the License, or
15
* (at your option) any later version.
17
* This program is distributed in the hope that it will be useful,
18
* but WITHOUT ANY WARRANTY; without even the implied warranty of
19
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
* GNU General Public License for more details.
22
* You should have received a copy of the GNU General Public License
23
* along with this program; if not, write to the Free Software
24
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
28
# include <config.h> /* Site-specific config */
46
extern char *dst_nick;
47
extern char *game_name;
49
static void server_register(GGZServer * server);
50
static void server_process(void);
52
static void checkplayer(void);
54
/* Hooks for server events */
55
static GGZHookReturn server_connected(GGZServerEvent id, const void *,
57
static GGZHookReturn server_connect_fail(GGZServerEvent id, const void *,
59
static GGZHookReturn server_negotiated(GGZServerEvent id, const void *,
61
static GGZHookReturn server_login_ok(GGZServerEvent id, const void *,
63
static GGZHookReturn server_login_fail(GGZServerEvent id, const void *,
65
static GGZHookReturn server_list_rooms(GGZServerEvent id, const void *,
67
static GGZHookReturn server_list_types(GGZServerEvent id, const void *,
69
static GGZHookReturn server_enter_ok(GGZServerEvent id, const void *,
71
static GGZHookReturn server_enter_fail(GGZServerEvent id, const void *,
73
static GGZHookReturn server_loggedout(GGZServerEvent id, const void *,
76
#ifdef GGZ_ENABLE_DEPRECATED
77
static GGZHookReturn server_channel_connected(GGZServerEvent id,
78
const void *, const void *);
79
static GGZHookReturn server_channel_ready(GGZServerEvent id, const void *,
83
static GGZHookReturn server_net_error(GGZServerEvent id, const void *,
85
static GGZHookReturn server_protocol_error(GGZServerEvent id, const void *,
88
static GGZHookReturn room_list_players(GGZRoomEvent id, const void *,
90
static GGZHookReturn room_list_tables(GGZRoomEvent id, const void *,
92
static GGZHookReturn room_enter(GGZRoomEvent id, const void *,
94
static GGZHookReturn room_leave(GGZRoomEvent id, const void *,
96
static GGZHookReturn room_table_launched(GGZRoomEvent id, const void *,
98
static GGZHookReturn room_table_launch_fail(GGZRoomEvent id, const void *,
100
static GGZHookReturn room_table_joined(GGZRoomEvent id, const void *,
102
static GGZHookReturn room_table_join_fail(GGZRoomEvent id, const void *,
104
static GGZHookReturn room_table_left(GGZRoomEvent id, const void *,
106
static GGZHookReturn room_table_leave_fail(GGZRoomEvent id, const void *,
108
static GGZHookReturn room_table_update(GGZRoomEvent id, const void *,
111
GGZServer *server = NULL;
113
static int playing = 0;
115
extern GGZGame *game;
117
int server_init(char *host, int port, GGZLoginType type, char *login,
121
opt.flags = GGZ_OPT_PARSER | GGZ_OPT_MODULES;
124
server = ggzcore_server_new();
125
ggzcore_server_set_hostinfo(server, host, port, 0);
126
ggzcore_server_set_logininfo(server, type, login, password, NULL);
127
server_register(server);
129
return ggzcore_server_connect(server);
132
static void server_process(void)
135
int fd = ggzcore_server_get_fd(server);
136
ggzcore_server_read_data(server, fd);
140
static void server_register(GGZServer * server)
142
ggzcore_server_add_event_hook(server, GGZ_CONNECTED,
144
ggzcore_server_add_event_hook(server, GGZ_CONNECT_FAIL,
145
server_connect_fail);
146
ggzcore_server_add_event_hook(server, GGZ_NEGOTIATED,
148
ggzcore_server_add_event_hook(server, GGZ_NEGOTIATE_FAIL,
149
server_connect_fail);
150
ggzcore_server_add_event_hook(server, GGZ_LOGGED_IN,
152
ggzcore_server_add_event_hook(server, GGZ_LOGIN_FAIL,
154
ggzcore_server_add_event_hook(server, GGZ_ROOM_LIST,
156
ggzcore_server_add_event_hook(server, GGZ_TYPE_LIST,
158
ggzcore_server_add_event_hook(server, GGZ_ENTERED,
160
ggzcore_server_add_event_hook(server, GGZ_ENTER_FAIL,
162
ggzcore_server_add_event_hook(server, GGZ_LOGOUT,
164
ggzcore_server_add_event_hook(server, GGZ_NET_ERROR,
166
ggzcore_server_add_event_hook(server, GGZ_PROTOCOL_ERROR,
167
server_protocol_error);
168
#ifdef GGZ_ENABLE_DEPRECATED
169
ggzcore_server_add_event_hook(server, GGZ_CHANNEL_CONNECTED,
170
server_channel_connected);
171
ggzcore_server_add_event_hook(server, GGZ_CHANNEL_READY,
172
server_channel_ready);
176
static void room_register(GGZRoom * room)
178
ggzcore_room_add_event_hook(room, GGZ_PLAYER_LIST,
180
ggzcore_room_add_event_hook(room, GGZ_TABLE_LIST,
182
ggzcore_room_add_event_hook(room, GGZ_ROOM_ENTER, room_enter);
183
ggzcore_room_add_event_hook(room, GGZ_ROOM_LEAVE, room_leave);
184
ggzcore_room_add_event_hook(room, GGZ_TABLE_LAUNCHED,
185
room_table_launched);
186
ggzcore_room_add_event_hook(room, GGZ_TABLE_LAUNCH_FAIL,
187
room_table_launch_fail);
188
ggzcore_room_add_event_hook(room, GGZ_TABLE_JOINED,
190
ggzcore_room_add_event_hook(room, GGZ_TABLE_JOIN_FAIL,
191
room_table_join_fail);
192
ggzcore_room_add_event_hook(room, GGZ_TABLE_LEFT, room_table_left);
193
ggzcore_room_add_event_hook(room, GGZ_TABLE_LEAVE_FAIL,
194
room_table_leave_fail);
195
ggzcore_room_add_event_hook(room, GGZ_TABLE_UPDATE,
199
static GGZHookReturn server_connected(GGZServerEvent id,
200
const void *event_data,
201
const void *user_data)
204
fd = ggzcore_server_get_fd(server);
205
loop_add_fd(fd, server_process, NULL);
210
static GGZHookReturn server_connect_fail(GGZServerEvent id,
211
const void *event_data,
212
const void *user_data)
214
const char *msg = event_data;
216
fprintf(stderr, _("Connection failed: %s\n"), msg);
221
static GGZHookReturn server_negotiated(GGZServerEvent id,
222
const void *event_data,
223
const void *user_data)
225
ggzcore_server_login(server);
229
static GGZHookReturn server_login_ok(GGZServerEvent id,
230
const void *event_data,
231
const void *user_data)
233
ggzcore_server_list_rooms(server, -1, 1);
238
static GGZHookReturn server_login_fail(GGZServerEvent id,
239
const void *event_data,
240
const void *user_data)
242
const char *msg = event_data;
244
fprintf(stderr, _("Login failed: %s\n"), msg);
246
/* For the time being disconnect at not to confuse us */
247
ggzcore_server_logout(server);
252
static GGZModule *pick_module(GGZGameType * gt)
254
const char *name = ggzcore_gametype_get_name(gt);
255
const char *engine = ggzcore_gametype_get_prot_engine(gt);
256
const char *version = ggzcore_gametype_get_prot_version(gt);
259
num = ggzcore_module_get_num_by_type(name, engine, version);
262
fprintf(stderr, _("Game is not installed!\n"));
266
return ggzcore_module_get_nth_by_type(name, engine, version, 0);
269
static GGZHookReturn server_enter_ok(GGZServerEvent id,
270
const void *event_data,
271
const void *user_data)
275
room = ggzcore_server_get_cur_room(server);
276
if (ggzcore_room_get_num_players(room) > 0) {
277
} else { /* Get list from server */
278
ggzcore_room_list_players(room);
284
static GGZHookReturn server_enter_fail(GGZServerEvent id,
285
const void *event_data,
286
const void *user_data)
288
const char *msg = event_data;
290
fprintf(stderr, _("Enter failed: %s\n"), msg);
295
static GGZHookReturn server_loggedout(GGZServerEvent id,
296
const void *event_data,
297
const void *user_data)
303
static GGZHookReturn server_net_error(GGZServerEvent id,
304
const void *event_data,
305
const void *user_data)
311
static GGZHookReturn server_protocol_error(GGZServerEvent id,
312
const void *event_data,
313
const void *user_data)
315
const char *msg = event_data;
317
fprintf(stderr, _("Server error: %s disconnected\n"), msg);
323
static GGZHookReturn room_list_players(GGZRoomEvent id,
324
const void *event_data,
325
const void *user_data)
328
room = ggzcore_server_get_cur_room(server);
329
ggzcore_room_list_tables(room, 0, 0);
333
static GGZHookReturn room_list_tables(GGZRoomEvent id,
334
const void *event_data,
335
const void *user_data)
341
static void checkplayer()
344
GGZPlayer *player = NULL;
348
int i, table_id, found;
360
room = ggzcore_server_get_cur_room(server);
364
} else if (!strcmp(dst_nick, "")) {
369
for (i = 0; i < ggzcore_room_get_num_players(room); i++) {
370
player = ggzcore_room_get_nth_player(room, i);
372
(ggzcore_player_get_name(player),
380
("checkplayer: The player %s could not be found.\n"),
385
table = ggzcore_player_get_table(player);
387
printf(_("checkplayer: %s not at a table?\n"),
391
table_id = ggzcore_table_get_id(table);
394
gt = ggzcore_room_get_gametype(room);
396
printf(_("checkplayer: room without gametype?\n"));
399
module = pick_module(gt);
403
printf(_("checkplayer: We're playing...\n"));
410
game_init(module, gt, table_id, NULL, bot);
414
static GGZHookReturn room_enter(GGZRoomEvent id, const void *event_data,
415
const void *user_data)
421
static GGZHookReturn room_leave(GGZRoomEvent id, const void *event_data,
422
const void *user_data)
427
static GGZHookReturn room_table_launched(GGZRoomEvent id,
428
const void *event_data,
429
const void *user_data)
435
static GGZHookReturn room_table_launch_fail(GGZRoomEvent id,
436
const void *event_data,
437
const void *user_data)
439
const char *err_msg = event_data;
441
fprintf(stderr, _("Table launch failed: %s\n"), err_msg);
447
static GGZHookReturn room_table_joined(GGZRoomEvent id,
448
const void *event_data,
449
const void *user_data)
454
static GGZHookReturn room_table_join_fail(GGZRoomEvent id,
455
const void *event_data,
456
const void *user_data)
458
const char *err_msg = event_data;
460
fprintf(stderr, _("Table join failed: %s\n"), err_msg);
465
static GGZHookReturn room_table_left(GGZRoomEvent id,
466
const void *event_data,
467
const void *user_data)
473
static GGZHookReturn room_table_update(GGZRoomEvent id,
474
const void *event_data,
475
const void *user_data)
481
static GGZHookReturn room_table_leave_fail(GGZRoomEvent id,
482
const void *event_data,
483
const void *user_data)
485
fprintf(stderr, _("Table leave failed\n"));
489
static GGZHookReturn server_list_rooms(GGZServerEvent id,
490
const void *event_data,
491
const void *user_data)
495
/* Register callbacks for all rooms */
496
num = ggzcore_server_get_num_rooms(server);
497
for (i = 0; i < num; i++)
498
room_register(ggzcore_server_get_nth_room(server, i));
499
ggzcore_server_list_gametypes(server, 0);
503
static GGZHookReturn server_list_types(GGZServerEvent id,
504
const void *event_data,
505
const void *user_data)
513
num = ggzcore_server_get_num_rooms(server);
515
for (i = 0; i < num; i++) {
516
room = ggzcore_server_get_nth_room(server, i);
517
type = ggzcore_room_get_gametype(room);
519
name = ggzcore_gametype_get_name(type);
520
if (name && game_name
521
&& strcmp(name, game_name) == 0) {
522
ggzcore_server_join_room(server, i);
530
_("Game type %s not found on the server\n"),
534
#ifdef GGZ_ENABLE_DEPRECATED
538
static GGZHookReturn server_channel_connected(GGZServerEvent id,
539
const void *event_data,
540
const void *user_data)
542
game_channel_connected(ggzcore_server_get_channel(server));
546
static GGZHookReturn server_channel_ready(GGZServerEvent id,
547
const void *event_data,
548
const void *user_data)
550
game_channel_ready(ggzcore_server_get_channel(server));