mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-26 00:23:55 -07:00
fix segfault that happens when account tab is closed (#5474)
This commit is contained in:
parent
d09b9eb533
commit
23bd18a04c
19 changed files with 332 additions and 121 deletions
|
|
@ -159,6 +159,7 @@ set(cockatrice_SOURCES
|
||||||
src/server/user/user_context_menu.cpp
|
src/server/user/user_context_menu.cpp
|
||||||
src/server/user/user_info_connection.cpp
|
src/server/user/user_info_connection.cpp
|
||||||
src/server/user/user_info_box.cpp
|
src/server/user/user_info_box.cpp
|
||||||
|
src/server/user/user_list_manager.cpp
|
||||||
src/server/user/user_list_widget.cpp
|
src/server/user/user_list_widget.cpp
|
||||||
src/client/ui/window_main.cpp
|
src/client/ui/window_main.cpp
|
||||||
src/game/zones/view_zone_widget.cpp
|
src/game/zones/view_zone_widget.cpp
|
||||||
|
|
|
||||||
|
|
@ -52,18 +52,6 @@ public:
|
||||||
{
|
{
|
||||||
return tr("Account");
|
return tr("Account");
|
||||||
}
|
}
|
||||||
const UserListWidget *getAllUsersList() const
|
|
||||||
{
|
|
||||||
return allUsersList;
|
|
||||||
}
|
|
||||||
const UserListWidget *getBuddyList() const
|
|
||||||
{
|
|
||||||
return buddyList;
|
|
||||||
}
|
|
||||||
const UserListWidget *getIgnoreList() const
|
|
||||||
{
|
|
||||||
return ignoreList;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -123,15 +123,16 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay)
|
||||||
}
|
}
|
||||||
|
|
||||||
TabGame::TabGame(TabSupervisor *_tabSupervisor,
|
TabGame::TabGame(TabSupervisor *_tabSupervisor,
|
||||||
|
UserlistProxy *_userListProxy,
|
||||||
QList<AbstractClient *> &_clients,
|
QList<AbstractClient *> &_clients,
|
||||||
const Event_GameJoined &event,
|
const Event_GameJoined &event,
|
||||||
const QMap<int, QString> &_roomGameTypes)
|
const QMap<int, QString> &_roomGameTypes)
|
||||||
: Tab(_tabSupervisor), clients(_clients), gameInfo(event.game_info()), roomGameTypes(_roomGameTypes),
|
: Tab(_tabSupervisor), userListProxy(_userListProxy), clients(_clients), gameInfo(event.game_info()),
|
||||||
hostId(event.host_id()), localPlayerId(event.player_id()), isLocalGame(_tabSupervisor->getIsLocalGame()),
|
roomGameTypes(_roomGameTypes), hostId(event.host_id()), localPlayerId(event.player_id()),
|
||||||
spectator(event.spectator()), judge(event.judge()), gameStateKnown(false), resuming(event.resuming()),
|
isLocalGame(_tabSupervisor->getIsLocalGame()), spectator(event.spectator()), judge(event.judge()),
|
||||||
currentPhase(-1), activeCard(nullptr), gameClosed(false), replay(nullptr), replayPlayButton(nullptr),
|
gameStateKnown(false), resuming(event.resuming()), currentPhase(-1), activeCard(nullptr), gameClosed(false),
|
||||||
replayFastForwardButton(nullptr), aReplaySkipForward(nullptr), aReplaySkipBackward(nullptr),
|
replay(nullptr), replayPlayButton(nullptr), replayFastForwardButton(nullptr), aReplaySkipForward(nullptr),
|
||||||
aReplaySkipForwardBig(nullptr), aReplaySkipBackwardBig(nullptr), replayDock(nullptr)
|
aReplaySkipBackward(nullptr), aReplaySkipForwardBig(nullptr), aReplaySkipBackwardBig(nullptr), replayDock(nullptr)
|
||||||
{
|
{
|
||||||
// THIS CTOR IS USED ON GAMES
|
// THIS CTOR IS USED ON GAMES
|
||||||
gameInfo.set_started(false);
|
gameInfo.set_started(false);
|
||||||
|
|
@ -1683,7 +1684,7 @@ void TabGame::createPlayerListDock(bool bReplay)
|
||||||
|
|
||||||
void TabGame::createMessageDock(bool bReplay)
|
void TabGame::createMessageDock(bool bReplay)
|
||||||
{
|
{
|
||||||
messageLog = new MessageLogWidget(tabSupervisor, tabSupervisor, this);
|
messageLog = new MessageLogWidget(tabSupervisor, userListProxy, this);
|
||||||
connect(messageLog, SIGNAL(cardNameHovered(QString)), cardInfoFrameWidget, SLOT(setCard(QString)));
|
connect(messageLog, SIGNAL(cardNameHovered(QString)), cardInfoFrameWidget, SLOT(setCard(QString)));
|
||||||
connect(messageLog, &MessageLogWidget::showCardInfoPopup, this, &TabGame::showCardInfoPopup);
|
connect(messageLog, &MessageLogWidget::showCardInfoPopup, this, &TabGame::showCardInfoPopup);
|
||||||
connect(messageLog, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString)));
|
connect(messageLog, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString)));
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
#include <QCompleter>
|
#include <QCompleter>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
|
|
||||||
|
class UserlistProxy;
|
||||||
class DeckViewContainer;
|
class DeckViewContainer;
|
||||||
class AbstractClient;
|
class AbstractClient;
|
||||||
class CardDatabase;
|
class CardDatabase;
|
||||||
|
|
@ -66,6 +67,7 @@ class TabGame : public Tab
|
||||||
private:
|
private:
|
||||||
QTimer *gameTimer;
|
QTimer *gameTimer;
|
||||||
int secondsElapsed;
|
int secondsElapsed;
|
||||||
|
UserlistProxy *userListProxy;
|
||||||
QList<AbstractClient *> clients;
|
QList<AbstractClient *> clients;
|
||||||
ServerInfo_Game gameInfo;
|
ServerInfo_Game gameInfo;
|
||||||
QMap<int, QString> roomGameTypes;
|
QMap<int, QString> roomGameTypes;
|
||||||
|
|
@ -210,6 +212,7 @@ private slots:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TabGame(TabSupervisor *_tabSupervisor,
|
TabGame(TabSupervisor *_tabSupervisor,
|
||||||
|
UserlistProxy *_userListProxy,
|
||||||
QList<AbstractClient *> &_clients,
|
QList<AbstractClient *> &_clients,
|
||||||
const Event_GameJoined &event,
|
const Event_GameJoined &event,
|
||||||
const QMap<int, QString> &_roomGameTypes);
|
const QMap<int, QString> &_roomGameTypes);
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
#include "../../main.h"
|
#include "../../main.h"
|
||||||
#include "../../server/chat_view/chat_view.h"
|
#include "../../server/chat_view/chat_view.h"
|
||||||
#include "../../server/pending_command.h"
|
#include "../../server/pending_command.h"
|
||||||
|
#include "../../server/user/user_list_manager.h"
|
||||||
#include "../../settings/cache_settings.h"
|
#include "../../settings/cache_settings.h"
|
||||||
#include "../game_logic/abstract_client.h"
|
#include "../game_logic/abstract_client.h"
|
||||||
#include "../sound_engine.h"
|
#include "../sound_engine.h"
|
||||||
|
|
@ -25,7 +26,7 @@ TabMessage::TabMessage(TabSupervisor *_tabSupervisor,
|
||||||
: Tab(_tabSupervisor), client(_client), ownUserInfo(new ServerInfo_User(_ownUserInfo)),
|
: Tab(_tabSupervisor), client(_client), ownUserInfo(new ServerInfo_User(_ownUserInfo)),
|
||||||
otherUserInfo(new ServerInfo_User(_otherUserInfo)), userOnline(true)
|
otherUserInfo(new ServerInfo_User(_otherUserInfo)), userOnline(true)
|
||||||
{
|
{
|
||||||
chatView = new ChatView(tabSupervisor, tabSupervisor, 0, true);
|
chatView = new ChatView(tabSupervisor, tabSupervisor->getUserListManager(), 0, true);
|
||||||
connect(chatView, &ChatView::showCardInfoPopup, this, &TabMessage::showCardInfoPopup);
|
connect(chatView, &ChatView::showCardInfoPopup, this, &TabMessage::showCardInfoPopup);
|
||||||
connect(chatView, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString)));
|
connect(chatView, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString)));
|
||||||
connect(chatView, SIGNAL(addMentionTag(QString)), this, SLOT(addMentionTag(QString)));
|
connect(chatView, SIGNAL(addMentionTag(QString)), this, SLOT(addMentionTag(QString)));
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
#include "../../main.h"
|
#include "../../main.h"
|
||||||
#include "../../server/chat_view/chat_view.h"
|
#include "../../server/chat_view/chat_view.h"
|
||||||
#include "../../server/pending_command.h"
|
#include "../../server/pending_command.h"
|
||||||
|
#include "../../server/user/user_list_manager.h"
|
||||||
#include "../../server/user/user_list_widget.h"
|
#include "../../server/user/user_list_widget.h"
|
||||||
#include "../../settings/cache_settings.h"
|
#include "../../settings/cache_settings.h"
|
||||||
#include "get_pb_extension.h"
|
#include "get_pb_extension.h"
|
||||||
|
|
@ -35,9 +36,10 @@
|
||||||
TabRoom::TabRoom(TabSupervisor *_tabSupervisor,
|
TabRoom::TabRoom(TabSupervisor *_tabSupervisor,
|
||||||
AbstractClient *_client,
|
AbstractClient *_client,
|
||||||
ServerInfo_User *_ownUser,
|
ServerInfo_User *_ownUser,
|
||||||
|
const UserlistProxy *_userListProxy,
|
||||||
const ServerInfo_Room &info)
|
const ServerInfo_Room &info)
|
||||||
: Tab(_tabSupervisor), client(_client), roomId(info.room_id()), roomName(QString::fromStdString(info.name())),
|
: Tab(_tabSupervisor), client(_client), roomId(info.room_id()), roomName(QString::fromStdString(info.name())),
|
||||||
ownUser(_ownUser)
|
ownUser(_ownUser), userListProxy(_userListProxy)
|
||||||
{
|
{
|
||||||
const int gameTypeListSize = info.gametype_list_size();
|
const int gameTypeListSize = info.gametype_list_size();
|
||||||
for (int i = 0; i < gameTypeListSize; ++i)
|
for (int i = 0; i < gameTypeListSize; ++i)
|
||||||
|
|
@ -51,7 +53,7 @@ TabRoom::TabRoom(TabSupervisor *_tabSupervisor,
|
||||||
connect(userList, SIGNAL(openMessageDialog(const QString &, bool)), this,
|
connect(userList, SIGNAL(openMessageDialog(const QString &, bool)), this,
|
||||||
SIGNAL(openMessageDialog(const QString &, bool)));
|
SIGNAL(openMessageDialog(const QString &, bool)));
|
||||||
|
|
||||||
chatView = new ChatView(tabSupervisor, tabSupervisor, nullptr, true, this);
|
chatView = new ChatView(tabSupervisor, userListProxy, nullptr, true, this);
|
||||||
connect(chatView, SIGNAL(showMentionPopup(const QString &)), this, SLOT(actShowMentionPopup(const QString &)));
|
connect(chatView, SIGNAL(showMentionPopup(const QString &)), this, SLOT(actShowMentionPopup(const QString &)));
|
||||||
connect(chatView, SIGNAL(messageClickedSignal()), this, SLOT(focusTab()));
|
connect(chatView, SIGNAL(messageClickedSignal()), this, SLOT(focusTab()));
|
||||||
connect(chatView, SIGNAL(openMessageDialog(QString, bool)), this, SIGNAL(openMessageDialog(QString, bool)));
|
connect(chatView, SIGNAL(openMessageDialog(QString, bool)), this, SIGNAL(openMessageDialog(QString, bool)));
|
||||||
|
|
@ -282,7 +284,7 @@ void TabRoom::processRoomSayEvent(const Event_RoomSay &event)
|
||||||
QString senderName = QString::fromStdString(event.name());
|
QString senderName = QString::fromStdString(event.name());
|
||||||
QString message = QString::fromStdString(event.message());
|
QString message = QString::fromStdString(event.message());
|
||||||
|
|
||||||
if (tabSupervisor->getTabAccount()->getIgnoreList()->getUsers().contains(senderName))
|
if (userListProxy->getOnlineUser(senderName))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
UserListTWI *twi = userList->getUsers().value(senderName);
|
UserListTWI *twi = userList->getUsers().value(senderName);
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,8 @@
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
|
|
||||||
|
class UserlistProxy;
|
||||||
|
class UserListManager;
|
||||||
namespace google
|
namespace google
|
||||||
{
|
{
|
||||||
namespace protobuf
|
namespace protobuf
|
||||||
|
|
@ -49,6 +51,7 @@ private:
|
||||||
|
|
||||||
GameSelector *gameSelector;
|
GameSelector *gameSelector;
|
||||||
UserListWidget *userList;
|
UserListWidget *userList;
|
||||||
|
const UserlistProxy *userListProxy;
|
||||||
ChatView *chatView;
|
ChatView *chatView;
|
||||||
QLabel *sayLabel;
|
QLabel *sayLabel;
|
||||||
LineEditCompleter *sayEdit;
|
LineEditCompleter *sayEdit;
|
||||||
|
|
@ -89,6 +92,7 @@ public:
|
||||||
TabRoom(TabSupervisor *_tabSupervisor,
|
TabRoom(TabSupervisor *_tabSupervisor,
|
||||||
AbstractClient *_client,
|
AbstractClient *_client,
|
||||||
ServerInfo_User *_ownUser,
|
ServerInfo_User *_ownUser,
|
||||||
|
const UserlistProxy *_userListProxy,
|
||||||
const ServerInfo_Room &info);
|
const ServerInfo_Room &info);
|
||||||
void retranslateUi() override;
|
void retranslateUi() override;
|
||||||
void closeRequest(bool forced = false) override;
|
void closeRequest(bool forced = false) override;
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "../../client/game_logic/abstract_client.h"
|
#include "../../client/game_logic/abstract_client.h"
|
||||||
#include "../../main.h"
|
#include "../../main.h"
|
||||||
|
#include "../../server/user/user_list_manager.h"
|
||||||
#include "../../server/user/user_list_widget.h"
|
#include "../../server/user/user_list_widget.h"
|
||||||
#include "../../settings/cache_settings.h"
|
#include "../../settings/cache_settings.h"
|
||||||
#include "../ui/pixel_map_generator.h"
|
#include "../ui/pixel_map_generator.h"
|
||||||
|
|
@ -114,6 +115,8 @@ TabSupervisor::TabSupervisor(AbstractClient *_client, QMenu *tabsMenu, QWidget *
|
||||||
tabBar()->setStyle(new MacOSTabFixStyle);
|
tabBar()->setStyle(new MacOSTabFixStyle);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
userListManager = new UserListManager(client, this);
|
||||||
|
|
||||||
// connect tab changes
|
// connect tab changes
|
||||||
connect(this, &TabSupervisor::currentChanged, this, &TabSupervisor::updateCurrent);
|
connect(this, &TabSupervisor::currentChanged, this, &TabSupervisor::updateCurrent);
|
||||||
|
|
||||||
|
|
@ -291,6 +294,8 @@ void TabSupervisor::start(const ServerInfo_User &_userInfo)
|
||||||
isLocalGame = false;
|
isLocalGame = false;
|
||||||
userInfo = new ServerInfo_User(_userInfo);
|
userInfo = new ServerInfo_User(_userInfo);
|
||||||
|
|
||||||
|
userListManager->handleConnect();
|
||||||
|
|
||||||
resetTabsMenu();
|
resetTabsMenu();
|
||||||
|
|
||||||
tabsMenu->addSeparator();
|
tabsMenu->addSeparator();
|
||||||
|
|
@ -395,6 +400,8 @@ void TabSupervisor::stop()
|
||||||
tab->closeRequest(true);
|
tab->closeRequest(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
userListManager->handleDisconnect();
|
||||||
|
|
||||||
delete userInfo;
|
delete userInfo;
|
||||||
userInfo = 0;
|
userInfo = 0;
|
||||||
}
|
}
|
||||||
|
|
@ -535,7 +542,7 @@ void TabSupervisor::gameJoined(const Event_GameJoined &event)
|
||||||
roomGameTypes.insert(event.game_types(i).game_type_id(),
|
roomGameTypes.insert(event.game_types(i).game_type_id(),
|
||||||
QString::fromStdString(event.game_types(i).description()));
|
QString::fromStdString(event.game_types(i).description()));
|
||||||
|
|
||||||
TabGame *tab = new TabGame(this, QList<AbstractClient *>() << client, event, roomGameTypes);
|
TabGame *tab = new TabGame(this, userListManager, QList<AbstractClient *>() << client, event, roomGameTypes);
|
||||||
connect(tab, &TabGame::gameClosing, this, &TabSupervisor::gameLeft);
|
connect(tab, &TabGame::gameClosing, this, &TabSupervisor::gameLeft);
|
||||||
connect(tab, &TabGame::openMessageDialog, this, &TabSupervisor::addMessageTab);
|
connect(tab, &TabGame::openMessageDialog, this, &TabSupervisor::addMessageTab);
|
||||||
connect(tab, &TabGame::openDeckEditor, this, &TabSupervisor::addDeckEditorTab);
|
connect(tab, &TabGame::openDeckEditor, this, &TabSupervisor::addDeckEditorTab);
|
||||||
|
|
@ -546,7 +553,7 @@ void TabSupervisor::gameJoined(const Event_GameJoined &event)
|
||||||
|
|
||||||
void TabSupervisor::localGameJoined(const Event_GameJoined &event)
|
void TabSupervisor::localGameJoined(const Event_GameJoined &event)
|
||||||
{
|
{
|
||||||
TabGame *tab = new TabGame(this, localClients, event, QMap<int, QString>());
|
TabGame *tab = new TabGame(this, userListManager, localClients, event, QMap<int, QString>());
|
||||||
connect(tab, &TabGame::gameClosing, this, &TabSupervisor::gameLeft);
|
connect(tab, &TabGame::gameClosing, this, &TabSupervisor::gameLeft);
|
||||||
connect(tab, &TabGame::openDeckEditor, this, &TabSupervisor::addDeckEditorTab);
|
connect(tab, &TabGame::openDeckEditor, this, &TabSupervisor::addDeckEditorTab);
|
||||||
myAddTab(tab);
|
myAddTab(tab);
|
||||||
|
|
@ -574,7 +581,7 @@ void TabSupervisor::gameLeft(TabGame *tab)
|
||||||
|
|
||||||
void TabSupervisor::addRoomTab(const ServerInfo_Room &info, bool setCurrent)
|
void TabSupervisor::addRoomTab(const ServerInfo_Room &info, bool setCurrent)
|
||||||
{
|
{
|
||||||
TabRoom *tab = new TabRoom(this, client, userInfo, info);
|
TabRoom *tab = new TabRoom(this, client, userInfo, userListManager, info);
|
||||||
connect(tab, &TabRoom::maximizeClient, this, &TabSupervisor::maximizeMainWindow);
|
connect(tab, &TabRoom::maximizeClient, this, &TabSupervisor::maximizeMainWindow);
|
||||||
connect(tab, &TabRoom::roomClosing, this, &TabSupervisor::roomLeft);
|
connect(tab, &TabRoom::roomClosing, this, &TabSupervisor::roomLeft);
|
||||||
connect(tab, &TabRoom::openMessageDialog, this, &TabSupervisor::addMessageTab);
|
connect(tab, &TabRoom::openMessageDialog, this, &TabSupervisor::addMessageTab);
|
||||||
|
|
@ -616,11 +623,11 @@ TabMessage *TabSupervisor::addMessageTab(const QString &receiverName, bool focus
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
ServerInfo_User otherUser;
|
ServerInfo_User otherUser;
|
||||||
UserListTWI *twi = tabAccount->getAllUsersList()->getUsers().value(receiverName);
|
if (auto user = userListManager->getOnlineUser(receiverName)) {
|
||||||
if (twi)
|
otherUser = ServerInfo_User(*user);
|
||||||
otherUser = twi->getUserInfo();
|
} else {
|
||||||
else
|
|
||||||
otherUser.set_name(receiverName.toStdString());
|
otherUser.set_name(receiverName.toStdString());
|
||||||
|
}
|
||||||
|
|
||||||
TabMessage *tab;
|
TabMessage *tab;
|
||||||
tab = messageTabs.value(QString::fromStdString(otherUser.name()));
|
tab = messageTabs.value(QString::fromStdString(otherUser.name()));
|
||||||
|
|
@ -717,9 +724,9 @@ void TabSupervisor::processUserMessageEvent(const Event_UserMessage &event)
|
||||||
if (!tab)
|
if (!tab)
|
||||||
tab = messageTabs.value(QString::fromStdString(event.receiver_name()));
|
tab = messageTabs.value(QString::fromStdString(event.receiver_name()));
|
||||||
if (!tab) {
|
if (!tab) {
|
||||||
UserListTWI *twi = tabAccount->getAllUsersList()->getUsers().value(senderName);
|
const ServerInfo_User *userInfo = userListManager->getOnlineUser(senderName);
|
||||||
if (twi) {
|
if (userInfo) {
|
||||||
UserLevelFlags userLevel = UserLevelFlags(twi->getUserInfo().user_level());
|
UserLevelFlags userLevel = UserLevelFlags(userInfo->user_level());
|
||||||
if (SettingsCache::instance().getIgnoreUnregisteredUserMessages() &&
|
if (SettingsCache::instance().getIgnoreUnregisteredUserMessages() &&
|
||||||
!userLevel.testFlag(ServerInfo_User::IsRegistered))
|
!userLevel.testFlag(ServerInfo_User::IsRegistered))
|
||||||
// Flags are additive, so reg/mod/admin are all IsRegistered
|
// Flags are additive, so reg/mod/admin are all IsRegistered
|
||||||
|
|
@ -753,15 +760,15 @@ void TabSupervisor::processUserLeft(const QString &userName)
|
||||||
void TabSupervisor::processUserJoined(const ServerInfo_User &userInfoJoined)
|
void TabSupervisor::processUserJoined(const ServerInfo_User &userInfoJoined)
|
||||||
{
|
{
|
||||||
QString userName = QString::fromStdString(userInfoJoined.name());
|
QString userName = QString::fromStdString(userInfoJoined.name());
|
||||||
if (isUserBuddy(userName)) {
|
if (userListManager->isUserBuddy(userName)) {
|
||||||
Tab *tab = static_cast<Tab *>(getTabAccount());
|
if (auto *tab = getTabAccount()) {
|
||||||
|
if (tab != currentWidget()) {
|
||||||
if (tab != currentWidget()) {
|
tab->setContentsChanged(true);
|
||||||
tab->setContentsChanged(true);
|
QPixmap avatarPixmap =
|
||||||
QPixmap avatarPixmap =
|
UserLevelPixmapGenerator::generatePixmap(13, (UserLevelFlags)userInfoJoined.user_level(), true,
|
||||||
UserLevelPixmapGenerator::generatePixmap(13, (UserLevelFlags)userInfoJoined.user_level(), true,
|
QString::fromStdString(userInfoJoined.privlevel()));
|
||||||
QString::fromStdString(userInfoJoined.privlevel()));
|
setTabIcon(indexOf(tab), QPixmap(avatarPixmap));
|
||||||
setTabIcon(indexOf(tab), QPixmap(avatarPixmap));
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SettingsCache::instance().getBuddyConnectNotificationsEnabled()) {
|
if (SettingsCache::instance().getBuddyConnectNotificationsEnabled()) {
|
||||||
|
|
@ -849,57 +856,6 @@ void TabSupervisor::processNotifyUserEvent(const Event_NotifyUser &event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TabSupervisor::isOwnUserRegistered() const
|
|
||||||
{
|
|
||||||
return userInfo != nullptr && (userInfo->user_level() & ServerInfo_User::IsRegistered) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString TabSupervisor::getOwnUsername() const
|
|
||||||
{
|
|
||||||
return userInfo != nullptr ? QString::fromStdString(userInfo->name()) : QString();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TabSupervisor::isUserBuddy(const QString &userName) const
|
|
||||||
{
|
|
||||||
if (!getTabAccount())
|
|
||||||
return false;
|
|
||||||
if (!getTabAccount()->getBuddyList())
|
|
||||||
return false;
|
|
||||||
QMap<QString, UserListTWI *> buddyList = getTabAccount()->getBuddyList()->getUsers();
|
|
||||||
bool senderIsBuddy = buddyList.contains(userName);
|
|
||||||
return senderIsBuddy;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TabSupervisor::isUserIgnored(const QString &userName) const
|
|
||||||
{
|
|
||||||
if (!getTabAccount())
|
|
||||||
return false;
|
|
||||||
if (!getTabAccount()->getIgnoreList())
|
|
||||||
return false;
|
|
||||||
QMap<QString, UserListTWI *> buddyList = getTabAccount()->getIgnoreList()->getUsers();
|
|
||||||
bool senderIsBuddy = buddyList.contains(userName);
|
|
||||||
return senderIsBuddy;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ServerInfo_User *TabSupervisor::getOnlineUser(const QString &userName) const
|
|
||||||
{
|
|
||||||
if (!getTabAccount())
|
|
||||||
return nullptr;
|
|
||||||
if (!getTabAccount()->getAllUsersList())
|
|
||||||
return nullptr;
|
|
||||||
QMap<QString, UserListTWI *> userList = getTabAccount()->getAllUsersList()->getUsers();
|
|
||||||
const QString &userNameToMatchLower = userName.toLower();
|
|
||||||
QMap<QString, UserListTWI *>::iterator i;
|
|
||||||
|
|
||||||
for (i = userList.begin(); i != userList.end(); ++i)
|
|
||||||
if (i.key().toLower() == userNameToMatchLower) {
|
|
||||||
const ServerInfo_User &_userInfo = i.value()->getUserInfo();
|
|
||||||
return &_userInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool TabSupervisor::switchToGameTabIfAlreadyExists(const int gameId)
|
bool TabSupervisor::switchToGameTabIfAlreadyExists(const int gameId)
|
||||||
{
|
{
|
||||||
bool isGameTabExists = false;
|
bool isGameTabExists = false;
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
#include <QProxyStyle>
|
#include <QProxyStyle>
|
||||||
#include <QTabWidget>
|
#include <QTabWidget>
|
||||||
|
|
||||||
|
class UserListManager;
|
||||||
class QMenu;
|
class QMenu;
|
||||||
class AbstractClient;
|
class AbstractClient;
|
||||||
class Tab;
|
class Tab;
|
||||||
|
|
@ -62,12 +63,13 @@ protected:
|
||||||
void paintEvent(QPaintEvent *event) override;
|
void paintEvent(QPaintEvent *event) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TabSupervisor : public QTabWidget, public UserlistProxy
|
class TabSupervisor : public QTabWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
ServerInfo_User *userInfo;
|
ServerInfo_User *userInfo;
|
||||||
AbstractClient *client;
|
AbstractClient *client;
|
||||||
|
UserListManager *userListManager;
|
||||||
QList<AbstractClient *> localClients;
|
QList<AbstractClient *> localClients;
|
||||||
QMenu *tabsMenu;
|
QMenu *tabsMenu;
|
||||||
TabDeckStorageVisual *tabVisualDeckStorage;
|
TabDeckStorageVisual *tabVisualDeckStorage;
|
||||||
|
|
@ -117,17 +119,16 @@ public:
|
||||||
return userInfo;
|
return userInfo;
|
||||||
}
|
}
|
||||||
AbstractClient *getClient() const;
|
AbstractClient *getClient() const;
|
||||||
|
const UserListManager *getUserListManager() const
|
||||||
|
{
|
||||||
|
return userListManager;
|
||||||
|
}
|
||||||
const QMap<int, TabRoom *> &getRoomTabs() const
|
const QMap<int, TabRoom *> &getRoomTabs() const
|
||||||
{
|
{
|
||||||
return roomTabs;
|
return roomTabs;
|
||||||
}
|
}
|
||||||
bool getAdminLocked() const;
|
bool getAdminLocked() const;
|
||||||
bool closeRequest();
|
bool closeRequest();
|
||||||
bool isOwnUserRegistered() const override;
|
|
||||||
QString getOwnUsername() const override;
|
|
||||||
bool isUserBuddy(const QString &userName) const override;
|
|
||||||
bool isUserIgnored(const QString &userName) const override;
|
|
||||||
const ServerInfo_User *getOnlineUser(const QString &userName) const override;
|
|
||||||
bool switchToGameTabIfAlreadyExists(const int gameId);
|
bool switchToGameTabIfAlreadyExists(const int gameId);
|
||||||
void actShowPopup(const QString &message);
|
void actShowPopup(const QString &message);
|
||||||
signals:
|
signals:
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
#include "../dialogs/dlg_create_game.h"
|
#include "../dialogs/dlg_create_game.h"
|
||||||
#include "../dialogs/dlg_filter_games.h"
|
#include "../dialogs/dlg_filter_games.h"
|
||||||
#include "../server/pending_command.h"
|
#include "../server/pending_command.h"
|
||||||
|
#include "../server/user/user_list_manager.h"
|
||||||
#include "games_model.h"
|
#include "games_model.h"
|
||||||
#include "pb/response.pb.h"
|
#include "pb/response.pb.h"
|
||||||
#include "pb/room_commands.pb.h"
|
#include "pb/room_commands.pb.h"
|
||||||
|
|
@ -39,7 +40,7 @@ GameSelector::GameSelector(AbstractClient *_client,
|
||||||
gameListView = new QTreeView;
|
gameListView = new QTreeView;
|
||||||
gameListModel = new GamesModel(_rooms, _gameTypes, this);
|
gameListModel = new GamesModel(_rooms, _gameTypes, this);
|
||||||
if (showFilters) {
|
if (showFilters) {
|
||||||
gameListProxyModel = new GamesProxyModel(this, tabSupervisor);
|
gameListProxyModel = new GamesProxyModel(this, tabSupervisor->getUserListManager());
|
||||||
gameListProxyModel->setSourceModel(gameListModel);
|
gameListProxyModel->setSourceModel(gameListModel);
|
||||||
gameListProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
|
gameListProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive);
|
||||||
gameListView->setModel(gameListProxyModel);
|
gameListView->setModel(gameListProxyModel);
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "../client/tabs/tab_account.h"
|
#include "../client/tabs/tab_account.h"
|
||||||
#include "../client/ui/pixel_map_generator.h"
|
#include "../client/ui/pixel_map_generator.h"
|
||||||
|
#include "../server/user/user_list_manager.h"
|
||||||
#include "../server/user/user_list_widget.h"
|
#include "../server/user/user_list_widget.h"
|
||||||
#include "../settings/cache_settings.h"
|
#include "../settings/cache_settings.h"
|
||||||
#include "pb/serverinfo_game.pb.h"
|
#include "pb/serverinfo_game.pb.h"
|
||||||
|
|
@ -284,9 +285,8 @@ void GamesModel::updateGameList(const ServerInfo_Game &game)
|
||||||
endInsertRows();
|
endInsertRows();
|
||||||
}
|
}
|
||||||
|
|
||||||
GamesProxyModel::GamesProxyModel(QObject *parent, const TabSupervisor *_tabSupervisor)
|
GamesProxyModel::GamesProxyModel(QObject *parent, const UserlistProxy *_userListProxy)
|
||||||
: QSortFilterProxyModel(parent), ownUserIsRegistered(_tabSupervisor->isOwnUserRegistered()),
|
: QSortFilterProxyModel(parent), userListProxy(_userListProxy)
|
||||||
tabSupervisor(_tabSupervisor)
|
|
||||||
{
|
{
|
||||||
resetFilterParameters();
|
resetFilterParameters();
|
||||||
setSortRole(GamesModel::SORT_ROLE);
|
setSortRole(GamesModel::SORT_ROLE);
|
||||||
|
|
@ -508,15 +508,14 @@ bool GamesProxyModel::filterAcceptsRow(int sourceRow) const
|
||||||
if (!showBuddiesOnlyGames && game.only_buddies()) {
|
if (!showBuddiesOnlyGames && game.only_buddies()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (hideIgnoredUserGames && tabSupervisor->getTabAccount()->getIgnoreList()->getUsers().contains(
|
if (hideIgnoredUserGames && userListProxy->isUserIgnored(QString::fromStdString(game.creator_info().name()))) {
|
||||||
QString::fromStdString(game.creator_info().name()))) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!showFullGames && game.player_count() == game.max_players())
|
if (!showFullGames && game.player_count() == game.max_players())
|
||||||
return false;
|
return false;
|
||||||
if (!showGamesThatStarted && game.started())
|
if (!showGamesThatStarted && game.started())
|
||||||
return false;
|
return false;
|
||||||
if (!ownUserIsRegistered)
|
if (!userListProxy->isOwnUserRegistered())
|
||||||
if (game.only_registered())
|
if (game.only_registered())
|
||||||
return false;
|
return false;
|
||||||
if (!showPasswordProtectedGames && game.with_password())
|
if (!showPasswordProtectedGames && game.with_password())
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
#ifndef GAMESMODEL_H
|
#ifndef GAMESMODEL_H
|
||||||
#define GAMESMODEL_H
|
#define GAMESMODEL_H
|
||||||
|
|
||||||
#include "../client/tabs/tab_supervisor.h"
|
|
||||||
#include "game_type_map.h"
|
#include "game_type_map.h"
|
||||||
#include "pb/serverinfo_game.pb.h"
|
#include "pb/serverinfo_game.pb.h"
|
||||||
|
|
||||||
|
|
@ -12,6 +11,8 @@
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
|
|
||||||
|
class UserlistProxy;
|
||||||
|
|
||||||
class GamesModel : public QAbstractTableModel
|
class GamesModel : public QAbstractTableModel
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
@ -65,8 +66,7 @@ class GamesProxyModel : public QSortFilterProxyModel
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
bool ownUserIsRegistered;
|
const UserlistProxy *userListProxy;
|
||||||
const TabSupervisor *tabSupervisor;
|
|
||||||
|
|
||||||
// If adding any additional filters, make sure to update:
|
// If adding any additional filters, make sure to update:
|
||||||
// - GamesProxyModel()
|
// - GamesProxyModel()
|
||||||
|
|
@ -88,7 +88,7 @@ private:
|
||||||
showOnlyIfSpectatorsCanSeeHands;
|
showOnlyIfSpectatorsCanSeeHands;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GamesProxyModel(QObject *parent = nullptr, const TabSupervisor *_tabSupervisor = nullptr);
|
GamesProxyModel(QObject *parent = nullptr, const UserlistProxy *_userListProxy = nullptr);
|
||||||
|
|
||||||
bool getShowBuddiesOnlyGames() const
|
bool getShowBuddiesOnlyGames() const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
#include "../../client/tabs/tab_supervisor.h"
|
#include "../../client/tabs/tab_supervisor.h"
|
||||||
#include "../../client/ui/pixel_map_generator.h"
|
#include "../../client/ui/pixel_map_generator.h"
|
||||||
#include "../../server/user/user_context_menu.h"
|
#include "../../server/user/user_context_menu.h"
|
||||||
|
#include "../../server/user/user_list_manager.h"
|
||||||
#include "../../server/user/user_list_widget.h"
|
#include "../../server/user/user_list_widget.h"
|
||||||
#include "pb/command_kick_from_game.pb.h"
|
#include "pb/command_kick_from_game.pb.h"
|
||||||
#include "pb/serverinfo_playerproperties.pb.h"
|
#include "pb/serverinfo_playerproperties.pb.h"
|
||||||
|
|
@ -71,7 +72,7 @@ PlayerListWidget::PlayerListWidget(TabSupervisor *_tabSupervisor,
|
||||||
itemDelegate = new PlayerListItemDelegate(this);
|
itemDelegate = new PlayerListItemDelegate(this);
|
||||||
setItemDelegate(itemDelegate);
|
setItemDelegate(itemDelegate);
|
||||||
|
|
||||||
userContextMenu = new UserContextMenu(tabSupervisor, this, game);
|
userContextMenu = new UserContextMenu(tabSupervisor, tabSupervisor->getUserListManager(), this, game);
|
||||||
connect(userContextMenu, &UserContextMenu::openMessageDialog, this, &PlayerListWidget::openMessageDialog);
|
connect(userContextMenu, &UserContextMenu::openMessageDialog, this, &PlayerListWidget::openMessageDialog);
|
||||||
} else {
|
} else {
|
||||||
userContextMenu = nullptr;
|
userContextMenu = nullptr;
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ ChatView::ChatView(TabSupervisor *_tabSupervisor,
|
||||||
linkColor = palette().link().color();
|
linkColor = palette().link().color();
|
||||||
}
|
}
|
||||||
|
|
||||||
userContextMenu = new UserContextMenu(tabSupervisor, this, game);
|
userContextMenu = new UserContextMenu(tabSupervisor, userlistProxy, this, game);
|
||||||
connect(userContextMenu, SIGNAL(openMessageDialog(QString, bool)), this, SIGNAL(openMessageDialog(QString, bool)));
|
connect(userContextMenu, SIGNAL(openMessageDialog(QString, bool)), this, SIGNAL(openMessageDialog(QString, bool)));
|
||||||
|
|
||||||
ownUserName = userlistProxy->getOwnUsername();
|
ownUserName = userlistProxy->getOwnUsername();
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#include "../../client/tabs/tab_game.h"
|
#include "../../client/tabs/tab_game.h"
|
||||||
#include "../../client/tabs/tab_supervisor.h"
|
#include "../../client/tabs/tab_supervisor.h"
|
||||||
#include "../../game/game_selector.h"
|
#include "../../game/game_selector.h"
|
||||||
|
#include "../../server/chat_view/user_list_proxy.h"
|
||||||
#include "../chat_view/chat_view.h"
|
#include "../chat_view/chat_view.h"
|
||||||
#include "../pending_command.h"
|
#include "../pending_command.h"
|
||||||
#include "pb/command_kick_from_game.pb.h"
|
#include "pb/command_kick_from_game.pb.h"
|
||||||
|
|
@ -27,8 +28,12 @@
|
||||||
#include <QtGui>
|
#include <QtGui>
|
||||||
#include <QtWidgets>
|
#include <QtWidgets>
|
||||||
|
|
||||||
UserContextMenu::UserContextMenu(TabSupervisor *_tabSupervisor, QWidget *parent, TabGame *_game)
|
UserContextMenu::UserContextMenu(TabSupervisor *_tabSupervisor,
|
||||||
: QObject(parent), client(_tabSupervisor->getClient()), tabSupervisor(_tabSupervisor), game(_game)
|
const UserlistProxy *_userListProxy,
|
||||||
|
QWidget *parent,
|
||||||
|
TabGame *_game)
|
||||||
|
: QObject(parent), client(_tabSupervisor->getClient()), tabSupervisor(_tabSupervisor),
|
||||||
|
userListProxy(_userListProxy), game(_game)
|
||||||
{
|
{
|
||||||
aUserName = new QAction(QString(), this);
|
aUserName = new QAction(QString(), this);
|
||||||
aUserName->setEnabled(false);
|
aUserName->setEnabled(false);
|
||||||
|
|
@ -284,7 +289,7 @@ void UserContextMenu::warnUser_dialogFinished()
|
||||||
{
|
{
|
||||||
WarningDialog *dlg = static_cast<WarningDialog *>(sender());
|
WarningDialog *dlg = static_cast<WarningDialog *>(sender());
|
||||||
|
|
||||||
if (dlg->getName().isEmpty() || tabSupervisor->getOwnUsername().simplified().isEmpty())
|
if (dlg->getName().isEmpty() || userListProxy->getOwnUsername().simplified().isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Command_WarnUser cmd;
|
Command_WarnUser cmd;
|
||||||
|
|
@ -348,14 +353,14 @@ void UserContextMenu::showContextMenu(const QPoint &pos,
|
||||||
menu->addAction(aDetails);
|
menu->addAction(aDetails);
|
||||||
menu->addAction(aShowGames);
|
menu->addAction(aShowGames);
|
||||||
menu->addAction(aChat);
|
menu->addAction(aChat);
|
||||||
if (userLevel.testFlag(ServerInfo_User::IsRegistered) && tabSupervisor->isOwnUserRegistered()) {
|
if (userLevel.testFlag(ServerInfo_User::IsRegistered) && userListProxy->isOwnUserRegistered()) {
|
||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
if (tabSupervisor->isUserBuddy(userName)) {
|
if (userListProxy->isUserBuddy(userName)) {
|
||||||
menu->addAction(aRemoveFromBuddyList);
|
menu->addAction(aRemoveFromBuddyList);
|
||||||
} else {
|
} else {
|
||||||
menu->addAction(aAddToBuddyList);
|
menu->addAction(aAddToBuddyList);
|
||||||
}
|
}
|
||||||
if (tabSupervisor->isUserIgnored(userName)) {
|
if (userListProxy->isUserIgnored(userName)) {
|
||||||
menu->addAction(aRemoveFromIgnoreList);
|
menu->addAction(aRemoveFromIgnoreList);
|
||||||
} else {
|
} else {
|
||||||
menu->addAction(aAddToIgnoreList);
|
menu->addAction(aAddToIgnoreList);
|
||||||
|
|
@ -398,7 +403,7 @@ void UserContextMenu::showContextMenu(const QPoint &pos,
|
||||||
menu->addAction(aPromoteToJudge);
|
menu->addAction(aPromoteToJudge);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool anotherUser = userName != tabSupervisor->getOwnUsername();
|
bool anotherUser = userName != userListProxy->getOwnUsername();
|
||||||
aDetails->setEnabled(true);
|
aDetails->setEnabled(true);
|
||||||
aChat->setEnabled(anotherUser && online);
|
aChat->setEnabled(anotherUser && online);
|
||||||
aShowGames->setEnabled(online);
|
aShowGames->setEnabled(online);
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
|
class UserlistProxy;
|
||||||
class AbstractClient;
|
class AbstractClient;
|
||||||
class ChatView;
|
class ChatView;
|
||||||
class CommandContainer;
|
class CommandContainer;
|
||||||
|
|
@ -22,6 +23,7 @@ class UserContextMenu : public QObject
|
||||||
private:
|
private:
|
||||||
AbstractClient *client;
|
AbstractClient *client;
|
||||||
TabSupervisor *tabSupervisor;
|
TabSupervisor *tabSupervisor;
|
||||||
|
const UserlistProxy *userListProxy;
|
||||||
TabGame *game;
|
TabGame *game;
|
||||||
|
|
||||||
QAction *aUserName;
|
QAction *aUserName;
|
||||||
|
|
@ -52,7 +54,10 @@ private slots:
|
||||||
void gamesOfUserReceived(const Response &resp, const CommandContainer &commandContainer);
|
void gamesOfUserReceived(const Response &resp, const CommandContainer &commandContainer);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
UserContextMenu(TabSupervisor *_tabSupervisor, QWidget *_parent, TabGame *_game = 0);
|
UserContextMenu(TabSupervisor *_tabSupervisor,
|
||||||
|
const UserlistProxy *_userListProxy,
|
||||||
|
QWidget *_parent,
|
||||||
|
TabGame *_game = 0);
|
||||||
void retranslateUi();
|
void retranslateUi();
|
||||||
void showContextMenu(const QPoint &pos,
|
void showContextMenu(const QPoint &pos,
|
||||||
const QString &userName,
|
const QString &userName,
|
||||||
|
|
|
||||||
170
cockatrice/src/server/user/user_list_manager.cpp
Normal file
170
cockatrice/src/server/user/user_list_manager.cpp
Normal file
|
|
@ -0,0 +1,170 @@
|
||||||
|
#include "user_list_manager.h"
|
||||||
|
|
||||||
|
#include "../../client/game_logic/abstract_client.h"
|
||||||
|
#include "../../client/sound_engine.h"
|
||||||
|
#include "../pending_command.h"
|
||||||
|
#include "pb/event_add_to_list.pb.h"
|
||||||
|
#include "pb/event_remove_from_list.pb.h"
|
||||||
|
#include "pb/event_user_joined.pb.h"
|
||||||
|
#include "pb/event_user_left.pb.h"
|
||||||
|
#include "pb/response_list_users.pb.h"
|
||||||
|
#include "pb/session_commands.pb.h"
|
||||||
|
#include "user_info_box.h"
|
||||||
|
|
||||||
|
UserListManager::UserListManager(AbstractClient *_client, QWidget *parent)
|
||||||
|
: QWidget(parent), client(_client), ownUserInfo(nullptr)
|
||||||
|
{
|
||||||
|
connect(client, &AbstractClient::userJoinedEventReceived, this, &UserListManager::processUserJoinedEvent);
|
||||||
|
connect(client, &AbstractClient::userLeftEventReceived, this, &UserListManager::processUserLeftEvent);
|
||||||
|
connect(client, &AbstractClient::buddyListReceived, this, &UserListManager::buddyListReceived);
|
||||||
|
connect(client, &AbstractClient::ignoreListReceived, this, &UserListManager::ignoreListReceived);
|
||||||
|
connect(client, &AbstractClient::addToListEventReceived, this, &UserListManager::processAddToListEvent);
|
||||||
|
connect(client, &AbstractClient::removeFromListEventReceived, this, &UserListManager::processRemoveFromListEvent);
|
||||||
|
connect(client, &AbstractClient::userInfoChanged, this, &UserListManager::setOwnUserInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
UserListManager::~UserListManager()
|
||||||
|
{
|
||||||
|
handleDisconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserListManager::handleConnect()
|
||||||
|
{
|
||||||
|
populateInitialOnlineUsers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserListManager::handleDisconnect()
|
||||||
|
{
|
||||||
|
onlineUsers.clear();
|
||||||
|
buddyUsers.clear();
|
||||||
|
ignoredUsers.clear();
|
||||||
|
|
||||||
|
delete ownUserInfo;
|
||||||
|
ownUserInfo = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserListManager::setOwnUserInfo(const ServerInfo_User &userInfo)
|
||||||
|
{
|
||||||
|
ownUserInfo = new ServerInfo_User(userInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserListManager::populateInitialOnlineUsers()
|
||||||
|
{
|
||||||
|
PendingCommand *pend = client->prepareSessionCommand(Command_ListUsers());
|
||||||
|
connect(pend, qOverload<const Response &, const CommandContainer &, const QVariant &>(&PendingCommand::finished),
|
||||||
|
this, &UserListManager::processListUsersResponse);
|
||||||
|
client->sendCommand(pend);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserListManager::processListUsersResponse(const Response &response)
|
||||||
|
{
|
||||||
|
const auto &resp = response.GetExtension(Response_ListUsers::ext);
|
||||||
|
|
||||||
|
const int userListSize = resp.user_list_size();
|
||||||
|
for (int i = 0; i < userListSize; ++i) {
|
||||||
|
const ServerInfo_User &info = resp.user_list(i);
|
||||||
|
const QString &userName = QString::fromStdString(info.name());
|
||||||
|
onlineUsers.insert(userName, info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserListManager::processUserJoinedEvent(const Event_UserJoined &event)
|
||||||
|
{
|
||||||
|
const auto &info = event.user_info();
|
||||||
|
const QString &userName = QString::fromStdString(info.name());
|
||||||
|
onlineUsers.insert(userName, info);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserListManager::processUserLeftEvent(const Event_UserLeft &event)
|
||||||
|
{
|
||||||
|
const auto &userName = QString::fromStdString(event.name());
|
||||||
|
onlineUsers.remove(userName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserListManager::buddyListReceived(const QList<ServerInfo_User> &_buddyList)
|
||||||
|
{
|
||||||
|
for (const auto &user : _buddyList) {
|
||||||
|
const auto &userName = QString::fromStdString(user.name());
|
||||||
|
buddyUsers.insert(userName, user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserListManager::ignoreListReceived(const QList<ServerInfo_User> &_ignoreList)
|
||||||
|
{
|
||||||
|
for (const auto &user : _ignoreList) {
|
||||||
|
const auto &userName = QString::fromStdString(user.name());
|
||||||
|
ignoredUsers.insert(userName, user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserListManager::processAddToListEvent(const Event_AddToList &event)
|
||||||
|
{
|
||||||
|
const auto &user = event.user_info();
|
||||||
|
const auto &userName = QString::fromStdString(user.name());
|
||||||
|
|
||||||
|
const auto &userListType = QString::fromStdString(event.list_name());
|
||||||
|
|
||||||
|
QMap<QString, ServerInfo_User> userMap;
|
||||||
|
if (userListType == "buddy") {
|
||||||
|
userMap = buddyUsers;
|
||||||
|
} else if (userListType == "ignore") {
|
||||||
|
userMap = ignoredUsers;
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
userMap.insert(userName, user);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UserListManager::processRemoveFromListEvent(const Event_RemoveFromList &event)
|
||||||
|
{
|
||||||
|
const auto &userListType = QString::fromStdString(event.list_name());
|
||||||
|
const auto &userName = QString::fromStdString(event.user_name());
|
||||||
|
|
||||||
|
QMap<QString, ServerInfo_User> userMap;
|
||||||
|
if (userListType == "buddy") {
|
||||||
|
userMap = buddyUsers;
|
||||||
|
} else if (userListType == "ignore") {
|
||||||
|
userMap = ignoredUsers;
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
userMap.remove(userName);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UserListManager::isOwnUserRegistered() const
|
||||||
|
{
|
||||||
|
return ownUserInfo != nullptr && (ownUserInfo->user_level() & ServerInfo_User::IsRegistered) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString UserListManager::getOwnUsername() const
|
||||||
|
{
|
||||||
|
return ownUserInfo != nullptr ? QString::fromStdString(ownUserInfo->name()) : QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UserListManager::isUserBuddy(const QString &userName) const
|
||||||
|
{
|
||||||
|
return buddyUsers.contains(userName);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool UserListManager::isUserIgnored(const QString &userName) const
|
||||||
|
{
|
||||||
|
return ignoredUsers.contains(userName);
|
||||||
|
}
|
||||||
|
|
||||||
|
const ServerInfo_User *UserListManager::getOnlineUser(const QString &userName) const
|
||||||
|
{
|
||||||
|
const QString &userNameToMatchLower = userName.toLower();
|
||||||
|
|
||||||
|
const auto it =
|
||||||
|
std::find_if(onlineUsers.begin(), onlineUsers.end(), [&userNameToMatchLower](const ServerInfo_User &user) {
|
||||||
|
return userNameToMatchLower == QString::fromStdString(user.name()).toLower();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (it != onlineUsers.end()) {
|
||||||
|
return &*it;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
};
|
||||||
72
cockatrice/src/server/user/user_list_manager.h
Normal file
72
cockatrice/src/server/user/user_list_manager.h
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
#ifndef COCKATRICE_USER_LIST_MANAGER_H
|
||||||
|
#define COCKATRICE_USER_LIST_MANAGER_H
|
||||||
|
|
||||||
|
#include "../chat_view/user_list_proxy.h"
|
||||||
|
#include "pb/serverinfo_user.pb.h"
|
||||||
|
|
||||||
|
#include <QMap>
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
class AbstractClient;
|
||||||
|
class Event_AddToList;
|
||||||
|
class Event_ListRooms;
|
||||||
|
class Event_RemoveFromList;
|
||||||
|
class Event_UserJoined;
|
||||||
|
class Event_UserLeft;
|
||||||
|
class Response;
|
||||||
|
class ServerInfo_User;
|
||||||
|
class TabSupervisor;
|
||||||
|
|
||||||
|
class UserListManager : public QWidget, public UserlistProxy
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
private:
|
||||||
|
AbstractClient *client;
|
||||||
|
ServerInfo_User *ownUserInfo;
|
||||||
|
QMap<QString, ServerInfo_User> onlineUsers, buddyUsers, ignoredUsers;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void setOwnUserInfo(const ServerInfo_User &userInfo);
|
||||||
|
void populateInitialOnlineUsers();
|
||||||
|
void processListUsersResponse(const Response &response);
|
||||||
|
void processUserJoinedEvent(const Event_UserJoined &event);
|
||||||
|
void processUserLeftEvent(const Event_UserLeft &event);
|
||||||
|
void buddyListReceived(const QList<ServerInfo_User> &_buddyList);
|
||||||
|
void ignoreListReceived(const QList<ServerInfo_User> &_ignoreList);
|
||||||
|
void processAddToListEvent(const Event_AddToList &event);
|
||||||
|
void processRemoveFromListEvent(const Event_RemoveFromList &event);
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit UserListManager(AbstractClient *_client, QWidget *parent = nullptr);
|
||||||
|
~UserListManager() override;
|
||||||
|
|
||||||
|
[[nodiscard]] QMap<QString, ServerInfo_User> getAllUsersList() const
|
||||||
|
{
|
||||||
|
return onlineUsers;
|
||||||
|
}
|
||||||
|
[[nodiscard]] QMap<QString, ServerInfo_User> getBuddyList() const
|
||||||
|
{
|
||||||
|
return buddyUsers;
|
||||||
|
}
|
||||||
|
[[nodiscard]] QMap<QString, ServerInfo_User> getIgnoreList() const
|
||||||
|
{
|
||||||
|
return ignoredUsers;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isOwnUserRegistered() const override;
|
||||||
|
QString getOwnUsername() const override;
|
||||||
|
bool isUserBuddy(const QString &userName) const override;
|
||||||
|
bool isUserIgnored(const QString &userName) const override;
|
||||||
|
const ServerInfo_User *getOnlineUser(const QString &userName) const override;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void handleConnect();
|
||||||
|
void handleDisconnect();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void userLeft(const QString &userName);
|
||||||
|
void userJoined(const ServerInfo_User &userInfo);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // COCKATRICE_USER_LIST_MANAGER_H
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#include "../../client/tabs/tab_supervisor.h"
|
#include "../../client/tabs/tab_supervisor.h"
|
||||||
#include "../../client/ui/pixel_map_generator.h"
|
#include "../../client/ui/pixel_map_generator.h"
|
||||||
#include "../../game/game_selector.h"
|
#include "../../game/game_selector.h"
|
||||||
|
#include "../../server/user/user_list_manager.h"
|
||||||
#include "../pending_command.h"
|
#include "../pending_command.h"
|
||||||
#include "pb/moderator_commands.pb.h"
|
#include "pb/moderator_commands.pb.h"
|
||||||
#include "pb/response_get_games_of_user.pb.h"
|
#include "pb/response_get_games_of_user.pb.h"
|
||||||
|
|
@ -377,7 +378,7 @@ UserListWidget::UserListWidget(TabSupervisor *_tabSupervisor,
|
||||||
: QGroupBox(parent), tabSupervisor(_tabSupervisor), client(_client), type(_type), onlineCount(0)
|
: QGroupBox(parent), tabSupervisor(_tabSupervisor), client(_client), type(_type), onlineCount(0)
|
||||||
{
|
{
|
||||||
itemDelegate = new UserListItemDelegate(this);
|
itemDelegate = new UserListItemDelegate(this);
|
||||||
userContextMenu = new UserContextMenu(tabSupervisor, this);
|
userContextMenu = new UserContextMenu(tabSupervisor, tabSupervisor->getUserListManager(), this);
|
||||||
connect(userContextMenu, SIGNAL(openMessageDialog(QString, bool)), this, SIGNAL(openMessageDialog(QString, bool)));
|
connect(userContextMenu, SIGNAL(openMessageDialog(QString, bool)), this, SIGNAL(openMessageDialog(QString, bool)));
|
||||||
|
|
||||||
userTree = new QTreeWidget;
|
userTree = new QTreeWidget;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue