summaryrefslogtreecommitdiff
path: root/src/network/network_server.cpp
diff options
context:
space:
mode:
authorBjarni Thor <bjarni@bjarnithor.com>2020-01-21 15:39:10 +0000
committerCharles Pigott <charlespigott@googlemail.com>2020-02-04 22:17:39 +0000
commit5880f1479f21157158dbe862e4cb1118e0cfbfae (patch)
tree83597e5e42c96594646ccc548a915f303488b044 /src/network/network_server.cpp
parentb5d56559d2ec16512dd8a0346406bf36486ebf7c (diff)
downloadopenttd-5880f1479f21157158dbe862e4cb1118e0cfbfae.tar.xz
Feature #7756: Allow server to supply a reason to kicked/banned clients
This commit adds the missing feature of allowing the server owner to provide a reason for kicking/banning a client, which the client sees in a pop-up window after being kicked. The implementation extends the network protocol by adding a new network action called NETWORK_ACTION_KICKED that is capable of having an error string, unlike the other network error packages. Additionally, the kick function broadcasts a message to all clients about the kicked client and the reason for the kick.
Diffstat (limited to 'src/network/network_server.cpp')
-rw-r--r--src/network/network_server.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp
index f68cfd05c..dd88042a1 100644
--- a/src/network/network_server.cpp
+++ b/src/network/network_server.cpp
@@ -407,13 +407,15 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendCompanyInfo()
/**
* Send an error to the client, and close its connection.
* @param error The error to disconnect for.
+ * @param reason In case of kicking a client, specifies the reason for kicking the client.
*/
-NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode error)
+NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode error, const char *reason)
{
char str[100];
Packet *p = new Packet(PACKET_SERVER_ERROR);
p->Send_uint8(error);
+ if (reason != nullptr) p->Send_string(reason);
this->SendPacket(p);
StringID strid = GetNetworkErrorMsg(error);
@@ -427,7 +429,11 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err
DEBUG(net, 1, "'%s' made an error and has been disconnected. Reason: '%s'", client_name, str);
- NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, nullptr, strid);
+ if (error == NETWORK_ERROR_KICKED && reason != nullptr) {
+ NetworkTextMessage(NETWORK_ACTION_KICKED, CC_DEFAULT, false, client_name, reason, strid);
+ } else {
+ NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, nullptr, strid);
+ }
for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
if (new_cs->status > STATUS_AUTHORIZED && new_cs != this) {
@@ -2039,29 +2045,32 @@ void NetworkServerSendRcon(ClientID client_id, TextColour colour_code, const cha
/**
* Kick a single client.
* @param client_id The client to kick.
+ * @param reason In case of kicking a client, specifies the reason for kicking the client.
*/
-void NetworkServerKickClient(ClientID client_id)
+void NetworkServerKickClient(ClientID client_id, const char *reason)
{
if (client_id == CLIENT_ID_SERVER) return;
- NetworkClientSocket::GetByClientID(client_id)->SendError(NETWORK_ERROR_KICKED);
+ NetworkClientSocket::GetByClientID(client_id)->SendError(NETWORK_ERROR_KICKED, reason);
}
/**
* Ban, or kick, everyone joined from the given client's IP.
* @param client_id The client to check for.
* @param ban Whether to ban or kick.
+ * @param reason In case of kicking a client, specifies the reason for kicking the client.
*/
-uint NetworkServerKickOrBanIP(ClientID client_id, bool ban)
+uint NetworkServerKickOrBanIP(ClientID client_id, bool ban, const char *reason)
{
- return NetworkServerKickOrBanIP(NetworkClientSocket::GetByClientID(client_id)->GetClientIP(), ban);
+ return NetworkServerKickOrBanIP(NetworkClientSocket::GetByClientID(client_id)->GetClientIP(), ban, reason);
}
/**
* Kick or ban someone based on an IP address.
* @param ip The IP address/range to ban/kick.
* @param ban Whether to ban or just kick.
+ * @param reason In case of kicking a client, specifies the reason for kicking the client.
*/
-uint NetworkServerKickOrBanIP(const char *ip, bool ban)
+uint NetworkServerKickOrBanIP(const char *ip, bool ban, const char *reason)
{
/* Add address to ban-list */
if (ban) {
@@ -2081,7 +2090,7 @@ uint NetworkServerKickOrBanIP(const char *ip, bool ban)
for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
if (cs->client_id == CLIENT_ID_SERVER) continue;
if (cs->client_address.IsInNetmask(ip)) {
- NetworkServerKickClient(cs->client_id);
+ NetworkServerKickClient(cs->client_id, reason);
n++;
}
}