diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d7b52cd2..2d756b71e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -294,7 +294,7 @@ set(LIBFASTFETCH_SRC src/modules/processes.c src/modules/player/player.c src/modules/poweradapter/poweradapter.c - src/modules/publicip.c + src/modules/publicip/publicip.c src/modules/display/display.c src/modules/separator/separator.c src/modules/shell/shell.c diff --git a/src/common/init.c b/src/common/init.c index fe8388384..20354358c 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -90,7 +90,7 @@ static void defaultConfig(FFinstance* instance) ffInitPowerAdapterOptions(&instance->config.powerAdapter); ffInitLocaleOptions(&instance->config.locale); ffInitLocalIpOptions(&instance->config.localIP); - initModuleArg(&instance->config.publicIP); + ffInitPublicIpOptions(&instance->config.publicIP); initModuleArg(&instance->config.weather); ffInitWifiOptions(&instance->config.wifi); ffInitPlayerOptions(&instance->config.player); @@ -132,9 +132,6 @@ static void defaultConfig(FFinstance* instance) ffStrbufInit(&instance->config.libwlanapi); ffStrbufInit(&instance->config.libnm); - instance->config.publicIpTimeout = 0; - ffStrbufInit(&instance->config.publicIpUrl); - instance->config.weatherTimeout = 0; ffStrbufInitS(&instance->config.weatherOutputFormat, "%t+-+%C+(%l)"); @@ -307,7 +304,7 @@ static void destroyConfig(FFinstance* instance) ffDestroyPowerAdapterOptions(&instance->config.powerAdapter); ffDestroyLocaleOptions(&instance->config.locale); ffDestroyLocalIpOptions(&instance->config.localIP); - destroyModuleArg(&instance->config.publicIP); + ffDestroyPublicIpOptions(&instance->config.publicIP); ffDestroyWallpaperOptions(&instance->config.wallpaper); destroyModuleArg(&instance->config.weather); ffDestroyWifiOptions(&instance->config.wifi); @@ -349,7 +346,6 @@ static void destroyConfig(FFinstance* instance) ffStrbufDestroy(&instance->config.libwlanapi); ffStrbufDestroy(&instance->config.libnm); - ffStrbufDestroy(&instance->config.publicIpUrl); ffStrbufDestroy(&instance->config.weatherOutputFormat); } diff --git a/src/fastfetch.c b/src/fastfetch.c index 66672c322..1744bd57c 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1009,7 +1009,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(ffParsePowerAdapterCommandOptions(&instance->config.powerAdapter, key, value)) {} else if(ffParseLocaleCommandOptions(&instance->config.locale, key, value)) {} else if(ffParseLocalIpCommandOptions(&instance->config.localIP, key, value)) {} - else if(optionParseModuleArgs(key, value, "publicip", &instance->config.publicIP)) {} + else if(ffParsePublicIpCommandOptions(&instance->config.publicIP, key, value)) {} else if(optionParseModuleArgs(key, value, "weather", &instance->config.weather)) {} else if(ffParsePlayerCommandOptions(&instance->config.player, key, value)) {} else if(ffParseMediaCommandOptions(&instance->config.media, key, value)) {} @@ -1088,10 +1088,6 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con //Module options// ////////////////// - else if(strcasecmp(key, "--publicip-url") == 0) - optionParseString(key, value, &instance->config.publicIpUrl); - else if(strcasecmp(key, "--publicip-timeout") == 0) - instance->config.publicIpTimeout = optionParseUInt32(key, value); else if(strcasecmp(key, "--weather-output-format") == 0) optionParseString(key, value, &instance->config.weatherOutputFormat); else if(strcasecmp(key, "--weather-timeout") == 0) @@ -1222,8 +1218,8 @@ static void parseStructureCommand(FFinstance* instance, const char* line) ffPrintLocale(instance, &instance->config.locale); else if(strcasecmp(line, "localip") == 0) ffPrintLocalIp(instance, &instance->config.localIP); - else if(strcasecmp(line, "publicip") == 0) - ffPrintPublicIp(instance); + else if(strcasecmp(line, FF_PUBLICIP_MODULE_NAME) == 0) + ffPrintPublicIp(instance, &instance->config.publicIP); else if(strcasecmp(line, FF_WIFI_MODULE_NAME) == 0) ffPrintWifi(instance, &instance->config.wifi); else if(strcasecmp(line, "weather") == 0) @@ -1281,8 +1277,8 @@ int main(int argc, const char** argv) if(instance.config.multithreading) { - if(ffStrbufContainIgnCaseS(&data.structure, "PublicIp")) - ffPreparePublicIp(&instance); + if(ffStrbufContainIgnCaseS(&data.structure, FF_PUBLICIP_MODULE_NAME)) + ffPreparePublicIp(&instance.config.publicIP); if(ffStrbufContainIgnCaseS(&data.structure, "Weather")) ffPrepareWeather(&instance); diff --git a/src/fastfetch.h b/src/fastfetch.h index 606ce08c3..2c159059f 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -83,7 +83,7 @@ typedef struct FFconfig FFPowerAdapterOptions powerAdapter; FFLocaleOptions locale; FFLocalIpOptions localIP; - FFModuleArgs publicIP; + FFPublicIpOptions publicIP; FFModuleArgs weather; FFPlayerOptions player; FFMediaOptions media; @@ -123,9 +123,6 @@ typedef struct FFconfig FFstrbuf libwlanapi; FFstrbuf libnm; - FFstrbuf publicIpUrl; - uint32_t publicIpTimeout; - FFstrbuf weatherOutputFormat; uint32_t weatherTimeout; @@ -180,7 +177,6 @@ void ffLogoBuiltinListAutocompletion(); //Common -void ffPreparePublicIp(FFinstance* instance); void ffPrepareWeather(FFinstance* instance); //Printing @@ -188,7 +184,6 @@ void ffPrepareWeather(FFinstance* instance); void ffPrintChassis(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); void ffPrintTheme(FFinstance* instance); -void ffPrintPublicIp(FFinstance* instance); void ffPrintWeather(FFinstance* instance); #endif diff --git a/src/flashfetch.c b/src/flashfetch.c index ec2d209ec..e00d2b48b 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -13,7 +13,7 @@ int main(int argc, char** argv) //Modify instance.config here // ffPrepareCPUUsage(); - // ffPreparePublicIp(&instance); + // ffPreparePublicIp(&instance.config.publicIP); // ffPrepareWeather(&instance); //Does things like starting detection threads, disabling line wrap, etc @@ -53,7 +53,7 @@ int main(int argc, char** argv) //ffPrintPlayer(&instance, &instance.config.player); //ffPrintMedia(&instance, &instance.config.media); //ffPrintLocalIp(&instance); - //ffPrintPublicIp(&instance); + //ffPrintPublicIp(&instance, &instance.config.publicIp); //ffPrintWifi(&instance); //ffPrintCPUUsage(&instance, &instance.config.cpuUsage); ffPrintLocale(&instance, &instance.config.locale); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index e056bf218..c248d0114 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -115,6 +115,7 @@ static bool parseModuleJsonObject(FFinstance* instance, const char* type, json_o tryModule(instance, type, module, FF_PACKAGES_MODULE_NAME, ffParsePackagesJsonObject) || tryModule(instance, type, module, FF_PLAYER_MODULE_NAME, ffParsePlayerJsonObject) || tryModule(instance, type, module, FF_POWERADAPTER_MODULE_NAME, ffParsePowerAdapterJsonObject) || + tryModule(instance, type, module, FF_PUBLICIP_MODULE_NAME, ffParsePublicIpJsonObject) || false; } diff --git a/src/modules/modules.h b/src/modules/modules.h index b31c2af65..b28e1d1e4 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -34,6 +34,7 @@ #include "modules/packages/packages.h" #include "modules/player/player.h" #include "modules/poweradapter/poweradapter.h" +#include "modules/publicip/publicip.h" #include "modules/separator/separator.h" #include "modules/shell/shell.h" #include "modules/sound/sound.h" diff --git a/src/modules/options.h b/src/modules/options.h index bd57642ca..cfdefd52b 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -32,6 +32,7 @@ #include "modules/packages/option.h" #include "modules/player/option.h" #include "modules/poweradapter/option.h" +#include "modules/publicip/option.h" #include "modules/separator/option.h" #include "modules/shell/option.h" #include "modules/sound/option.h" diff --git a/src/modules/publicip.c b/src/modules/publicip.c deleted file mode 100644 index 2483be9d9..000000000 --- a/src/modules/publicip.c +++ /dev/null @@ -1,65 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" -#include "common/networking.h" - -#define FF_PUBLICIP_MODULE_NAME "Public IP" -#define FF_PUBLICIP_NUM_FORMAT_ARGS 1 - -static FFNetworkingState state; -static int status = -1; - -void ffPreparePublicIp(FFinstance* instance) -{ - if(instance->config.publicIpUrl.length == 0) - status = ffNetworkingSendHttpRequest(&state, "ipinfo.io", "/ip", NULL); - else - { - FF_STRBUF_AUTO_DESTROY host = ffStrbufCreateCopy(&instance->config.publicIpUrl); - ffStrbufSubstrAfterFirstS(&host, "://"); - uint32_t pathStartIndex = ffStrbufFirstIndexC(&host, '/'); - - FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); - if(pathStartIndex != host.length) - { - ffStrbufAppendNS(&path, pathStartIndex, host.chars + (host.length - pathStartIndex)); - host.length = pathStartIndex; - host.chars[pathStartIndex] = '\0'; - } - - status = ffNetworkingSendHttpRequest(&state, host.chars, path.length == 0 ? "/" : path.chars, NULL); - } -} - -void ffPrintPublicIp(FFinstance* instance) -{ - if(status == -1) - ffPreparePublicIp(instance); - - if(status == 0) - { - ffPrintError(instance, FF_PUBLICIP_MODULE_NAME, 0, &instance->config.publicIP, "Failed to connect to an IP detection server"); - return; - } - - FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(4096); - bool success = ffNetworkingRecvHttpResponse(&state, &result, instance->config.publicIpTimeout); - if(success) ffStrbufSubstrAfterFirstS(&result, "\r\n\r\n"); - - if(!success || result.length == 0) - { - ffPrintError(instance, FF_PUBLICIP_MODULE_NAME, 0, &instance->config.publicIP, "Failed to receive the server response"); - return; - } - - if(instance->config.publicIP.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_PUBLICIP_MODULE_NAME, 0, &instance->config.publicIP.key); - ffStrbufPutTo(&result, stdout); - } - else - { - ffPrintFormat(instance, FF_PUBLICIP_MODULE_NAME, 0, &instance->config.publicIP, FF_PUBLICIP_NUM_FORMAT_ARGS, (FFformatarg[]) { - {FF_FORMAT_ARG_TYPE_STRBUF, &result} - }); - } -} diff --git a/src/modules/publicip/option.h b/src/modules/publicip/option.h new file mode 100644 index 000000000..aef383fc5 --- /dev/null +++ b/src/modules/publicip/option.h @@ -0,0 +1,14 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFPublicIpOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; + + FFstrbuf url; + uint32_t timeout; +} FFPublicIpOptions; diff --git a/src/modules/publicip/publicip.c b/src/modules/publicip/publicip.c new file mode 100644 index 000000000..a1ebc8819 --- /dev/null +++ b/src/modules/publicip/publicip.c @@ -0,0 +1,137 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "common/networking.h" +#include "modules/publicip/publicip.h" + +#define FF_PUBLICIP_DISPLAY_NAME "Public IP" +#define FF_PUBLICIP_NUM_FORMAT_ARGS 1 + +static FFNetworkingState state; +static int status = -1; + +void ffPreparePublicIp(FFPublicIpOptions* options) +{ + if (options->url.length == 0) + status = ffNetworkingSendHttpRequest(&state, "ipinfo.io", "/ip", NULL); + else + { + FF_STRBUF_AUTO_DESTROY host = ffStrbufCreateCopy(&options->url); + ffStrbufSubstrAfterFirstS(&host, "://"); + uint32_t pathStartIndex = ffStrbufFirstIndexC(&host, '/'); + + FF_STRBUF_AUTO_DESTROY path = ffStrbufCreate(); + if(pathStartIndex != host.length) + { + ffStrbufAppendNS(&path, pathStartIndex, host.chars + (host.length - pathStartIndex)); + host.length = pathStartIndex; + host.chars[pathStartIndex] = '\0'; + } + + status = ffNetworkingSendHttpRequest(&state, host.chars, path.length == 0 ? "/" : path.chars, NULL); + } +} + +void ffPrintPublicIp(FFinstance* instance, FFPublicIpOptions* options) +{ + if (status == -1) + ffPreparePublicIp(options); + + if (status == 0) + { + ffPrintError(instance, FF_PUBLICIP_DISPLAY_NAME, 0, &options->moduleArgs, "Failed to connect to an IP detection server"); + return; + } + + FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(4096); + bool success = ffNetworkingRecvHttpResponse(&state, &result, options->timeout); + if (success) ffStrbufSubstrAfterFirstS(&result, "\r\n\r\n"); + + if (!success || result.length == 0) + { + ffPrintError(instance, FF_PUBLICIP_DISPLAY_NAME, 0, &options->moduleArgs, "Failed to receive the server response"); + return; + } + + if (options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_PUBLICIP_DISPLAY_NAME, 0, &options->moduleArgs.key); + ffStrbufPutTo(&result, stdout); + } + else + { + ffPrintFormat(instance, FF_PUBLICIP_DISPLAY_NAME, 0, &options->moduleArgs, FF_PUBLICIP_NUM_FORMAT_ARGS, (FFformatarg[]) { + {FF_FORMAT_ARG_TYPE_STRBUF, &result} + }); + } +} + +void ffInitPublicIpOptions(FFPublicIpOptions* options) +{ + options->moduleName = FF_PUBLICIP_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); + + ffStrbufInit(&options->url); + options->timeout = 0; +} + +bool ffParsePublicIpCommandOptions(FFPublicIpOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_PUBLICIP_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + if (strcasecmp(subKey, "url") == 0) + { + ffOptionParseString(key, value, &options->url); + return true; + } + + if (strcasecmp(subKey, "timeout") == 0) + { + options->timeout = ffOptionParseUInt32(key, value); + return true; + } + + return false; +} + +void ffDestroyPublicIpOptions(FFPublicIpOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + + ffStrbufDestroy(&options->url); +} + +#ifdef FF_HAVE_JSONC +void ffParsePublicIpJsonObject(FFinstance* instance, json_object* module) +{ + FFPublicIpOptions __attribute__((__cleanup__(ffDestroyPublicIpOptions))) options; + ffInitPublicIpOptions(&options); + + if (module) + { + json_object_object_foreach(module, key, val) + { + if (ffJsonConfigParseModuleArgs(key, val, &options.moduleArgs)) + continue; + + if (strcasecmp(key, "url") == 0) + { + ffStrbufSetS(&options.url, json_object_get_string(val)); + continue; + } + + if (strcasecmp(key, "timeout") == 0) + { + options.timeout = (uint32_t) json_object_get_int(val); + continue; + } + + ffPrintError(instance, FF_PUBLICIP_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintPublicIp(instance, &options); +} +#endif diff --git a/src/modules/publicip/publicip.h b/src/modules/publicip/publicip.h new file mode 100644 index 000000000..2306ddcf4 --- /dev/null +++ b/src/modules/publicip/publicip.h @@ -0,0 +1,17 @@ +#pragma once + +#include "fastfetch.h" + +#define FF_PUBLICIP_MODULE_NAME "PublicIp" + +void ffPreparePublicIp(FFPublicIpOptions* options); + +void ffPrintPublicIp(FFinstance* instance, FFPublicIpOptions* options); +void ffInitPublicIpOptions(FFPublicIpOptions* options); +bool ffParsePublicIpCommandOptions(FFPublicIpOptions* options, const char* key, const char* value); +void ffDestroyPublicIpOptions(FFPublicIpOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/jsonconfig.h" +void ffParsePublicIpJsonObject(FFinstance* instance, json_object* module); +#endif