aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-03-14 14:06:14 +0100
committertomsmeding <tom.smeding@gmail.com>2017-03-14 14:06:14 +0100
commita7a5b95990e0d6c1617c796dba2c45dab816161d (patch)
treeac58c3975e4eb0b546669bbcfe658cacf8ebfd8b
parent230e9775f5b61e21aa085825fbbd0232e9a360ef (diff)
Inviting
-rw-r--r--command.c29
-rw-r--r--db.c22
-rw-r--r--db.h3
-rw-r--r--main.c1
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){