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 @@
你已经被该服务器封禁!
+
+
+ 由于逃跑或者其他不正当行为,你已经被暂时封禁!
+
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) {