package com.nisovin.magicspells;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import com.nisovin.magicspells.events.SpellCastEvent;
import com.nisovin.magicspells.events.SpellCastedEvent;
import com.nisovin.magicspells.events.SpellForgetEvent;
import com.nisovin.magicspells.events.SpellLearnEvent;
import com.nisovin.magicspells.events.SpellTargetEvent;
import com.nisovin.magicspells.events.SpellTargetLocationEvent;
public class MagicLogger implements Listener {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
FileWriter writer;
public MagicLogger(MagicSpells plugin) {
File file = new File(plugin.getDataFolder(), "log-" + System.currentTimeMillis() + ".txt");
try {
writer = new FileWriter(file, true);
MagicSpells.registerEvents(this);
} catch (IOException e) {
MagicSpells.handleException(e);
}
}
public void disable() {
if (writer != null) {
try {
writer.flush();
writer.close();
} catch (IOException e) {
MagicSpells.handleException(e);
}
}
writer = null;
}
@EventHandler(priority = EventPriority.MONITOR)
public void onSpellLearn(SpellLearnEvent event) {
log("LEARN" +
"; spell=" + event.getSpell().getInternalName() +
"; player=" + event.getLearner().getName() +
"; loc=" + formatLoc(event.getLearner().getLocation()) +
"; source=" + event.getSource().name() +
"; teacher=" + getTeacherName(event.getTeacher()) +
"; canceled=" + event.isCancelled());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onSpellForget(SpellForgetEvent event) {
log("FORGET" +
"; spell=" + event.getSpell().getInternalName() +
"; player=" + event.getForgetter().getName() +
"; loc=" + formatLoc(event.getForgetter().getLocation()) +
"; canceled=" + event.isCancelled());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onSpellCast(SpellCastEvent event) {
log("BEGIN CAST" +
"; spell=" + event.getSpell().getInternalName() +
"; caster=" + event.getCaster().getName() +
"; loc=" + formatLoc(event.getCaster().getLocation()) +
"; state=" + event.getSpellCastState().name() +
"; power=" + event.getPower() +
"; canceled=" + event.isCancelled());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onSpellTarget(SpellTargetEvent event) {
Player caster = event.getCaster();
log(" TARGET ENTITY" +
"; spell=" + event.getSpell().getInternalName() +
"; caster=" + (caster != null ? caster.getName() : "null") +
"; casterloc=" + (caster != null ? formatLoc(caster.getLocation()) : "null") +
": target=" + getTargetName(event.getTarget()) +
"; targetloc=" + formatLoc(event.getTarget().getLocation()) +
"; canceled=" + event.isCancelled());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onSpellTargetLocation(SpellTargetLocationEvent event) {
log(" TARGET LOCATION" +
"; spell=" + event.getSpell().getInternalName() +
"; caster=" + event.getCaster().getName() +
"; casterloc=" + formatLoc(event.getCaster().getLocation()) +
"; targetloc=" + formatLoc(event.getTargetLocation()) +
"; canceled=" + event.isCancelled());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onSpellCasted(SpellCastedEvent event) {
log(" END CAST" +
"; spell=" + event.getSpell().getInternalName() +
"; caster=" + event.getCaster().getName() +
"; loc=" + formatLoc(event.getCaster().getLocation()) +
"; state=" + event.getSpellCastState().name() +
"; power=" + event.getPower() +
"; result=" + event.getPostCastAction().name());
}
private String formatLoc(Location location) {
return location.getWorld().getName() + "," + location.getBlockX() + "," + location.getBlockY() + "," + location.getBlockZ();
}
private String getTargetName(LivingEntity target) {
if (target instanceof Player) {
return ((Player)target).getName();
} else {
return target.getType().name();
}
}
private String getTeacherName(Object o) {
if (o == null) {
return "none";
} else if (o instanceof Player) {
return "player-" + ((Player)o).getName();
} else if (o instanceof Spell) {
return "spell-" + ((Spell)o).getInternalName();
} else if (o instanceof Block) {
return "block-" + formatLoc(((Block)o).getLocation());
} else {
return o.toString();
}
}
private void log(String string) {
if (writer != null) {
try {
writer.write("[" + dateFormat.format(new Date()) + "] " + string + "\n");
} catch (IOException e) {
}
}
}
}