aboutsummaryrefslogtreecommitdiff
path: root/command.c
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-03-16 21:06:11 +0100
committertomsmeding <tom.smeding@gmail.com>2017-03-16 21:06:57 +0100
commit047e1828901b5b08cd538a7b11c0de2149606797 (patch)
tree9249612fe9bb88bf3063733744a6c02c391e5739 /command.c
parenta441b302c2c11c291df60fe642ec0d51646218dd (diff)
Basic message sending
TODO: broadcast to all online fd's of a user? TODO: close users that aren't reachable in a broadcast?
Diffstat (limited to 'command.c')
-rw-r--r--command.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/command.c b/command.c
index 3ede1cc..0f2cd06 100644
--- a/command.c
+++ b/command.c
@@ -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);