mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-24 00:03:11 +01:00
Rename members of CurrencyType
This commit is contained in:
@@ -72,16 +72,16 @@ namespace OpenRCT2::Ui::Windows
|
||||
close();
|
||||
break;
|
||||
case WIDX_RATE_UP:
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::Custom)].rate += 1;
|
||||
Config::Get().general.customCurrencyRate = CurrencyDescriptors[EnumValue(CurrencyType::Custom)].rate;
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::custom)].rate += 1;
|
||||
Config::Get().general.customCurrencyRate = CurrencyDescriptors[EnumValue(CurrencyType::custom)].rate;
|
||||
Config::Save();
|
||||
windowMgr->InvalidateAll();
|
||||
break;
|
||||
case WIDX_RATE_DOWN:
|
||||
if (CurrencyDescriptors[EnumValue(CurrencyType::Custom)].rate > 1)
|
||||
if (CurrencyDescriptors[EnumValue(CurrencyType::custom)].rate > 1)
|
||||
{
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::Custom)].rate -= 1;
|
||||
Config::Get().general.customCurrencyRate = CurrencyDescriptors[EnumValue(CurrencyType::Custom)].rate;
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::custom)].rate -= 1;
|
||||
Config::Get().general.customCurrencyRate = CurrencyDescriptors[EnumValue(CurrencyType::custom)].rate;
|
||||
Config::Save();
|
||||
windowMgr->InvalidateAll();
|
||||
}
|
||||
@@ -94,7 +94,7 @@ namespace OpenRCT2::Ui::Windows
|
||||
{ windowPos.x + widget->left, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0,
|
||||
Dropdown::Flag::StayOpen, 2, widget->width() - 3);
|
||||
|
||||
if (CurrencyDescriptors[EnumValue(CurrencyType::Custom)].affix_unicode == CurrencyAffix::Prefix)
|
||||
if (CurrencyDescriptors[EnumValue(CurrencyType::custom)].affix_unicode == CurrencyAffix::Prefix)
|
||||
{
|
||||
gDropdown.items[0].setChecked(true);
|
||||
}
|
||||
@@ -107,7 +107,7 @@ namespace OpenRCT2::Ui::Windows
|
||||
case WIDX_SYMBOL_TEXT:
|
||||
WindowTextInputRawOpen(
|
||||
this, WIDX_SYMBOL_TEXT, STR_CUSTOM_CURRENCY_SYMBOL_INPUT_TITLE, STR_CUSTOM_CURRENCY_SYMBOL_INPUT_DESC,
|
||||
{}, CurrencyDescriptors[EnumValue(CurrencyType::Custom)].symbol_unicode, kCurrencySymbolMaxSize);
|
||||
{}, CurrencyDescriptors[EnumValue(CurrencyType::custom)].symbol_unicode, kCurrencySymbolMaxSize);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -119,7 +119,7 @@ namespace OpenRCT2::Ui::Windows
|
||||
case WIDX_RATE:
|
||||
WindowTextInputOpen(
|
||||
this, WIDX_RATE, STR_RATE_INPUT_TITLE, STR_RATE_INPUT_DESC, {}, STR_FORMAT_INTEGER,
|
||||
static_cast<uint32_t>(CurrencyDescriptors[EnumValue(CurrencyType::Custom)].rate),
|
||||
static_cast<uint32_t>(CurrencyDescriptors[EnumValue(CurrencyType::custom)].rate),
|
||||
kCurrencyRateMaxNumDigits);
|
||||
break;
|
||||
}
|
||||
@@ -134,16 +134,16 @@ namespace OpenRCT2::Ui::Windows
|
||||
{
|
||||
if (dropdownIndex == 0)
|
||||
{
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::Custom)].affix_ascii = CurrencyAffix::Prefix;
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::Custom)].affix_unicode = CurrencyAffix::Prefix;
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::custom)].affix_ascii = CurrencyAffix::Prefix;
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::custom)].affix_unicode = CurrencyAffix::Prefix;
|
||||
}
|
||||
else if (dropdownIndex == 1)
|
||||
{
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::Custom)].affix_ascii = CurrencyAffix::Suffix;
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::Custom)].affix_unicode = CurrencyAffix::Suffix;
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::custom)].affix_ascii = CurrencyAffix::Suffix;
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::custom)].affix_unicode = CurrencyAffix::Suffix;
|
||||
}
|
||||
|
||||
Config::Get().general.customCurrencyAffix = CurrencyDescriptors[EnumValue(CurrencyType::Custom)].affix_unicode;
|
||||
Config::Get().general.customCurrencyAffix = CurrencyDescriptors[EnumValue(CurrencyType::custom)].affix_unicode;
|
||||
Config::Save();
|
||||
|
||||
auto* windowMgr = Ui::GetWindowManager();
|
||||
@@ -162,10 +162,10 @@ namespace OpenRCT2::Ui::Windows
|
||||
{
|
||||
case WIDX_SYMBOL_TEXT:
|
||||
String::safeUtf8Copy(
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::Custom)].symbol_unicode, std::string(text).c_str(),
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::custom)].symbol_unicode, std::string(text).c_str(),
|
||||
kCurrencySymbolMaxSize);
|
||||
|
||||
Config::Get().general.customCurrencySymbol = CurrencyDescriptors[EnumValue(CurrencyType::Custom)]
|
||||
Config::Get().general.customCurrencySymbol = CurrencyDescriptors[EnumValue(CurrencyType::custom)]
|
||||
.symbol_unicode;
|
||||
|
||||
Config::Save();
|
||||
@@ -178,8 +178,8 @@ namespace OpenRCT2::Ui::Windows
|
||||
if (res.has_value())
|
||||
{
|
||||
int32_t rate = res.value();
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::Custom)].rate = rate;
|
||||
Config::Get().general.customCurrencyRate = CurrencyDescriptors[EnumValue(CurrencyType::Custom)].rate;
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::custom)].rate = rate;
|
||||
Config::Get().general.customCurrencyRate = CurrencyDescriptors[EnumValue(CurrencyType::custom)].rate;
|
||||
Config::Save();
|
||||
windowMgr->InvalidateAll();
|
||||
}
|
||||
@@ -198,7 +198,7 @@ namespace OpenRCT2::Ui::Windows
|
||||
|
||||
DrawTextBasic(rt, screenCoords, STR_RATE, {}, { colours[1] });
|
||||
|
||||
int32_t baseExchange = CurrencyDescriptors[EnumValue(CurrencyType::Pounds)].rate;
|
||||
int32_t baseExchange = CurrencyDescriptors[EnumValue(CurrencyType::pounds)].rate;
|
||||
ft = Formatter();
|
||||
ft.Add<int32_t>(baseExchange);
|
||||
DrawTextBasic(rt, screenCoords + ScreenCoordsXY{ 200, 0 }, STR_CUSTOM_CURRENCY_EQUIVALENCY, ft, { colours[1] });
|
||||
@@ -209,11 +209,11 @@ namespace OpenRCT2::Ui::Windows
|
||||
|
||||
screenCoords = windowPos + ScreenCoordsXY{ widgets[WIDX_SYMBOL_TEXT].left + 1, widgets[WIDX_SYMBOL_TEXT].top };
|
||||
|
||||
DrawText(rt, screenCoords, { colours[1] }, CurrencyDescriptors[EnumValue(CurrencyType::Custom)].symbol_unicode);
|
||||
DrawText(rt, screenCoords, { colours[1] }, CurrencyDescriptors[EnumValue(CurrencyType::custom)].symbol_unicode);
|
||||
|
||||
auto drawPos = windowPos
|
||||
+ ScreenCoordsXY{ widgets[WIDX_AFFIX_DROPDOWN].left + 1, widgets[WIDX_AFFIX_DROPDOWN].top };
|
||||
StringId stringId = (CurrencyDescriptors[EnumValue(CurrencyType::Custom)].affix_unicode == CurrencyAffix::Prefix)
|
||||
StringId stringId = (CurrencyDescriptors[EnumValue(CurrencyType::custom)].affix_unicode == CurrencyAffix::Prefix)
|
||||
? STR_PREFIX
|
||||
: STR_SUFFIX;
|
||||
DrawTextBasic(rt, drawPos, stringId, {}, { colours[1] });
|
||||
|
||||
@@ -1204,10 +1204,10 @@ namespace OpenRCT2::Ui::Windows
|
||||
case WIDX_CURRENCY_DROPDOWN:
|
||||
{
|
||||
// All the currencies plus the separator
|
||||
constexpr auto numItems = EnumValue(CurrencyType::Count) + 1;
|
||||
constexpr auto numItems = EnumValue(CurrencyType::count) + 1;
|
||||
|
||||
// All the currencies except custom currency
|
||||
constexpr size_t numOrdinaryCurrencies = EnumValue(CurrencyType::Count) - 1;
|
||||
constexpr size_t numOrdinaryCurrencies = EnumValue(CurrencyType::count) - 1;
|
||||
|
||||
for (size_t i = 0; i < numOrdinaryCurrencies; i++)
|
||||
{
|
||||
@@ -1217,11 +1217,11 @@ namespace OpenRCT2::Ui::Windows
|
||||
gDropdown.items[numOrdinaryCurrencies] = Dropdown::Separator();
|
||||
|
||||
gDropdown.items[numOrdinaryCurrencies + 1] = Dropdown::MenuLabel(
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::Custom)].stringId);
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::custom)].stringId);
|
||||
|
||||
ShowDropdown(widget, numItems);
|
||||
|
||||
if (Config::Get().general.currencyFormat == CurrencyType::Custom)
|
||||
if (Config::Get().general.currencyFormat == CurrencyType::custom)
|
||||
{
|
||||
gDropdown.items[EnumValue(Config::Get().general.currencyFormat) + 1].setChecked(true);
|
||||
}
|
||||
@@ -1283,7 +1283,7 @@ namespace OpenRCT2::Ui::Windows
|
||||
UpdateHeightMarkers();
|
||||
break;
|
||||
case WIDX_CURRENCY_DROPDOWN:
|
||||
if (dropdownIndex == EnumValue(CurrencyType::Custom) + 1)
|
||||
if (dropdownIndex == EnumValue(CurrencyType::custom) + 1)
|
||||
{ // Add 1 because the separator occupies a position
|
||||
Config::Get().general.currencyFormat = static_cast<CurrencyType>(dropdownIndex - 1);
|
||||
ContextOpenWindow(WindowClass::customCurrencyConfig);
|
||||
|
||||
@@ -68,24 +68,24 @@ namespace OpenRCT2::Config
|
||||
});
|
||||
|
||||
static const auto Enum_Currency = ConfigEnum<CurrencyType>({
|
||||
ConfigEnumEntry<CurrencyType>("GBP", CurrencyType::Pounds),
|
||||
ConfigEnumEntry<CurrencyType>("USD", CurrencyType::Dollars),
|
||||
ConfigEnumEntry<CurrencyType>("FRF", CurrencyType::Franc),
|
||||
ConfigEnumEntry<CurrencyType>("DEM", CurrencyType::DeutscheMark),
|
||||
ConfigEnumEntry<CurrencyType>("JPY", CurrencyType::Yen),
|
||||
ConfigEnumEntry<CurrencyType>("ESP", CurrencyType::Peseta),
|
||||
ConfigEnumEntry<CurrencyType>("ITL", CurrencyType::Lira),
|
||||
ConfigEnumEntry<CurrencyType>("NLG", CurrencyType::Guilders),
|
||||
ConfigEnumEntry<CurrencyType>("SEK", CurrencyType::Krona),
|
||||
ConfigEnumEntry<CurrencyType>("EUR", CurrencyType::Euros),
|
||||
ConfigEnumEntry<CurrencyType>("KRW", CurrencyType::Won),
|
||||
ConfigEnumEntry<CurrencyType>("RUB", CurrencyType::Rouble),
|
||||
ConfigEnumEntry<CurrencyType>("CZK", CurrencyType::CzechKoruna),
|
||||
ConfigEnumEntry<CurrencyType>("HKD", CurrencyType::HKD),
|
||||
ConfigEnumEntry<CurrencyType>("TWD", CurrencyType::TWD),
|
||||
ConfigEnumEntry<CurrencyType>("CNY", CurrencyType::Yuan),
|
||||
ConfigEnumEntry<CurrencyType>("HUF", CurrencyType::Forint),
|
||||
ConfigEnumEntry<CurrencyType>("CUSTOM", CurrencyType::Custom),
|
||||
ConfigEnumEntry<CurrencyType>("GBP", CurrencyType::pounds),
|
||||
ConfigEnumEntry<CurrencyType>("USD", CurrencyType::dollars),
|
||||
ConfigEnumEntry<CurrencyType>("FRF", CurrencyType::franc),
|
||||
ConfigEnumEntry<CurrencyType>("DEM", CurrencyType::deutscheMark),
|
||||
ConfigEnumEntry<CurrencyType>("JPY", CurrencyType::yen),
|
||||
ConfigEnumEntry<CurrencyType>("ESP", CurrencyType::peseta),
|
||||
ConfigEnumEntry<CurrencyType>("ITL", CurrencyType::lira),
|
||||
ConfigEnumEntry<CurrencyType>("NLG", CurrencyType::guilders),
|
||||
ConfigEnumEntry<CurrencyType>("SEK", CurrencyType::krona),
|
||||
ConfigEnumEntry<CurrencyType>("EUR", CurrencyType::euros),
|
||||
ConfigEnumEntry<CurrencyType>("KRW", CurrencyType::won),
|
||||
ConfigEnumEntry<CurrencyType>("RUB", CurrencyType::rouble),
|
||||
ConfigEnumEntry<CurrencyType>("CZK", CurrencyType::czechKoruna),
|
||||
ConfigEnumEntry<CurrencyType>("HKD", CurrencyType::hongKongDollar),
|
||||
ConfigEnumEntry<CurrencyType>("TWD", CurrencyType::newTaiwanDollar),
|
||||
ConfigEnumEntry<CurrencyType>("CNY", CurrencyType::yuan),
|
||||
ConfigEnumEntry<CurrencyType>("HUF", CurrencyType::forint),
|
||||
ConfigEnumEntry<CurrencyType>("CUSTOM", CurrencyType::custom),
|
||||
});
|
||||
|
||||
static const auto Enum_CurrencySymbolAffix = ConfigEnum<CurrencyAffix>({
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
namespace OpenRCT2
|
||||
{
|
||||
// clang-format off
|
||||
CurrencyDescriptor CurrencyDescriptors[EnumValue(CurrencyType::Count)] = {
|
||||
CurrencyDescriptor CurrencyDescriptors[EnumValue(CurrencyType::count)] = {
|
||||
{ "GBP", 10, CurrencyAffix::Prefix, u8"£", CurrencyAffix::Suffix, "GBP", STR_POUNDS }, // British Pound
|
||||
{ "USD", 10, CurrencyAffix::Prefix, u8"$", CurrencyAffix::Prefix, "$", STR_DOLLARS }, // US Dollar
|
||||
{ "FRF", 10, CurrencyAffix::Suffix, u8"F", CurrencyAffix::Suffix, "F", STR_FRANC }, // French Franc
|
||||
@@ -45,12 +45,12 @@ namespace OpenRCT2
|
||||
|
||||
void CurrencyLoadCustomCurrencyConfig()
|
||||
{
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::Custom)].rate = Config::Get().general.customCurrencyRate;
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::Custom)].affix_unicode = Config::Get().general.customCurrencyAffix;
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::custom)].rate = Config::Get().general.customCurrencyRate;
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::custom)].affix_unicode = Config::Get().general.customCurrencyAffix;
|
||||
if (!Config::Get().general.customCurrencySymbol.empty())
|
||||
{
|
||||
String::safeUtf8Copy(
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::Custom)].symbol_unicode,
|
||||
CurrencyDescriptors[EnumValue(CurrencyType::custom)].symbol_unicode,
|
||||
Config::Get().general.customCurrencySymbol.c_str(), kCurrencySymbolMaxSize);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace OpenRCT2
|
||||
|
||||
// List of currency formats
|
||||
// TODO: refactor into getter
|
||||
extern CurrencyDescriptor CurrencyDescriptors[EnumValue(CurrencyType::Count)];
|
||||
extern CurrencyDescriptor CurrencyDescriptors[EnumValue(CurrencyType::count)];
|
||||
|
||||
/**
|
||||
* Loads custom currency saved parameters into {@link CurrencyDescriptors}'
|
||||
|
||||
@@ -16,27 +16,27 @@ namespace OpenRCT2
|
||||
// List of currencies
|
||||
enum class CurrencyType : uint8_t
|
||||
{
|
||||
Pounds, // British Pound
|
||||
Dollars, // US Dollar
|
||||
Franc, // French Franc
|
||||
DeutscheMark, // Deutsche Mark
|
||||
Yen, // Japanese Yen
|
||||
Peseta, // Spanish Peseta
|
||||
Lira, // Italian Lira
|
||||
Guilders, // Dutch Gilder
|
||||
Krona, // Swedish Krona
|
||||
Euros, // Euro
|
||||
Won, // South Korean Won
|
||||
Rouble, // Russian Rouble
|
||||
CzechKoruna, // Czech koruna
|
||||
HKD, // Hong Kong Dollar
|
||||
TWD, // New Taiwan Dollar
|
||||
Yuan, // Chinese Yuan
|
||||
Forint, // Hungarian Forint
|
||||
pounds, // British Pound
|
||||
dollars, // US Dollar
|
||||
franc, // French Franc
|
||||
deutscheMark, // Deutsche Mark
|
||||
yen, // Japanese Yen
|
||||
peseta, // Spanish Peseta
|
||||
lira, // Italian Lira
|
||||
guilders, // Dutch Gilder
|
||||
krona, // Swedish Krona
|
||||
euros, // Euro
|
||||
won, // South Korean Won
|
||||
rouble, // Russian Rouble
|
||||
czechKoruna, // Czech koruna
|
||||
hongKongDollar, // Hong Kong Dollar
|
||||
newTaiwanDollar, // New Taiwan Dollar
|
||||
yuan, // Chinese Yuan
|
||||
forint, // Hungarian Forint
|
||||
|
||||
Custom, // Custom currency
|
||||
custom, // Custom currency
|
||||
|
||||
Count // Last item
|
||||
count, // Last item
|
||||
};
|
||||
|
||||
enum class CurrencyAffix : uint8_t
|
||||
|
||||
@@ -52,10 +52,10 @@ namespace OpenRCT2::Platform
|
||||
{
|
||||
if (currCode == nullptr || strlen(currCode) < 3)
|
||||
{
|
||||
return CurrencyType::Pounds;
|
||||
return CurrencyType::pounds;
|
||||
}
|
||||
|
||||
for (int32_t currency = 0; currency < EnumValue(CurrencyType::Count); ++currency)
|
||||
for (int32_t currency = 0; currency < EnumValue(CurrencyType::count); ++currency)
|
||||
{
|
||||
if (strncmp(currCode, CurrencyDescriptors[currency].isoCode, 3) == 0)
|
||||
{
|
||||
@@ -63,7 +63,7 @@ namespace OpenRCT2::Platform
|
||||
}
|
||||
}
|
||||
|
||||
return CurrencyType::Pounds;
|
||||
return CurrencyType::pounds;
|
||||
}
|
||||
|
||||
RealWorldDate GetDateLocal()
|
||||
|
||||
@@ -140,7 +140,7 @@ TEST_F(FormattingTests, comma_large)
|
||||
|
||||
TEST_F(FormattingTests, currency)
|
||||
{
|
||||
Config::Get().general.currencyFormat = CurrencyType::Pounds;
|
||||
Config::Get().general.currencyFormat = CurrencyType::pounds;
|
||||
ASSERT_EQ(u8"-£251", FormatString("{CURRENCY}", -2510));
|
||||
ASSERT_EQ(u8"£1", FormatString("{CURRENCY}", 4));
|
||||
ASSERT_EQ(u8"£1", FormatString("{CURRENCY}", 5));
|
||||
@@ -151,7 +151,7 @@ TEST_F(FormattingTests, currency)
|
||||
|
||||
TEST_F(FormattingTests, currency2dp)
|
||||
{
|
||||
Config::Get().general.currencyFormat = CurrencyType::Pounds;
|
||||
Config::Get().general.currencyFormat = CurrencyType::pounds;
|
||||
ASSERT_EQ(u8"-£251.00", FormatString("{CURRENCY2DP}", -2510));
|
||||
ASSERT_EQ(u8"£0.40", FormatString("{CURRENCY2DP}", 4));
|
||||
ASSERT_EQ(u8"£0.50", FormatString("{CURRENCY2DP}", 5));
|
||||
@@ -162,7 +162,7 @@ TEST_F(FormattingTests, currency2dp)
|
||||
|
||||
TEST_F(FormattingTests, currency_yen)
|
||||
{
|
||||
Config::Get().general.currencyFormat = CurrencyType::Yen;
|
||||
Config::Get().general.currencyFormat = CurrencyType::yen;
|
||||
ASSERT_EQ(u8"-¥25,100", FormatString("{CURRENCY}", -2510));
|
||||
ASSERT_EQ(u8"¥40", FormatString("{CURRENCY2DP}", 4));
|
||||
ASSERT_EQ(u8"¥50", FormatString("{CURRENCY2DP}", 5));
|
||||
@@ -173,7 +173,7 @@ TEST_F(FormattingTests, currency_yen)
|
||||
|
||||
TEST_F(FormattingTests, currency2dp_yen)
|
||||
{
|
||||
Config::Get().general.currencyFormat = CurrencyType::Yen;
|
||||
Config::Get().general.currencyFormat = CurrencyType::yen;
|
||||
ASSERT_EQ(u8"-¥25,100", FormatString("{CURRENCY2DP}", -2510));
|
||||
ASSERT_EQ(u8"¥40", FormatString("{CURRENCY2DP}", 4));
|
||||
ASSERT_EQ(u8"¥50", FormatString("{CURRENCY2DP}", 5));
|
||||
@@ -184,14 +184,14 @@ TEST_F(FormattingTests, currency2dp_yen)
|
||||
|
||||
TEST_F(FormattingTests, currency_pts)
|
||||
{
|
||||
Config::Get().general.currencyFormat = CurrencyType::Peseta;
|
||||
Config::Get().general.currencyFormat = CurrencyType::peseta;
|
||||
ASSERT_EQ("-251Pts", FormatString("{CURRENCY}", -2510));
|
||||
ASSERT_EQ("112Pts", FormatString("{CURRENCY}", 1111));
|
||||
}
|
||||
|
||||
TEST_F(FormattingTests, currency2dp_pts)
|
||||
{
|
||||
Config::Get().general.currencyFormat = CurrencyType::Peseta;
|
||||
Config::Get().general.currencyFormat = CurrencyType::peseta;
|
||||
ASSERT_EQ("-251.00Pts", FormatString("{CURRENCY2DP}", -2510));
|
||||
ASSERT_EQ("0.40Pts", FormatString("{CURRENCY2DP}", 4));
|
||||
ASSERT_EQ("111.10Pts", FormatString("{CURRENCY2DP}", 1111));
|
||||
|
||||
Reference in New Issue
Block a user