mirror of
https://github.com/rad4day/Waybar.git
synced 2023-12-21 10:22:59 +01:00
refactor: move label name and id to label contructor
This commit is contained in:
parent
97bd637f5d
commit
d24d85bebf
@ -10,7 +10,8 @@ namespace waybar {
|
|||||||
|
|
||||||
class ALabel : public IModule {
|
class ALabel : public IModule {
|
||||||
public:
|
public:
|
||||||
ALabel(const Json::Value &, const std::string &format, uint16_t interval = 0);
|
ALabel(const Json::Value &, const std::string &, const std::string &, const std::string &format,
|
||||||
|
uint16_t interval = 0);
|
||||||
virtual ~ALabel();
|
virtual ~ALabel();
|
||||||
virtual auto update() -> void;
|
virtual auto update() -> void;
|
||||||
virtual std::string getIcon(uint16_t, const std::string &alt = "", uint16_t max = 0);
|
virtual std::string getIcon(uint16_t, const std::string &alt = "", uint16_t max = 0);
|
||||||
@ -29,8 +30,8 @@ class ALabel : public IModule {
|
|||||||
bool alt_ = false;
|
bool alt_ = false;
|
||||||
std::string default_format_;
|
std::string default_format_;
|
||||||
|
|
||||||
virtual bool handleToggle(GdkEventButton *const &ev);
|
virtual bool handleToggle(GdkEventButton *const &ev);
|
||||||
virtual bool handleScroll(GdkEventScroll *);
|
virtual bool handleScroll(GdkEventScroll *);
|
||||||
virtual std::string getState(uint8_t value, bool lesser = false);
|
virtual std::string getState(uint8_t value, bool lesser = false);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -47,7 +47,6 @@ class Backlight : public ALabel {
|
|||||||
template <class ForwardIt, class Inserter>
|
template <class ForwardIt, class Inserter>
|
||||||
static void enumerate_devices(ForwardIt first, ForwardIt last, Inserter inserter, udev *udev);
|
static void enumerate_devices(ForwardIt first, ForwardIt last, Inserter inserter, udev *udev);
|
||||||
|
|
||||||
const std::string name_;
|
|
||||||
const std::string preferred_device_;
|
const std::string preferred_device_;
|
||||||
static constexpr int EPOLL_MAX_EVENTS = 16;
|
static constexpr int EPOLL_MAX_EVENTS = 16;
|
||||||
|
|
||||||
|
@ -2,7 +2,8 @@
|
|||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <util/command.hpp>
|
#include <util/command.hpp>
|
||||||
|
|
||||||
waybar::ALabel::ALabel(const Json::Value& config, const std::string& format, uint16_t interval)
|
waybar::ALabel::ALabel(const Json::Value& config, const std::string& name, const std::string& id,
|
||||||
|
const std::string& format, uint16_t interval)
|
||||||
: config_(config),
|
: config_(config),
|
||||||
format_(config_["format"].isString() ? config_["format"].asString() : format),
|
format_(config_["format"].isString() ? config_["format"].asString() : format),
|
||||||
interval_(config_["interval"] == "once"
|
interval_(config_["interval"] == "once"
|
||||||
@ -10,6 +11,10 @@ waybar::ALabel::ALabel(const Json::Value& config, const std::string& format, uin
|
|||||||
: std::chrono::seconds(
|
: std::chrono::seconds(
|
||||||
config_["interval"].isUInt() ? config_["interval"].asUInt() : interval)),
|
config_["interval"].isUInt() ? config_["interval"].asUInt() : interval)),
|
||||||
default_format_(format_) {
|
default_format_(format_) {
|
||||||
|
label_.set_name(name);
|
||||||
|
if (!id.empty()) {
|
||||||
|
label_.get_style_context()->add_class(id);
|
||||||
|
}
|
||||||
event_box_.add(label_);
|
event_box_.add(label_);
|
||||||
if (config_["max-length"].isUInt()) {
|
if (config_["max-length"].isUInt()) {
|
||||||
label_.set_max_width_chars(config_["max-length"].asUInt());
|
label_.set_max_width_chars(config_["max-length"].asUInt());
|
||||||
|
@ -88,12 +88,9 @@ int waybar::modules::Backlight::BacklightDev::get_max() const { return max_; }
|
|||||||
|
|
||||||
void waybar::modules::Backlight::BacklightDev::set_max(int max) { max_ = max; }
|
void waybar::modules::Backlight::BacklightDev::set_max(int max) { max_ = max; }
|
||||||
|
|
||||||
waybar::modules::Backlight::Backlight(const std::string &name, const Json::Value &config)
|
waybar::modules::Backlight::Backlight(const std::string &id, const Json::Value &config)
|
||||||
: ALabel(config, "{percent}%", 2),
|
: ALabel(config, "backlight", id, "{percent}%", 2),
|
||||||
name_(name),
|
|
||||||
preferred_device_(config["device"].isString() ? config["device"].asString() : "") {
|
preferred_device_(config["device"].isString() ? config["device"].asString() : "") {
|
||||||
label_.set_name("backlight");
|
|
||||||
|
|
||||||
// Get initial state
|
// Get initial state
|
||||||
{
|
{
|
||||||
std::unique_ptr<udev, UdevDeleter> udev_check{udev_new()};
|
std::unique_ptr<udev, UdevDeleter> udev_check{udev_new()};
|
||||||
@ -181,7 +178,7 @@ auto waybar::modules::Backlight::update() -> void {
|
|||||||
const auto percent = best->get_max() == 0 ? 100 : best->get_actual() * 100 / best->get_max();
|
const auto percent = best->get_max() == 0 ? 100 : best->get_actual() * 100 / best->get_max();
|
||||||
label_.set_markup(fmt::format(
|
label_.set_markup(fmt::format(
|
||||||
format_, fmt::arg("percent", std::to_string(percent)), fmt::arg("icon", getIcon(percent))));
|
format_, fmt::arg("percent", std::to_string(percent)), fmt::arg("icon", getIcon(percent))));
|
||||||
getState(percent);
|
getState(percent);
|
||||||
} else {
|
} else {
|
||||||
if (!previous_best_.has_value()) {
|
if (!previous_best_.has_value()) {
|
||||||
return;
|
return;
|
||||||
@ -213,7 +210,8 @@ void waybar::modules::Backlight::upsert_device(ForwardIt first, ForwardIt last,
|
|||||||
const char *name = udev_device_get_sysname(dev);
|
const char *name = udev_device_get_sysname(dev);
|
||||||
check_nn(name);
|
check_nn(name);
|
||||||
|
|
||||||
const char *actual_brightness_attr = strcmp(name, "amdgpu_bl0") == 0 ? "brightness" : "actual_brightness";
|
const char *actual_brightness_attr =
|
||||||
|
strcmp(name, "amdgpu_bl0") == 0 ? "brightness" : "actual_brightness";
|
||||||
|
|
||||||
const char *actual = udev_device_get_sysattr_value(dev, actual_brightness_attr);
|
const char *actual = udev_device_get_sysattr_value(dev, actual_brightness_attr);
|
||||||
check_nn(actual);
|
check_nn(actual);
|
||||||
|
@ -2,11 +2,7 @@
|
|||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
waybar::modules::Battery::Battery(const std::string& id, const Json::Value& config)
|
waybar::modules::Battery::Battery(const std::string& id, const Json::Value& config)
|
||||||
: ALabel(config, "{capacity}%", 60) {
|
: ALabel(config, "battery", id, "{capacity}%", 60) {
|
||||||
label_.set_name("battery");
|
|
||||||
if (!id.empty()) {
|
|
||||||
label_.get_style_context()->add_class(id);
|
|
||||||
}
|
|
||||||
getBatteries();
|
getBatteries();
|
||||||
fd_ = inotify_init1(IN_CLOEXEC);
|
fd_ = inotify_init1(IN_CLOEXEC);
|
||||||
if (fd_ == -1) {
|
if (fd_ == -1) {
|
||||||
|
@ -1,11 +1,7 @@
|
|||||||
#include "modules/clock.hpp"
|
#include "modules/clock.hpp"
|
||||||
|
|
||||||
waybar::modules::Clock::Clock(const std::string& id, const Json::Value& config)
|
waybar::modules::Clock::Clock(const std::string& id, const Json::Value& config)
|
||||||
: ALabel(config, "{:%H:%M}", 60) {
|
: ALabel(config, "clock", id, "{:%H:%M}", 60) {
|
||||||
label_.set_name("clock");
|
|
||||||
if (!id.empty()) {
|
|
||||||
label_.get_style_context()->add_class(id);
|
|
||||||
}
|
|
||||||
thread_ = [this] {
|
thread_ = [this] {
|
||||||
dp.emit();
|
dp.emit();
|
||||||
auto now = std::chrono::system_clock::now();
|
auto now = std::chrono::system_clock::now();
|
||||||
|
@ -2,11 +2,7 @@
|
|||||||
#include <numeric>
|
#include <numeric>
|
||||||
|
|
||||||
waybar::modules::Cpu::Cpu(const std::string& id, const Json::Value& config)
|
waybar::modules::Cpu::Cpu(const std::string& id, const Json::Value& config)
|
||||||
: ALabel(config, "{usage}%", 10) {
|
: ALabel(config, "cpu", id, "{usage}%", 10) {
|
||||||
label_.set_name("cpu");
|
|
||||||
if (!id.empty()) {
|
|
||||||
label_.get_style_context()->add_class(id);
|
|
||||||
}
|
|
||||||
thread_ = [this] {
|
thread_ = [this] {
|
||||||
dp.emit();
|
dp.emit();
|
||||||
thread_.sleep_for(interval_);
|
thread_.sleep_for(interval_);
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
waybar::modules::Custom::Custom(const std::string& name, const Json::Value& config)
|
waybar::modules::Custom::Custom(const std::string& name, const Json::Value& config)
|
||||||
: ALabel(config, "{}"), name_(name), fp_(nullptr), pid_(-1) {
|
: ALabel(config, "custom-" + name_, name, "{}"), name_(name), fp_(nullptr), pid_(-1) {
|
||||||
label_.set_name("custom-" + name_);
|
|
||||||
if (config_["exec"].isString()) {
|
if (config_["exec"].isString()) {
|
||||||
if (interval_.count() > 0) {
|
if (interval_.count() > 0) {
|
||||||
delayWorker();
|
delayWorker();
|
||||||
|
@ -3,15 +3,11 @@
|
|||||||
|
|
||||||
waybar::modules::IdleInhibitor::IdleInhibitor(const std::string& id, const Bar& bar,
|
waybar::modules::IdleInhibitor::IdleInhibitor(const std::string& id, const Bar& bar,
|
||||||
const Json::Value& config)
|
const Json::Value& config)
|
||||||
: ALabel(config, "{status}"),
|
: ALabel(config, "idle_inhibitor", id, "{status}"),
|
||||||
bar_(bar),
|
bar_(bar),
|
||||||
status_("deactivated"),
|
status_("deactivated"),
|
||||||
idle_inhibitor_(nullptr),
|
idle_inhibitor_(nullptr),
|
||||||
pid_(-1) {
|
pid_(-1) {
|
||||||
label_.set_name("idle_inhibitor");
|
|
||||||
if (!id.empty()) {
|
|
||||||
label_.get_style_context()->add_class(id);
|
|
||||||
}
|
|
||||||
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
event_box_.add_events(Gdk::BUTTON_PRESS_MASK);
|
||||||
event_box_.signal_button_press_event().connect(
|
event_box_.signal_button_press_event().connect(
|
||||||
sigc::mem_fun(*this, &IdleInhibitor::handleToggle));
|
sigc::mem_fun(*this, &IdleInhibitor::handleToggle));
|
||||||
|
@ -1,11 +1,7 @@
|
|||||||
#include "modules/memory.hpp"
|
#include "modules/memory.hpp"
|
||||||
|
|
||||||
waybar::modules::Memory::Memory(const std::string& id, const Json::Value& config)
|
waybar::modules::Memory::Memory(const std::string& id, const Json::Value& config)
|
||||||
: ALabel(config, "{}%", 30) {
|
: ALabel(config, "memory", id, "{}%", 30) {
|
||||||
label_.set_name("memory");
|
|
||||||
if (!id.empty()) {
|
|
||||||
label_.get_style_context()->add_class(id);
|
|
||||||
}
|
|
||||||
thread_ = [this] {
|
thread_ = [this] {
|
||||||
dp.emit();
|
dp.emit();
|
||||||
thread_.sleep_for(interval_);
|
thread_.sleep_for(interval_);
|
||||||
@ -15,12 +11,13 @@ waybar::modules::Memory::Memory(const std::string& id, const Json::Value& config
|
|||||||
auto waybar::modules::Memory::update() -> void {
|
auto waybar::modules::Memory::update() -> void {
|
||||||
parseMeminfo();
|
parseMeminfo();
|
||||||
if (memtotal_ > 0 && memfree_ >= 0) {
|
if (memtotal_ > 0 && memfree_ >= 0) {
|
||||||
int used_ram_percentage = 100 * (memtotal_ - memfree_) / memtotal_;
|
int used_ram_percentage = 100 * (memtotal_ - memfree_) / memtotal_;
|
||||||
auto used_ram_gigabytes = (memtotal_ - memfree_) / std::pow(1024, 2);
|
auto used_ram_gigabytes = (memtotal_ - memfree_) / std::pow(1024, 2);
|
||||||
auto available_ram_gigabytes = memfree_ / std::pow(1024, 2);
|
auto available_ram_gigabytes = memfree_ / std::pow(1024, 2);
|
||||||
|
|
||||||
getState(used_ram_percentage);
|
getState(used_ram_percentage);
|
||||||
label_.set_markup(fmt::format(format_, used_ram_percentage,
|
label_.set_markup(fmt::format(format_,
|
||||||
|
used_ram_percentage,
|
||||||
fmt::arg("percentage", used_ram_percentage),
|
fmt::arg("percentage", used_ram_percentage),
|
||||||
fmt::arg("used", used_ram_gigabytes),
|
fmt::arg("used", used_ram_gigabytes),
|
||||||
fmt::arg("avail", available_ram_gigabytes)));
|
fmt::arg("avail", available_ram_gigabytes)));
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include <spdlog/spdlog.h>
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
waybar::modules::MPD::MPD(const std::string& id, const Json::Value& config)
|
waybar::modules::MPD::MPD(const std::string& id, const Json::Value& config)
|
||||||
: ALabel(config, "{album} - {artist} - {title}", 5),
|
: ALabel(config, "mpd", id, "{album} - {artist} - {title}", 5),
|
||||||
module_name_(id.empty() ? "mpd" : "mpd#" + id),
|
module_name_(id.empty() ? "mpd" : "mpd#" + id),
|
||||||
server_(nullptr),
|
server_(nullptr),
|
||||||
port_(config_["port"].isUInt() ? config["port"].asUInt() : 0),
|
port_(config_["port"].isUInt() ? config["port"].asUInt() : 0),
|
||||||
@ -21,11 +21,6 @@ waybar::modules::MPD::MPD(const std::string& id, const Json::Value& config)
|
|||||||
spdlog::warn("{}: `timeout` configuration should be an unsigned int", module_name_);
|
spdlog::warn("{}: `timeout` configuration should be an unsigned int", module_name_);
|
||||||
}
|
}
|
||||||
|
|
||||||
label_.set_name("mpd");
|
|
||||||
if (!id.empty()) {
|
|
||||||
label_.get_style_context()->add_class(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!config["server"].isNull()) {
|
if (!config["server"].isNull()) {
|
||||||
if (!config_["server"].isString()) {
|
if (!config_["server"].isString()) {
|
||||||
spdlog::warn("{}:`server` configuration should be a string", module_name_);
|
spdlog::warn("{}:`server` configuration should be a string", module_name_);
|
||||||
@ -261,7 +256,7 @@ void waybar::modules::MPD::tryConnect() {
|
|||||||
checkErrors(connection_.get());
|
checkErrors(connection_.get());
|
||||||
spdlog::info("{}: Connected to MPD", module_name_);
|
spdlog::info("{}: Connected to MPD", module_name_);
|
||||||
} catch (std::runtime_error& e) {
|
} catch (std::runtime_error& e) {
|
||||||
spdlog::error("{}: Failed to connect to MPD: {}", module_name_, e.what());
|
spdlog::error("{}: Failed to connect to MPD: {}", module_name_, e.what());
|
||||||
connection_.reset();
|
connection_.reset();
|
||||||
alternate_connection_.reset();
|
alternate_connection_.reset();
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ std::optional<unsigned long long> read_netstat(std::string_view category, std::s
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
waybar::modules::Network::Network(const std::string &id, const Json::Value &config)
|
waybar::modules::Network::Network(const std::string &id, const Json::Value &config)
|
||||||
: ALabel(config, "{ifname}", 60),
|
: ALabel(config, "network", id, "{ifname}", 60),
|
||||||
ifid_(-1),
|
ifid_(-1),
|
||||||
last_ext_iface_(-1),
|
last_ext_iface_(-1),
|
||||||
family_(config["family"] == "ipv6" ? AF_INET6 : AF_INET),
|
family_(config["family"] == "ipv6" ? AF_INET6 : AF_INET),
|
||||||
@ -83,11 +83,6 @@ waybar::modules::Network::Network(const std::string &id, const Json::Value &conf
|
|||||||
signal_strength_dbm_(0),
|
signal_strength_dbm_(0),
|
||||||
signal_strength_(0),
|
signal_strength_(0),
|
||||||
frequency_(0) {
|
frequency_(0) {
|
||||||
label_.set_name("network");
|
|
||||||
if (!id.empty()) {
|
|
||||||
label_.get_style_context()->add_class(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto down_octets = read_netstat(BANDWIDTH_CATEGORY, BANDWIDTH_DOWN_TOTAL_KEY);
|
auto down_octets = read_netstat(BANDWIDTH_CATEGORY, BANDWIDTH_DOWN_TOTAL_KEY);
|
||||||
auto up_octets = read_netstat(BANDWIDTH_CATEGORY, BANDWIDTH_UP_TOTAL_KEY);
|
auto up_octets = read_netstat(BANDWIDTH_CATEGORY, BANDWIDTH_UP_TOTAL_KEY);
|
||||||
if (down_octets) {
|
if (down_octets) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "modules/pulseaudio.hpp"
|
#include "modules/pulseaudio.hpp"
|
||||||
|
|
||||||
waybar::modules::Pulseaudio::Pulseaudio(const std::string &id, const Json::Value &config)
|
waybar::modules::Pulseaudio::Pulseaudio(const std::string &id, const Json::Value &config)
|
||||||
: ALabel(config, "{volume}%"),
|
: ALabel(config, "pulseaudio", id, "{volume}%"),
|
||||||
mainloop_(nullptr),
|
mainloop_(nullptr),
|
||||||
mainloop_api_(nullptr),
|
mainloop_api_(nullptr),
|
||||||
context_(nullptr),
|
context_(nullptr),
|
||||||
@ -12,10 +12,6 @@ waybar::modules::Pulseaudio::Pulseaudio(const std::string &id, const Json::Value
|
|||||||
source_idx_(0),
|
source_idx_(0),
|
||||||
source_volume_(0),
|
source_volume_(0),
|
||||||
source_muted_(false) {
|
source_muted_(false) {
|
||||||
label_.set_name("pulseaudio");
|
|
||||||
if (!id.empty()) {
|
|
||||||
label_.get_style_context()->add_class(id);
|
|
||||||
}
|
|
||||||
mainloop_ = pa_threaded_mainloop_new();
|
mainloop_ = pa_threaded_mainloop_new();
|
||||||
if (mainloop_ == nullptr) {
|
if (mainloop_ == nullptr) {
|
||||||
throw std::runtime_error("pa_mainloop_new() failed.");
|
throw std::runtime_error("pa_mainloop_new() failed.");
|
||||||
|
@ -3,11 +3,7 @@
|
|||||||
|
|
||||||
namespace waybar::modules::sway {
|
namespace waybar::modules::sway {
|
||||||
|
|
||||||
Mode::Mode(const std::string& id, const Json::Value& config) : ALabel(config, "{}") {
|
Mode::Mode(const std::string& id, const Json::Value& config) : ALabel(config, "mode", id, "{}") {
|
||||||
label_.set_name("mode");
|
|
||||||
if (!id.empty()) {
|
|
||||||
label_.get_style_context()->add_class(id);
|
|
||||||
}
|
|
||||||
ipc_.subscribe(R"(["mode"])");
|
ipc_.subscribe(R"(["mode"])");
|
||||||
ipc_.signal_event.connect(sigc::mem_fun(*this, &Mode::onEvent));
|
ipc_.signal_event.connect(sigc::mem_fun(*this, &Mode::onEvent));
|
||||||
// Launch worker
|
// Launch worker
|
||||||
|
@ -4,11 +4,7 @@
|
|||||||
namespace waybar::modules::sway {
|
namespace waybar::modules::sway {
|
||||||
|
|
||||||
Window::Window(const std::string& id, const Bar& bar, const Json::Value& config)
|
Window::Window(const std::string& id, const Bar& bar, const Json::Value& config)
|
||||||
: ALabel(config, "{}"), bar_(bar), windowId_(-1) {
|
: ALabel(config, "window", id, "{}"), bar_(bar), windowId_(-1) {
|
||||||
label_.set_name("window");
|
|
||||||
if (!id.empty()) {
|
|
||||||
label_.get_style_context()->add_class(id);
|
|
||||||
}
|
|
||||||
if (label_.get_max_width_chars() == -1) {
|
if (label_.get_max_width_chars() == -1) {
|
||||||
label_.set_hexpand(true);
|
label_.set_hexpand(true);
|
||||||
label_.set_ellipsize(Pango::EllipsizeMode::ELLIPSIZE_END);
|
label_.set_ellipsize(Pango::EllipsizeMode::ELLIPSIZE_END);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "modules/temperature.hpp"
|
#include "modules/temperature.hpp"
|
||||||
|
|
||||||
waybar::modules::Temperature::Temperature(const std::string& id, const Json::Value& config)
|
waybar::modules::Temperature::Temperature(const std::string& id, const Json::Value& config)
|
||||||
: ALabel(config, "{temperatureC}°C", 10) {
|
: ALabel(config, "temperature", id, "{temperatureC}°C", 10) {
|
||||||
if (config_["hwmon-path"].isString()) {
|
if (config_["hwmon-path"].isString()) {
|
||||||
file_path_ = config_["hwmon-path"].asString();
|
file_path_ = config_["hwmon-path"].asString();
|
||||||
} else {
|
} else {
|
||||||
@ -12,10 +12,6 @@ waybar::modules::Temperature::Temperature(const std::string& id, const Json::Val
|
|||||||
if (!temp.is_open()) {
|
if (!temp.is_open()) {
|
||||||
throw std::runtime_error("Can't open " + file_path_);
|
throw std::runtime_error("Can't open " + file_path_);
|
||||||
}
|
}
|
||||||
label_.set_name("temperature");
|
|
||||||
if (!id.empty()) {
|
|
||||||
label_.get_style_context()->add_class(id);
|
|
||||||
}
|
|
||||||
thread_ = [this] {
|
thread_ = [this] {
|
||||||
dp.emit();
|
dp.emit();
|
||||||
thread_.sleep_for(interval_);
|
thread_.sleep_for(interval_);
|
||||||
@ -58,4 +54,4 @@ std::tuple<uint16_t, uint16_t> waybar::modules::Temperature::getTemperature() {
|
|||||||
bool waybar::modules::Temperature::isCritical(uint16_t temperature_c) {
|
bool waybar::modules::Temperature::isCritical(uint16_t temperature_c) {
|
||||||
return config_["critical-threshold"].isInt() &&
|
return config_["critical-threshold"].isInt() &&
|
||||||
temperature_c >= config_["critical-threshold"].asInt();
|
temperature_c >= config_["critical-threshold"].asInt();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user