aboutsummaryrefslogtreecommitdiff
path: root/command.c
diff options
context:
space:
mode:
authorTom Smeding <tom.smeding@gmail.com>2020-07-27 21:22:42 +0200
committerTom Smeding <tom.smeding@gmail.com>2020-07-28 16:07:42 +0200
commite21ad3a5aa46635db9dc30b3395aa59588074932 (patch)
treeba055e0201d7329286be59dd8020d90ccea8d5b7 /command.c
parent909ada35ccb617344d244d4e76c9ce85fd2b922b (diff)
server: Protocol v2, DB v2: message replies
Diffstat (limited to 'command.c')
-rw-r--r--command.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/command.c b/command.c
index 8fa343d..ba8727e 100644
--- a/command.c
+++ b/command.c
@@ -232,8 +232,18 @@ static struct cmd_retval cmd_send(struct conn_data *data,const char *tag,const c
return RET_OK;
}
userdata_mark_active(data->userid,data->fd,true);
+
const char *roomname=args[0];
- const char *message=args[1];
+
+ i64 replyid;
+ if(!parse_i64(args[1],&replyid)){
+ debug("Connection fd=%d sent an invalid number for 'send': '%s'",
+ data->fd,args[1]);
+ return RET_CLOSE(true);
+ }
+
+ const char *message=args[2];
+
if(strlen(message)>MAX_MESSAGE_LEN){
net_send_error(data->fd,tag,"Message too long");
return RET_OK;
@@ -247,17 +257,22 @@ static struct cmd_retval cmd_send(struct conn_data *data,const char *tag,const c
net_send_error(data->fd,tag,"Not in that room");
return RET_OK;
}
+ if(replyid>=0&&!db_message_exists(roomid,replyid)){
+ net_send_error(data->fd,tag,"Replied-to message not found");
+ return RET_OK;
+ }
i64 timestamp=make_timestamp();
- i64 msgid=db_create_message(roomid,data->userid,make_timestamp(),message);
+ i64 msgid=db_create_message(roomid,data->userid,make_timestamp(),replyid,message);
bool closed=net_send_number(data->fd,tag,msgid);
char *pushbuf=NULL;
char *username=db_get_username(data->userid);
- i64 pushbuflen=asprintf(&pushbuf,"_push message %s %s %" PRIi64 " %" PRIi64 " %s\n",
- roomname,username,timestamp,msgid,message);
+ i64 pushbuflen=asprintf(&pushbuf,
+ "_push message %s %s %" PRIi64 " %" PRIi64 " %" PRIi64 " %s\n",
+ roomname,username,timestamp,msgid,replyid,message);
- event_emit_message(timestamp,message,username,roomname);
+ event_emit_message(timestamp,message,username,roomname,replyid);
firebase_send_message(roomname,roomid,username,message);
free(username);
@@ -317,9 +332,9 @@ static struct cmd_retval history_cmd_helper(
for(i64 i=ml.count-1;i>=0;i--){
char *username=db_get_username(ml.list[i].userid);
- len=asprintf(&buf,"%s history_message %" PRIi64 " %s %s %" PRIi64 " %" PRIi64 " %s\n",
+ len=asprintf(&buf,"%s history_message %" PRIi64 " %s %s %" PRIi64 " %" PRIi64 " %" PRIi64 " %s\n",
tag,ml.count-1-i,roomname,username,ml.list[i].timestamp,
- ml.list[i].msgid,ml.list[i].message);
+ ml.list[i].msgid,ml.list[i].replyid,ml.list[i].message);
free(username);
closed=net_send_raw_text(data->fd,buf,len);
free(buf);
@@ -421,7 +436,7 @@ static const struct cmd_info commands[COMMAND_HASH_MODULUS] = {
COMMAND_ENTRY('l', "list_members", 1, false, cmd_list_members),
COMMAND_ENTRY('c', "create_room", 0, false, cmd_create_room),
COMMAND_ENTRY('i', "invite", 2, false, cmd_invite),
- COMMAND_ENTRY('s', "send", 2, true, cmd_send),
+ COMMAND_ENTRY('s', "send", 3, true, cmd_send),
COMMAND_ENTRY('h', "history", 2, false, cmd_history),
COMMAND_ENTRY('h', "history_before", 3, false, cmd_history_before),
COMMAND_ENTRY('p', "ping", 0, false, cmd_ping),