From 047e1828901b5b08cd538a7b11c0de2149606797 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Thu, 16 Mar 2017 21:06:11 +0100 Subject: Basic message sending TODO: broadcast to all online fd's of a user? TODO: close users that aren't reachable in a broadcast? --- command.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'command.c') diff --git a/command.c b/command.c index 3ede1cc..0f2cd06 100644 --- a/command.c +++ b/command.c @@ -7,6 +7,7 @@ #include #include "command.h" #include "db.h" +#include "user_data.h" static i64 make_timestamp(void){ @@ -89,6 +90,15 @@ static bool send_list(int fd,const char *tag,i64 count,const char **list){ return send_raw_text(fd,"\n",1); } +static bool send_push(int fd,const char *head,const char *arg){ + char *buf=NULL; + i64 len=asprintf(&buf,"_push %s %s\n",head,arg); + assert(buf); + bool closed=send_raw_text(fd,buf,len); + free(buf); + return closed; +} + static bool cmd_register(struct conn_data *data,const char *tag,const char **args){ i64 userid=db_find_user(args[0]); @@ -109,8 +119,12 @@ static bool cmd_login(struct conn_data *data,const char *tag,const char **args){ char *pass=db_get_pass(userid); bool success=strcmp(args[1],pass)==0; free(pass); + if(data->userid!=-1){ + userdata_unregister(data->userid,data->fd); + } if(success){ data->userid=userid; + userdata_register(userid,data->fd); send_ok(data->fd,tag); } else { data->userid=-1; @@ -196,7 +210,16 @@ static bool cmd_send(struct conn_data *data,const char *tag,const char **args){ db_create_message(roomid,data->userid,make_timestamp(),args[1]); bool closed=send_ok(data->fd,tag); -#warning TODO: broadcast + struct db_user_list members=db_get_members(roomid); + for(i64 i=0;ifd){ + send_push(fd,"message",args[1]); + // TODO: unregister and close users that aren't reachable anymore; maybe ping instead? + } + } + + return closed; } @@ -219,6 +242,7 @@ static const struct cmd_info commands[]={ bool handle_input_line(struct conn_data *data,char *line,size_t linelen){ + line[linelen]='\0'; char *sepp=memchr(line,' ',linelen); if(sepp==NULL){ debug("No space in input line from connection %d",data->fd); -- cgit v1.2.3-54-g00ecf