#define _GNU_SOURCE #include #include #include #include #include #include #include #include #include "memory.h" #include "showmenu.h" #include "tcp.h" #define HOSTNAME "localhost" #define PORT 1423 #define GAMENAME "regexbattle" static char *die_message=NULL; __attribute__((noreturn, format (printf,1,2))) static void die(const char *format,...){ va_list ap; va_start(ap,format); char *buf; int ret=vasprintf(&buf,format,ap); va_end(ap); if(ret<0){ die_message=strdup("Double error roll"); } else { die_message=buf; } exit(1); } static void exit_cleanup(void){ endkeyboard(); endscreen(); if(die_message!=NULL){ printf("%s\n",die_message); } } char* show_prompt(int x,int y,int w,const char *title){ Promptwidget *prw=prw_make(x,y,w,title); char *line=NULL; while(line==NULL){ redraw(); int key=tgetkey(); if(key==KEY_ESC)break; line=prw_handlekey(prw,key); } prw_destroy(prw); return line; } static void room_create(int sock,const char *name){ tcp_send_line_f(sock,"room_create " GAMENAME " %s 0 2",name); if(tcp_read_ok(sock,"room_create")==-1){ moveto(1,7); tprintf("Room name already exists."); redraw(); return; } //TODO: do something with the created room } static void room_join(int sock,const char *name){} int main(void){ int sock=tcp_connect(HOSTNAME,PORT); if(sock==-1){ printf("Could not connect to %s:%d\n",HOSTNAME,PORT); return 1; } char *recvbuf=NULL; i64 recvbufsz=0; tcp_send_line(sock,"ping"); tcp_read_line(sock,&recvbuf,&recvbufsz); if(strcmp(recvbuf,"pong")!=0){ printf("Protocol error; different server running on %s:%d?\n",HOSTNAME,PORT); return 1; } initscreen(); initkeyboard(false); installCLhandler(true); atexit(exit_cleanup); clearscreen(); while(true){ i64 sel=showmenu("REGEXBATTLE", "List open public games","Create a new game","Join an open game", "Quit",NULL); Size termsize=gettermsize(); fillrect(0,7,termsize.w,termsize.h-7,' '); switch(sel){ case 0: { tcp_send_line(sock,"room_list " GAMENAME); TcpList *list=tcp_read_list(sock,"room_list"); if(list==NULL)die("Protocol error: receiving list"); Size termsize=gettermsize(); fillrect(0,7,termsize.w,termsize.h-7,' '); moveto(0,7); for(i64 i=0;initems&&i+7items[i]); } tcp_list_destroy(list); break; } case 1: { char *line=show_prompt(2,8,20,"Game name to create"); Size termsize=gettermsize(); fillrect(0,7,termsize.w,termsize.h-7,' '); if(line!=NULL){ room_create(sock,line); free(line); } break; } case 2: { char *line=show_prompt(2,8,20,"Game name to join"); Size termsize=gettermsize(); fillrect(0,7,termsize.w,termsize.h-7,' '); if(line!=NULL){ room_join(sock,line); free(line); } break; } case 3: return 0; } } }