Commit b0693299 authored by woogerboy21's avatar woogerboy21
Browse files

Added server private message functionality to allow server based PM notifications.

Ban based notification to other online moderators is the first form implemented by this PR.
parent afc425e6
...@@ -130,7 +130,7 @@ void ChatView::appendMessage(QString message, RoomMessageTypeFlags messageType, ...@@ -130,7 +130,7 @@ void ChatView::appendMessage(QString message, RoomMessageTypeFlags messageType,
lastSender = sender; lastSender = sender;
// timestamp // timestamp
if (showTimestamps && !sameSender && !sender.isEmpty()) { if (showTimestamps && (!sameSender || sender.toLower() == "servatrice") && !sender.isEmpty()) {
QTextCharFormat timeFormat; QTextCharFormat timeFormat;
timeFormat.setForeground(QColor(SERVER_MESSAGE_COLOR)); timeFormat.setForeground(QColor(SERVER_MESSAGE_COLOR));
if (sender.isEmpty()) if (sender.isEmpty())
...@@ -139,31 +139,35 @@ void ChatView::appendMessage(QString message, RoomMessageTypeFlags messageType, ...@@ -139,31 +139,35 @@ void ChatView::appendMessage(QString message, RoomMessageTypeFlags messageType,
cursor.insertText(QDateTime::currentDateTime().toString("[hh:mm:ss] ")); cursor.insertText(QDateTime::currentDateTime().toString("[hh:mm:ss] "));
} }
// nickname // nickname
QTextCharFormat senderFormat; if (sender.toLower() != "servatrice") {
if (tabSupervisor && tabSupervisor->getUserInfo() && (sender == QString::fromStdString(tabSupervisor->getUserInfo()->name()))) { QTextCharFormat senderFormat;
senderFormat.setForeground(QBrush(getCustomMentionColor())); if (tabSupervisor && tabSupervisor->getUserInfo() &&
senderFormat.setFontWeight(QFont::Bold); (sender == QString::fromStdString(tabSupervisor->getUserInfo()->name()))) {
} else { senderFormat.setForeground(QBrush(getCustomMentionColor()));
senderFormat.setForeground(QBrush(OTHER_USER_COLOR));
if (playerBold)
senderFormat.setFontWeight(QFont::Bold); senderFormat.setFontWeight(QFont::Bold);
} } else {
senderFormat.setAnchor(true); senderFormat.setForeground(QBrush(OTHER_USER_COLOR));
senderFormat.setAnchorHref("user://" + QString::number(userLevel) + "_" + sender); if (playerBold)
if (sameSender) { senderFormat.setFontWeight(QFont::Bold);
cursor.insertText(" "); }
} else { senderFormat.setAnchor(true);
if (!sender.isEmpty() && tabSupervisor->getUserListsTab()) { senderFormat.setAnchorHref("user://" + QString::number(userLevel) + "_" + sender);
const int pixelSize = QFontInfo(cursor.charFormat().font()).pixelSize(); if (sameSender) {
QMap<QString, UserListTWI *> buddyList = tabSupervisor->getUserListsTab()->getBuddyList()->getUsers(); cursor.insertText(" ");
cursor.insertImage(UserLevelPixmapGenerator::generatePixmap(pixelSize, userLevel, buddyList.contains(sender)).toImage()); } else {
cursor.insertText(" "); if (!sender.isEmpty() && tabSupervisor->getUserListsTab()) {
const int pixelSize = QFontInfo(cursor.charFormat().font()).pixelSize();
QMap<QString, UserListTWI *> 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 // use different color for server messages
...@@ -180,6 +184,9 @@ void ChatView::appendMessage(QString message, RoomMessageTypeFlags messageType, ...@@ -180,6 +184,9 @@ void ChatView::appendMessage(QString message, RoomMessageTypeFlags messageType,
defaultFormat.setFontItalic(true); defaultFormat.setFontItalic(true);
break; break;
} }
} else if (sender.toLower() == "servatrice") {
defaultFormat.setForeground(Qt::darkGreen);
defaultFormat.setFontWeight(QFont::Bold);
} }
cursor.setCharFormat(defaultFormat); cursor.setCharFormat(defaultFormat);
......
...@@ -116,6 +116,8 @@ void TabMessage::processUserMessageEvent(const Event_UserMessage &event) ...@@ -116,6 +116,8 @@ void TabMessage::processUserMessageEvent(const Event_UserMessage &event)
soundEngine->playSound("private_message"); soundEngine->playSound("private_message");
if (settingsCache->getShowMessagePopup() && shouldShowSystemPopup(event)) if (settingsCache->getShowMessagePopup() && shouldShowSystemPopup(event))
showSystemPopup(event); showSystemPopup(event);
if (QString::fromStdString(event.sender_name()).simplified() == "Servatrice")
sayEdit->setDisabled(true);
emit userEvent(); emit userEvent();
} }
......
...@@ -262,6 +262,18 @@ void Server::removeClient(Server_ProtocolHandler *client) ...@@ -262,6 +262,18 @@ void Server::removeClient(Server_ProtocolHandler *client)
qDebug() << "Server::removeClient: removed" << (void *) client << ";" << clients.size() << "clients; " << users.size() << "users left"; qDebug() << "Server::removeClient: removed" << (void *) client << ";" << clients.size() << "clients; " << users.size() << "users left";
} }
QList<QString> Server::getOnlineModeratorList()
{
QList<QString> 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) void Server::externalUserJoined(const ServerInfo_User &userInfo)
{ {
// This function is always called from the main thread via signal/slot. // 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 ...@@ -617,4 +629,4 @@ void Server::sendIsl_RoomCommand(const CommandContainer &item, int serverId, qin
cont->set_room_id(roomId); cont->set_room_id(roomId);
emit sigSendIslMessage(msg, serverId); emit sigSendIslMessage(msg, serverId);
} }
\ No newline at end of file
...@@ -55,6 +55,7 @@ public: ...@@ -55,6 +55,7 @@ public:
virtual QMap<QString, bool> getServerRequiredFeatureList() const { return QMap<QString, bool>(); } virtual QMap<QString, bool> getServerRequiredFeatureList() const { return QMap<QString, bool>(); }
void addClient(Server_ProtocolHandler *player); void addClient(Server_ProtocolHandler *player);
void removeClient(Server_ProtocolHandler *player); void removeClient(Server_ProtocolHandler *player);
QList<QString> getOnlineModeratorList();
virtual QString getLoginMessage() const { return QString(); } virtual QString getLoginMessage() const { return QString(); }
virtual bool permitUnregisteredUsers() const { return true; } virtual bool permitUnregisteredUsers() const { return true; }
virtual bool getGameShouldPing() const { return false; } virtual bool getGameShouldPing() const { return false; }
......
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
#include "pb/event_add_to_list.pb.h" #include "pb/event_add_to_list.pb.h"
#include "pb/event_remove_from_list.pb.h" #include "pb/event_remove_from_list.pb.h"
#include "pb/event_notify_user.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_ban_history.pb.h"
#include "pb/response_deck_list.pb.h" #include "pb/response_deck_list.pb.h"
#include "pb/response_deck_download.pb.h" #include "pb/response_deck_download.pb.h"
...@@ -520,6 +521,20 @@ void ServerSocketInterface::deckDelDirHelper(int basePathId) ...@@ -520,6 +521,20 @@ void ServerSocketInterface::deckDelDirHelper(int basePathId)
sqlInterface->execSqlQuery(query); sqlInterface->execSqlQuery(query);
} }
void ServerSocketInterface::sendServerMessage(const QString userName, const QString message)
{
ServerSocketInterface *user = static_cast<ServerSocketInterface *>(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*/) Response::ResponseCode ServerSocketInterface::cmdDeckDelDir(const Command_DeckDelDir &cmd, ResponseContainer & /*rc*/)
{ {
if (authState != PasswordRight) if (authState != PasswordRight)
...@@ -795,7 +810,7 @@ Response::ResponseCode ServerSocketInterface::cmdBanFromServer(const Command_Ban ...@@ -795,7 +810,7 @@ Response::ResponseCode ServerSocketInterface::cmdBanFromServer(const Command_Ban
if (!userName.isEmpty()) { if (!userName.isEmpty()) {
ServerSocketInterface *user = static_cast<ServerSocketInterface *>(server->getUsers().value(userName)); ServerSocketInterface *user = static_cast<ServerSocketInterface *>(server->getUsers().value(userName));
if (user) if (user && !userList.contains(user))
userList.append(user); userList.append(user);
} }
...@@ -831,6 +846,23 @@ Response::ResponseCode ServerSocketInterface::cmdBanFromServer(const Command_Ban ...@@ -831,6 +846,23 @@ Response::ResponseCode ServerSocketInterface::cmdBanFromServer(const Command_Ban
} }
servatrice->clientsLock.unlock(); servatrice->clientsLock.unlock();
QList<QString> moderatorList = server->getOnlineModeratorList();
QListIterator<QString> 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; return Response::RespOk;
} }
...@@ -863,6 +895,9 @@ Response::ResponseCode ServerSocketInterface::cmdRegisterAccount(const Command_R ...@@ -863,6 +895,9 @@ Response::ResponseCode ServerSocketInterface::cmdRegisterAccount(const Command_R
return Response::RespUsernameInvalid; return Response::RespUsernameInvalid;
} }
if (userName.toLower() == "servatrice")
return Response::RespUsernameInvalid;
if(sqlInterface->userExists(userName)) if(sqlInterface->userExists(userName))
return Response::RespUserAlreadyExists; return Response::RespUserAlreadyExists;
......
...@@ -86,6 +86,7 @@ private: ...@@ -86,6 +86,7 @@ private:
Response::ResponseCode cmdDeckList(const Command_DeckList &cmd, ResponseContainer &rc); Response::ResponseCode cmdDeckList(const Command_DeckList &cmd, ResponseContainer &rc);
Response::ResponseCode cmdDeckNewDir(const Command_DeckNewDir &cmd, ResponseContainer &rc); Response::ResponseCode cmdDeckNewDir(const Command_DeckNewDir &cmd, ResponseContainer &rc);
void deckDelDirHelper(int basePathId); void deckDelDirHelper(int basePathId);
void sendServerMessage(const QString userName, const QString message);
Response::ResponseCode cmdDeckDelDir(const Command_DeckDelDir &cmd, ResponseContainer &rc); Response::ResponseCode cmdDeckDelDir(const Command_DeckDelDir &cmd, ResponseContainer &rc);
Response::ResponseCode cmdDeckDel(const Command_DeckDel &cmd, ResponseContainer &rc); Response::ResponseCode cmdDeckDel(const Command_DeckDel &cmd, ResponseContainer &rc);
Response::ResponseCode cmdDeckUpload(const Command_DeckUpload &cmd, ResponseContainer &rc); Response::ResponseCode cmdDeckUpload(const Command_DeckUpload &cmd, ResponseContainer &rc);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment