diff options
-rw-r--r-- | command.c | 11 | ||||
-rw-r--r-- | user_data.c | 10 | ||||
-rw-r--r-- | user_data.h | 4 |
3 files changed, 17 insertions, 8 deletions
@@ -212,10 +212,13 @@ static bool cmd_send(struct conn_data *data,const char *tag,const char **args){ 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? + i64 nfds; + const int *fds=userdata_online(members.list[i].id,&nfds); + if(nfds<=0)continue; + for(i64 j=0;j<nfds;j++){ + if(fds[j]!=data->fd){ + send_push(fds[j],"message",args[1]); + } } } diff --git a/user_data.c b/user_data.c index 77e09cc..65587ad 100644 --- a/user_data.c +++ b/user_data.c @@ -64,9 +64,13 @@ void userdata_unregister(i64 userid,int fd){ item->data.fds_len--; } -int userdata_online(i64 userid){ +const int* userdata_online(i64 userid,i64 *nfds){ struct hash_item *item=find_userdata(userid); - if(!item)return false; + if(!item){ + *nfds=0; + return NULL; + } assert(item->data.fds_len!=0); - return item->data.fds[0]; // TODO: return all fds in some way? + *nfds=item->data.fds_len; + return item->data.fds; } diff --git a/user_data.h b/user_data.h index 4b4fc10..094ad75 100644 --- a/user_data.h +++ b/user_data.h @@ -5,4 +5,6 @@ void userdata_register(i64 userid,int fd); void userdata_unregister(i64 userid,int fd); -int userdata_online(i64 userid); // Returns fd + +// Returns array of nfds fd's; valid until next call to (un)register +const int* userdata_online(i64 userid,i64 *nfds); |