package com.arlania;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Level;

import com.arlania.engine.task.Task;
import com.arlania.engine.task.TaskManager;
import com.arlania.model.Position;
import com.arlania.model.Item;
import com.arlania.model.Locations.Location;
import com.arlania.model.definitions.ItemDefinition;
import com.arlania.util.Stopwatch;
import com.arlania.world.World;
import com.arlania.world.content.Guild.GuildRank;
import com.arlania.world.entity.impl.npc.NPC;
import com.arlania.world.entity.impl.player.Player;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class ItemHashHandler {

	private static Path itemHashPath = Paths.get("./data/hashes/items.json");
	private static File itemHashFile;
	private static ArrayList<String> itemHashArrayList;

	private static final int TIME = 30000; // 30 secs
	private static Stopwatch timer = new Stopwatch().reset();

	public ItemHashHandler() {
		System.out.println("ITEM HANDLER BEING CREATED");
		itemHashArrayList = new ArrayList<String>();
		itemHashFile = itemHashPath.toFile();
		if (!itemHashFile.getParentFile().exists()) {
			try {
				System.out.println("CREATING NEW FILE / FOLDER");
				itemHashFile.getParentFile().mkdirs();
				itemHashArrayList.add("start");
				itemHashFile.getParentFile().setWritable(true);
				try (FileWriter writer = new FileWriter(itemHashFile)) {
					Gson builder = new GsonBuilder().setPrettyPrinting().create();
					JsonObject object = new JsonObject();
					object.add("hashes", builder.toJsonTree(itemHashArrayList));
					writer.write(builder.toJson(object));
					writer.close();
					System.out.println("Initialized item hash file: " + itemHashFile.getPath());
				} catch (Exception e) {
					// An error happened while saving.
					GameServer.getLogger().log(Level.WARNING, "An error has occured while creating quiver file!", e);
				}
			} catch (SecurityException e) {
				System.out.println("Unable to create directory for player data!");
			}
		} else {
			load();
		}

	}

	private void load() {
		try (FileReader fileReader = new FileReader(itemHashFile)) {
			System.out.println("Now attempting to read file from Item Hash File");
			System.out.println(itemHashFile.getAbsolutePath());
			JsonParser fileParser = new JsonParser();
			Gson builder = new GsonBuilder().create();
			JsonObject reader = (JsonObject) fileParser.parse(fileReader);

			if (reader.has("hashes")) {
				String[] hashes = builder.fromJson(reader.get("hashes").getAsJsonArray(), String[].class);
				for (String s : hashes) {
					itemHashArrayList.add(s);
				}
				System.out.println("[ITEM HASHES]: " + itemHashArrayList.size() + " hashes loaded.");
			}

			fileReader.close();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	public void add(String hash) {
		if (hash != null) {
			itemHashArrayList.add(hash);
			update();
		} else {
			System.out.println("tossing null hash");
		}
	}

	public void monitor() {
		if (timer.elapsed(TIME)) {
			timer.reset();
			{//rewrite - add ge check 
				//System.out.println("Monitoring for duped items..");
				HashMap<Player, ArrayList<String>> itemMap = new HashMap<Player, ArrayList<String>>();
				for (Player player : World.getPlayers()) {
					if (player == null)
						continue;
					//System.out.println("Scanning " + player.getUsername());
					ArrayList<String> scannedItems = new ArrayList<String>();
					//add ge check
					Item[] bankItems = player.getBank().getItems();
					Item[] inventoryItems = player.getInventory().getItems();
					ArrayList<Item> bankArray = new ArrayList<Item>(Arrays.asList(bankItems));
					ArrayList<Item> inventoryArray = new ArrayList<Item>(Arrays.asList(inventoryItems));
					int dupeCounter = 0;
					// BANK CHECK
					if (bankItems.length > 0) {
						for (Item i : bankItems) {
							scannedItems.add(i.getItemHash());
							for (Item i2 : bankArray) {
								if (i != null && i2 != null) {
									if (i.getItemHash() != null && i2.getItemHash() != null) {
										if (i.getItemHash().equalsIgnoreCase(i2.getItemHash())) {
											dupeCounter++;
										}
									}
								}
							}

							if (dupeCounter > 1) {
								player.setPlayerLocked(true);
								player.sendMessage(
										"@red@YOU HAVE BEEN DETECTED DUPING IN YOUR BANK AND YOUR ACCOUNT IS LOCKED.");
							} else {
								dupeCounter = 0;
							}
						}
					}
					dupeCounter = 0;

					if (inventoryItems.length > 0) {
						// INVENTORY CHECK
						for (Item i : inventoryItems) {
							scannedItems.add(i.getItemHash());
							for (Item i2 : inventoryArray) {
								if (i != null && i2 != null) {
									if (i.getItemHash() != null && i2.getItemHash() != null) {
										if (i.getItemHash().equalsIgnoreCase(i2.getItemHash())) {
											dupeCounter++;
										}
									}
								}
							}

							if (dupeCounter > 1) {
								player.setPlayerLocked(true);
								player.sendMessage(
										"@red@YOU HAVE BEEN DETECTED DUPING IN YOUR INVENTORY AND YOUR ACCOUNT IS LOCKED.");
							} else {
								dupeCounter = 0;
							}
						}
					}
					dupeCounter = 0;

					if (inventoryItems.length > 0 && bankItems.length > 0) {
						// BANK -> INVENTORY CHECK
						for (Item i : bankArray) {
							for (Item i2 : inventoryArray) {
								if (i != null && i2 != null) {
									if (i.getItemHash() != null && i2.getItemHash() != null) {
										if (i.getItemHash().equalsIgnoreCase(i2.getItemHash())) {
											dupeCounter++;
										}
									}
								}
							}

							if (dupeCounter > 0) {
								player.setPlayerLocked(true);
								player.sendMessage(
										"@red@YOU HAVE BEEN DETECTED DUPING IN YOUR INVENTORY AND YOUR ACCOUNT IS LOCKED.");

							}
						}
					}
					dupeCounter = 0;

					if (scannedItems.size() > 0) {
						itemMap.put(player, scannedItems);
					}

					if (inventoryItems.length == 0 && bankItems.length == 0)
						continue;

					// SCANNED HASH CHECK
					for (Entry<Player, ArrayList<String>> e : itemMap.entrySet()) {
						if (!e.getKey().equals(player)) {
							// check items
							for (String hashes : scannedItems) {
								if (e.getValue().contains(hashes) && hashes != null) {
									dupeCounter++;
								}
							}
						}

						if (dupeCounter > 0) {
							player.getPacketSender().sendMessage(
									"@red@YOU HAVE BEEN DETECTED DUPING WITH ANOTHER PLAYER AND YOUR ACCOUNT HAS BEEN LOCKED.");
							e.getKey().getPacketSender().sendMessage(
									"@red@YOU HAVE BEEN DETECTED DUPING WITH ANOTHER PLAYER AND YOUR ACCOUNT HAS BEEN LOCKED.");
						}
					}
				}
			}
		}
	}

	private void update() {
		
		itemHashFile.getParentFile().setWritable(true);

		// Attempt to make the player save directory if it doesn&#039;t
		// exist.
		if (!itemHashFile.getParentFile().exists()) {
			try {
				itemHashFile.getParentFile().mkdirs();
			} catch (SecurityException e) {
				System.out.println("Unable to create directory for player data!");
			}
		}
		try (FileReader fileReader = new FileReader(itemHashFile)) {
			System.out.println("Now attempting to read file from item hash File2");
			JsonElement fileParser = new Gson().fromJson(fileReader, JsonElement.class);
			System.out.println("made parser");
			Gson builder = new GsonBuilder().create();
			System.out.println("made builder");
			JsonObject reader = fileParser.getAsJsonObject();
			System.out.println("made reader");
			
			Iterator<Entry<String, JsonElement>> it = reader.entrySet().iterator();
			while(it.hasNext()) {
				Entry<String,JsonElement> e = it.next();
				System.out.println("entry: " + e.getKey());
				System.out.println("value: " + e.getValue());
			}
			
			if (reader.getAsJsonObject().has("hashes")) {
				reader.getAsJsonObject().remove("hashes");
			} else {
				System.out.println("reader has no hashes");
			}
			
			System.out.println("{HASH ARRAY SIZE}: " + itemHashArrayList.size());
			reader.getAsJsonObject().add("hashes", builder.toJsonTree(itemHashArrayList));
			
			
			try (FileWriter writer = new FileWriter(itemHashFile)) {

				Gson builder2 = new GsonBuilder().setPrettyPrinting().create();
				writer.write(builder2.toJson(reader));
				writer.close();
				System.out.println("Updated item hashes: " + itemHashFile.getPath());
			} catch (Exception e) {
				// An error happened while saving.
				GameServer.getLogger().log(Level.WARNING, "An error has occured while saving a character file!", e);
			}
			fileReader.close();
		} catch (Exception e) {
			System.out.print(e.getMessage());
		}


	}

	public boolean check(String hash) {
		if (!itemHashArrayList.contains(hash)) {
			return true;
		} else {
			return false;
		}
	}

	public void delete(String hash) {
		Iterator<String> it = itemHashArrayList.iterator();
		while(it.hasNext()) {
			String h = it.next();
			if(h.equalsIgnoreCase(hash)) {
				itemHashArrayList.remove(h);
				System.out.println("deleted a hash");
				break;
			}
		}
		update();
	}
}

Add a code snippet to your website: www.paste.org