From 430827002da0a87d7e9c14e2b6929ffa5228afc1 Mon Sep 17 00:00:00 2001 From: Johnny Richard Date: Fri, 22 Apr 2022 02:14:33 +0200 Subject: server: Add JOIN message parser --- server.c | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/server.c b/server.c index ab8d193..d86b00b 100644 --- a/server.c +++ b/server.c @@ -35,9 +35,11 @@ static void server_handle_client_data(server_t *server, struct epoll_event *event); static void server_handle_server_data(server_t *server, struct epoll_event *event); static void server_client_msg_dipatcher(server_t *server, client_t *client); +static void server_on_nick_msg(server_t *server, client_t *client, string_view_t msg); static void server_on_user_msg(server_t *server, client_t *client, string_view_t msg); static void server_on_ping_msg(server_t *server, client_t *client, string_view_t msg); static void server_on_privmsg_msg(server_t *server, client_t *client, string_view_t msg); +static void server_on_join_msg(server_t *server, client_t *client, string_view_t msg); void server_init(server_t *server, uint32_t port) @@ -216,12 +218,18 @@ server_handle_client_data(server_t *server, struct epoll_event *event) static void server_client_msg_dipatcher(server_t *server, client_t *client) { - string_view_t msg = string_view_from_cstr(client->msg_buf); + string_view_t msg; + msg = string_view_from_cstr(client->msg_buf); + msg = string_view_chop_by_delim(&msg, '\r'); + string_view_t msg_type = string_view_chop_by_delim(&msg, ' '); if (msg_type.size == 0) { return; } + if (string_view_eq(msg_type, string_view_from_cstr("NICK"))) { + return server_on_nick_msg(server, client, msg); + } if (string_view_eq(msg_type, string_view_from_cstr("USER"))) { return server_on_user_msg(server, client, msg); } @@ -231,6 +239,9 @@ server_client_msg_dipatcher(server_t *server, client_t *client) if (string_view_eq(msg_type, string_view_from_cstr("PRIVMSG"))) { return server_on_privmsg_msg(server, client, msg); } + if (string_view_eq(msg_type, string_view_from_cstr("JOIN"))) { + return server_on_join_msg(server, client, msg); + } } static void @@ -246,6 +257,18 @@ server_on_user_msg(server_t *server, ); } +static void +server_on_nick_msg(server_t *server, + client_t *client, + string_view_t msg) +{ + hash_table_remove(server->client_table, client->nick); + + sprintf(client->nick, SVFMT, SVARG(&msg)); + + hash_table_insert(server->client_table, client->nick, client); +} + static void server_on_ping_msg(server_t *server, client_t *client, @@ -274,3 +297,18 @@ server_on_privmsg_msg(server_t *server, string_view_chop_by_delim(&msg, ':'); client_send_msg(client_receiver, ":%s PRIVMSG %s :%.*s\n", client->nick, client_receiver->nick, msg.size, msg.data); } + +static void +server_on_join_msg(server_t *server, + client_t *client, + string_view_t msg) +{ + // FIXME: Create server channel hash_table + client_send_msg( + client, + ":%s!~%s@localhost JOIN "SVFMT"\n", + client->nick, + client->nick, + SVARG(&msg) + ); +} -- cgit v1.2.3