changeset 2859:5dcbcb954e29 draft

(svn r3407) - Feature: Kick and ban now with IP numbers.
author Darkvater <Darkvater@openttd.org>
date Thu, 19 Jan 2006 15:58:57 +0000
parents 84ebd314b758
children 307dde3e41cd
files console_cmds.c network.c network_data.h
diffstat 3 files changed, 36 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/console_cmds.c
+++ b/console_cmds.c
@@ -365,26 +365,31 @@
 	uint32 index;
 
 	if (argc == 0) {
-		IConsoleHelp("Ban a player from a network game. Usage: 'ban <client-id>'");
+		IConsoleHelp("Ban a player from a network game. Usage: 'ban <ip | client-id>'");
 		IConsoleHelp("For client-id's, see the command 'clients'");
 		return true;
 	}
 
 	if (argc != 2) return false;
 
-	index = atoi(argv[1]);
+	if (strchr(argv[1], '.') == NULL) {
+		index = atoi(argv[1]);
+		ci = NetworkFindClientFromIndex(index);
+	} else {
+		ci = NetworkFindClientFromIP(argv[1]);
+		index = (ci == NULL) ? 0 : ci->client_index;
+	}
 
 	if (index == NETWORK_SERVER_INDEX) {
 		IConsolePrint(_icolour_def, "Silly boy, you can not ban yourself!");
 		return true;
 	}
+
 	if (index == 0) {
 		IConsoleError("Invalid Client-ID");
 		return true;
 	}
 
-	ci = NetworkFindClientInfoFromIndex(index);
-
 	if (ci != NULL) {
 		uint i;
 		/* Add user to ban-list */
@@ -407,7 +412,7 @@
 	uint i, index;
 
 	if (argc == 0) {
-		IConsoleHelp("Unban a player from a network game. Usage: 'unban <ip | id>'");
+		IConsoleHelp("Unban a player from a network game. Usage: 'unban <ip | client-id>'");
 		IConsoleHelp("For a list of banned IP's, see the command 'banlist'");
 		return true;
 	}
@@ -528,25 +533,31 @@
 	uint32 index;
 
 	if (argc == 0) {
-		IConsoleHelp("Kick a player from a network game. Usage: 'kick <client-id>'");
+		IConsoleHelp("Kick a player from a network game. Usage: 'kick <ip | client-id>'");
 		IConsoleHelp("For client-id's, see the command 'clients'");
 		return true;
 	}
 
 	if (argc != 2) return false;
 
-	index = atoi(argv[1]);
+	if (strchr(argv[1], '.') == NULL) {
+		index = atoi(argv[1]);
+		ci = NetworkFindClientFromIndex(index);
+	} else {
+		ci = NetworkFindClientFromIP(argv[1]);
+		index = (ci == NULL) ? 0 : ci->client_index;
+	}
+
 	if (index == NETWORK_SERVER_INDEX) {
 		IConsolePrint(_icolour_def, "Silly boy, you can not kick yourself!");
 		return true;
 	}
+
 	if (index == 0) {
 		IConsoleError("Invalid client-id");
 		return true;
 	}
 
-	ci = NetworkFindClientInfoFromIndex(index);
-
 	if (ci != NULL) {
 		SEND_COMMAND(PACKET_SERVER_ERROR)(NetworkFindClientStateFromIndex(index), NETWORK_ERROR_KICKED);
 	} else
--- a/network.c
+++ b/network.c
@@ -65,6 +65,21 @@
 	return NULL;
 }
 
+/** Return the CI for a given IP
+ * @param ip IP of the client we are looking for. This must be in string-format
+ * @return return a pointer to the corresponding NetworkClientInfo struct or NULL on failure */
+NetworkClientInfo *NetworkFindClientInfoFromIP(const char *ip)
+{
+	NetworkClientInfo *ci;
+	uint32 ip_number = inet_addr(ip);
+
+	for (ci = _network_client_info; ci != &_network_client_info[MAX_CLIENT_INFO]; ci++) {
+		if (ci->client_ip == ip_number) return ci;
+	}
+
+	return NULL;
+}
+
 // Function that looks up the CS for a given client-index
 NetworkClientState *NetworkFindClientStateFromIndex(uint16 client_index)
 {
--- a/network_data.h
+++ b/network_data.h
@@ -226,6 +226,7 @@
 uint NetworkCalculateLag(const NetworkClientState *cs);
 byte NetworkGetCurrentLanguageIndex(void);
 NetworkClientInfo *NetworkFindClientInfoFromIndex(uint16 client_index);
+NetworkClientInfo *NetworkFindClientInfoFromIP(const char *ip);
 NetworkClientState *NetworkFindClientStateFromIndex(uint16 client_index);
 unsigned long NetworkResolveHost(const char *hostname);