Jump to content

Recommended Posts

Posted

adds a new admin command admin_find_dualbox to list IPs with more than 1 char online

(inspired by Zealar)

 

script is not perfect, missing a proper htm file with functionality to go back or whatever. just a draft of Zealar's idea :)

 

usage:

//find_dualbox - finds IPs with 2 or more chars online

//find_dualbox 4 - finds IPs with 4 or more chars online (just change the number to whatever you want)

 

Index: data/html/admin/dualbox.htm
===================================================================
--- data/html/admin/dualbox.htm	(revision 0)
+++ data/html/admin/dualbox.htm	(revision 0)
@@ -0,0 +1,13 @@
+<html><body>
+<table width=260><tr>
+<td width=40><button value="Main" action="bypass -h admin_admin" width=40 height=15 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df"></td>
+<td width=180><center>IPs with dualboxes (%multibox%): </center></td>
+<td width=40><button value="Back" action="bypass -h admin_show_characters 0" width=40 height=15 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df"></td>
+</tr></table>
+<br>
+%results%
+<br><br>
+<a action="bypass -h admin_find_dualbox 3\>Find dualbox with 3+ chars</a><br1>
+<a action="bypass -h admin_find_dualbox 4\>Find dualbox with 4+ chars</a><br1>
+<a action="bypass -h admin_find_dualbox 5\>Find dualbox with 5+ chars</a><br1>
+</body></html>
\ No newline at end of file
Index: data/scripts/handlers/admincommandhandlers/AdminEditChar.java
===================================================================
--- data/scripts/handlers/admincommandhandlers/AdminEditChar.java	(revision 6101)
+++ data/scripts/handlers/admincommandhandlers/AdminEditChar.java	(working copy)
@@ -16,7 +16,12 @@

import java.sql.Connection;
import java.sql.PreparedStatement;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.logging.Logger;
@@ -82,6 +87,7 @@
		"admin_find_character", //find a player by his name or a part of it (case-insensitive)
		"admin_find_ip", // find all the player connections from a given IPv4 number
		"admin_find_account", //list all the characters from an account (useful for GMs w/o DB access)
+		"admin_find_dualbox", //list all the IPs with more than 1 char logged in (dualbox)
		"admin_save_modifications", //consider it deprecated...
		"admin_rec", // gives recommendation points
		"admin_settitle", // changes char title
@@ -168,6 +174,19 @@
				listCharacters(activeChar, 0);
			}
		}
+		else if (command.startsWith("admin_find_dualbox"))
+		{
+			int multibox = 2;
+			try
+			{
+				String val = command.substring(19);
+				multibox = Integer.parseInt(val);
+			}
+			catch (Exception e)
+			{
+			}
+			findDualbox(activeChar, multibox);
+		}
		else if (command.equals("admin_edit_character"))
			editCharacter(activeChar);
		// Karma control commands
@@ -552,13 +571,9 @@
		String account = "N/A";
		try
		{
-			StringTokenizer clientinfo = new StringTokenizer(player.getClient().toString(), " ]:-[");
-			clientinfo.nextToken();
-			clientinfo.nextToken();
-			clientinfo.nextToken();
-			account = clientinfo.nextToken();
-			clientinfo.nextToken();
-			ip = clientinfo.nextToken();
+			String clientInfo = player.getClient().toString();
+			account = clientInfo.substring(clientInfo.indexOf("Account: ")+9, clientInfo.indexOf(" - IP: "));
+			ip = clientInfo.substring(clientInfo.indexOf(" - IP: ")+7,clientInfo.lastIndexOf("]"));
		}
		catch (Exception e)
		{
@@ -896,4 +911,65 @@
			throw new IllegalArgumentException("Malformed character name");
	}

