mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-06 18:25:37 +08:00
refs #469, renamed flags
* db to entity flags as it also features entities not from DB * Flag enums singular (discussed with MS / slack)
This commit is contained in:
committed by
Mathew Sutcliffe
parent
24432a56c7
commit
2cfd3540b8
@@ -20,7 +20,7 @@ namespace BlackCore
|
||||
Q_ASSERT_X(id >= 1024, Q_FUNC_INFO, "wrong id for metatype");
|
||||
id = qRegisterMetaType<BlackCore::INetwork::ConnectionStatus>();
|
||||
Q_ASSERT_X(id >= 1024, Q_FUNC_INFO, "wrong id for metatype");
|
||||
id = qRegisterMetaType<BlackCore::CWebReaderFlags::WebReaderFlags>();
|
||||
id = qRegisterMetaType<BlackCore::CWebReaderFlags::WebReaderFlag>();
|
||||
Q_ASSERT_X(id >= 1024, Q_FUNC_INFO, "wrong id for metatype");
|
||||
id = qRegisterMetaType<BlackCore::CWebReaderFlags::WebReader>();
|
||||
Q_UNUSED(id);
|
||||
|
||||
@@ -21,10 +21,10 @@ namespace BlackCore
|
||||
BlackMisc::CThreadedReader(owner, name)
|
||||
{ }
|
||||
|
||||
void CDatabaseReader::readInBackgroundThread(CDbFlags::Entity entities)
|
||||
void CDatabaseReader::readInBackgroundThread(CEntityFlags::Entity entities)
|
||||
{
|
||||
if (m_shutdown) { return; }
|
||||
bool s = QMetaObject::invokeMethod(this, "ps_read", Q_ARG(BlackMisc::Network::CDbFlags::Entity, entities));
|
||||
bool s = QMetaObject::invokeMethod(this, "ps_read", Q_ARG(BlackMisc::Network::CEntityFlags::Entity, entities));
|
||||
Q_ASSERT_X(s, Q_FUNC_INFO, "Invoke failed");
|
||||
Q_UNUSED(s);
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "blackcore/blackcoreexport.h"
|
||||
#include "blackmisc/threadedreader.h"
|
||||
#include "blackmisc/network/dbflags.h"
|
||||
#include "blackmisc/network/entityflags.h"
|
||||
#include <QNetworkReply>
|
||||
#include <QJsonArray>
|
||||
#include <QDateTime>
|
||||
@@ -54,7 +54,7 @@ namespace BlackCore
|
||||
};
|
||||
|
||||
//! Start reading in own thread
|
||||
void readInBackgroundThread(BlackMisc::Network::CDbFlags::Entity entities);
|
||||
void readInBackgroundThread(BlackMisc::Network::CEntityFlags::Entity entities);
|
||||
|
||||
//! Can connect to DB
|
||||
bool canConnect() const;
|
||||
|
||||
@@ -157,7 +157,7 @@ namespace BlackCore
|
||||
return m_countries.size();
|
||||
}
|
||||
|
||||
void CIcaoDataReader::ps_read(BlackMisc::Network::CDbFlags::Entity entities)
|
||||
void CIcaoDataReader::ps_read(BlackMisc::Network::CEntityFlags::Entity entities)
|
||||
{
|
||||
this->threadAssertCheck();
|
||||
Q_ASSERT(this->m_networkManagerAircraft);
|
||||
@@ -167,29 +167,29 @@ namespace BlackCore
|
||||
Q_ASSERT(!m_urlAirlineIcao.isEmpty());
|
||||
Q_ASSERT(!m_urlCountry.isEmpty());
|
||||
|
||||
CDbFlags::Entity entitiesTriggered = CDbFlags::NoEntity;
|
||||
if (entities.testFlag(CDbFlags::AircraftIcaoEntity))
|
||||
CEntityFlags::Entity entitiesTriggered = CEntityFlags::NoEntity;
|
||||
if (entities.testFlag(CEntityFlags::AircraftIcaoEntity))
|
||||
{
|
||||
QNetworkRequest requestAircraft(m_urlAircraftIcao);
|
||||
this->m_networkManagerAircraft->get(requestAircraft);
|
||||
entitiesTriggered |= CDbFlags::AircraftIcaoEntity;
|
||||
entitiesTriggered |= CEntityFlags::AircraftIcaoEntity;
|
||||
}
|
||||
|
||||
if (entities.testFlag(CDbFlags::AirlineIcaoEntity))
|
||||
if (entities.testFlag(CEntityFlags::AirlineIcaoEntity))
|
||||
{
|
||||
QNetworkRequest requestAirline(m_urlAirlineIcao);
|
||||
this->m_networkManagerAirlines->get(requestAirline);
|
||||
entitiesTriggered |= CDbFlags::AirlineIcaoEntity;
|
||||
entitiesTriggered |= CEntityFlags::AirlineIcaoEntity;
|
||||
}
|
||||
|
||||
if (entities.testFlag(CDbFlags::CountryEntity))
|
||||
if (entities.testFlag(CEntityFlags::CountryEntity))
|
||||
{
|
||||
QNetworkRequest requestCountry(m_urlCountry);
|
||||
this->m_networkManagerCountries->get(requestCountry);
|
||||
entitiesTriggered |= CDbFlags::CountryEntity;
|
||||
entitiesTriggered |= CEntityFlags::CountryEntity;
|
||||
}
|
||||
|
||||
emit readData(entitiesTriggered, CDbFlags::StartRead, 0);
|
||||
emit dataRead(entitiesTriggered, CEntityFlags::StartRead, 0);
|
||||
}
|
||||
|
||||
void CIcaoDataReader::ps_parseAircraftIcaoData(QNetworkReply *nwReplyPtr)
|
||||
@@ -200,7 +200,7 @@ namespace BlackCore
|
||||
QJsonArray array = this->transformReplyIntoDatastoreResponse(nwReply.data());
|
||||
if (array.isEmpty())
|
||||
{
|
||||
emit readData(CDbFlags::AircraftIcaoEntity, CDbFlags::ReadFailed, 0);
|
||||
emit dataRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadFailed, 0);
|
||||
return;
|
||||
}
|
||||
CAircraftIcaoCodeList codes = CAircraftIcaoCodeList::fromDatabaseJson(array);
|
||||
@@ -212,7 +212,7 @@ namespace BlackCore
|
||||
this->m_aircraftIcaos = codes;
|
||||
n = codes.size();
|
||||
}
|
||||
emit readData(CDbFlags::AircraftIcaoEntity, CDbFlags::ReadFinished, n);
|
||||
emit dataRead(CEntityFlags::AircraftIcaoEntity, CEntityFlags::ReadFinished, n);
|
||||
}
|
||||
|
||||
void CIcaoDataReader::ps_parseAirlineIcaoData(QNetworkReply *nwReplyPtr)
|
||||
@@ -221,7 +221,7 @@ namespace BlackCore
|
||||
QJsonArray array = this->transformReplyIntoDatastoreResponse(nwReply.data());
|
||||
if (array.isEmpty())
|
||||
{
|
||||
emit readData(CDbFlags::AirlineIcaoEntity, CDbFlags::ReadFailed, 0);
|
||||
emit dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFailed, 0);
|
||||
return;
|
||||
}
|
||||
CAirlineIcaoCodeList codes = CAirlineIcaoCodeList::fromDatabaseJson(array);
|
||||
@@ -233,7 +233,7 @@ namespace BlackCore
|
||||
this->m_airlineIcaos = codes;
|
||||
n = codes.size();
|
||||
}
|
||||
emit readData(CDbFlags::AirlineIcaoEntity, CDbFlags::ReadFinished, n);
|
||||
emit dataRead(CEntityFlags::AirlineIcaoEntity, CEntityFlags::ReadFinished, n);
|
||||
}
|
||||
|
||||
void CIcaoDataReader::ps_parseCountryData(QNetworkReply *nwReplyPtr)
|
||||
@@ -242,7 +242,7 @@ namespace BlackCore
|
||||
QJsonArray array = this->transformReplyIntoDatastoreResponse(nwReply.data());
|
||||
if (array.isEmpty())
|
||||
{
|
||||
emit readData(CDbFlags::CountryEntity, CDbFlags::ReadFailed, 0);
|
||||
emit dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadFailed, 0);
|
||||
return;
|
||||
}
|
||||
CCountryList countries = CCountryList::fromDatabaseJson(array);
|
||||
@@ -254,7 +254,7 @@ namespace BlackCore
|
||||
this->m_countries = countries;
|
||||
n = m_countries.size();
|
||||
}
|
||||
emit readData(CDbFlags::CountryEntity, CDbFlags::ReadFinished, n);
|
||||
emit dataRead(CEntityFlags::CountryEntity, CEntityFlags::ReadFinished, n);
|
||||
}
|
||||
|
||||
bool CIcaoDataReader::canConnect(QString &message) const
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#include "blackmisc/countrylist.h"
|
||||
#include "blackmisc/aviation/aircrafticaocodelist.h"
|
||||
#include "blackmisc/aviation/airlineicaocodelist.h"
|
||||
#include "blackmisc/network/dbflags.h"
|
||||
#include "blackmisc/network/entityflags.h"
|
||||
|
||||
#include <QObject>
|
||||
#include <QTimer>
|
||||
@@ -103,7 +103,7 @@ namespace BlackCore
|
||||
|
||||
signals:
|
||||
//! Combined read signal
|
||||
void readData(BlackMisc::Network::CDbFlags::Entity entity, BlackMisc::Network::CDbFlags::ReadState state, int number);
|
||||
void dataRead(BlackMisc::Network::CEntityFlags::Entity entity, BlackMisc::Network::CEntityFlags::ReadState state, int number);
|
||||
|
||||
private slots:
|
||||
//! Aircraft have been read
|
||||
@@ -116,7 +116,7 @@ namespace BlackCore
|
||||
void ps_parseCountryData(QNetworkReply *nwReply);
|
||||
|
||||
//! Read / re-read data file
|
||||
void ps_read(BlackMisc::Network::CDbFlags::Entity entities);
|
||||
void ps_read(BlackMisc::Network::CEntityFlags::Entity entities);
|
||||
|
||||
private:
|
||||
QNetworkAccessManager *m_networkManagerAircraft = nullptr;
|
||||
|
||||
@@ -162,7 +162,7 @@ namespace BlackCore
|
||||
return cm;
|
||||
}
|
||||
|
||||
void CModelDataReader::ps_read(CDbFlags::Entity entity)
|
||||
void CModelDataReader::ps_read(CEntityFlags::Entity entity)
|
||||
{
|
||||
this->threadAssertCheck();
|
||||
Q_ASSERT(this->m_networkManagerLivery);
|
||||
@@ -171,29 +171,29 @@ namespace BlackCore
|
||||
Q_ASSERT(!m_urlLiveries.isEmpty());
|
||||
Q_ASSERT(!m_urlDistributors.isEmpty());
|
||||
|
||||
CDbFlags::Entity triggeredRead = CDbFlags::NoEntity;
|
||||
if (entity.testFlag(CDbFlags::LiveryEntity))
|
||||
CEntityFlags::Entity triggeredRead = CEntityFlags::NoEntity;
|
||||
if (entity.testFlag(CEntityFlags::LiveryEntity))
|
||||
{
|
||||
QNetworkRequest requestLivery(m_urlLiveries);
|
||||
this->m_networkManagerLivery->get(requestLivery);
|
||||
triggeredRead |= CDbFlags::LiveryEntity;
|
||||
triggeredRead |= CEntityFlags::LiveryEntity;
|
||||
}
|
||||
|
||||
if (entity.testFlag(CDbFlags::DistributorEntity))
|
||||
if (entity.testFlag(CEntityFlags::DistributorEntity))
|
||||
{
|
||||
QNetworkRequest requestDistributor(m_urlDistributors);
|
||||
this->m_networkManagerDistributor->get(requestDistributor);
|
||||
triggeredRead |= CDbFlags::DistributorEntity;
|
||||
triggeredRead |= CEntityFlags::DistributorEntity;
|
||||
}
|
||||
|
||||
if (entity.testFlag(CDbFlags::ModelEntity))
|
||||
if (entity.testFlag(CEntityFlags::ModelEntity))
|
||||
{
|
||||
QNetworkRequest requestModel(m_urlModels);
|
||||
this->m_networkManagerModel->get(requestModel);
|
||||
triggeredRead |= CDbFlags::ModelEntity;
|
||||
triggeredRead |= CEntityFlags::ModelEntity;
|
||||
}
|
||||
|
||||
emit readData(triggeredRead, CDbFlags::StartRead, 0);
|
||||
emit dataRead(triggeredRead, CEntityFlags::StartRead, 0);
|
||||
}
|
||||
|
||||
void CModelDataReader::ps_parseLiveryData(QNetworkReply *nwReplyPtr)
|
||||
@@ -204,7 +204,7 @@ namespace BlackCore
|
||||
QJsonArray array = this->transformReplyIntoDatastoreResponse(nwReply.data());
|
||||
if (array.isEmpty())
|
||||
{
|
||||
emit readData(CDbFlags::LiveryEntity, CDbFlags::ReadFailed, 0);
|
||||
emit dataRead(CEntityFlags::LiveryEntity, CEntityFlags::ReadFailed, 0);
|
||||
return;
|
||||
}
|
||||
CLiveryList liveries = CLiveryList::fromDatabaseJson(array);
|
||||
@@ -216,7 +216,7 @@ namespace BlackCore
|
||||
this->m_liveries = liveries;
|
||||
n = liveries.size();
|
||||
}
|
||||
emit readData(CDbFlags::LiveryEntity, CDbFlags::ReadFinished, n);
|
||||
emit dataRead(CEntityFlags::LiveryEntity, CEntityFlags::ReadFinished, n);
|
||||
}
|
||||
|
||||
void CModelDataReader::ps_parseDistributorData(QNetworkReply *nwReplyPtr)
|
||||
@@ -225,7 +225,7 @@ namespace BlackCore
|
||||
QJsonArray array = this->transformReplyIntoDatastoreResponse(nwReply.data());
|
||||
if (array.isEmpty())
|
||||
{
|
||||
emit readData(CDbFlags::DistributorEntity, CDbFlags::ReadFailed, 0);
|
||||
emit dataRead(CEntityFlags::DistributorEntity, CEntityFlags::ReadFailed, 0);
|
||||
return;
|
||||
}
|
||||
CDistributorList distributors = CDistributorList::fromDatabaseJson(array);
|
||||
@@ -237,7 +237,7 @@ namespace BlackCore
|
||||
this->m_distributors = distributors;
|
||||
n = distributors.size();
|
||||
}
|
||||
emit readData(CDbFlags::DistributorEntity, CDbFlags::ReadFinished, n);
|
||||
emit dataRead(CEntityFlags::DistributorEntity, CEntityFlags::ReadFinished, n);
|
||||
}
|
||||
|
||||
void CModelDataReader::ps_parseModelData(QNetworkReply *nwReplyPtr)
|
||||
@@ -246,7 +246,7 @@ namespace BlackCore
|
||||
QJsonArray array = this->transformReplyIntoDatastoreResponse(nwReply.data());
|
||||
if (array.isEmpty())
|
||||
{
|
||||
emit readData(CDbFlags::ModelEntity, CDbFlags::ReadFailed, 0);
|
||||
emit dataRead(CEntityFlags::ModelEntity, CEntityFlags::ReadFailed, 0);
|
||||
return;
|
||||
}
|
||||
CAircraftModelList models = CAircraftModelList::fromDatabaseJson(array);
|
||||
@@ -258,7 +258,7 @@ namespace BlackCore
|
||||
this->m_models = models;
|
||||
n = models.size();
|
||||
}
|
||||
emit readData(CDbFlags::ModelEntity, CDbFlags::ReadFinished, n);
|
||||
emit dataRead(CEntityFlags::ModelEntity, CEntityFlags::ReadFinished, n);
|
||||
}
|
||||
|
||||
QString CModelDataReader::getLiveryUrl(const QString &protocol, const QString &server, const QString &baseUrl)
|
||||
|
||||
@@ -95,7 +95,7 @@ namespace BlackCore
|
||||
|
||||
signals:
|
||||
//! Combined read signal
|
||||
void readData(BlackMisc::Network::CDbFlags::Entity entity, BlackMisc::Network::CDbFlags::ReadState state, int number);
|
||||
void dataRead(BlackMisc::Network::CEntityFlags::Entity entity, BlackMisc::Network::CEntityFlags::ReadState state, int number);
|
||||
|
||||
private slots:
|
||||
//! Liveries have been read
|
||||
@@ -108,7 +108,7 @@ namespace BlackCore
|
||||
void ps_parseModelData(QNetworkReply *nwReply);
|
||||
|
||||
//! Read / re-read data file
|
||||
void ps_read(BlackMisc::Network::CDbFlags::Entity entity = BlackMisc::Network::CDbFlags::DistributorLiveryModel);
|
||||
void ps_read(BlackMisc::Network::CEntityFlags::Entity entity = BlackMisc::Network::CEntityFlags::DistributorLiveryModel);
|
||||
|
||||
private:
|
||||
QNetworkAccessManager *m_networkManagerLivery = nullptr;
|
||||
|
||||
@@ -87,7 +87,7 @@ namespace BlackCore
|
||||
|
||||
//! \copydoc IWebDataReaderProvider::connectSwiftDatabaseSignals
|
||||
//! \ingroup webdatareaderprovider
|
||||
virtual BlackMisc::Network::CDbFlags::Entity triggerRead(BlackMisc::Network::CDbFlags::Entity whatToRead) override;
|
||||
virtual BlackMisc::Network::CEntityFlags::Entity triggerRead(BlackMisc::Network::CEntityFlags::Entity whatToRead) override;
|
||||
|
||||
//! \copydoc IWebDataReaderProvider::getVatsimFsdServers
|
||||
//! \ingroup webdatareaderprovider
|
||||
@@ -236,7 +236,7 @@ namespace BlackCore
|
||||
void vatsimMetarsRead(int number);
|
||||
|
||||
//! Combined read signal
|
||||
void readSwiftDbData(BlackMisc::Network::CDbFlags::Entity entity, BlackMisc::Network::CDbFlags::ReadState state, int number);
|
||||
void readSwiftDbData(BlackMisc::Network::CEntityFlags::Entity entity, BlackMisc::Network::CEntityFlags::ReadState state, int number);
|
||||
|
||||
//! Model has been written
|
||||
void modelWritten(const BlackMisc::Simulation::CAircraftModel &model);
|
||||
@@ -252,7 +252,7 @@ namespace BlackCore
|
||||
void ps_dataFileRead(int lines);
|
||||
|
||||
//! Read from model reader
|
||||
void ps_readFromSwiftDb(BlackMisc::Network::CDbFlags::Entity entity, BlackMisc::Network::CDbFlags::ReadState state, int number);
|
||||
void ps_readFromSwiftDb(BlackMisc::Network::CEntityFlags::Entity entity, BlackMisc::Network::CEntityFlags::ReadState state, int number);
|
||||
|
||||
private:
|
||||
//! Init the readers
|
||||
@@ -261,7 +261,7 @@ namespace BlackCore
|
||||
//! Init the writers
|
||||
void initWriters();
|
||||
|
||||
CWebReaderFlags::WebReader m_readerFlags = CWebReaderFlags::WebReaderFlags::None; //!< which readers are available
|
||||
CWebReaderFlags::WebReader m_readerFlags = CWebReaderFlags::WebReaderFlag::None; //!< which readers are available
|
||||
|
||||
// for reading XML and VATSIM data files
|
||||
CVatsimBookingReader *m_vatsimBookingReader = nullptr;
|
||||
|
||||
@@ -13,36 +13,41 @@ using namespace BlackMisc::Network;
|
||||
|
||||
namespace BlackCore
|
||||
{
|
||||
CWebReaderFlags::WebReader CWebReaderFlags::entityToReader(CDbFlags::Entity entity)
|
||||
CWebReaderFlags::WebReader CWebReaderFlags::entityToReader(CEntityFlags::Entity entity)
|
||||
{
|
||||
WebReader f = None;
|
||||
if (entity.testFlag(CDbFlags::AircraftIcaoEntity) ||
|
||||
entity.testFlag(CDbFlags::AirlineIcaoEntity) ||
|
||||
entity.testFlag(CDbFlags::CountryEntity))
|
||||
if (entity.testFlag(CEntityFlags::AircraftIcaoEntity) ||
|
||||
entity.testFlag(CEntityFlags::AirlineIcaoEntity) ||
|
||||
entity.testFlag(CEntityFlags::CountryEntity))
|
||||
{
|
||||
f |= IcaoDataReader;
|
||||
}
|
||||
|
||||
if (entity.testFlag(CDbFlags::ModelEntity) ||
|
||||
entity.testFlag(CDbFlags::DistributorEntity) ||
|
||||
entity.testFlag(CDbFlags::LiveryEntity))
|
||||
if (entity.testFlag(CEntityFlags::ModelEntity) ||
|
||||
entity.testFlag(CEntityFlags::DistributorEntity) ||
|
||||
entity.testFlag(CEntityFlags::LiveryEntity))
|
||||
{
|
||||
f |= ModelReader;
|
||||
}
|
||||
|
||||
if (entity.testFlag(CDbFlags::VatsimBookings))
|
||||
if (entity.testFlag(CEntityFlags::BookingEntity))
|
||||
{
|
||||
f |= VatsimBookingReader;
|
||||
}
|
||||
|
||||
if (entity.testFlag(CDbFlags::VatsimDataFile))
|
||||
if (entity.testFlag(CEntityFlags::VatsimDataFile))
|
||||
{
|
||||
f |= VatsimDataReader;
|
||||
}
|
||||
|
||||
if (entity.testFlag(CEntityFlags::MetarEntity))
|
||||
{
|
||||
f |= VatsimMetarReader;
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
bool CWebReaderFlags::isFromSwiftDb(CDbFlags::Entity entity)
|
||||
bool CWebReaderFlags::isFromSwiftDb(CEntityFlags::Entity entity)
|
||||
{
|
||||
return isFromSwiftDb(entityToReader(entity));
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
//! \file
|
||||
|
||||
#include "blackcoreexport.h"
|
||||
#include "blackmisc/network/dbflags.h"
|
||||
#include "blackmisc/network/entityflags.h"
|
||||
#include <QFlags>
|
||||
#include <QMetaType>
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace BlackCore
|
||||
{
|
||||
public:
|
||||
//! Which readers to init
|
||||
enum WebReaderFlags
|
||||
enum WebReaderFlag
|
||||
{
|
||||
None = 0, ///< no reader at all
|
||||
VatsimBookingReader = 1 << 0, ///< reader for VATSIM booking data
|
||||
@@ -38,20 +38,20 @@ namespace BlackCore
|
||||
AllSwiftDbReaders = IcaoDataReader | ModelReader, ///< all swift data
|
||||
AllReaders = AllSwiftDbReaders | AllVatsimReaders ///< everything
|
||||
};
|
||||
Q_DECLARE_FLAGS(WebReader, WebReaderFlags)
|
||||
Q_DECLARE_FLAGS(WebReader, WebReaderFlag)
|
||||
|
||||
//! Relationship between reader and entity
|
||||
static WebReader entityToReader(BlackMisc::Network::CDbFlags::Entity entity);
|
||||
static WebReader entityToReader(BlackMisc::Network::CEntityFlags::Entity entity);
|
||||
|
||||
//! Read from swift DB
|
||||
static bool isFromSwiftDb(BlackMisc::Network::CDbFlags::Entity entity);
|
||||
static bool isFromSwiftDb(BlackMisc::Network::CEntityFlags::Entity entity);
|
||||
|
||||
//! Read from swift DB
|
||||
static bool isFromSwiftDb(WebReader reader);
|
||||
};
|
||||
} // namespace
|
||||
|
||||
Q_DECLARE_METATYPE(BlackCore::CWebReaderFlags::WebReaderFlags)
|
||||
Q_DECLARE_METATYPE(BlackCore::CWebReaderFlags::WebReaderFlag)
|
||||
Q_DECLARE_METATYPE(BlackCore::CWebReaderFlags::WebReader)
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(BlackCore::CWebReaderFlags::WebReader)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user