Smarter rooms (#2484)
* Added VIP only room * Added DONATOR room. * Extended Room to include privilege level. * Updated room join logic * Updated server tab permissions column display based on perm+privlevel definitions * Fixed new client -> old server blank permissions column on server tab Added the ability for registered user - VIP/DONATOR/PRIVILEGED room.
This commit is contained in:
parent
317ac05919
commit
2f23a9cb2f
12 changed files with 79 additions and 33 deletions
|
@ -6,7 +6,7 @@ LocalServer::LocalServer(QObject *parent)
|
||||||
: Server(parent)
|
: Server(parent)
|
||||||
{
|
{
|
||||||
setDatabaseInterface(new LocalServer_DatabaseInterface(this));
|
setDatabaseInterface(new LocalServer_DatabaseInterface(this));
|
||||||
addRoom(new Server_Room(0, 0, QString(), QString(), QString(), false, QString(), QStringList(), this));
|
addRoom(new Server_Room(0, 0, QString(), QString(), QString(), QString(), false, QString(), QStringList(), this));
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalServer::~LocalServer()
|
LocalServer::~LocalServer()
|
||||||
|
|
|
@ -71,7 +71,7 @@ void RoomSelector::processListRoomsEvent(const Event_ListRooms &event)
|
||||||
const int roomListSize = event.room_list_size();
|
const int roomListSize = event.room_list_size();
|
||||||
for (int i = 0; i < roomListSize; ++i) {
|
for (int i = 0; i < roomListSize; ++i) {
|
||||||
const ServerInfo_Room &room = event.room_list(i);
|
const ServerInfo_Room &room = event.room_list(i);
|
||||||
|
|
||||||
for (int j = 0; j < roomList->topLevelItemCount(); ++j) {
|
for (int j = 0; j < roomList->topLevelItemCount(); ++j) {
|
||||||
QTreeWidgetItem *twi = roomList->topLevelItem(j);
|
QTreeWidgetItem *twi = roomList->topLevelItem(j);
|
||||||
if (twi->data(0, Qt::UserRole).toInt() == room.room_id()) {
|
if (twi->data(0, Qt::UserRole).toInt() == room.room_id()) {
|
||||||
|
@ -80,7 +80,7 @@ void RoomSelector::processListRoomsEvent(const Event_ListRooms &event)
|
||||||
if (room.has_description())
|
if (room.has_description())
|
||||||
twi->setData(1, Qt::DisplayRole, QString::fromStdString(room.description()));
|
twi->setData(1, Qt::DisplayRole, QString::fromStdString(room.description()));
|
||||||
if (room.has_permissionlevel())
|
if (room.has_permissionlevel())
|
||||||
twi->setData(2, Qt::DisplayRole, QString::fromStdString(room.permissionlevel()).toLower());
|
twi->setData(2, Qt::DisplayRole, getRoomPermissionDisplay(room));
|
||||||
if (room.has_player_count())
|
if (room.has_player_count())
|
||||||
twi->setData(3, Qt::DisplayRole, room.player_count());
|
twi->setData(3, Qt::DisplayRole, room.player_count());
|
||||||
if (room.has_game_count())
|
if (room.has_game_count())
|
||||||
|
@ -95,7 +95,7 @@ void RoomSelector::processListRoomsEvent(const Event_ListRooms &event)
|
||||||
if (room.has_description())
|
if (room.has_description())
|
||||||
twi->setData(1, Qt::DisplayRole, QString::fromStdString(room.description()));
|
twi->setData(1, Qt::DisplayRole, QString::fromStdString(room.description()));
|
||||||
if (room.has_permissionlevel())
|
if (room.has_permissionlevel())
|
||||||
twi->setData(2, Qt::DisplayRole, QString::fromStdString(room.permissionlevel()).toLower());
|
twi->setData(2, Qt::DisplayRole, getRoomPermissionDisplay(room));
|
||||||
twi->setData(3, Qt::DisplayRole, room.player_count());
|
twi->setData(3, Qt::DisplayRole, room.player_count());
|
||||||
twi->setData(4, Qt::DisplayRole, room.game_count());
|
twi->setData(4, Qt::DisplayRole, room.game_count());
|
||||||
twi->setTextAlignment(2, Qt::AlignRight);
|
twi->setTextAlignment(2, Qt::AlignRight);
|
||||||
|
@ -109,6 +109,24 @@ void RoomSelector::processListRoomsEvent(const Event_ListRooms &event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString RoomSelector::getRoomPermissionDisplay(const ServerInfo_Room & room)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* A room can have a permission level and a privilege level. How ever we want to display only the necessary information
|
||||||
|
* on the server tab needed to inform users of required permissions to enter a room. If the room has a privilege level
|
||||||
|
* the server tab will display the privilege level in the "permissions" column in the row however if the room contains
|
||||||
|
* a permissions level for the room the permissions level defined for the room will be displayed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
QString roomPermissionDisplay = QString::fromStdString(room.privilegelevel()).toLower();
|
||||||
|
if (QString::fromStdString(room.permissionlevel()).toLower() != "none")
|
||||||
|
roomPermissionDisplay = QString::fromStdString(room.permissionlevel()).toLower();
|
||||||
|
if (roomPermissionDisplay == "") // catch all for misconfigured .ini room definitions
|
||||||
|
roomPermissionDisplay = "none";
|
||||||
|
|
||||||
|
return roomPermissionDisplay;
|
||||||
|
}
|
||||||
|
|
||||||
void RoomSelector::joinClicked()
|
void RoomSelector::joinClicked()
|
||||||
{
|
{
|
||||||
QTreeWidgetItem *twi = roomList->currentItem();
|
QTreeWidgetItem *twi = roomList->currentItem();
|
||||||
|
|
|
@ -24,6 +24,7 @@ private:
|
||||||
QTreeWidget *roomList;
|
QTreeWidget *roomList;
|
||||||
QPushButton *joinButton;
|
QPushButton *joinButton;
|
||||||
AbstractClient *client;
|
AbstractClient *client;
|
||||||
|
QString getRoomPermissionDisplay(const ServerInfo_Room &room);
|
||||||
private slots:
|
private slots:
|
||||||
void processListRoomsEvent(const Event_ListRooms &event);
|
void processListRoomsEvent(const Event_ListRooms &event);
|
||||||
void joinClicked();
|
void joinClicked();
|
||||||
|
|
|
@ -14,4 +14,5 @@ message ServerInfo_Room {
|
||||||
repeated ServerInfo_User user_list = 8;
|
repeated ServerInfo_User user_list = 8;
|
||||||
repeated ServerInfo_GameType gametype_list = 9;
|
repeated ServerInfo_GameType gametype_list = 9;
|
||||||
optional string permissionlevel = 10;
|
optional string permissionlevel = 10;
|
||||||
|
optional string privilegelevel = 11;
|
||||||
}
|
}
|
||||||
|
|
|
@ -620,23 +620,9 @@ Response::ResponseCode Server_ProtocolHandler::cmdJoinRoom(const Command_JoinRoo
|
||||||
if (!r)
|
if (!r)
|
||||||
return Response::RespNameNotFound;
|
return Response::RespNameNotFound;
|
||||||
|
|
||||||
QString roomPermission = r->getRoomPermission().toLower();
|
if (!(userInfo->user_level() & ServerInfo_User::IsModerator))
|
||||||
if (roomPermission != "none"){
|
if (!(r->userMayJoin(*userInfo)))
|
||||||
if (roomPermission == "registered") {
|
return Response::RespUserLevelTooLow;
|
||||||
if (!(userInfo->user_level() & ServerInfo_User::IsRegistered))
|
|
||||||
return Response::RespUserLevelTooLow;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (roomPermission == "moderator"){
|
|
||||||
if (!(userInfo->user_level() & ServerInfo_User::IsModerator))
|
|
||||||
return Response::RespUserLevelTooLow;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (roomPermission == "administrator"){
|
|
||||||
if (!(userInfo->user_level() & ServerInfo_User::IsAdmin))
|
|
||||||
return Response::RespUserLevelTooLow;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
r->addClient(this);
|
r->addClient(this);
|
||||||
rooms.insert(r->getId(), r);
|
rooms.insert(r->getId(), r);
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
#include "pb/serverinfo_chat_message.pb.h"
|
#include "pb/serverinfo_chat_message.pb.h"
|
||||||
#include <google/protobuf/descriptor.h>
|
#include <google/protobuf/descriptor.h>
|
||||||
|
|
||||||
Server_Room::Server_Room(int _id, int _chatHistorySize, const QString &_name, const QString &_description, const QString &_permissionLevel, bool _autoJoin, const QString &_joinMessage, const QStringList &_gameTypes, Server *parent)
|
Server_Room::Server_Room(int _id, int _chatHistorySize, const QString &_name, const QString &_description, const QString &_permissionLevel, const QString &_privilegeLevel, bool _autoJoin, const QString &_joinMessage, const QStringList &_gameTypes, Server *parent)
|
||||||
: QObject(parent), id(_id), chatHistorySize(_chatHistorySize), name(_name), description(_description), permissionLevel(_permissionLevel), autoJoin(_autoJoin), joinMessage(_joinMessage), gameTypes(_gameTypes), gamesLock(QReadWriteLock::Recursive)
|
: QObject(parent), id(_id), chatHistorySize(_chatHistorySize), name(_name), description(_description), permissionLevel(_permissionLevel), privilegeLevel(_privilegeLevel), autoJoin(_autoJoin), joinMessage(_joinMessage), gameTypes(_gameTypes), gamesLock(QReadWriteLock::Recursive)
|
||||||
{
|
{
|
||||||
connect(this, SIGNAL(gameListChanged(ServerInfo_Game)), this, SLOT(broadcastGameListUpdate(ServerInfo_Game)), Qt::QueuedConnection);
|
connect(this, SIGNAL(gameListChanged(ServerInfo_Game)), this, SLOT(broadcastGameListUpdate(ServerInfo_Game)), Qt::QueuedConnection);
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,31 @@ Server_Room::~Server_Room()
|
||||||
usersLock.unlock();
|
usersLock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Server_Room::userMayJoin(const ServerInfo_User & userInfo)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (permissionLevel.toLower() == "administrator" || permissionLevel.toLower() == "moderator")
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (permissionLevel.toLower() == "registered" && !(userInfo.user_level() & ServerInfo_User::IsRegistered))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (privilegeLevel.toLower() != "none")
|
||||||
|
{
|
||||||
|
if (privilegeLevel.toLower() == "privileged")
|
||||||
|
{
|
||||||
|
if (privilegeLevel.toLower() == "none")
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (privilegeLevel.toLower() != QString::fromStdString(userInfo.privlevel()).toLower())
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
Server *Server_Room::getServer() const
|
Server *Server_Room::getServer() const
|
||||||
{
|
{
|
||||||
return static_cast<Server *>(parent());
|
return static_cast<Server *>(parent());
|
||||||
|
@ -44,11 +69,11 @@ Server *Server_Room::getServer() const
|
||||||
const ServerInfo_Room &Server_Room::getInfo(ServerInfo_Room &result, bool complete, bool showGameTypes, bool includeExternalData) const
|
const ServerInfo_Room &Server_Room::getInfo(ServerInfo_Room &result, bool complete, bool showGameTypes, bool includeExternalData) const
|
||||||
{
|
{
|
||||||
result.set_room_id(id);
|
result.set_room_id(id);
|
||||||
|
|
||||||
result.set_name(name.toStdString());
|
result.set_name(name.toStdString());
|
||||||
result.set_description(description.toStdString());
|
result.set_description(description.toStdString());
|
||||||
result.set_auto_join(autoJoin);
|
result.set_auto_join(autoJoin);
|
||||||
result.set_permissionlevel(permissionLevel.toStdString());
|
result.set_permissionlevel(permissionLevel.toStdString());
|
||||||
|
result.set_privilegelevel(privilegeLevel.toStdString());
|
||||||
|
|
||||||
gamesLock.lockForRead();
|
gamesLock.lockForRead();
|
||||||
result.set_game_count(games.size() + externalGames.size());
|
result.set_game_count(games.size() + externalGames.size());
|
||||||
|
|
|
@ -35,6 +35,7 @@ private:
|
||||||
QString name;
|
QString name;
|
||||||
QString description;
|
QString description;
|
||||||
QString permissionLevel;
|
QString permissionLevel;
|
||||||
|
QString privilegeLevel;
|
||||||
bool autoJoin;
|
bool autoJoin;
|
||||||
QString joinMessage;
|
QString joinMessage;
|
||||||
QStringList gameTypes;
|
QStringList gameTypes;
|
||||||
|
@ -49,13 +50,15 @@ public:
|
||||||
mutable QReadWriteLock usersLock;
|
mutable QReadWriteLock usersLock;
|
||||||
mutable QReadWriteLock gamesLock;
|
mutable QReadWriteLock gamesLock;
|
||||||
mutable QReadWriteLock historyLock;
|
mutable QReadWriteLock historyLock;
|
||||||
Server_Room(int _id, int _chatHistorySize, const QString &_name, const QString &_description, const QString &_permissionLevel, bool _autoJoin, const QString &_joinMessage, const QStringList &_gameTypes, Server *parent );
|
Server_Room(int _id, int _chatHistorySize, const QString &_name, const QString &_description, const QString &_permissionLevel, const QString &_privilegeLevel, bool _autoJoin, const QString &_joinMessage, const QStringList &_gameTypes, Server *parent );
|
||||||
~Server_Room();
|
~Server_Room();
|
||||||
int getId() const { return id; }
|
int getId() const { return id; }
|
||||||
QString getName() const { return name; }
|
QString getName() const { return name; }
|
||||||
QString getDescription() const { return description; }
|
QString getDescription() const { return description; }
|
||||||
QString getRoomPermission() const { return permissionLevel; }
|
QString getRoomPermission() const { return permissionLevel; }
|
||||||
|
QString getRoomPrivilege() const { return privilegeLevel; }
|
||||||
bool getAutoJoin() const { return autoJoin; }
|
bool getAutoJoin() const { return autoJoin; }
|
||||||
|
bool userMayJoin(const ServerInfo_User &userInfo);
|
||||||
QString getJoinMessage() const { return joinMessage; }
|
QString getJoinMessage() const { return joinMessage; }
|
||||||
const QStringList &getGameTypes() const { return gameTypes; }
|
const QStringList &getGameTypes() const { return gameTypes; }
|
||||||
const QMap<int, Server_Game *> &getGames() const { return games; }
|
const QMap<int, Server_Game *> &getGames() const { return games; }
|
||||||
|
|
6
servatrice/migrations/servatrice_0022_to_0023.sql
Normal file
6
servatrice/migrations/servatrice_0022_to_0023.sql
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
-- Servatrice db migration from version 22 to version 23
|
||||||
|
|
||||||
|
alter table cockatrice_rooms modify column permissionlevel enum('NONE','REGISTERED','MODERATOR','ADMINISTRATOR');
|
||||||
|
alter table cockatrice_rooms add column privlevel enum('NONE','PRIVILEGED','VIP','DONATOR') NOT NULL;
|
||||||
|
|
||||||
|
UPDATE cockatrice_schema_version SET version=23 WHERE version=22;
|
|
@ -261,6 +261,10 @@ roomlist\1\description="Play anything here."
|
||||||
; Default is none.
|
; Default is none.
|
||||||
roomlist\1\permissionlevel=none
|
roomlist\1\permissionlevel=none
|
||||||
|
|
||||||
|
; Rooms can restrict the permission level of users that can join, Currnetly supported options are none, privileged, vip, and donator.
|
||||||
|
; Default is none.
|
||||||
|
roomlist\1\privilegelevel=none
|
||||||
|
|
||||||
; Wether to make users autojoin this room when connected to the server
|
; Wether to make users autojoin this room when connected to the server
|
||||||
roomlist\1\autojoin=true
|
roomlist\1\autojoin=true
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ CREATE TABLE IF NOT EXISTS `cockatrice_schema_version` (
|
||||||
PRIMARY KEY (`version`)
|
PRIMARY KEY (`version`)
|
||||||
) ENGINE=INNODB DEFAULT CHARSET=utf8;
|
) ENGINE=INNODB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
INSERT INTO cockatrice_schema_version VALUES(22);
|
INSERT INTO cockatrice_schema_version VALUES(23);
|
||||||
|
|
||||||
-- users and user data tables
|
-- users and user data tables
|
||||||
CREATE TABLE IF NOT EXISTS `cockatrice_users` (
|
CREATE TABLE IF NOT EXISTS `cockatrice_users` (
|
||||||
|
@ -89,7 +89,8 @@ CREATE TABLE IF NOT EXISTS `cockatrice_rooms` (
|
||||||
`id` int(7) unsigned NOT NULL auto_increment,
|
`id` int(7) unsigned NOT NULL auto_increment,
|
||||||
`name` varchar(50) NOT NULL,
|
`name` varchar(50) NOT NULL,
|
||||||
`descr` varchar(255) NOT NULL,
|
`descr` varchar(255) NOT NULL,
|
||||||
`permissionlevel` varchar(20) NOT NULL,
|
`permissionlevel` enum('NONE','REGISTERED','MODERATOR','ADMINISTRATOR') NOT NULL,
|
||||||
|
`privlevel` enum('NONE','PRIVILEGED','VIP','DONATOR') NOT NULL,
|
||||||
`auto_join` tinyint(1) default 0,
|
`auto_join` tinyint(1) default 0,
|
||||||
`join_message` varchar(255) NOT NULL,
|
`join_message` varchar(255) NOT NULL,
|
||||||
`chat_history_size` int(4) NOT NULL,
|
`chat_history_size` int(4) NOT NULL,
|
||||||
|
|
|
@ -285,7 +285,7 @@ bool Servatrice::initServer()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getRoomsMethodString() == "sql") {
|
if (getRoomsMethodString() == "sql") {
|
||||||
QSqlQuery *query = servatriceDatabaseInterface->prepareQuery("select id, name, descr, permissionlevel, auto_join, join_message, chat_history_size from {prefix}_rooms where id_server = :id_server order by id asc");
|
QSqlQuery *query = servatriceDatabaseInterface->prepareQuery("select id, name, descr, permissionlevel, privlevel, auto_join, join_message, chat_history_size from {prefix}_rooms where id_server = :id_server order by id asc");
|
||||||
query->bindValue(":id_server", serverId);
|
query->bindValue(":id_server", serverId);
|
||||||
servatriceDatabaseInterface->execSqlQuery(query);
|
servatriceDatabaseInterface->execSqlQuery(query);
|
||||||
while (query->next()) {
|
while (query->next()) {
|
||||||
|
@ -301,8 +301,9 @@ bool Servatrice::initServer()
|
||||||
query->value(1).toString(),
|
query->value(1).toString(),
|
||||||
query->value(2).toString(),
|
query->value(2).toString(),
|
||||||
query->value(3).toString().toLower(),
|
query->value(3).toString().toLower(),
|
||||||
query->value(4).toInt(),
|
query->value(4).toString().toLower(),
|
||||||
query->value(5).toString(),
|
query->value(5).toInt(),
|
||||||
|
query->value(6).toString(),
|
||||||
gameTypes,
|
gameTypes,
|
||||||
this));
|
this));
|
||||||
}
|
}
|
||||||
|
@ -317,13 +318,13 @@ bool Servatrice::initServer()
|
||||||
gameTypes.append(settingsCache->value("name").toString());
|
gameTypes.append(settingsCache->value("name").toString());
|
||||||
}
|
}
|
||||||
settingsCache->endArray();
|
settingsCache->endArray();
|
||||||
Server_Room *newRoom = new Server_Room(i,settingsCache->value("chathistorysize").toInt(),settingsCache->value("name").toString(),settingsCache->value("description").toString(),settingsCache->value("permissionlevel").toString().toLower(),settingsCache->value("autojoin").toBool(),settingsCache->value("joinmessage").toString(),gameTypes,this);
|
Server_Room *newRoom = new Server_Room(i,settingsCache->value("chathistorysize").toInt(),settingsCache->value("name").toString(),settingsCache->value("description").toString(),settingsCache->value("permissionlevel").toString().toLower(),settingsCache->value("privilegelevel").toString().toLower(),settingsCache->value("autojoin").toBool(),settingsCache->value("joinmessage").toString(),gameTypes,this);
|
||||||
addRoom(newRoom);
|
addRoom(newRoom);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(size==0) {
|
if(size==0) {
|
||||||
// no room defined in config, add a dummy one
|
// no room defined in config, add a dummy one
|
||||||
Server_Room *newRoom = new Server_Room(0,100,"General room","Play anything here.","none",true,"",QStringList("Standard"),this);
|
Server_Room *newRoom = new Server_Room(0,100,"General room","Play anything here.","none","none",true,"",QStringList("Standard"),this);
|
||||||
addRoom(newRoom);
|
addRoom(newRoom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
#include "server_database_interface.h"
|
#include "server_database_interface.h"
|
||||||
|
|
||||||
#define DATABASE_SCHEMA_VERSION 22
|
#define DATABASE_SCHEMA_VERSION 23
|
||||||
|
|
||||||
class Servatrice;
|
class Servatrice;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue