From f8b2e812837158173a337f12a9216ec52ecb617b Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Mon, 23 Jun 2014 01:20:45 -0400 Subject: [PATCH 01/12] revised log filter code revised log filtering code --- servatrice/src/server_logger.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index bfd979fd0..ea497126b 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -56,6 +56,7 @@ void ServerLogger::logMessage(QString message, void *caller) switch (loglevel) { case 1: + capture = 0; break; case 2: @@ -71,17 +72,16 @@ void ServerLogger::logMessage(QString message, void *caller) found = message.indexOf("Command_RoomSay.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } found = message.indexOf("Command_Message.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } found = message.indexOf("Command_GameSay.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - if (capture != 0){ - bufferMutex.lock(); - buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); - bufferMutex.unlock(); - } break; default: - bufferMutex.lock(); - buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); - bufferMutex.unlock(); + capture = 1; + } + + if (capture != 0){ + bufferMutex.lock(); + buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); + bufferMutex.unlock(); } emit sigFlushBuffer(); } From c5fae5682a2a0631a4121d3f34753af40a597a5e Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Mon, 23 Jun 2014 01:39:13 -0400 Subject: [PATCH 02/12] updated for clarity updated filtering code for clarity (based on recommendations) --- servatrice/src/server_logger.cpp | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index ea497126b..7f7c6dd01 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -53,6 +53,8 @@ void ServerLogger::logMessage(QString message, void *caller) QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); int found = 0; int capture = 0; int loglevel = 0; loglevel = settings->value("server/loglevel").toInt(); + + switch (loglevel) { case 1: @@ -60,18 +62,26 @@ void ServerLogger::logMessage(QString message, void *caller) break; case 2: - // filter message log data - found = message.indexOf("Adding room: ID=", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Starting status update clock", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Starting server on port", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Server listening.", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Server::loginUser:", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Server::removeClient:", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Command_Login.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Command_RoomSay.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Command_Message.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } - found = message.indexOf("Command_GameSay.ext", Qt::CaseInsensitive); if (found != -1){ capture = 1; } + list = [ + "Adding room: ID=", + "Starting status update clock", + "Starting server on port", + "Server listening.", + "Server::loginUser:", + "Server::removeClient:", + "Command_Login.ext", + "Command_RoomSay.ext", + "Command_Message.ext", + "Command_GameSay.ext" + ]; + + for x in list { + if(message.indexOf(x, Qt::CaseInsensitive) != -1) { + capture = 1; + break; + } + } break; default: From 234a68dfd086b5e823a19c828bbadea2c9d2608c Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Mon, 23 Jun 2014 03:38:26 -0400 Subject: [PATCH 03/12] improved code structure improved code structure for clarity --- servatrice/src/server_logger.cpp | 38 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index 7f7c6dd01..076480356 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -5,11 +5,13 @@ #include #include #include +#include #ifdef Q_OS_UNIX # include # include # include #endif +using namespace std; ServerLogger::ServerLogger(bool _logToConsole, QObject *parent) : QObject(parent), logToConsole(_logToConsole), flushRunning(false) @@ -51,7 +53,7 @@ void ServerLogger::logMessage(QString message, void *caller) //filter out all log entries based on loglevel value in configuration file QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); - int found = 0; int capture = 0; int loglevel = 0; + int found = 0; int capture = 0; int loglevel = 0; list lst_str; loglevel = settings->value("server/loglevel").toInt(); @@ -63,24 +65,22 @@ void ServerLogger::logMessage(QString message, void *caller) case 2: // filter message log data - list = [ - "Adding room: ID=", - "Starting status update clock", - "Starting server on port", - "Server listening.", - "Server::loginUser:", - "Server::removeClient:", - "Command_Login.ext", - "Command_RoomSay.ext", - "Command_Message.ext", - "Command_GameSay.ext" - ]; - - for x in list { - if(message.indexOf(x, Qt::CaseInsensitive) != -1) { - capture = 1; - break; - } + lst_str.push_back("Adding room: ID="); + lst_str.push_back("Starting status update clock"); + lst_str.push_back("Starting server on port"); + lst_str.push_back("Server listening."); + lst_str.push_back("Server::loginUser:"); + lst_str.push_back("Server::removeClient:"); + lst_str.push_back("Command_Login.ext"); + lst_str.push_back("Command_RoomSay.ext"); + lst_str.push_back("Command_Message.ext"); + lst_str.push_back("Command_GameSay.ext"); + for (list::iterator i = lst_str.begin(); i != lst_str.end(); i++) + { + if(message.indexOf((*i).c_str(), Qt::CaseInsensitive) != -1) { + capture = 1; + break; + } } break; From 39e0c5a887583196ac577d1c00c6bd22a18e17f3 Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Mon, 23 Jun 2014 09:16:40 -0400 Subject: [PATCH 04/12] variable cleanup removed unused variables changed switch statement to now log more verbose as loglevel number increments captured undefined loglevel to default to most verbose logging --- servatrice/src/server_logger.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index 076480356..a5c33bc8b 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -53,9 +53,10 @@ void ServerLogger::logMessage(QString message, void *caller) //filter out all log entries based on loglevel value in configuration file QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); - int found = 0; int capture = 0; int loglevel = 0; list lst_str; - loglevel = settings->value("server/loglevel").toInt(); - + int capture = 0; list lst_str; + int loglevel = settings->value("server/loglevel").toInt(); + if (!loglevel) + loglevel = 999; switch (loglevel) { From 5cdb4b51360acf0d1abccb0c6fef34d679651d0d Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Thu, 26 Jun 2014 00:30:38 -0400 Subject: [PATCH 05/12] updated for revised server log filtering updated loglevel setting name to reflect more accurate setting name (writelog) also added logfilter setting to allow user defined filters. (still needs code update to handle more than single string filter) --- servatrice/servatrice.ini.example | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/servatrice/servatrice.ini.example b/servatrice/servatrice.ini.example index 5c5e2488c..c50ff9f1a 100644 --- a/servatrice/servatrice.ini.example +++ b/servatrice/servatrice.ini.example @@ -5,7 +5,8 @@ logfile=server.log name="My Cockatrice server" id=1 number_pools=1 -loglevel=0 +writelog=1 +logfilters="" [servernetwork] active=0 From 1ef419a8750aa78ffc5bb3a44ea696557d35112d Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Thu, 26 Jun 2014 00:35:39 -0400 Subject: [PATCH 06/12] revised filtering code revised filtering code. still needs more work to get filter checks to compare more than single string. --- servatrice/src/server_logger.cpp | 55 +++++++++----------------------- 1 file changed, 15 insertions(+), 40 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index a5c33bc8b..1fff3f8ba 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -5,13 +5,11 @@ #include #include #include -#include #ifdef Q_OS_UNIX # include # include # include #endif -using namespace std; ServerLogger::ServerLogger(bool _logToConsole, QObject *parent) : QObject(parent), logToConsole(_logToConsole), flushRunning(false) @@ -53,48 +51,25 @@ void ServerLogger::logMessage(QString message, void *caller) //filter out all log entries based on loglevel value in configuration file QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); - int capture = 0; list lst_str; - int loglevel = settings->value("server/loglevel").toInt(); - if (!loglevel) - loglevel = 999; + bool shouldWeWriteLog = settings->value("server/writelog").toBool(); + //allowedLogStatements << "Adding room: ID=" << "Starting status update clock" << "Starting server on port" << + // "Server listening." << "Server::loginUser:" << "Server::removeClient:" << "Command_Login.ext" << + // "Command_RoomSay.ext" << "Command_Message.ext" << "Command_GameSay.ext"; - switch (loglevel) - { - case 1: - capture = 0; - break; + if (shouldWeWriteLog){ + QString logFilters = settings->value("server/logfilters").toString(); + bool shouldWeSkipLine = false; + if (!logFilters.trimmed().isEmpty()) + shouldWeSkipLine = !message.contains(logFilters); + + if (shouldWeSkipLine) + return; - case 2: - // filter message log data - lst_str.push_back("Adding room: ID="); - lst_str.push_back("Starting status update clock"); - lst_str.push_back("Starting server on port"); - lst_str.push_back("Server listening."); - lst_str.push_back("Server::loginUser:"); - lst_str.push_back("Server::removeClient:"); - lst_str.push_back("Command_Login.ext"); - lst_str.push_back("Command_RoomSay.ext"); - lst_str.push_back("Command_Message.ext"); - lst_str.push_back("Command_GameSay.ext"); - for (list::iterator i = lst_str.begin(); i != lst_str.end(); i++) - { - if(message.indexOf((*i).c_str(), Qt::CaseInsensitive) != -1) { - capture = 1; - break; - } - } - break; - - default: - capture = 1; - } - - if (capture != 0){ bufferMutex.lock(); - buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); - bufferMutex.unlock(); + buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); + bufferMutex.unlock(); + emit sigFlushBuffer(); } - emit sigFlushBuffer(); } void ServerLogger::flushBuffer() From 0f710fd480834a331f58edb601b6c2c3780afed5 Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Thu, 26 Jun 2014 14:37:45 -0400 Subject: [PATCH 07/12] added multiple filter capabilities changed the single qstring search for log filtering to qstringlist to allow for multiple filters --- servatrice/src/server_logger.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index 1fff3f8ba..0264c2fdb 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -49,19 +49,25 @@ void ServerLogger::logMessage(QString message, void *caller) if (caller) callerString = QString::number((qulonglong) caller, 16) + " "; - //filter out all log entries based on loglevel value in configuration file + //filter out all log entries based on values in configuration file QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); bool shouldWeWriteLog = settings->value("server/writelog").toBool(); - //allowedLogStatements << "Adding room: ID=" << "Starting status update clock" << "Starting server on port" << - // "Server listening." << "Server::loginUser:" << "Server::removeClient:" << "Command_Login.ext" << - // "Command_RoomSay.ext" << "Command_Message.ext" << "Command_GameSay.ext"; if (shouldWeWriteLog){ QString logFilters = settings->value("server/logfilters").toString(); + QStringList listlogFilters = logFilters.split(",", QString::SkipEmptyParts); bool shouldWeSkipLine = false; - if (!logFilters.trimmed().isEmpty()) - shouldWeSkipLine = !message.contains(logFilters); - + if (!logFilters.trimmed().isEmpty()){ + shouldWeSkipLine = true; + foreach(QString logFilter, listlogFilters){ + if (message.contains(logFilter, Qt::CaseInsensitive)){ + shouldWeSkipLine = false; + break; + } + } + } + + if (shouldWeSkipLine) return; From c30c23f8c5694dd220925fb7ba80aba968acabbe Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Thu, 26 Jun 2014 14:45:56 -0400 Subject: [PATCH 08/12] removed extra un-needed empty line. removed extra un-needed empty line. --- servatrice/src/server_logger.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index 0264c2fdb..9566ba17c 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -67,7 +67,6 @@ void ServerLogger::logMessage(QString message, void *caller) } } - if (shouldWeSkipLine) return; From 69a8fa0bb1849cea321eeae72291165399f6a081 Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Fri, 27 Jun 2014 18:17:19 -0400 Subject: [PATCH 09/12] formatting 4 space indent + flow change for easier readability --- servatrice/src/server_logger.cpp | 165 ++++++++++++++++--------------- 1 file changed, 83 insertions(+), 82 deletions(-) diff --git a/servatrice/src/server_logger.cpp b/servatrice/src/server_logger.cpp index 9566ba17c..2dbbc5e52 100644 --- a/servatrice/src/server_logger.cpp +++ b/servatrice/src/server_logger.cpp @@ -12,121 +12,122 @@ #endif ServerLogger::ServerLogger(bool _logToConsole, QObject *parent) - : QObject(parent), logToConsole(_logToConsole), flushRunning(false) + : QObject(parent), logToConsole(_logToConsole), flushRunning(false) { } ServerLogger::~ServerLogger() { - flushBuffer(); - // This does not work with the destroyed() signal as this destructor is called after the main event loop is done. - thread()->quit(); + flushBuffer(); + // This does not work with the destroyed() signal as this destructor is called after the main event loop is done. + thread()->quit(); } void ServerLogger::startLog(const QString &logFileName) { - if (!logFileName.isEmpty()) { - logFile = new QFile("server.log", this); - logFile->open(QIODevice::Append); + if (!logFileName.isEmpty()) { + logFile = new QFile("server.log", this); + logFile->open(QIODevice::Append); #ifdef Q_OS_UNIX - ::socketpair(AF_UNIX, SOCK_STREAM, 0, sigHupFD); + ::socketpair(AF_UNIX, SOCK_STREAM, 0, sigHupFD); - snHup = new QSocketNotifier(sigHupFD[1], QSocketNotifier::Read, this); - connect(snHup, SIGNAL(activated(int)), this, SLOT(handleSigHup())); + snHup = new QSocketNotifier(sigHupFD[1], QSocketNotifier::Read, this); + connect(snHup, SIGNAL(activated(int)), this, SLOT(handleSigHup())); #endif - } else - logFile = 0; - - connect(this, SIGNAL(sigFlushBuffer()), this, SLOT(flushBuffer()), Qt::QueuedConnection); + } else + logFile = 0; + + connect(this, SIGNAL(sigFlushBuffer()), this, SLOT(flushBuffer()), Qt::QueuedConnection); } void ServerLogger::logMessage(QString message, void *caller) { - if (!logFile) - return; - - QString callerString; - if (caller) - callerString = QString::number((qulonglong) caller, 16) + " "; - - //filter out all log entries based on values in configuration file - QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); - bool shouldWeWriteLog = settings->value("server/writelog").toBool(); - - if (shouldWeWriteLog){ - QString logFilters = settings->value("server/logfilters").toString(); - QStringList listlogFilters = logFilters.split(",", QString::SkipEmptyParts); - bool shouldWeSkipLine = false; - if (!logFilters.trimmed().isEmpty()){ - shouldWeSkipLine = true; - foreach(QString logFilter, listlogFilters){ - if (message.contains(logFilter, Qt::CaseInsensitive)){ - shouldWeSkipLine = false; - break; - } - } - } + if (!logFile) + return; + + QString callerString; + if (caller) + callerString = QString::number((qulonglong) caller, 16) + " "; + + //filter out all log entries based on values in configuration file + QSettings *settings = new QSettings("servatrice.ini", QSettings::IniFormat); + bool shouldWeWriteLog = settings->value("server/writelog").toBool(); + QString logFilters = settings->value("server/logfilters").toString(); + QStringList listlogFilters = logFilters.split(",", QString::SkipEmptyParts); + bool shouldWeSkipLine = false; + + if (!shouldWeWriteLog) + return; - if (shouldWeSkipLine) - return; + if (!logFilters.trimmed().isEmpty()){ + shouldWeSkipLine = true; + foreach(QString logFilter, listlogFilters){ + if (message.contains(logFilter, Qt::CaseInsensitive)){ + shouldWeSkipLine = false; + break; + } + } + } - bufferMutex.lock(); - buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); - bufferMutex.unlock(); - emit sigFlushBuffer(); - } + if (shouldWeSkipLine) + return; + + bufferMutex.lock(); + buffer.append(QDateTime::currentDateTime().toString() + " " + callerString + message); + bufferMutex.unlock(); + emit sigFlushBuffer(); } void ServerLogger::flushBuffer() { - if (flushRunning) - return; - - flushRunning = true; - QTextStream stream(logFile); - forever { - bufferMutex.lock(); - if (buffer.isEmpty()) { - bufferMutex.unlock(); - flushRunning = false; - return; - } - QString message = buffer.takeFirst(); - bufferMutex.unlock(); - - stream << message << "\n"; - stream.flush(); - - if (logToConsole) - std::cout << message.toStdString() << std::endl; - } + if (flushRunning) + return; + + flushRunning = true; + QTextStream stream(logFile); + forever { + bufferMutex.lock(); + if (buffer.isEmpty()) { + bufferMutex.unlock(); + flushRunning = false; + return; + } + QString message = buffer.takeFirst(); + bufferMutex.unlock(); + + stream << message << "\n"; + stream.flush(); + + if (logToConsole) + std::cout << message.toStdString() << std::endl; + } } void ServerLogger::hupSignalHandler(int /*unused*/) { #ifdef Q_OS_UNIX - if (!logFile) - return; - - char a = 1; - ::write(sigHupFD[0], &a, sizeof(a)); + if (!logFile) + return; + + char a = 1; + ::write(sigHupFD[0], &a, sizeof(a)); #endif } void ServerLogger::handleSigHup() { #ifdef Q_OS_UNIX - if (!logFile) - return; - - snHup->setEnabled(false); - char tmp; - ::read(sigHupFD[1], &tmp, sizeof(tmp)); - - logFile->close(); - logFile->open(QIODevice::Append); - - snHup->setEnabled(true); + if (!logFile) + return; + + snHup->setEnabled(false); + char tmp; + ::read(sigHupFD[1], &tmp, sizeof(tmp)); + + logFile->close(); + logFile->open(QIODevice::Append); + + snHup->setEnabled(true); #endif } From 9296c0717386a11921a178645be2b6a381aecd06 Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Tue, 1 Jul 2014 10:27:17 -0400 Subject: [PATCH 10/12] friendly-invalid-password-prompt Updated user prompt for clarity of the invalid login issue. --- cockatrice/src/window_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp index f5dc26843..5c97b6070 100644 --- a/cockatrice/src/window_main.cpp +++ b/cockatrice/src/window_main.cpp @@ -241,7 +241,7 @@ void MainWindow::loginError(Response::ResponseCode r, QString reasonStr, quint32 { switch (r) { case Response::RespWrongPassword: - QMessageBox::critical(this, tr("Error"), tr("Invalid login data.")); + QMessageBox::critical(this, tr("Error"), tr("Incorrect password, please try again.")); break; case Response::RespWouldOverwriteOldSession: QMessageBox::critical(this, tr("Error"), tr("There is already an active session using this user name.\nPlease close that session first and re-login.")); From 05f15c7988acd7c9be883edf695905d97e04ffb9 Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Tue, 1 Jul 2014 10:28:15 -0400 Subject: [PATCH 11/12] Revert "friendly-invalid-password-prompt" This reverts commit 9296c0717386a11921a178645be2b6a381aecd06. --- cockatrice/src/window_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp index 5c97b6070..f5dc26843 100644 --- a/cockatrice/src/window_main.cpp +++ b/cockatrice/src/window_main.cpp @@ -241,7 +241,7 @@ void MainWindow::loginError(Response::ResponseCode r, QString reasonStr, quint32 { switch (r) { case Response::RespWrongPassword: - QMessageBox::critical(this, tr("Error"), tr("Incorrect password, please try again.")); + QMessageBox::critical(this, tr("Error"), tr("Invalid login data.")); break; case Response::RespWouldOverwriteOldSession: QMessageBox::critical(this, tr("Error"), tr("There is already an active session using this user name.\nPlease close that session first and re-login.")); From b68751db1acc06ee6966d74eaaf090fc34d475d9 Mon Sep 17 00:00:00 2001 From: woogerboy21 Date: Tue, 1 Jul 2014 10:28:26 -0400 Subject: [PATCH 12/12] Revert "Revert "friendly-invalid-password-prompt"" This reverts commit 05f15c7988acd7c9be883edf695905d97e04ffb9. --- cockatrice/src/window_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp index f5dc26843..5c97b6070 100644 --- a/cockatrice/src/window_main.cpp +++ b/cockatrice/src/window_main.cpp @@ -241,7 +241,7 @@ void MainWindow::loginError(Response::ResponseCode r, QString reasonStr, quint32 { switch (r) { case Response::RespWrongPassword: - QMessageBox::critical(this, tr("Error"), tr("Invalid login data.")); + QMessageBox::critical(this, tr("Error"), tr("Incorrect password, please try again.")); break; case Response::RespWouldOverwriteOldSession: QMessageBox::critical(this, tr("Error"), tr("There is already an active session using this user name.\nPlease close that session first and re-login."));