[1.8-1.13.2] AltFinder


#1


Single / Personal servers
Simply drop the jar into your “plugins” folder. The auto-generated config should default to reasonable values for you, but you may modify it if you wish.

Multiple servers / Large networks
Drop the jar into the plugins folder and configure the “sql” section to use MySQL instead of SQLite. RabbitMQ and/or Redis are optional but highly recommended if you have multiple servers.

# How the plugin stores long-term data
storage:
  # The storage method
  #
  # Options:
  # - MySQL (remote)
  # - SQLite (local)
  method: 'sqlite'

  data:
    # Address and port of the remote database (if applicable)
    address: '127.0.0.1:3306'
    # The name of the database AltFinder will store data in
    # If you're using remote options, this must be created beforehand
    database: 'altfinder'
    # Table prefix for all AltFinder tables
    prefix: 'altfinder_'
    # Database credentials (if applicable)
    username: ''
    password: ''

    # MongoDB options- obviously don't need to worry about these if not using MongoDB ;)
    mongodb:
      # Connection prefix for all AltFinder connections
      collection-prefix: ''
      # MongoDB ClientConnectionURI
      connection-uri: ''

  settings:
    # The maximum size of the database connection pool
    # Determines the max number of connections to the database
    max-pool-size: 2
    # The minimum size of the satabase connection pool
    # Determines the min number of connections kept alive to the database
    min-idle: 2
    # The maximum lifetime of a connection in the pool
    # Should be at least 30 seconds less than any database or infrastructure-imposed connection time limit
    max-lifetime: 1800000 # 30 minutes
    # The maximum number of milliseconds that the plugin will wait for a new connection from the pool before timing out
    timeout: 5000 # 5 seconds

    # Extra connection properties
    properties:
      unicode: true
      encoding: 'utf8'

# Redis is a very fast cache accessible by multiple servers
# If you don't want to constantly hit your database for queries, try enabling and configuring this
# You will need to install the (external) Redis server software if you haven't already
# https://redis.io/
redis:
  enabled: false
  # Address and port of the remote Redis server
  address: '127.0.0.1:6379'
  # Redis credentials
  password: ''

# RabbitMQ is a messaging queue that will allow the plugin to push instant updates across multiple servers
# You will need to install the (external) RabbitMQ server software if you haven't already
# https://www.rabbitmq.com/
rabbitmq:
  enabled: false
  # Address and port of the remote RabbitMQ server
  address: '127.0.0.1:5672'
  # RabbitMQ credentials
  username: 'guest'
  password: 'guest'

# When true, logs some extra output to the console so you can see if/why things might be failing
debug: false

# A list of player UUIDs and/or IPs to ignore
ignore:
- '127.0.0.1'
- 'localhost'
- '::1'
#- '069a79f4-44e9-4726-a5be-fca90e38aaf5' #Notch

stats:
  # Whether or not to send anonymous usage statistics to bStats
  # True: Send anonymous stats; let the author know how well the plugin is doing and how it's used!
  # False: Do not send stats and make the author sad :(
  usage: true
  # Whether or not to send anonymous errors to the author
  # True: Send errors anonymously to Rollbar and/or GameAnalytics so the author can fix them!
  # False: Do not send errors and wonder why any bugs you encounter haven't beeen fixed
  errors: true

update:
  # Whether or not to automatically check for updates and notify the console if found
  check: true
  # Whether or not to notify players with the altfinder.admin permission node
  notify: true

# Config version, no touchy plz
version: 3.0


/seen <ip|name> - Shows the last logout time of a player.
/altfinder reload - Reloads the plugin.
/altfinder search|find - Finds potential alt accounts on the IP or player specified.
/altfinder delete|del|gdpr - Removes a given IP or player from the system.


altfinder.admin - gives access to reload and delete commands, and notifies of updates
altfinder.seen - perm node for /seen
altfinder.search - perm nodes for the search command


Please consider donating to support this free plugin!
https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=DMGE92AKY9FWU


According to the GDPR, you must specify that you are storing IP information to your players in a privacy policy when using this plugin (actually you need that if you’re running a vanilla server without this plugin because of server logs). You may also be required to remove some data using the provided commands.
Disclaimer: I am a plugin developer, not a lawyer. This information is provided as a “best guess” and is not legal advice.


Maven

<repository>
  <id>egg82-ninja</id>
  <url>https://www.myget.org/F/egg82-java/maven/</url>
</repository>

Latest Repo

API usage

AltAPI.getInstance();
...
long getCurrentSQLTime();
void addPlayerData(UUID uuid, String ip, String server);
void removePlayerData(UUID uuid);
void removePlayerData(String ip);
ImmutableSet<PlayerData> getPlayerData(UUID uuid);
ImmutableSet<PlayerData> getPlayerData(String ip);

---

ImmutableSet<PlayerData> data = api.getPlayerData("127.0.0.1");
PlayerData d = data.get(0); // Somehow
d.getUUID();
d.getIP();
d.getCount();
d.getServer();
d.getCreated();
d.getUpdated();

Example - list all players logged into all IPs that a specified player has ever logged in on

ImmutableSet<PlayerData> uuidData = api.getPlayerData(uuid);
Set<PlayerData> altData = new HashSet<>(uuidData);

for (PlayerData data : uuidData) {
    altData.addAll(api.getPlayerData(data.getIP()));
}

altData.removeIf(v -> uuid.equals(v.getUUID())); // This now contains all potential alts, minus the original uuid that was searched for

Example - emulate Essentials /seen

ImmutableSet<PlayerData> data = api.getPlayerData(ip);
for (PlayerData d : data) {
    getName(d.getUUID());
}

List<PlayerData> sorted = new ArrayList<>(data);
sorted.sort(Comparator.comparingLong(PlayerData::getCreated));

if (data.isEmpty()) {
    sender.sendMessage("No players have logged in from " + ip);
} else {
    for (PlayerData data : sorted) {
        String name = getName(data.getUUID());
        sender.sendMessage("Player: " + (name != null ? ChatColor.GREEN + name : ChatColor.RED + "UNKNOWN"));
        sender.sendMessage(" - First seen: " + getTime(data.getCreated(), api.getCurrentSQLTime()) + " ago");
        sender.sendMessage(" - Last seen: " + getTime(data.getUpdated(), api.getCurrentSQLTime()) + " ago on " + data.getServer());
        sender.sendMessage(" - IP Login Count: " + data.getCount());
    }
}

Download available on Spigot: https://www.spigotmc.org/resources/altfinder.57678/
Source available on GitHub: https://github.com/egg82/AltFinder