From a7a5b95990e0d6c1617c796dba2c45dab816161d Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Tue, 14 Mar 2017 14:06:14 +0100 Subject: Inviting --- command.c | 29 ++++++++++++++++++++++++++++- db.c | 22 ++++++++++++++++++++++ db.h | 3 ++- main.c | 1 + 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/command.c b/command.c index 9d5e2e8..30d2223 100644 --- a/command.c +++ b/command.c @@ -95,7 +95,7 @@ static bool cmd_register(struct conn_data *data,const char *tag,const char **arg static bool cmd_login(struct conn_data *data,const char *tag,const char **args){ i64 userid=db_find_user(args[0]); if(userid==-1){ - send_error(data->fd,tag,"Username does not exist"); + send_error(data->fd,tag,"User not found"); return false; } char *pass=db_get_pass(userid); @@ -144,6 +144,32 @@ static bool cmd_create_room(struct conn_data *data,const char *tag,const char ** return closed; } +static bool cmd_invite(struct conn_data *data,const char *tag,const char **args){ + if(data->userid==-1){ + send_error(data->fd,tag,"Not logged in"); + return false; + } + i64 roomid=db_find_room(args[0]); + if(roomid==-1){ + send_error(data->fd,tag,"Room not found"); + return false; + } + + i64 user2=db_find_user(args[1]); + if(user2==-1){ + send_error(data->fd,tag,"User not found"); + return false; + } + + if(!db_is_member(roomid,data->userid)){ + send_error(data->fd,tag,"Not in that room"); + return false; + } + + db_add_member(roomid,user2); + return send_ok(data->fd,tag); +} + struct cmd_info{ const char *cmdname; @@ -157,6 +183,7 @@ static const struct cmd_info commands[]={ {"login",2,true,cmd_login}, {"list_rooms",0,false,cmd_list_rooms}, {"create_room",0,false,cmd_create_room}, + {"invite",2,false,cmd_invite}, }; #define NCOMMANDS (sizeof(commands)/sizeof(commands[0])) diff --git a/db.c b/db.c index 1997c5a..9efbd4a 100644 --- a/db.c +++ b/db.c @@ -75,6 +75,28 @@ bool db_add_member(i64 roomid,i64 userid){ return success; } +bool db_is_member(i64 roomid,i64 userid){ + sqlite3_stmt *stmt; + SQLITE(prepare_v2,database,"select 1 from Members where room = ? and user = ?",-1,&stmt,NULL); + SQLITE(bind_int64,stmt,1,roomid); + SQLITE(bind_int64,stmt,2,userid); + bool success=sqlite3_step(stmt)==SQLITE_ROW; + SQLITE(finalize,stmt); + return success; +} + +i64 db_find_room(const char *name){ + sqlite3_stmt *stmt; + SQLITE(prepare_v2,database,"select id from Rooms where name = ?",-1,&stmt,NULL); + SQLITE(bind_text,stmt,1,name,-1,SQLITE_STATIC); + i64 roomid=-1; + if(sqlite3_step(stmt)==SQLITE_ROW){ + roomid=sqlite3_column_int64(stmt,0); + } + SQLITE(finalize,stmt); + return roomid; +} + struct db_room_list db_list_rooms(i64 userid){ sqlite3_stmt *stmt; SQLITE(prepare_v2,database, diff --git a/db.h b/db.h index 911103d..9dc926c 100644 --- a/db.h +++ b/db.h @@ -29,7 +29,8 @@ void db_close(void); struct db_name_id db_create_room(void); bool db_delete_room(i64 roomid); bool db_add_member(i64 roomid,i64 userid); -bool db_remove_member(i64 roomid,u64 userid); +bool db_remove_member(i64 roomid,i64 userid); +bool db_is_member(i64 roomid,i64 userid); i64 db_find_room(const char *name); // -1 if not found struct db_room_list db_list_rooms(i64 userid); diff --git a/main.c b/main.c index f059778..cfedf93 100644 --- a/main.c +++ b/main.c @@ -46,6 +46,7 @@ static struct conn_data* find_conn_data(int fd){ } static void delete_conn_data(int fd){ + debug("Deleting conn_data for fd=%d",fd); struct hash_item *item=conn_hash[fd%CONN_HASH_SIZE]; assert(item); if(item->cd.fd==fd){ -- cgit v1.2.3-70-g09d2