]> git.lizzy.rs Git - dragonblocks_alpha.git/blob - src/server/server.c
Use different database files
[dragonblocks_alpha.git] / src / server / server.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <dragonnet/addr.h>
4 #include "interrupt.h"
5 #include "server/database.h"
6 #include "server/server.h"
7 #include "server/server_map.h"
8 #include "server/server_player.h"
9 #include "util.h"
10
11 DragonnetListener *server;
12
13 static bool on_recv(DragonnetPeer *peer, DragonnetTypeId type, unused void *pkt)
14 {
15         return ((ServerPlayer *) peer->extra)->auth != (type == DRAGONNET_TYPE_ToServerAuth);
16 }
17
18 static void on_ToServerAuth(DragonnetPeer *peer, ToServerAuth *pkt)
19 {
20         if (server_player_auth(peer->extra, pkt->name))
21                 pkt->name = NULL;
22 }
23
24 // set a node on the map
25 static void on_ToServerSetnode(unused DragonnetPeer *peer, ToServerSetnode *pkt)
26 {
27         map_set_node(server_map.map, pkt->pos, map_node_create(pkt->node, (Blob) {0, NULL}), false, NULL);
28 }
29
30 // update player's position
31 static void on_ToServerPos(DragonnetPeer *peer, ToServerPos *pkt)
32 {
33         ServerPlayer *player = peer->extra;
34
35         pthread_rwlock_wrlock(&player->pos_lock);
36         player->pos = pkt->pos;
37         database_update_player_pos(player->name, player->pos);
38         pthread_rwlock_unlock(&player->pos_lock);
39 }
40
41 // tell server map manager client requested the block
42 static void on_ToServerRequestBlock(DragonnetPeer *peer, ToServerRequestBlock *pkt)
43 {
44         server_map_requested_block(peer->extra, pkt->pos);
45 }
46
47 // server entry point
48 int main(int argc, char **argv)
49 {
50         if (argc < 2) {
51                 fprintf(stderr, "Missing address\n");
52                 return EXIT_FAILURE;
53         }
54
55         if (! (server = dragonnet_listener_new(argv[1]))) {
56                 fprintf(stderr, "Failed to listen to connections\n");
57                 return EXIT_FAILURE;
58         }
59
60         char *address = dragonnet_addr_str(server->laddr);
61         printf("Listening on %s\n", address);
62         free(address);
63
64         server->on_connect = &server_player_add;
65         server->on_disconnect = &server_player_remove;
66         server->on_recv = &on_recv;
67         server->on_recv_type[DRAGONNET_TYPE_ToServerAuth] =         (void *) &on_ToServerAuth;
68         server->on_recv_type[DRAGONNET_TYPE_ToServerSetnode] =      (void *) &on_ToServerSetnode;
69         server->on_recv_type[DRAGONNET_TYPE_ToServerPos] =          (void *) &on_ToServerPos;
70         server->on_recv_type[DRAGONNET_TYPE_ToServerRequestBlock] = (void *) &on_ToServerRequestBlock;
71
72         interrupt_init();
73
74         if (! database_init())
75                 return EXIT_FAILURE;
76
77         server_map_init();
78         server_player_init();
79
80         server_map_prepare_spawn();
81         dragonnet_listener_run(server);
82
83         flag_wait(interrupt);
84
85         printf("Shutting down\n");
86         dragonnet_listener_close(server);
87
88         server_player_deinit();
89         server_map_deinit();
90         database_deinit();
91         interrupt_deinit();
92
93         dragonnet_listener_delete(server);
94
95         return EXIT_SUCCESS;
96 }