diff options
Diffstat (limited to 'command.c')
-rw-r--r-- | command.c | 26 |
1 files changed, 25 insertions, 1 deletions
@@ -7,6 +7,7 @@ #include <sys/socket.h> #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;i<members.count;i++){ + int fd=userdata_online(members.list[i].id); + if(fd!=-1&&fd!=data->fd){ + 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); |