diff --git a/cockatrice/src/chatview.cpp b/cockatrice/src/chatview.cpp index b1b13984..cd72d73f 100644 --- a/cockatrice/src/chatview.cpp +++ b/cockatrice/src/chatview.cpp @@ -130,7 +130,7 @@ void ChatView::appendMessage(QString message, RoomMessageTypeFlags messageType, lastSender = sender; // timestamp - if (showTimestamps && !sameSender && !sender.isEmpty()) { + if (showTimestamps && (!sameSender || sender.toLower() == "servatrice") && !sender.isEmpty()) { QTextCharFormat timeFormat; timeFormat.setForeground(QColor(SERVER_MESSAGE_COLOR)); if (sender.isEmpty()) @@ -139,31 +139,35 @@ void ChatView::appendMessage(QString message, RoomMessageTypeFlags messageType, cursor.insertText(QDateTime::currentDateTime().toString("[hh:mm:ss] ")); } - // nickname - QTextCharFormat senderFormat; - if (tabSupervisor && tabSupervisor->getUserInfo() && (sender == QString::fromStdString(tabSupervisor->getUserInfo()->name()))) { - senderFormat.setForeground(QBrush(getCustomMentionColor())); - senderFormat.setFontWeight(QFont::Bold); - } else { - senderFormat.setForeground(QBrush(OTHER_USER_COLOR)); - if (playerBold) + // nickname + if (sender.toLower() != "servatrice") { + QTextCharFormat senderFormat; + if (tabSupervisor && tabSupervisor->getUserInfo() && + (sender == QString::fromStdString(tabSupervisor->getUserInfo()->name()))) { + senderFormat.setForeground(QBrush(getCustomMentionColor())); senderFormat.setFontWeight(QFont::Bold); - } - senderFormat.setAnchor(true); - senderFormat.setAnchorHref("user://" + QString::number(userLevel) + "_" + sender); - if (sameSender) { - cursor.insertText(" "); - } else { - if (!sender.isEmpty() && tabSupervisor->getUserListsTab()) { - const int pixelSize = QFontInfo(cursor.charFormat().font()).pixelSize(); - QMap buddyList = tabSupervisor->getUserListsTab()->getBuddyList()->getUsers(); - cursor.insertImage(UserLevelPixmapGenerator::generatePixmap(pixelSize, userLevel, buddyList.contains(sender)).toImage()); - cursor.insertText(" "); + } else { + senderFormat.setForeground(QBrush(OTHER_USER_COLOR)); + if (playerBold) + senderFormat.setFontWeight(QFont::Bold); + } + senderFormat.setAnchor(true); + senderFormat.setAnchorHref("user://" + QString::number(userLevel) + "_" + sender); + if (sameSender) { + cursor.insertText(" "); + } else { + if (!sender.isEmpty() && tabSupervisor->getUserListsTab()) { + const int pixelSize = QFontInfo(cursor.charFormat().font()).pixelSize(); + QMap buddyList = tabSupervisor->getUserListsTab()->getBuddyList()->getUsers(); + cursor.insertImage(UserLevelPixmapGenerator::generatePixmap(pixelSize, userLevel, + buddyList.contains(sender)).toImage()); + cursor.insertText(" "); + } + cursor.setCharFormat(senderFormat); + if (!sender.isEmpty()) + sender.append(": "); + cursor.insertText(sender); } - cursor.setCharFormat(senderFormat); - if (!sender.isEmpty()) - sender.append(": "); - cursor.insertText(sender); } // use different color for server messages @@ -180,6 +184,9 @@ void ChatView::appendMessage(QString message, RoomMessageTypeFlags messageType, defaultFormat.setFontItalic(true); break; } + } else if (sender.toLower() == "servatrice") { + defaultFormat.setForeground(Qt::darkGreen); + defaultFormat.setFontWeight(QFont::Bold); } cursor.setCharFormat(defaultFormat); diff --git a/cockatrice/src/tab_message.cpp b/cockatrice/src/tab_message.cpp index 7e9fcf75..6e906c0a 100644 --- a/cockatrice/src/tab_message.cpp +++ b/cockatrice/src/tab_message.cpp @@ -116,6 +116,8 @@ void TabMessage::processUserMessageEvent(const Event_UserMessage &event) soundEngine->playSound("private_message"); if (settingsCache->getShowMessagePopup() && shouldShowSystemPopup(event)) showSystemPopup(event); + if (QString::fromStdString(event.sender_name()).simplified() == "Servatrice") + sayEdit->setDisabled(true); emit userEvent(); } diff --git a/common/server.cpp b/common/server.cpp index 7274800c..33313ab2 100644 --- a/common/server.cpp +++ b/common/server.cpp @@ -262,6 +262,18 @@ void Server::removeClient(Server_ProtocolHandler *client) qDebug() << "Server::removeClient: removed" << (void *) client << ";" << clients.size() << "clients; " << users.size() << "users left"; } +QList Server::getOnlineModeratorList() +{ + QList results; + QReadLocker clientsLocker(&clientsLock); + for (int i = 0; i < clients.size(); ++i) { + ServerInfo_User *data = clients[i]->getUserInfo(); + if (data->user_level() & ServerInfo_User::IsModerator || data->user_level() & ServerInfo_User::IsAdmin) //TODO: this line should be updated in the event there is any type of new user level created + results << QString::fromStdString(data->name()).simplified(); + } + return results; +} + void Server::externalUserJoined(const ServerInfo_User &userInfo) { // This function is always called from the main thread via signal/slot. @@ -617,4 +629,4 @@ void Server::sendIsl_RoomCommand(const CommandContainer &item, int serverId, qin cont->set_room_id(roomId); emit sigSendIslMessage(msg, serverId); -} +} \ No newline at end of file diff --git a/common/server.h b/common/server.h index 537f1a84..6baebc8f 100644 --- a/common/server.h +++ b/common/server.h @@ -55,6 +55,7 @@ public: virtual QMap getServerRequiredFeatureList() const { return QMap(); } void addClient(Server_ProtocolHandler *player); void removeClient(Server_ProtocolHandler *player); + QList getOnlineModeratorList(); virtual QString getLoginMessage() const { return QString(); } virtual bool permitUnregisteredUsers() const { return true; } virtual bool getGameShouldPing() const { return false; } diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index 6911d9f6..1b0a4773 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -51,6 +51,7 @@ #include "pb/event_add_to_list.pb.h" #include "pb/event_remove_from_list.pb.h" #include "pb/event_notify_user.pb.h" +#include "pb/event_user_message.pb.h" #include "pb/response_ban_history.pb.h" #include "pb/response_deck_list.pb.h" #include "pb/response_deck_download.pb.h" @@ -520,6 +521,20 @@ void ServerSocketInterface::deckDelDirHelper(int basePathId) sqlInterface->execSqlQuery(query); } +void ServerSocketInterface::sendServerMessage(const QString userName, const QString message) +{ + ServerSocketInterface *user = static_cast(server->getUsers().value(userName)); + if (user) { + Event_UserMessage event; + event.set_sender_name("Servatrice"); + event.set_receiver_name(userName.toStdString()); + event.set_message(message.toStdString()); + SessionEvent *se = user->prepareSessionEvent(event); + user->sendProtocolItem(*se); + delete se; + } +} + Response::ResponseCode ServerSocketInterface::cmdDeckDelDir(const Command_DeckDelDir &cmd, ResponseContainer & /*rc*/) { if (authState != PasswordRight) @@ -795,7 +810,7 @@ Response::ResponseCode ServerSocketInterface::cmdBanFromServer(const Command_Ban if (!userName.isEmpty()) { ServerSocketInterface *user = static_cast(server->getUsers().value(userName)); - if (user) + if (user && !userList.contains(user)) userList.append(user); } @@ -831,6 +846,23 @@ Response::ResponseCode ServerSocketInterface::cmdBanFromServer(const Command_Ban } servatrice->clientsLock.unlock(); + QList moderatorList = server->getOnlineModeratorList(); + QListIterator modIterator(moderatorList); + foreach(QString moderator, moderatorList) { + QString notificationMessage = "A ban has been put in with the following details:"; + if (!userName.isEmpty()) + notificationMessage.append("\n Username: " + userName); + if (!address.isEmpty()) + notificationMessage.append("\n IP Address: " + address); + if (!clientID.isEmpty()) + notificationMessage.append("\n Client ID: " + clientID); + + notificationMessage.append("\n Length: " + QString::number(minutes) + " minute(s)"); + notificationMessage.append("\n Internal Reason: " + QString::fromStdString(cmd.reason())); + notificationMessage.append("\n Visible Reason: " + QString::fromStdString(cmd.visible_reason())); + sendServerMessage(moderator.simplified(), notificationMessage); + } + return Response::RespOk; } @@ -863,6 +895,9 @@ Response::ResponseCode ServerSocketInterface::cmdRegisterAccount(const Command_R return Response::RespUsernameInvalid; } + if (userName.toLower() == "servatrice") + return Response::RespUsernameInvalid; + if(sqlInterface->userExists(userName)) return Response::RespUserAlreadyExists; diff --git a/servatrice/src/serversocketinterface.h b/servatrice/src/serversocketinterface.h index 894bd3a9..a8bf48c9 100644 --- a/servatrice/src/serversocketinterface.h +++ b/servatrice/src/serversocketinterface.h @@ -86,6 +86,7 @@ private: Response::ResponseCode cmdDeckList(const Command_DeckList &cmd, ResponseContainer &rc); Response::ResponseCode cmdDeckNewDir(const Command_DeckNewDir &cmd, ResponseContainer &rc); void deckDelDirHelper(int basePathId); + void sendServerMessage(const QString userName, const QString message); Response::ResponseCode cmdDeckDelDir(const Command_DeckDelDir &cmd, ResponseContainer &rc); Response::ResponseCode cmdDeckDel(const Command_DeckDel &cmd, ResponseContainer &rc); Response::ResponseCode cmdDeckUpload(const Command_DeckUpload &cmd, ResponseContainer &rc);