X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fcommand%2Fgeneric.qc;h=2e00ff03a105af7a8a91b38b46d811d54f078ad0;hb=761c83e1d606d531c96f7bac51ef959951115483;hp=8508ef354618342604b17c18aa3fbe067e9319bc;hpb=b335141f208e550a760aa5fde4b8a563a3ede884;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/command/generic.qc b/qcsrc/common/command/generic.qc index 8508ef354..2e00ff03a 100644 --- a/qcsrc/common/command/generic.qc +++ b/qcsrc/common/command/generic.qc @@ -1,6 +1,6 @@ // ========================================================= // Generic program common command code, written by Samual -// Last updated: December 28th, 2011 +// Last updated: February 19th, 2012 // ========================================================= // used by generic commands for better help/usage information @@ -17,6 +17,38 @@ string GetProgramCommandPrefix(void) #endif } +// used by curl command +void Curl_URI_Get_Callback(float id, float status, string data) +{ + float i; + float do_exec; + string do_cvar; + i = id - URI_GET_CURL; + do_exec = curl_uri_get_exec[i]; + do_cvar = curl_uri_get_cvar[i]; + if(status != 0) + { + print(sprintf(_("error: status is %d\n"), status)); + if(do_cvar) + strunzone(do_cvar); + return; + } + if(do_exec) + localcmd(data); + if(do_cvar) + { + cvar_set(do_cvar, data); + strunzone(do_cvar); + } + if(!do_exec && !do_cvar) + print(data); +} + + +// ======================= +// Command Sub-Functions +// ======================= + void GenericCommand_addtolist(float request, float argc) { switch(request) @@ -27,30 +59,113 @@ void GenericCommand_addtolist(float request, float argc) if(argc >= 2) { - if(cvar_string(argv(1)) == "") // cvar was empty + string original_cvar = argv(1); + string tmp_string = argv(2); + + if(cvar_string(original_cvar) == "") // cvar was empty { - cvar_set(argv(1), argv(2)); + cvar_set(original_cvar, tmp_string); } else // add it to the end of the list if the list doesn't already have it { - argc = tokenizebyseparator(cvar_string(argv(1)), " "); + argc = tokenizebyseparator(cvar_string(original_cvar), " "); + for(i = 0; i < argc; ++i) - if(argv(i) == argv(2)) + if(argv(i) == tmp_string) return; // already in list - cvar_set(argv(1), strcat(argv(2), " ", cvar_string(argv(1)))); + cvar_set(original_cvar, strcat(tmp_string, " ", cvar_string(original_cvar))); } return; } } default: - // todo + print("Incorrect parameters for ^2addtolist^7\n"); + case CMD_REQUEST_USAGE: + { + print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " addtolist variable value")); + print(" Where 'variable' is what to add 'value' to.\n"); + print("See also: ^2removefromlist^7\n"); + return; + } + } +} + +void GenericCommand_qc_curl(float request, float argc) +{ + switch(request) + { + case CMD_REQUEST_COMMAND: + { + float do_exec; + string do_cvar; + float key; + float i, j; + string url; + float buf; + float r; + + do_exec = FALSE; + do_cvar = string_null; + key = -1; + + for(i = 1; i+1 < argc; ++i) + { + if(argv(i) == "--cvar" && i+2 < argc) + { + ++i; + do_cvar = strzone(argv(i)); + continue; + } + if(argv(i) == "--exec") + { + do_exec = TRUE; + continue; + } + if(argv(i) == "--key" && i+2 < argc) + { + ++i; + key = stof(argv(i)); + continue; + } + break; + } + + // now, argv(i) is the URL + // following args may be POST parameters + url = argv(i); + ++i; + buf = buf_create(); + j = 0; + for(; i+1 < argc; i += 2) + bufstr_set(buf, ++j, sprintf("%s=%s", uri_escape(argv(i)), uri_escape(argv(i+1)))); + if(i < argc) + bufstr_set(buf, ++j, sprintf("submit=%s", uri_escape(argv(i)))); + + if(j == 0) // no args: GET + r = crypto_uri_postbuf(url, URI_GET_CURL + curl_uri_get_pos, string_null, string_null, -1, key); + else // with args: POST + r = crypto_uri_postbuf(url, URI_GET_CURL + curl_uri_get_pos, "application/x-www-form-urlencoded", "&", buf, key); + + if(r) + { + curl_uri_get_exec[curl_uri_get_pos] = do_exec; + curl_uri_get_cvar[curl_uri_get_pos] = do_cvar; + curl_uri_get_pos = mod(curl_uri_get_pos + 1, URI_GET_CURL_END - URI_GET_CURL + 1); + } + else + print(_("error creating curl handle\n")); + + buf_del(buf); + + return; + } + + default: case CMD_REQUEST_USAGE: { - print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " addtolist variable [value]")); - print(" Where 'variable' is what to add to the list,\n"); - print(" and 'value' is any extra optional paramaters to add with quotes."); + print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " qc_curl [--key N] [--cvar] [--exec] URL [postargs...]")); return; } } @@ -68,38 +183,29 @@ void GenericCommand_dumpcommands(float request) if(fh >= 0) { -#ifdef SVQC - - // write sv_cmd aliases - CMD_Write("dump of server console commands:\n"); - GameCommand_macro_write_aliases(fh); - - // write client only aliases - CMD_Write("\ndump of networked client only commands:\n"); - ClientCommand_macro_write_aliases(fh); - - // write common aliases - CMD_Write("\ndump of common commands:\n"); - CommonCommand_macro_write_aliases(fh); + #ifdef SVQC + CMD_Write("dump of server console commands:\n"); + GameCommand_macro_write_aliases(fh); + + CMD_Write("\ndump of networked client only commands:\n"); + ClientCommand_macro_write_aliases(fh); + + CMD_Write("\ndump of common commands:\n"); + CommonCommand_macro_write_aliases(fh); - // write ban aliases - CMD_Write("\ndump of ban commands:\n"); - -#endif - -#ifdef CSQC - - // write cl_cmd aliases - CMD_Write("dump of client commands:\n"); - LocalCommand_macro_write_aliases(fh); - -#endif + CMD_Write("\ndump of ban commands:\n"); + BanCommand_macro_write_aliases(fh); + #endif + + #ifdef CSQC + CMD_Write("dump of client commands:\n"); + LocalCommand_macro_write_aliases(fh); + #endif - // write generic commands CMD_Write("\ndump of generic commands:\n"); GenericCommand_macro_write_aliases(fh); - print("Completed dump of aliases in ^2", GetProgramCommandPrefix(), "_dump.txt^7.\n"); + print("Completed dump of aliases in ^2data/data/", GetProgramCommandPrefix(), "_dump.txt^7.\n"); fclose(fh); } @@ -120,6 +226,40 @@ void GenericCommand_dumpcommands(float request) } } +void GenericCommand_dumpnotifs(float request) +{ + switch(request) + { + case CMD_REQUEST_COMMAND: + { + float fh; + string filename = "notifications_dump.txt"; + fh = fopen(filename, FILE_WRITE); + + if(fh >= 0) + { + fputs(fh, "dump of notifications list:\n"); + Dump_Notifications(fh); + print("Completed dump of notifications in ^2data/data/notifications_dump.txt^7.\n"); + fclose(fh); + } + else + { + print("^1Error: ^7Could not dump to file!\n"); + } + return; + } + + default: + case CMD_REQUEST_USAGE: + { + print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " dumpnotifs")); + print(" No arguments required.\n"); + return; + } + } +} + void GenericCommand_maplist(float request, float argc) { switch(request) @@ -151,12 +291,30 @@ void GenericCommand_maplist(float request, float argc) break; // go to usage } + case "cleanup": // scans maplist and only adds back the ones which are really usable + { + MapInfo_Enumerate(); + MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0); + argc = tokenizebyseparator(cvar_string("g_maplist"), " "); + + tmp_string = ""; + for(i = 0; i < argc; ++i) + if(MapInfo_CheckMap(argv(i))) + tmp_string = strcat(tmp_string, " ", argv(i)); + + tmp_string = substring(tmp_string, 1, strlen(tmp_string) - 1); + cvar_set("g_maplist", tmp_string); + + return; + } + case "remove": // scans maplist and only adds back whatever maps were not provided in argv(2) { if(argc == 3) { argc = tokenizebyseparator(cvar_string("g_maplist"), " "); + tmp_string = ""; for(i = 0; i < argc; ++i) if(argv(i) != argv(2)) tmp_string = strcat(tmp_string, " ", argv(i)); @@ -174,22 +332,6 @@ void GenericCommand_maplist(float request, float argc) cvar_set("g_maplist", shufflewords(cvar_string("g_maplist"))); return; } - - case "cleanup": // scans maplist and only adds back the ones which are really usable - { - MapInfo_Enumerate(); - MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0); - argc = tokenizebyseparator(cvar_string("g_maplist"), " "); - - for(i = 0; i < argc; ++i) - if(MapInfo_CheckMap(argv(i))) - tmp_string = strcat(tmp_string, " ", argv(i)); - - tmp_string = substring(tmp_string, 1, strlen(tmp_string) - 1); - cvar_set("g_maplist", tmp_string); - - return; - } default: break; } @@ -199,8 +341,69 @@ void GenericCommand_maplist(float request, float argc) print("Incorrect parameters for ^2maplist^7\n"); case CMD_REQUEST_USAGE: { - print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " maplist command [map]")); // todo - print(" No arguments required.\n"); + print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " maplist action [map]")); + print(" Where 'action' is the command to complete,\n"); + print(" and 'map' is what it acts upon (if required).\n"); + print(" Full list of commands here: \"add, cleanup, remove, shuffle.\"\n"); + return; + } + } +} + +void GenericCommand_nextframe(float request, float arguments, string command) +{ + switch(request) + { + case CMD_REQUEST_COMMAND: + { + queue_to_execute_next_frame(substring(command, argv_start_index(1), argv_end_index(-1) - argv_start_index(1))); + return; + } + + default: + case CMD_REQUEST_USAGE: + { + print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " nextframe command...")); + print(" Where command will be executed next frame of this VM\n"); + return; + } + } +} + +void GenericCommand_removefromlist(float request, float argc) +{ + switch(request) + { + case CMD_REQUEST_COMMAND: + { + if(argc == 3) + { + float i; + string original_cvar = argv(1); + string removal = argv(2); + string tmp_string; + + argc = tokenizebyseparator(cvar_string(original_cvar), " "); + + tmp_string = ""; + for(i = 0; i < argc; ++i) + if(argv(i) != removal) + tmp_string = strcat(tmp_string, " ", argv(i)); + + tmp_string = substring(tmp_string, 1, strlen(tmp_string) - 1); + cvar_set(original_cvar, tmp_string); + + return; + } + } + + default: + print("Incorrect parameters for ^2removefromlist^7\n"); + case CMD_REQUEST_USAGE: + { + print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " removefromlist variable value")); + print(" Where 'variable' is what cvar to remove 'value' from.\n"); + print("See also: ^2addtolist^7\n"); return; } } @@ -229,6 +432,7 @@ void GenericCommand_settemp(float request, float argc) { print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " settemp \"cvar\" \"arguments\"\n")); print(" Where 'cvar' is the cvar you want to temporarily set with 'arguments'.\n"); + print("See also: ^2settemp_restore^7\n"); return; } } @@ -255,6 +459,7 @@ void GenericCommand_settemp_restore(float request, float argc) { print(strcat("\nUsage:^3 ", GetProgramCommandPrefix(), " settemp_restore\n")); print(" No arguments required.\n"); + print("See also: ^2settemp^7\n"); return; } } @@ -289,9 +494,13 @@ void GenericCommand_(float request) // Do not hard code aliases for these, instead create them in commands.cfg... also: keep in alphabetical order, please ;) #define GENERIC_COMMANDS(request,arguments,command) \ - GENERIC_COMMAND("addtolist", GenericCommand_addtolist(request, arguments), "Add a string to a cvar at the end of a list") \ + GENERIC_COMMAND("addtolist", GenericCommand_addtolist(request, arguments), "Add a string to a cvar") \ GENERIC_COMMAND("dumpcommands", GenericCommand_dumpcommands(request), "Dump all commands on the program to *_cmd_dump.txt") \ + GENERIC_COMMAND("dumpnotifs", GenericCommand_dumpnotifs(request), "Dump all notifications into notifications_dump.txt") \ GENERIC_COMMAND("maplist", GenericCommand_maplist(request, arguments), "Automatic control of maplist") \ + GENERIC_COMMAND("nextframe", GenericCommand_nextframe(request, arguments, command), "Execute the given command next frame of this VM") \ + GENERIC_COMMAND("qc_curl", GenericCommand_qc_curl(request, arguments), "Queries a URL") \ + GENERIC_COMMAND("removefromlist", GenericCommand_removefromlist(request, arguments), "Remove a string from a cvar") \ GENERIC_COMMAND("rpn", GenericCommand_rpn(request, arguments, command), "RPN calculator") \ GENERIC_COMMAND("settemp", GenericCommand_settemp(request, arguments), "Temporarily set a value to a cvar which is restored later") \ GENERIC_COMMAND("settemp_restore", GenericCommand_settemp_restore(request, arguments), "Restore all cvars set by settemp command") \