X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Fclient%2Fmain.c;h=204a61e0afb653e8f3a889b9fce64384c8bbbc95;hb=aab09714f5780d2d7eeb7f1f94a624e0535bdb22;hp=4072bd0e37c38c245c4913eba7f8d4b0e991efb7;hpb=399c1a3a2a1eb9c81ec0f7bdfb1512bdd2e41c6a;p=tpg%2Fopendispense2.git diff --git a/src/client/main.c b/src/client/main.c index 4072bd0..204a61e 100644 --- a/src/client/main.c +++ b/src/client/main.c @@ -23,7 +23,7 @@ #include #include #include -#include // SHA1 +//#include // SHA1 #define USE_NCURSES_INTERFACE 0 #define DEBUG_TRACE_SERVER 0 @@ -87,7 +87,7 @@ void PopulateItemList(int Socket); int Dispense_ShowUser(int Socket, const char *Username); void _PrintUserLine(const char *Line); int Dispense_AddUser(int Socket, const char *Username); - int Dispense_SetUserType(int Socket, const char *Username, const char *TypeString); + int Dispense_SetUserType(int Socket, const char *Username, const char *TypeString, const char *Reason); int Dispense_SetItem(int Socket, const char *Type, int ID, int NewPrice, const char *NewName); // --- Helpers --- char *ReadLine(int Socket); @@ -97,7 +97,7 @@ char *trim(char *string); void CompileRegex(regex_t *regex, const char *pattern, int flags); // === GLOBALS === -char *gsDispenseServer = "heathred"; +char *gsDispenseServer = "merlo.ucc.gu.uwa.edu.au"; int giDispensePort = 11020; tItem *gaItems; @@ -146,6 +146,11 @@ void ShowUsage(void) " dispense iteminfo \n" " Get the name and price for an item\n" ); +// if( giTextArgc == 0 || strcmp(gsTextArgs[0], "enumitems") == 0 ) +// printf( +// " dispense enumitems\n" +// " List avaliable items\n" +// ); if( giTextArgc == 0 ) printf(" == Coke members == \n"); if( giTextArgc == 0 || strcmp(gsTextArgs[0], "acct") == 0 ) @@ -161,6 +166,8 @@ void ShowUsage(void) printf( " dispense refund []\n" " Refund an item to a user (with optional price override)\n" + " Item IDs can be seen in the cokelog (in the brackets after the item name)\n" + " e.g. coke:6 for a coke, snack:33 for slot 33 of the snack machine\n" ); if( giTextArgc == 0 || strcmp(gsTextArgs[0], "slot") == 0 ) printf( @@ -173,7 +180,7 @@ void ShowUsage(void) printf( " dispense user add \n" " Create new account\n" - " dispense user type \n" + " dispense user type \n" " Alter a user's flags\n" " is a comma-separated list of user, coke, admin, internal or disabled\n" " Flags are removed by preceding the name with '-' or '!'\n" @@ -332,7 +339,7 @@ int main(int argc, char *argv[]) ShowUsage(); return RV_ARGUMENTS; } - if( giTextArgc + 1 == MAX_TXT_ARGS ) + if( giTextArgc == MAX_TXT_ARGS ) { fprintf(stderr, "ERROR: Too many arguments\n"); return RV_ARGUMENTS; @@ -344,7 +351,7 @@ int main(int argc, char *argv[]) continue; } - if( giTextArgc + 1 == MAX_TXT_ARGS ) + if( giTextArgc == MAX_TXT_ARGS ) { fprintf(stderr, "ERROR: Too many arguments\n"); return RV_ARGUMENTS; @@ -402,7 +409,11 @@ int main(int argc, char *argv[]) ret = Dispense_AlterBalance(sock, gsTextArgs[1], atoi(gsTextArgs[2]), gsTextArgs[3]); } } - // TODO: Preserve ret if non-zero + // On error, quit + if( ret ) { + close(sock); + return ret; + } // Show user information ret = Dispense_ShowUser(sock, gsTextArgs[1]); @@ -473,13 +484,16 @@ int main(int argc, char *argv[]) // Update a user else if( strcmp(gsTextArgs[1], "type") == 0 || strcmp(gsTextArgs[1], "flags") == 0 ) { - if( giTextArgc != 4 ) { + if( giTextArgc < 4 || giTextArgc > 5 ) { fprintf(stderr, "Error: `dispense user type` requires two arguments\n"); ShowUsage(); return RV_ARGUMENTS; } - ret = Dispense_SetUserType(sock, gsTextArgs[2], gsTextArgs[3]); + if( giTextArgc == 4 ) + ret = Dispense_SetUserType(sock, gsTextArgs[2], gsTextArgs[3], ""); + else + ret = Dispense_SetUserType(sock, gsTextArgs[2], gsTextArgs[3], gsTextArgs[4]); } else { @@ -547,7 +561,7 @@ int main(int argc, char *argv[]) // TODO: More close(sock); - return RV_UNKNOWN_ERROR; + return ret; } // Query an item price else if( strcmp(gsTextArgs[0], "iteminfo") == 0 ) @@ -807,10 +821,10 @@ int main(int argc, char *argv[]) if( j > 1 ) { printf("%i items dispensed\n", j); } + Dispense_ShowUser(sock, gsUserName); close(sock); - } - Dispense_ShowUser(sock, gsUserName); + } return ret; } @@ -1020,7 +1034,6 @@ int ShowNCursesUI(void) */ int ShowItemAt(int Row, int Col, int Width, int Index, int bHilighted) { - int _x, _y, times; char *name = NULL; int price = 0; int status = -1; @@ -1098,6 +1111,13 @@ int ShowItemAt(int Row, int Col, int Width, int Index, int bHilighted) break; } + if( price > 100*100 ) { + nameWidth --; + } + if( price > 1000*100 ) { + nameWidth --; + } + printw("%-*.*s", nameWidth, nameWidth, name); // getyx(stdscr, _y, _x); @@ -1105,20 +1125,18 @@ int ShowItemAt(int Row, int Col, int Width, int Index, int bHilighted) // times = Width - 5 - (_x - Col); // TODO: Better handling for large prices // while(times--) addch(' '); + // 999.99 should be enough printw(" %4i", price); } else { - printw("-- %s", name); - getyx(stdscr, _y, _x); - times = Width - 4 - (_x - Col); - while(times--) addch(' '); - printw(" "); +// int _x, _y, times; + printw("-- %-*.*s ", Width-4, Width-4, name); } } // If the item isn't availiable for sale, return -1 (so it's skipped) - if( status || price >= giUserBalance ) + if( status || price > giUserBalance ) Index = -1; return Index; @@ -1530,7 +1548,7 @@ void PopulateItemList(int Socket) char *buf; int responseCode; - char *itemType, *itemStart; + char *arrayType; int count, i; regmatch_t matches[4]; @@ -1553,19 +1571,16 @@ void PopulateItemList(int Socket) // 202 Item RunRegex(&gArrayRegex, buf, 4, matches, "Malformed server response"); - itemType = &buf[ matches[2].rm_so ]; buf[ matches[2].rm_eo ] = '\0'; + arrayType = &buf[ matches[2].rm_so ]; buf[ matches[2].rm_eo ] = '\0'; count = atoi( &buf[ matches[3].rm_so ] ); // Check array type - if( strcmp(itemType, "Items") != 0 ) { + if( strcmp(arrayType, "Items") != 0 ) { // What the?! fprintf(stderr, "Unexpected array type, expected 'Items', got '%s'\n", - itemType); + arrayType); exit(RV_UNKNOWN_ERROR); } - - itemStart = &buf[ matches[3].rm_eo ]; - free(buf); giNumItems = count; @@ -1680,7 +1695,7 @@ int DispenseItem(int Socket, const char *Type, int ID) int Dispense_AlterBalance(int Socket, const char *Username, int Ammount, const char *Reason) { char *buf; - int responseCode; + int responseCode, rv = -1; // Check for a dry run if( gbDryRun ) { @@ -1698,26 +1713,32 @@ int Dispense_AlterBalance(int Socket, const char *Username, int Ammount, const c buf = ReadLine(Socket); responseCode = atoi(buf); - free(buf); switch(responseCode) { - case 200: return 0; // OK + case 200: + rv = 0; // OK + break; case 402: fprintf(stderr, "Insufficient balance\n"); - return RV_BAD_ITEM; + rv = RV_BAD_ITEM; + break; case 403: // Not in coke fprintf(stderr, "You are not in coke (sucker)\n"); - return RV_PERMISSIONS; + rv = RV_PERMISSIONS; + break; case 404: // Unknown user fprintf(stderr, "Unknown user '%s'\n", Username); - return RV_INVALID_USER; + rv = RV_INVALID_USER; + break; default: - fprintf(stderr, "Unknown response code %i\n", responseCode); - return RV_UNKNOWN_RESPONSE; + fprintf(stderr, "Unknown response code %i\n'%s'\n", responseCode, buf); + rv = RV_UNKNOWN_RESPONSE; + break; } + free(buf); - return -1; + return rv; } /** @@ -2080,7 +2101,7 @@ int Dispense_AddUser(int Socket, const char *Username) return ret; } -int Dispense_SetUserType(int Socket, const char *Username, const char *TypeString) +int Dispense_SetUserType(int Socket, const char *Username, const char *TypeString, const char *Reason) { char *buf; int responseCode, ret; @@ -2093,7 +2114,7 @@ int Dispense_SetUserType(int Socket, const char *Username, const char *TypeStrin // TODO: Pre-validate the string - sendf(Socket, "USER_FLAGS %s %s\n", Username, TypeString); + sendf(Socket, "USER_FLAGS %s %s %s\n", Username, TypeString, Reason); buf = ReadLine(Socket); responseCode = atoi(buf); @@ -2106,7 +2127,7 @@ int Dispense_SetUserType(int Socket, const char *Username, const char *TypeStrin break; case 403: - printf("Only wheel can modify users\n"); + printf("Only dispense admins can modify users\n"); ret = RV_PERMISSIONS; break; @@ -2202,12 +2223,12 @@ char *ReadLine(int Socket) } else { len = recv(Socket, buf+bufPos, BUFSIZ-1-bufPos, 0); - if( len < 0 ) { + if( len <= 0 ) { free(ret); - return strdup("499 Client Connection Error\n"); + return strdup("599 Client Connection Error\n"); } - buf[bufPos+len] = '\0'; } + buf[bufPos+len] = '\0'; newline = strchr( buf+bufPos, '\n' ); if( newline ) {