Merge pull request #1527 from woogerboy21/ban_mod_notify

Moderator ban notifications + Server PM functionality
This commit is contained in:
Zach 2015-09-17 22:53:07 -04:00
commit ead6ab3ad6
6 changed files with 84 additions and 26 deletions

View file

@ -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,
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,
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);

View file

@ -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();
} }

View file

@ -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
cont->set_room_id(roomId); cont->set_room_id(roomId);
emit sigSendIslMessage(msg, serverId); emit sigSendIslMessage(msg, serverId);
} }

View file

@ -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; }

View file

@ -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)
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
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
} }
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
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;

View file

@ -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);