+	/**
+	 * @param activeChar
+	 * @throws IllegalArgumentException
+	 */
+	private void findDualbox(L2PcInstance activeChar, int multibox) throws IllegalArgumentException {
+		Collection<L2PcInstance> allPlayers = L2World.getInstance().getAllPlayers().values();
+		L2PcInstance[] players = allPlayers.toArray(new L2PcInstance[allPlayers.size()]);
+		
+		Map<String,List<L2PcInstance>> ipMap = new HashMap<String, List<L2PcInstance>>();
+		
+		String ip = "0.0.0.0";
+		L2GameClient client;
+		
+		final Map<String, Integer> dualboxIPs = new HashMap<String, Integer>();
+		
+		for (L2PcInstance player: players)
+		{
+			client = player.getClient();
+			if (client.isDetached())
+			{
+				continue;
+			}
+			else
+			{
+				ip = client.getConnection().getSocket().getInetAddress().getHostAddress();
+				if (ipMap.get(ip) == null)
+					ipMap.put(ip, new ArrayList<L2PcInstance>());
+				ipMap.get(ip).add(player);
+				
+				if (ipMap.get(ip).size() >= multibox)
+				{
+					Integer count = dualboxIPs.get(ip);
+					if (count == null)
+						dualboxIPs.put(ip, 0);
+					else
+						dualboxIPs.put(ip, count+1);
+				}
+			}
+		}
+		
+		List<String> keys = new ArrayList<String>(dualboxIPs.keySet());
+		Collections.sort(keys, new Comparator<String>(){
+			public int compare(String left, String right){
+				return dualboxIPs.get(left).compareTo(dualboxIPs.get(right));
+			}
+		});
+		Collections.reverse(keys);
+		
+		final StringBuilder results = new StringBuilder();
+		for (String dualboxIP : keys)
+		{
+			StringUtil.append(results, "<a action=\"bypass -h admin_find_ip " + dualboxIP + "\">" + dualboxIP + " (" + dualboxIPs.get(dualboxIP) + "</a><br1>");
+		}
+		
+		NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
+		adminReply.setFile("data/html/admin/dualbox.htm");
+		adminReply.replace("%multibox%", String.valueOf(multibox));
+		adminReply.replace("%results%", results.toString());
+		activeChar.sendPacket(adminReply);
+	}
+	
}

 

Sql for the command:

INSERT INTO `admin_command_access_rights` VALUES ('admin_find_dualbox','1');

Credits: janiii

 

It is Only for L2j.

Posted

this doesnt work in interlude because in interlude there isnt a table named "admin_command_access_rights" in the database

 

if you make it for interlude you have +1 from me

Posted

Well its a nice share but TheEnd you really need to optimize that code ^^

You used a lot of unecessary things which may and probably will cause a bigger memory usage thus, Lag.

You use HashMaps, then convert it to Arrays,etc. Its completely unnecessary and its a bad idea.

Just my 50cents. else its a nice work ^^

Posted

this doesnt work in interlude because in interlude there isnt a table named "admin_command_access_rights" in the database

 

if you make it for interlude you have +1 from me

I will try?

 


Index: java/config/GMAccess.properties
===================================================================
--- java/config/GMAccess.properties	(revision 0)
+++ java/config/GMAccess.properties	(revision 0
(not yet done)


Index: data/html/admin/dualbox.htm
===================================================================
--- data/html/admin/dualbox.htm	(revision 0)
+++ data/html/admin/dualbox.htm	(revision 0)
@@ -0,0 +1,13 @@
+<html><body>
+<table width=260><tr>
+<td width=40><button value="Main" action="bypass -h admin_admin" width=40 height=15 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df"></td>
+<td width=180><center>IPs with dualboxes (%multibox%): </center></td>
+<td width=40><button value="Back" action="bypass -h admin_show_characters 0" width=40 height=15 back="L2UI_ct1.button_df" fore="L2UI_ct1.button_df"></td>
+</tr></table>
+<br>
+%results%
+<br><br>
+<a action="bypass -h admin_find_dualbox 3\>Find dualbox with 3+ chars</a><br1>
+<a action="bypass -h admin_find_dualbox 4\>Find dualbox with 4+ chars</a><br1>
+<a action="bypass -h admin_find_dualbox 5\>Find dualbox with 5+ chars</a><br1>
+</body></html>
\ No newline at end of file
Index: data/scripts/handlers/admincommandhandlers/AdminEditChar.java
===================================================================
--- data/scripts/handlers/admincommandhandlers/AdminEditChar.java	(revision 6101)
+++ data/scripts/handlers/admincommandhandlers/AdminEditChar.java	(working copy)
@@ -16,7 +16,12 @@

import java.sql.Connection;
import java.sql.PreparedStatement;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.logging.Logger;
+import bsh.StringUtil;

import net.sf.l2j.gameserver.model.base.ClassId;
+import net.sf.l2j.gameserver.network.L2GameClient;
import net.sf.l2j.gameserver.network.SystemMessageId;

@@ -82,6 +87,7 @@
		"admin_find_character", //find a player by his name or a part of it (case-insensitive)
		"admin_find_ip", // find all the player connections from a given IPv4 number
		"admin_find_account", //list all the characters from an account (useful for GMs w/o DB access)
+		"admin_find_dualbox", //list all the IPs with more than 1 char logged in (dualbox)
		"admin_save_modifications", //consider it deprecated...
		"admin_rec", // gives recommendation points
		"admin_settitle", // changes char title
@@ -168,6 +174,19 @@
				listCharacters(activeChar, 0);
			}
		}
