diff --git a/Fk/Cheat/PlayerDetail.qml b/Fk/Cheat/PlayerDetail.qml index ad58f220..b76a426c 100644 --- a/Fk/Cheat/PlayerDetail.qml +++ b/Fk/Cheat/PlayerDetail.qml @@ -20,6 +20,31 @@ Flickable { width: parent.width - 40 x: 20 + // TODO: player details + Text { + id: screenName + font.pixelSize: 18 + } + + Text { + id: playerGameData + Layout.fillWidth: true + font.pixelSize: 18 + } + + TextEdit { + id: skillDesc + + Layout.fillWidth: true + font.pixelSize: 18 + + readOnly: true + selectByKeyboard: true + selectByMouse: false + wrapMode: TextEdit.WordWrap + textFormat: TextEdit.RichText + } + RowLayout { Button { text: Backend.translate("Give Flower") @@ -62,7 +87,22 @@ Flickable { root.finish(); } } + } + RowLayout { + Button { + text: config.blockedUsers.indexOf(screenName.text) === -1 ? Backend.translate("Block Chatter") : Backend.translate("Unblock Chatter") + enabled: pid !== Self.id && pid > 0 + onClicked: { + const idx = config.blockedUsers.indexOf(screenName.text); + if (idx === -1) { + config.blockedUsers.push(screenName.text); + } else { + config.blockedUsers.splice(idx, 1); + } + config.blockedUsersChanged(); + } + } Button { text: Backend.translate("Kick From Room") visible: !roomScene.isStarted && roomScene.isOwner @@ -73,34 +113,6 @@ Flickable { } } } - - // TODO: player details - RowLayout { - spacing: 16 - Text { - id: screenName - font.pixelSize: 18 - } - - Text { - id: playerGameData - Layout.fillWidth: true - font.pixelSize: 18 - } - } - - TextEdit { - id: skillDesc - - Layout.fillWidth: true - font.pixelSize: 18 - - readOnly: true - selectByKeyboard: true - selectByMouse: false - wrapMode: TextEdit.WordWrap - textFormat: TextEdit.RichText - } } function givePresent(p) { @@ -132,7 +144,8 @@ Flickable { const run = gamedata[2]; const winRate = (win / total) * 100; const runRate = (run / total) * 100; - playerGameData.text = total === 0 ? Backend.translate("Newbie") : "
" + Backend.translate("Win=%1 Run=%2 Total=%3").arg(winRate.toFixed(2)) + playerGameData.text = total === 0 ? Backend.translate("Newbie") : + Backend.translate("Win=%1 Run=%2 Total=%3").arg(winRate.toFixed(2)) .arg(runRate.toFixed(2)).arg(total); } diff --git a/Fk/Config.qml b/Fk/Config.qml index ad9bfb27..8f544b53 100644 --- a/Fk/Config.qml +++ b/Fk/Config.qml @@ -40,6 +40,7 @@ QtObject { property int roomTimeout: 0 property bool enableFreeAssign: false property bool observing: false + property var blockedUsers: [] function loadConf() { conf = JSON.parse(Backend.loadConf()); diff --git a/Fk/Logic.js b/Fk/Logic.js index f6652bb3..d133f4cb 100644 --- a/Fk/Logic.js +++ b/Fk/Logic.js @@ -142,6 +142,10 @@ callbacks["Chat"] = (jsonData) => { const time = data.time; const msg = data.msg; + if (config.blockedUsers.indexOf(userName) !== -1) { + return; + } + if (general === "") current.addToChat(pid, data, `[${time}] ${userName}: ${msg}`); else diff --git a/Fk/Splash.qml b/Fk/Splash.qml index cc4766a6..4d9cb736 100644 --- a/Fk/Splash.qml +++ b/Fk/Splash.qml @@ -150,6 +150,7 @@ Rectangle { PropertyAction { target: splash; property: "loading"; value: false } } + /** Text { text: "常用联机IP:175.178.66.93\n新月杀联机交流群:531553435" font.pixelSize: 20 @@ -159,6 +160,7 @@ Rectangle { anchors.rightMargin: 20 horizontalAlignment: Text.AlignRight } + **/ //--------------------Disappear-------------- Behavior on opacity { diff --git a/lang/zh_CN.ts b/lang/zh_CN.ts index 83e40c2b..a80de596 100644 --- a/lang/zh_CN.ts +++ b/lang/zh_CN.ts @@ -251,6 +251,10 @@ you have been banned! 你已经被该服务器封禁! + + you have been temporarily banned! + 由于逃跑或者其他不正当行为,你已经被暂时封禁! + diff --git a/lua/client/i18n/zh_CN.lua b/lua/client/i18n/zh_CN.lua index 9ff125c2..67b080a4 100644 --- a/lua/client/i18n/zh_CN.lua +++ b/lua/client/i18n/zh_CN.lua @@ -54,6 +54,8 @@ Fk:loadTranslationTable{ ["Give Egg"] = "砸蛋", ["Give Wine"] = "酒杯", ["Give Shoe"] = "拖鞋", + ["Block Chatter"] = "屏蔽发言", + ["Unblock Chatter"] = "解除屏蔽", ["Kick From Room"] = "踢出房间", ["Newbie"] = "新手保护ing", ["Win=%1 Run=%2 Total=%3"] = "胜率%1% 逃率%2% 总场次%3", diff --git a/src/network/router.cpp b/src/network/router.cpp index f6167014..89bdabee 100644 --- a/src/network/router.cpp +++ b/src/network/router.cpp @@ -315,7 +315,10 @@ void Router::handlePacket(const QByteArray &rawPacket) { ServerPlayer *player = qobject_cast(parent()); player->setThinking(false); // qDebug() << "wake up!"; - player->getRoom()->getThread()->wakeUp(); + auto room = player->getRoom(); + if (room->getThread()) { + room->getThread()->wakeUp(); + } if (requestId != this->expectedReplyId) return; diff --git a/src/server/room.cpp b/src/server/room.cpp index f6eac0ca..0dcc1d25 100644 --- a/src/server/room.cpp +++ b/src/server/room.cpp @@ -5,6 +5,7 @@ #include #include +#include "client_socket.h" #include "roomthread.h" #include "server.h" #include "serverplayer.h" @@ -265,6 +266,11 @@ void Room::removePlayer(ServerPlayer *player) { // 原先的跑路机器人会在游戏结束后自动销毁掉 server->addPlayer(runner); + // 如果走小道的人不是单机启动玩家 那么直接ban + if (!runner->getSocket()->peerAddress().contains("127.0.0.1")) { + server->temporarilyBan(runner->getId()); + } + m_thread->wakeUp(); // 发出信号,让大厅添加这个人 diff --git a/src/server/roomthread.cpp b/src/server/roomthread.cpp index d61bedfe..a193576a 100644 --- a/src/server/roomthread.cpp +++ b/src/server/roomthread.cpp @@ -86,7 +86,7 @@ bool RoomThread::hasRequest() { void RoomThread::trySleep(int ms) { if (sema_wake.available() > 0) { - sema_wake.acquire(sema_wake.available()); + sema_wake.tryAcquire(sema_wake.available(), ms); return; } diff --git a/src/server/server.cpp b/src/server/server.cpp index cc32e56b..bbd3814f 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -210,13 +210,22 @@ void Server::processNewConnection(ClientSocket *client) { qInfo() << addr << "connected"; auto result = SelectFromDatabase( db, QString("SELECT * FROM banip WHERE ip='%1';").arg(addr)); + + auto errmsg = QString(); + if (!result.isEmpty()) { + errmsg = "you have been banned!"; + } else if (temp_banlist.contains(addr)) { + errmsg = "you have been temporarily banned!"; + } + + if (!errmsg.isEmpty()) { QJsonArray body; body << -2; body << (Router::TYPE_NOTIFICATION | Router::SRC_SERVER | Router::DEST_CLIENT); body << "ErrorMsg"; - body << "you have been banned!"; + body << errmsg; client->send(JsonArray2Bytes(body)); qInfo() << "Refused banned IP:" << addr; client->disconnectFromHost(); @@ -552,15 +561,21 @@ RSA *Server::initServerRSA() { return rsa; } +#define SET_DEFAULT_CONFIG(k, v) do {\ + if (config.value(k).isUndefined()) { \ + config[k] = (v); \ + } } while (0) + void Server::readConfig() { QFile file("freekill.server.config.json"); - if (!file.open(QIODevice::ReadOnly)) { - return; + QByteArray json = "{}"; + if (file.open(QIODevice::ReadOnly)) { + json = file.readAll(); } - auto json = file.readAll(); config = QJsonDocument::fromJson(json).object(); // defaults + SET_DEFAULT_CONFIG("tempBanTime", 20); } QJsonValue Server::getConfig(const QString &key) { return config.value(key); } @@ -578,3 +593,20 @@ bool Server::checkBanWord(const QString &str) { } return true; } + +void Server::temporarilyBan(int playerId) { + auto player = findPlayer(playerId); + if (!player) return; + + auto socket = player->getSocket(); + if (!socket) return; + + auto addr = socket->peerAddress(); + temp_banlist.append(addr); + + auto time = getConfig("tempBanTime").toInt(); + QTimer::singleShot(time * 60000, this, [=]() { + temp_banlist.removeOne(addr); + }); + emit player->kicked(); +} diff --git a/src/server/server.h b/src/server/server.h index 05bc5588..b73e5a47 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -44,6 +44,8 @@ public: QJsonValue getConfig(const QString &command); bool checkBanWord(const QString &str); + void temporarilyBan(int playerId); + signals: void roomCreated(Room *room); void playerAdded(ServerPlayer *player); @@ -67,6 +69,7 @@ private: int nextRoomId; friend Room::Room(RoomThread *m_thread); QHash players; + QList temp_banlist; RSA *rsa; QString public_key; diff --git a/src/ui/qmlbackend.cpp b/src/ui/qmlbackend.cpp index db19e34a..7d1cfc82 100644 --- a/src/ui/qmlbackend.cpp +++ b/src/ui/qmlbackend.cpp @@ -110,8 +110,8 @@ void QmlBackend::joinServer(QString address) { void QmlBackend::quitLobby(bool close) { if (ClientInstance) delete ClientInstance; - if (ServerInstance && close) - ServerInstance->deleteLater(); + // if (ServerInstance && close) + // ServerInstance->deleteLater(); } void QmlBackend::emitNotifyUI(const QString &command, const QString &jsonData) {