· 9 years ago · Aug 01, 2017, 06:30 PM
1package com.mcsmp.BlockLogLite;
2
3import java.io.File;
4import java.util.HashMap;
5import java.util.logging.Logger;
6import org.bukkit.util.config.Configuration;
7import org.bukkit.block.Block;
8import org.bukkit.plugin.java.JavaPlugin;
9import java.sql.Connection;
10import java.sql.DriverManager;
11import java.sql.PreparedStatement;
12import java.sql.ResultSet;
13import java.sql.Statement;
14
15public class BlockLogLite extends JavaPlugin {
16
17 static final Logger log = Logger.getLogger("Minecraft");
18 Configuration conf;
19 Connection db;
20 BlockLogLiteBlockListener blockListener = new BlockLogLiteBlockListener(this);
21 HashMap<String, Integer> playerIdCache = new HashMap<String, Integer>();
22
23 public void onEnable() {
24 //log.info("[BlockLogLite] onEnable();");
25 if (!(new File(getDataFolder(), "config.yml")).exists()) {
26 getDataFolder().mkdirs();
27 conf = new Configuration(new File(getDataFolder(), "config.yml"));
28 conf.setProperty("database.dsn", "jdbc:mysql://localhost:3306/test");
29 conf.setProperty("database.user", "root");
30 conf.setProperty("database.pass", "");
31 conf.setProperty("database.queries.create-players", "CREATE TABLE IF NOT EXISTS `bll_players` (`id` int unsigned AUTO_INCREMENT, `player` varchar(32), PRIMARY KEY `player` (`player`), KEY `id` (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
32 conf.setProperty("database.queries.create-data", "CREATE TABLE IF NOT EXISTS `bll_data` (`id` int unsigned AUTO_INCREMENT, `date` int unsigned, `player_id` int unsigned, `action` tinyint unsigned, `x` int, `y` smallint, `z` int, `block_id` smallint, PRIMARY KEY `id` (`id`), KEY `xyz` (`x`, `y`, `z`), KEY `player_id` (`player_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;");
33 conf.setProperty("database.queries.select-player", "SELECT id FROM `bll_players` WHERE player = ?;");
34 conf.setProperty("database.queries.insert-player", "INSERT INTO `bll_players` (`player`) VALUES (?);");
35 conf.setProperty("database.queries.insert-data", "INSERT INTO `bll_data` (`date`, `player_id`, `action`, `x`, `y`, `z`, `block_id`) VALUES (UNIX_TIMESTAMP(), ?, ?, ?, ?, ?, ?);");
36 conf.save();
37 } else {
38 conf = new Configuration(new File(getDataFolder(), "config.yml"));
39 }
40 conf.load();
41 try {
42 Class.forName("com.mysql.jdbc.Driver");
43 db = DriverManager.getConnection(conf.getString("database.dsn"), conf.getString("database.user"), conf.getString("database.pass"));
44 Statement s = db.createStatement();
45 s.execute(conf.getString("database.queries.create-players"));
46 s.execute(conf.getString("database.queries.create-data"));
47 s.close();
48 } catch (Exception ex) {
49 log.severe(ex.getStackTrace().toString());
50 }
51 this.getServer().getPluginManager().registerEvent(org.bukkit.event.Event.Type.BLOCK_PLACED, blockListener, org.bukkit.event.Event.Priority.Monitor, this);
52 this.getServer().getPluginManager().registerEvent(org.bukkit.event.Event.Type.BLOCK_BREAK, blockListener, org.bukkit.event.Event.Priority.Monitor, this);
53 }
54
55 public int getPlayerId(String player) {
56 //log.info("[BlockLogLite] getPlayerId(" player ");");
57 if (playerIdCache.containsKey(player)) {
58 //log.info("[BlockLogLite] - Found in cache");
59 return (int) playerIdCache.get(player);
60 }
61 try {
62 PreparedStatement s = db.prepareStatement(conf.getString("database.queries.select-player"));
63 s.setString(1, player);
64 ResultSet result = s.executeQuery();
65 int id = 0;
66 if (result.next()) {
67 id = result.getInt("id");
68 playerIdCache.put(player, id);
69 } else {
70 s.close();
71 s = db.prepareStatement(conf.getString("database.queries.insert-player"), s.RETURN_GENERATED_KEYS);
72 s.setString(1, player);
73 s.executeUpdate();
74 result = s.getGeneratedKeys();
75 if (result.next()) {
76 id = result.getInt("GENERATED_KEY");
77 playerIdCache.put(player, id);
78 }
79 }
80 s.close();
81 return id;
82 } catch (Exception ex) {
83 log.severe(ex.getStackTrace().toString());
84 }
85 return 0;
86 }
87
88 public void blockAction(String player, int blockAction, Block block) {
89 //log.info("[BlockLogLite] blockAction(" player ", " blockAction ", " block.getX() ", " block.getY() ", " block.getZ() ", " block.getTypeId() ");");
90 int playerId = getPlayerId(player);
91 if (playerId > 0) {
92 try {
93 PreparedStatement s = db.prepareStatement(conf.getString("database.queries.insert-data"));
94 s.setInt(1, playerId);
95 s.setInt(2, blockAction);
96 s.setInt(3, block.getX());
97 s.setInt(4, block.getY());
98 s.setInt(5, block.getZ());
99 s.setInt(6, block.getTypeId());
100 s.executeUpdate();
101 s.close();
102 } catch (Exception ex) {
103 log.severe(ex.getStackTrace().toString());
104 }
105 } else {
106 log.severe("[BlockLogLite] getPlayerId(" player "): failed (returned 0)");
107 }
108 }
109
110 public void onDisable() {
111 //log.info("[BlockLogLite] onDisable();");
112 try {
113 db.close();
114 } catch (Exception e) {
115 e.printStackTrace();
116 }
117 }
118}
119
120package com.mcsmp.BlockLogLite;
121
122import org.bukkit.event.block.BlockBreakEvent;
123import org.bukkit.event.block.BlockListener;
124import org.bukkit.event.block.BlockPlaceEvent;
125
126public class BlockLogLiteBlockListener extends BlockListener {
127
128 BlockLogLite plugin;
129
130 public BlockLogLiteBlockListener(BlockLogLite i) {
131 plugin = i;
132 }
133
134 @Override
135 public void onBlockPlace(BlockPlaceEvent e) {
136 if (!e.isCancelled()) {
137 plugin.blockAction(e.getPlayer().getName(), 1, e.getBlock());
138 }
139 }
140
141 @Override
142 public void onBlockBreak(BlockBreakEvent e) {
143 if (!e.isCancelled()) {
144 plugin.blockAction(e.getPlayer().getName(), 2, e.getBlock());
145 }
146 }
147}