Page 1 of 1

Why isn't this code to add a node and entry working? (YAML)

Posted: Sun Apr 01, 2012 5:07 pm
by offluffy
I have these two blocks of code. I've looked through everything I can think of, and I figure the error has to be in these two blocks somewhere:

niceIp is basically the IP address with the dots replaced with underscores so it doesn't jack up the YAML file.
//Add the IP to users.yml if it isn't there already
if (!ipList.contains(niceIp)){
	plugin.users.set("Address." + niceIp, new ArrayList<String>());			
	try{
		plugin.users.save(plugin.usersFile);
	}catch(IOException e){
		e.printStackTrace();
	}
}
This one just adds the node if it doesn't exist.
//Add the username under an IP node in users.yml
if (plugin.users.getStringList("Address").contains(niceIp) && !(plugin.users.getStringList("Address." + niceIp).contains(niceName))){
	List<String> ipUsers = plugin.users.getStringList("Address." + niceIp);
	ipUsers.add(niceName);
	plugin.users.set("Address." + niceIp, ipUsers);			
	try{
		plugin.users.save(plugin.usersFile);
	}catch (IOException e){
		e.printStackTrace();
	}
}
This one adds an entry to the node the previous one created, or adds another entry to the node if it already exists, if the entry doesn't already exist.

The problem I'm having is that the plugin isn't creating the new node or inserting any new values. I'm not sure why, I've looked over it countless times @.@

For reference, the file it's writing to is structured like this:
User:
  <username>:
    ips:
    - <IP Address>
  <username>:
    ips:
    - <IP Address>
Address:
  <IP Address>:
  - <username>
  <IP Address>:
  - <username>
IP addresses in the Address section have underscores instead of dots, i.e., 127_0_0_1

P.S. - The YAML syntax highlighting seems to have some alignment issues XD

Re: Why isn't this code to add a node and entry working? (YA

Posted: Sun Apr 01, 2012 5:52 pm
by jacek
Hmm, well if there is no error being printed then it must mean that the block is not running. So are you sure that your if statements are correct ? You could add an else block to each one that just prints something to check this.

Could you post the full file ?

Re: Why isn't this code to add a node and entry working? (YA

Posted: Sun Apr 01, 2012 6:11 pm
by offluffy
Sure, this is the whole file. I'll try and else iteration and see if that catches anything usefule XD
package me.offluffy.blip;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;

import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerLoginEvent.Result;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLoginEvent;

public class LoginListener implements Listener {
	
	private Blip plugin;
	
	public LoginListener(Blip plugin){
		this.plugin = plugin;
	}
	
