summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..1dcdc1f
--- /dev/null
+++ b/main.c
@@ -0,0 +1,90 @@
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdarg.h>
+#include <sys/socket.h>
+#include <sys/select.h>
+#include <termio.h>
+#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);
+ }
+}
+
+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 public rooms","Create a room","Join a room",
+ "Quit",NULL);
+ 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;i<list->nitems&&i+7<termsize.h;i++){
+ tprintf("Room: %s\n",list->items[i]);
+ }
+ break;
+ }
+
+ case 1: break;
+ case 2: break;
+ case 3: return 0;
+ }
+ }
+}