diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 20 |
1 files changed, 18 insertions, 2 deletions
@@ -134,10 +134,26 @@ i64 list_find_d(void **d,i64 len,void *value){ #define LIST_FIND(_list,_value) list_find_d((void**)(_list)->d,(_list)->len,(void*)(_value)) +void room_broadcast_line(Room *room,const char *line){ + for(i64 i=0;i<room->members.len;i++){ + tcp_send_line(room->members.d[i]->sock,line); + } +} + +__attribute__((format (printf,2,3))) +void room_broadcast_line_f(Room *room,const char *format,...){ + va_list ap; + va_start(ap,format); + char *buf; + if(vasprintf(&buf,format,ap)<0)throw("vasprintf: allocation error"); + room_broadcast_line(room,buf); + free(buf); +} + //Returns false iff conn was already in specified room. bool room_join(Room *room,Connection *conn){ if(LIST_FIND(&room->members,conn)!=-1)return false; - //TODO: notify other members + room_broadcast_line_f(room,"room_join %s %s %" PRIi64,room->gameid,room->roomid,conn->id); clist_add(&room->members,conn); rlist_add(&conn->rooms,room); return true; @@ -151,7 +167,7 @@ bool room_leave(Room *room,Connection *conn){ if(idx==-1)return false; clist_remove(&room->members,conn); rlist_remove(&conn->rooms,room); - //TODO: notify other members + room_broadcast_line_f(room,"room_leave %s %s %" PRIi64,room->gameid,room->roomid,conn->id); if(room->members.len==0){ room_destroy(room); } |