	@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
	public void onPlayerLogin(PlayerLoginEvent event){
		
		//Get the player's name
		Player playerName = event.getPlayer();
		String niceName = playerName.getName().toLowerCase().replace(".", "_");

		String ip = "";
		
		//Get the player's IP address
		if (event.getResult().equals(Result.ALLOWED)){
			ip = event.getKickMessage();
		}
		
		String niceIp = ip.replace(".", "_");

		String eventPlayer = event.getPlayer().getName();
		
		//Check if it's a standard name if enforce-naming-standards is enabled
		if (plugin.config.getBoolean("blip.enforce-naming-standards")){
			Pattern pattern = Pattern.compile("[A-Za-z0-9_]{1,16}"); 
			boolean matcher = pattern.matcher(eventPlayer).matches();
			
			if(!matcher){
				event.setKickMessage("Please come back when you have a valid username!");
				event.setResult(Result.KICK_OTHER);
				plugin.log.warn(playerName.getName() + " was kicked: Invalid Name");
				return;
			}
		}
		
		//Check if the user has already been banned by another plugin or by the server (does not pass in an IP if so)
		if (ip.length() < 2){
			plugin.log.info(event.getPlayer().getName() + " is already banned by the server or another plugin.");
			return;
		}
		
		//Logs that a user logged in (irregardless whether they are banned)
		//TODO Alter this log entry, add a new one after succesfull login.
		plugin.log.info(playerName.getName() + " logged in from " + ip);
		
		//Get list of Users and IPs in users.yml
		Set<String> userList = plugin.users.getConfigurationSection("User").getKeys(false);
		Set<String> ipList = plugin.users.getConfigurationSection("Address").getKeys(false);
		
		//Add the user to users.yml if it isn't there already
		if (!userList.contains(niceName)){
			plugin.users.set("User." + niceName, new ArrayList<String>());			
			try{
				plugin.users.save(plugin.usersFile);
			}catch (IOException e){
				e.printStackTrace();
			}
		}
		
		//Add the IP to users.yml if it isn't there already
		if (!ipList.contains(niceIp)){
			plugin.users.set("Address." + niceIp, new ArrayList<String>());			
			try{
				plugin.users.save(plugin.usersFile);
			}catch(IOException e){
				e.printStackTrace();
			}
		}
		
		//Add the user's IP under their node in users.yml
		if(!(plugin.users.getStringList("User." + niceName + ".ips").contains(ip))){
			List<String> userIps = plugin.users.getStringList("User." + niceName + ".ips");
			userIps.add(ip);
			plugin.users.set("User." + niceName + ".ips", userIps);			
			try{
				plugin.users.save(plugin.usersFile);
			}catch (IOException e){
				e.printStackTrace();
			}			
		}
		
		//Add the username under an IP node in users.yml
		if (plugin.users.getStringList("Address").contains(niceIp) && !(plugin.users.getStringList("Address." + niceIp).contains(niceName))){
			List<String> ipUsers = plugin.users.getStringList("Address." + niceIp);
			ipUsers.add(niceName);
			plugin.users.set("Address." + niceIp, ipUsers);			
			try{
				plugin.users.save(plugin.usersFile);
			}catch (IOException e){
				e.printStackTrace();
			}
		}

		//Get list of banned users ans IPs
		List<String> bannedUsers = plugin.banned.getStringList("Users");
		List<String> bannedIps = plugin.banned.getStringList("Addresses");
		
		//Check if the username is banned
		if (bannedUsers.contains(niceName)){
			event.setKickMessage(plugin.config.getString("blip.banmsg"));
			event.setResult(Result.KICK_OTHER);
			if (plugin.config.getBoolean("blip.autoban-enabled")){
				if (!bannedIps.contains(ip) && !plugin.config.getStringList("blip.exemptips").contains(ip)){
					bannedIps.add(ip);
					
					plugin.banned.set("Addresses", bannedIps);
					
					try{
						plugin.banned.save(plugin.bannedFile);
					}catch (IOException e){
						e.printStackTrace();
					}
				}
			}
		}
		
		//Check if the IP is banned
		if (bannedIps.contains(ip)){
			event.setKickMessage(plugin.config.getString("blip.banmsg"));
			event.setResult(Result.KICK_OTHER);
			if (plugin.config.getBoolean("blip.autoban-enabled")){
				if (!bannedUsers.contains(niceName) && !plugin.config.getStringList("blip.exemptusers").contains(niceName)){
					bannedUsers.add(niceName);
					
					plugin.banned.set("Users", bannedUsers);
					
					try{
						plugin.banned.save(plugin.bannedFile);
					}catch (IOException e){
						e.printStackTrace();
					}
				}
			}
		}
	}
}
It's commented up pretty well at least to the point what I expected each block to do XD

Re: Why isn't this code to add a node and entry working? (YA

Posted: Mon Apr 02, 2012 11:01 am
by offluffy
Well, I finally found the error! \o/

A friend unintentionally helped me when he logged in when I was looking through the else iterations. XD
But as it so happens, in the if loop that was checking if the IP node was already there, previously this:
//Add the username under an IP node in users.yml
if (plugin.users.getStringList("Address").contains(niceIp) && !(plugin.users.getStringList("Address." + niceIp).contains(niceName))){
            List<String> ipUsers = plugin.users.getStringList("Address." + niceIp);
            ipUsers.add(niceName);
            plugin.users.set("Address." + niceIp, ipUsers);                
            try{
                    plugin.users.save(plugin.usersFile);
            }catch (IOException e){
                    e.printStackTrace();
            }
    }
It was trying to use the .getStringList("Address"), when it should have been .getConfigurationSection("Address"), since it's nodes immediately under that rather than entries. So now I have this:
if (plugin.users.getConfigurationSection("Address").contains(niceIp)){
	if (!(plugin.users.getStringList("Address." + niceIp).contains(niceName))){
		List<String> ipUsers = plugin.users.getStringList("Address." + niceIp);
		ipUsers.add(niceName);
		plugin.users.set("Address." + niceIp, ipUsers);			
		try{
			plugin.users.save(plugin.usersFile);
		}catch (IOException e){
			e.printStackTrace();
		}
	}
	else{
		plugin.log.severe("Did not pass - Line 135");
	}
}
On a latter note, I guess I could add .getKeys(false) so there isn't a lotta unnecessary information in the Set. If that doesn't utterly break everything again XD

Re: Why isn't this code to add a node and entry working? (YA

Posted: Tue Apr 03, 2012 1:31 am
by jacek
Ah, well I would probably have never spotted that !

And I think you could use
plugin.users.getConfigurationSection("Address").getKeys(false).contains(niceIp)
as you said, not sure if it's really going to make a difference in terms of performance.

anyway, good that you got it working :D

Re: Why isn't this code to add a node and entry working? (YA

Posted: Tue Apr 03, 2012 2:39 am
by offluffy
Thanks again XD