wawa
This commit is contained in:
parent
b09839ff6a
commit
269122d30c
|
@ -3,7 +3,6 @@ AlignArrayOfStructures: Right
|
||||||
AlignConsecutiveAssignments: true
|
AlignConsecutiveAssignments: true
|
||||||
AlignConsecutiveDeclarations: true
|
AlignConsecutiveDeclarations: true
|
||||||
AllowShortBlocksOnASingleLine: Always
|
AllowShortBlocksOnASingleLine: Always
|
||||||
AllowShortCompoundRequirementOnASingleLine: true
|
|
||||||
AllowShortEnumsOnASingleLine: true
|
AllowShortEnumsOnASingleLine: true
|
||||||
AllowShortFunctionsOnASingleLine: All
|
AllowShortFunctionsOnASingleLine: All
|
||||||
AllowShortLoopsOnASingleLine: true
|
AllowShortLoopsOnASingleLine: true
|
||||||
|
@ -24,7 +23,7 @@ SpacesBeforeTrailingComments: 1
|
||||||
|
|
||||||
IncludeBlocks: Regroup
|
IncludeBlocks: Regroup
|
||||||
IncludeCategories:
|
IncludeCategories:
|
||||||
- Regex: '".*"'
|
- Regex: '".*"'
|
||||||
Priority: 1
|
Priority: 1
|
||||||
- Regex: '<.*>'
|
- Regex: '<.*>'
|
||||||
Priority: -1
|
Priority: -1
|
||||||
|
|
|
@ -1,18 +1,16 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <rfl.hpp>
|
#include <rfl.hpp>
|
||||||
#include <rfl/Field.hpp>
|
#include <rfl/Field.hpp>
|
||||||
#include <rfl/default.hpp>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "../util/macros.h"
|
#include "../util/macros.h"
|
||||||
|
#include "../util/types.h"
|
||||||
#include "weather.h"
|
#include "weather.h"
|
||||||
|
|
||||||
using Location = std::variant<std::string, Coords>;
|
using Location = std::variant<string, Coords>;
|
||||||
|
|
||||||
struct General {
|
struct General {
|
||||||
rfl::Field<"name", std::string> name = "user";
|
rfl::Field<"name", string> name = "user";
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NowPlaying {
|
struct NowPlaying {
|
||||||
|
@ -20,9 +18,9 @@ struct NowPlaying {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Weather {
|
struct Weather {
|
||||||
Location location;
|
Location location;
|
||||||
std::string api_key;
|
string api_key;
|
||||||
std::string units;
|
string units;
|
||||||
|
|
||||||
[[nodiscard]] fn getWeatherInfo() const -> WeatherOutput;
|
[[nodiscard]] fn getWeatherInfo() const -> WeatherOutput;
|
||||||
};
|
};
|
||||||
|
|
|
@ -46,18 +46,18 @@ fn WriteCacheToFile(const WeatherOutput& data) -> Result<> {
|
||||||
return Ok();
|
return Ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn WriteCallback(void* contents, size_t size, size_t nmemb, std::string* str) -> size_t {
|
fn WriteCallback(void* contents, size_t size, size_t nmemb, string* str) -> size_t {
|
||||||
size_t totalSize = size * nmemb;
|
size_t totalSize = size * nmemb;
|
||||||
str->append(static_cast<char*>(contents), totalSize);
|
str->append(static_cast<char*>(contents), totalSize);
|
||||||
return totalSize;
|
return totalSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function to make API request
|
// Function to make API request
|
||||||
fn MakeApiRequest(const std::string& url) -> Result<WeatherOutput> {
|
fn MakeApiRequest(const string& url) -> Result<WeatherOutput> {
|
||||||
fmt::println("Making API request to URL: {}", url);
|
fmt::println("Making API request to URL: {}", url);
|
||||||
|
|
||||||
CURL* curl = curl_easy_init();
|
CURL* curl = curl_easy_init();
|
||||||
std::string responseBuffer;
|
string responseBuffer;
|
||||||
|
|
||||||
if (curl) {
|
if (curl) {
|
||||||
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
|
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
|
||||||
|
@ -103,14 +103,14 @@ fn Weather::getWeatherInfo() const -> WeatherOutput {
|
||||||
|
|
||||||
WeatherOutput result;
|
WeatherOutput result;
|
||||||
|
|
||||||
if (holds_alternative<std::string>(location)) {
|
if (holds_alternative<string>(location)) {
|
||||||
const std::string city = get<std::string>(location);
|
const string city = get<string>(location);
|
||||||
|
|
||||||
const char* loc = curl_easy_escape(nullptr, city.c_str(), static_cast<int>(city.length()));
|
const char* loc = curl_easy_escape(nullptr, city.c_str(), static_cast<int>(city.length()));
|
||||||
|
|
||||||
fmt::println("City: {}", loc);
|
fmt::println("City: {}", loc);
|
||||||
|
|
||||||
const std::string apiUrl = fmt::format(
|
const string apiUrl = fmt::format(
|
||||||
"https://api.openweathermap.org/data/2.5/"
|
"https://api.openweathermap.org/data/2.5/"
|
||||||
"weather?q={}&appid={}&units={}",
|
"weather?q={}&appid={}&units={}",
|
||||||
loc,
|
loc,
|
||||||
|
@ -124,7 +124,7 @@ fn Weather::getWeatherInfo() const -> WeatherOutput {
|
||||||
|
|
||||||
fmt::println("Coordinates: lat = {:.3f}, lon = {:.3f}", lat, lon);
|
fmt::println("Coordinates: lat = {:.3f}, lon = {:.3f}", lat, lon);
|
||||||
|
|
||||||
const std::string apiUrl = fmt::format(
|
const string apiUrl = fmt::format(
|
||||||
"https://api.openweathermap.org/data/2.5/"
|
"https://api.openweathermap.org/data/2.5/"
|
||||||
"weather?lat={:.3f}&lon={:.3f}&appid={}&units={}",
|
"weather?lat={:.3f}&lon={:.3f}&appid={}&units={}",
|
||||||
lat,
|
lat,
|
||||||
|
|
|
@ -1,20 +1,19 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/core.h>
|
|
||||||
#include <rfl.hpp>
|
#include <rfl.hpp>
|
||||||
#include <rfl/toml.hpp>
|
#include <rfl/toml.hpp>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "../util/numtypes.h"
|
#include "../util/types.h"
|
||||||
|
|
||||||
using degrees = rfl::Validator<u16, rfl::Minimum<0>, rfl::Maximum<360>>;
|
using degrees = rfl::Validator<u16, rfl::Minimum<0>, rfl::Maximum<360>>;
|
||||||
using percentage = rfl::Validator<i8, rfl::Minimum<0>, rfl::Maximum<100>>;
|
using percentage = rfl::Validator<i8, rfl::Minimum<0>, rfl::Maximum<100>>;
|
||||||
|
|
||||||
struct Condition {
|
struct Condition {
|
||||||
std::string description;
|
string description;
|
||||||
std::string icon;
|
string icon;
|
||||||
std::string main;
|
string main;
|
||||||
usize id;
|
usize id;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Main {
|
struct Main {
|
||||||
|
@ -40,11 +39,11 @@ struct Precipitation {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Sys {
|
struct Sys {
|
||||||
std::string country;
|
string country;
|
||||||
usize id;
|
usize id;
|
||||||
usize sunrise;
|
usize sunrise;
|
||||||
usize sunset;
|
usize sunset;
|
||||||
usize type;
|
usize type;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Clouds {
|
struct Clouds {
|
||||||
|
@ -64,8 +63,8 @@ struct WeatherOutput {
|
||||||
rfl::Rename<"coord", Coords> coords;
|
rfl::Rename<"coord", Coords> coords;
|
||||||
std::optional<Precipitation> rain;
|
std::optional<Precipitation> rain;
|
||||||
std::optional<Precipitation> snow;
|
std::optional<Precipitation> snow;
|
||||||
std::string base;
|
string base;
|
||||||
std::string name;
|
string name;
|
||||||
std::vector<Condition> weather;
|
std::vector<Condition> weather;
|
||||||
Sys sys;
|
Sys sys;
|
||||||
usize cod;
|
usize cod;
|
||||||
|
|
23
src/main.cpp
23
src/main.cpp
|
@ -6,9 +6,6 @@
|
||||||
#include "config/config.h"
|
#include "config/config.h"
|
||||||
#include "os/os.h"
|
#include "os/os.h"
|
||||||
|
|
||||||
using std::future;
|
|
||||||
using std::string;
|
|
||||||
|
|
||||||
struct BytesToGiB {
|
struct BytesToGiB {
|
||||||
u64 value;
|
u64 value;
|
||||||
};
|
};
|
||||||
|
@ -28,10 +25,10 @@ struct fmt::formatter<BytesToGiB> : formatter<double> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
fn GetDate() -> std::string {
|
fn GetDate() -> string {
|
||||||
const std::tm localTime = fmt::localtime(time(nullptr));
|
const std::tm localTime = fmt::localtime(time(nullptr));
|
||||||
|
|
||||||
std::string date = fmt::format("{:%e}", localTime);
|
string date = fmt::format("{:%e}", localTime);
|
||||||
|
|
||||||
if (!date.empty() && std::isspace(date.front()))
|
if (!date.empty() && std::isspace(date.front()))
|
||||||
date.erase(date.begin());
|
date.erase(date.begin());
|
||||||
|
@ -48,7 +45,9 @@ fn GetDate() -> std::string {
|
||||||
return fmt::format("{:%B} {}, {:%-I:%0M %p}", localTime, date, localTime);
|
return fmt::format("{:%B} {}, {:%-I:%0M %p}", localTime, date, localTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> int {
|
fn main() -> i32 {
|
||||||
|
using std::future;
|
||||||
|
|
||||||
const Config& config = Config::getInstance();
|
const Config& config = Config::getInstance();
|
||||||
|
|
||||||
auto weatherFuture =
|
auto weatherFuture =
|
||||||
|
@ -65,16 +64,16 @@ fn main() -> int {
|
||||||
const i64 temp = std::lround(json.main.temp);
|
const i64 temp = std::lround(json.main.temp);
|
||||||
const string townName = json.name;
|
const string townName = json.name;
|
||||||
|
|
||||||
const bool nowPlayingEnabled = nowPlayingEnabledFuture.get();
|
const bool nowPlayingEnabled = nowPlayingEnabledFuture.get();
|
||||||
const char* version = osVersionFuture.get();
|
const char* version = osVersionFuture.get();
|
||||||
const string date = dateFuture.get();
|
const string date = dateFuture.get();
|
||||||
const std::string name = config.general.get().name.get();
|
const string name = config.general.get().name.get();
|
||||||
const u64 mem = memInfoFuture.get();
|
const u64 mem = memInfoFuture.get();
|
||||||
|
|
||||||
fmt::println("Hello {}!", name);
|
fmt::println("Hello {}!", name);
|
||||||
fmt::println("Today is: {}", date);
|
fmt::println("Today is: {}", date);
|
||||||
fmt::println("It is {}°F in {}", temp, townName);
|
fmt::println("It is {}°F in {}", temp, townName);
|
||||||
fmt::println("Installed RAM: {:.2f} GiB", BytesToGiB(mem));
|
fmt::println("Installed RAM: {:.2f}", BytesToGiB(mem));
|
||||||
fmt::println("{}", version);
|
fmt::println("{}", version);
|
||||||
|
|
||||||
if (nowPlayingEnabled)
|
if (nowPlayingEnabled)
|
||||||
|
|
|
@ -8,8 +8,6 @@
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
using std::string;
|
|
||||||
|
|
||||||
fn ParseLineAsNumber(const string& input) -> u64 {
|
fn ParseLineAsNumber(const string& input) -> u64 {
|
||||||
// Find the first number
|
// Find the first number
|
||||||
string::size_type start = 0;
|
string::size_type start = 0;
|
||||||
|
@ -49,12 +47,12 @@ fn GetOSVersion() -> const char* {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string line;
|
string line;
|
||||||
const std::string prefix = "PRETTY_NAME=";
|
const string prefix = "PRETTY_NAME=";
|
||||||
|
|
||||||
while (std::getline(file, line)) {
|
while (std::getline(file, line)) {
|
||||||
if (line.find(prefix) == 0) {
|
if (line.find(prefix) == 0) {
|
||||||
std::string prettyName = line.substr(prefix.size());
|
string prettyName = line.substr(prefix.size());
|
||||||
|
|
||||||
// Remove surrounding quotes if present
|
// Remove surrounding quotes if present
|
||||||
if (!prettyName.empty() && prettyName.front() == '"' && prettyName.back() == '"')
|
if (!prettyName.empty() && prettyName.front() == '"' && prettyName.back() == '"')
|
||||||
|
@ -71,18 +69,18 @@ fn GetOSVersion() -> const char* {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn GetMprisPlayers(sdbus::IConnection& connection) -> std::vector<std::string> {
|
fn GetMprisPlayers(sdbus::IConnection& connection) -> std::vector<string> {
|
||||||
const char *dbusInterface = "org.freedesktop.DBus", *dbusObjectPath = "/org/freedesktop/DBus",
|
const char *dbusInterface = "org.freedesktop.DBus", *dbusObjectPath = "/org/freedesktop/DBus",
|
||||||
*dbusMethodListNames = "ListNames";
|
*dbusMethodListNames = "ListNames";
|
||||||
|
|
||||||
const std::unique_ptr<sdbus::IProxy> dbusProxy =
|
const std::unique_ptr<sdbus::IProxy> dbusProxy =
|
||||||
createProxy(connection, dbusInterface, dbusObjectPath);
|
createProxy(connection, dbusInterface, dbusObjectPath);
|
||||||
|
|
||||||
std::vector<std::string> names;
|
std::vector<string> names;
|
||||||
|
|
||||||
dbusProxy->callMethod(dbusMethodListNames).onInterface(dbusInterface).storeResultsTo(names);
|
dbusProxy->callMethod(dbusMethodListNames).onInterface(dbusInterface).storeResultsTo(names);
|
||||||
|
|
||||||
std::vector<std::string> mprisPlayers;
|
std::vector<string> mprisPlayers;
|
||||||
|
|
||||||
for (const std::basic_string<char>& name : names)
|
for (const std::basic_string<char>& name : names)
|
||||||
if (const char* mprisInterfaceName = "org.mpris.MediaPlayer2";
|
if (const char* mprisInterfaceName = "org.mpris.MediaPlayer2";
|
||||||
|
@ -92,26 +90,26 @@ fn GetMprisPlayers(sdbus::IConnection& connection) -> std::vector<std::string> {
|
||||||
return mprisPlayers;
|
return mprisPlayers;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn GetActivePlayer(const std::vector<std::string>& mprisPlayers) -> std::string {
|
fn GetActivePlayer(const std::vector<string>& mprisPlayers) -> string {
|
||||||
if (!mprisPlayers.empty())
|
if (!mprisPlayers.empty())
|
||||||
return mprisPlayers.front();
|
return mprisPlayers.front();
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
fn GetNowPlaying() -> std::string {
|
fn GetNowPlaying() -> string {
|
||||||
try {
|
try {
|
||||||
const char *playerObjectPath = "/org/mpris/MediaPlayer2",
|
const char *playerObjectPath = "/org/mpris/MediaPlayer2",
|
||||||
*playerInterfaceName = "org.mpris.MediaPlayer2.Player";
|
*playerInterfaceName = "org.mpris.MediaPlayer2.Player";
|
||||||
|
|
||||||
std::unique_ptr<sdbus::IConnection> connection = sdbus::createSessionBusConnection();
|
std::unique_ptr<sdbus::IConnection> connection = sdbus::createSessionBusConnection();
|
||||||
|
|
||||||
std::vector<std::string> mprisPlayers = GetMprisPlayers(*connection);
|
std::vector<string> mprisPlayers = GetMprisPlayers(*connection);
|
||||||
|
|
||||||
if (mprisPlayers.empty())
|
if (mprisPlayers.empty())
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
std::string activePlayer = GetActivePlayer(mprisPlayers);
|
string activePlayer = GetActivePlayer(mprisPlayers);
|
||||||
|
|
||||||
if (activePlayer.empty())
|
if (activePlayer.empty())
|
||||||
return "";
|
return "";
|
||||||
|
@ -119,13 +117,13 @@ fn GetNowPlaying() -> std::string {
|
||||||
std::unique_ptr<sdbus::IProxy> playerProxy =
|
std::unique_ptr<sdbus::IProxy> playerProxy =
|
||||||
sdbus::createProxy(*connection, activePlayer, playerObjectPath);
|
sdbus::createProxy(*connection, activePlayer, playerObjectPath);
|
||||||
|
|
||||||
std::map<std::string, sdbus::Variant> metadata =
|
std::map<string, sdbus::Variant> metadata =
|
||||||
playerProxy->getProperty("Metadata").onInterface(playerInterfaceName);
|
playerProxy->getProperty("Metadata").onInterface(playerInterfaceName);
|
||||||
|
|
||||||
if (const auto iter = metadata.find("xesam:title");
|
if (const auto iter = metadata.find("xesam:title");
|
||||||
|
|
||||||
iter != metadata.end() && iter->second.containsValueOfType<std::string>())
|
iter != metadata.end() && iter->second.containsValueOfType<string>())
|
||||||
return iter->second.get<std::string>();
|
return iter->second.get<string>();
|
||||||
} catch (const sdbus::Error& e) { std::cerr << "Error: " << e.what() << '\n'; }
|
} catch (const sdbus::Error& e) { std::cerr << "Error: " << e.what() << '\n'; }
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
|
|
|
@ -14,9 +14,9 @@ fn GetMemInfo() -> u64 {
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn GetNowPlaying() -> std::string {
|
fn GetNowPlaying() -> string {
|
||||||
if (const char* title = GetCurrentPlayingTitle(); const char* artist = GetCurrentPlayingArtist())
|
if (const char* title = GetCurrentPlayingTitle(); const char* artist = GetCurrentPlayingArtist())
|
||||||
return "Now Playing: " + std::string(artist) + " - " + std::string(title);
|
return "Now Playing: " + string(artist) + " - " + string(title);
|
||||||
|
|
||||||
return "No song playing";
|
return "No song playing";
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "../util/macros.h"
|
#include "../util/macros.h"
|
||||||
#include "../util/numtypes.h"
|
#include "../util/types.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the amount of installed RAM in bytes.
|
* @brief Get the amount of installed RAM in bytes.
|
||||||
|
@ -13,7 +11,7 @@ fn GetMemInfo() -> u64;
|
||||||
/**
|
/**
|
||||||
* @brief Get the currently playing song metadata.
|
* @brief Get the currently playing song metadata.
|
||||||
*/
|
*/
|
||||||
fn GetNowPlaying() -> std::string;
|
fn GetNowPlaying() -> string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the OS version.
|
* @brief Get the OS version.
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <string>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
|
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @class Error
|
* @class Error
|
||||||
|
@ -19,16 +19,16 @@ class Error {
|
||||||
* @brief Constructs an Error with a message.
|
* @brief Constructs an Error with a message.
|
||||||
* @param message The error message.
|
* @param message The error message.
|
||||||
*/
|
*/
|
||||||
explicit Error(std::string message) : m_Message(std::move(message)) {}
|
explicit Error(string message) : m_Message(std::move(message)) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Retrieves the error message.
|
* @brief Retrieves the error message.
|
||||||
* @return A constant reference to the error message string.
|
* @return A constant reference to the error message string.
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] fn message() const -> const std::string& { return m_Message; }
|
[[nodiscard]] fn message() const -> const string& { return m_Message; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string m_Message; ///< The error message.
|
string m_Message; ///< The error message.
|
||||||
};
|
};
|
||||||
|
|
||||||
// Primary template for Result with a default type of void
|
// Primary template for Result with a default type of void
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef u8
|
* @typedef u8
|
||||||
|
@ -117,3 +118,10 @@ using usize = std::size_t;
|
||||||
* subtracting two pointers.
|
* subtracting two pointers.
|
||||||
*/
|
*/
|
||||||
using isize = std::ptrdiff_t;
|
using isize = std::ptrdiff_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef string
|
||||||
|
* @brief Represents a string.
|
||||||
|
*/
|
||||||
|
using string = std::string;
|
||||||
|
|
Loading…
Reference in a new issue