+		else if (command.startsWith("admin_find_dualbox"))
+		{
+			int multibox = 2;
+			try
+			{
+				String val = command.substring(19);
+				multibox = Integer.parseInt(val);
+			}
+			catch (Exception e)
+			{
+			}
+			findDualbox(activeChar, multibox);
+		}
		else if (command.equals("admin_edit_character"))
			editCharacter(activeChar);
		// Karma control commands
@@ -552,13 +571,9 @@
		String account = "N/A";
		try
		{
-			StringTokenizer clientinfo = new StringTokenizer(player.getClient().toString(), " ]:-[");
-			clientinfo.nextToken();
-			clientinfo.nextToken();
-			clientinfo.nextToken();
-			account = clientinfo.nextToken();
-			clientinfo.nextToken();
-			ip = clientinfo.nextToken();
+			String clientInfo = player.getClient().toString();
+			account = clientInfo.substring(clientInfo.indexOf("Account: ")+9, clientInfo.indexOf(" - IP: "));
+			ip = clientInfo.substring(clientInfo.indexOf(" - IP: ")+7,clientInfo.lastIndexOf("]"));
		}
		catch (Exception e)
		{
@@ -896,4 +911,65 @@
			throw new IllegalArgumentException("Malformed character name");
	}

+	/**
+	 * @param activeChar
+	 * @throws IllegalArgumentException
+	 */
+	private void findDualbox(L2PcInstance activeChar, int multibox) throws IllegalArgumentException {
+		Collection<L2PcInstance> allPlayers = L2World.getInstance().getAllPlayers().values();
+		L2PcInstance[] players = allPlayers.toArray(new L2PcInstance[allPlayers.size()]);
+		
+		Map<String,List<L2PcInstance>> ipMap = new HashMap<String, List<L2PcInstance>>();
+		
+		String ip = "0.0.0.0";
+		L2GameClient client;
+		
+		final Map<String, Integer> dualboxIPs = new HashMap<String, Integer>();
+		
+		for (L2PcInstance player: players)
+		{
+			client = player.getClient();
+			if (client.isDetached())
+			{
+				continue;
+			}
+			else
+			{
+				ip = client.getConnection().getSocket().getInetAddress().getHostAddress();
+				if (ipMap.get(ip) == null)
+					ipMap.put(ip, new ArrayList<L2PcInstance>());
+				ipMap.get(ip).add(player);
+				
+				if (ipMap.get(ip).size() >= multibox)
+				{
+					Integer count = dualboxIPs.get(ip);
+					if (count == null)
+						dualboxIPs.put(ip, 0);
+					else
+						dualboxIPs.put(ip, count+1);
+				}
+			}
+		}
+		
+		List<String> keys = new ArrayList<String>(dualboxIPs.keySet());
+		Collections.sort(keys, new Comparator<String>(){
+			public int compare(String left, String right){
+				return dualboxIPs.get(left).compareTo(dualboxIPs.get(right));
+			}
+		});
+		Collections.reverse(keys);
+		
+		final StringBuilder results = new StringBuilder();
+		for (String dualboxIP : keys)
+		{
+			StringUtil.append(results, "<a action=\"bypass -h admin_find_ip " + dualboxIP + "\">" + dualboxIP + " (" + dualboxIPs.get(dualboxIP) + "</a><br1>");
+		}
+		
+		NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
+		adminReply.setFile("data/html/admin/dualbox.htm");
+		adminReply.replace("%multibox%", String.valueOf(multibox));
+		adminReply.replace("%results%", results.toString());
+		activeChar.sendPacket(adminReply);
+	}
+	
}

Well its a nice share but TheEnd you really need to optimize that code ^^

You used a lot of unecessary things which may and probably will cause a bigger memory usage thus, Lag.

You use HashMaps, then convert it to Arrays,etc. Its completely unnecessary and its a bad idea.

Just my 50cents. else its a nice work ^^

I am not a java programmer... But I can understand the java...I will try to see this code and then I will edit it....

Posted

Well its a nice share but TheEnd you really need to optimize that code ^^

You used a lot of unecessary things which may and probably will cause a bigger memory usage thus, Lag.

You use HashMaps, then convert it to Arrays,etc. Its completely unnecessary and its a bad idea.

Just my 50cents. else its a nice work ^^

 

Is not hes work.... ;P

 

anyway Apriciated .... i'll check it out ^.^

  • 2 weeks later...
Posted

With dual box its hard to recover, who is really in dual... if you will find just characters from the same IP it can by a little LAN with some users, and the IP will be the same becouse it's the same gateway :)

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...