BeardStat

BeardStat is statistics tracking plugin for bukkit. It tracks a wide variety of user statistics and makes them available to your playerbase and plugins.
Recorded stats
- last Login and logout time
- Total playtime
- block placement and breaking (including sub/metadata blocks like wool, logs etc)
- Items picked up/dropped
- Damage dealt and recieved
- Kills and deaths
- Food consumed
- Sheep sheared and dyed
- TNT detonated
- Distance travelled on foot/boat/cart/horse/pig
- Items crafted
- Animals tamed
- Teleports
- Fishing
Web interface (under development)
BeardStat also comes with a web interface for stats, this allows players to view their own and friends stats on your servers website. the Web interface also includes a scoreboard system to rank players based on various statistics (playtime, creepers killed)
Commands
Stats are recorded per world, and you can blacklist worlds/gamemodes from tracking. BeardStat also has a number of commands: * /stats - access to all stats information * /played - shows a players playyime. * /laston - Returns the last time the player was on * /statpage - Allows showing a selection of player stats, useful with Bukkit's command aliasing
Dev builds
Development builds of this project can be acquired at the provided continuous integration server.
These builds have not been approved by the BukkitDev staff. Use them at your own risk.
(Please note, zips in dev builds currently contain a broken implementation of the web interface, please instead download the .jar file instead. The web interface available on the right of this page) Development builds fresh from Jenkins
Issues
BeardStat has an issue tracker on github, https://github.com/tehbeard/beardstat/issues.
For error reports please include the following: * full stacktrace of the error * plugin version (inc. build number if using one from CI) * Bukkit version * Database type used (SQLite / MySQL)
Plugin integration
BeardStat provides a rich API for plugin developers to hook into BeardStat and read / record statistics.
For Developers
BeardStat stats are identifiable by a unique Id generated from 4 sub components: * Domain * World * Category * Statistic
Domain is the primary namespace for a collection of stats, the "default" domain is used by BeardStat, I ask that you use your own unique domain for your plugin (i.e. if you make a PvP arena plugin, you could use the domain "pvparena").
World represents the world in which this stat was recorded, these are for the most part the name of the world.
Two special cases exist however. "__global__" is a reserved world name, meant for stats that do not pertain to a world. The second case is "__imported__", this is a reserved world for stats that have been imported from an older version of BeardStat before per world storage was implemented.
While not intended, you can use the world id for a unique area that is not a whole world (Going back to our pvp arena example, you could use the arena names instead, such as old_forge, broken_bow instead of a world name)
Current plugins that are known to integrate BeardStat: * BeardAch - Achievements plugin * SimpleSpleef Evolution
Metrics
BeardStat includes the plugin metrics code developed by Hidendra (author of LWC), which collects anonymous information about the plugins deployment (minecraft, server, plugin version, assumed server location at country level and database type used by BeardStat, aggregated into graph form.) More information on this system, including how to disable it can be found here
-
View User Profile
-
Send Message
Posted May 6, 2012@Annihlator
1. The worlds list in config.yml is a blacklist (worlds not to track), not a whitelist, if you've put worlds you want to track stats on in there, take them out and reboot bukkit :).
2. The error is related a timeout issue with the connection, one that I had fixed. What that error is saying is that the server and plugin have not talked for 12 hours (such as when players are not on an "online" server for that time) and disconnected from the database. This confuses me though, since the plugin is designed to call back to the sql database every two minutes, and even if there is no data that has to be stored, it calls a keep alive query (asking how many rows are in the table). With your server being on localhost that confuses me further (it cannot therefore be a flaky network).
I've added this a few items to the issues tracker, so the next release will have non-coder friendly error messages above the stack traces.
-
View User Profile
-
Send Message
Posted May 6, 20121.2.5 R1.0 :
Seems to not log block destroys, placement, walking distance.
actually doesnt seem to log anything anymore except from login time, login amount, times "hit the air", monsters killed.
Also get alot of error output on the console, like:
2012-05-06 13:39:56 [SEVERE] com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 45,452,622 milliseconds ago. The last packet sent successfully to the server was 6 milliseconds ago. 2012-05-06 13:39:56 [SEVERE] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 2012-05-06 13:39:56 [SEVERE] at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 2012-05-06 13:39:56 [SEVERE] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 2012-05-06 13:39:56 [SEVERE] at java.lang.reflect.Constructor.newInstance(Unknown Source) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.Util.handleNewInstance(Util.java:407) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3082) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2968) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3516) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2273) 2012-05-06 13:39:56 [SEVERE] at me.tehbeard.BeardAch.dataSource.SqlDataSource.getPlayersAchievements(SqlDataSource.java:141) 2012-05-06 13:39:56 [SEVERE] at me.tehbeard.BeardAch.achievement.AchievementManager.loadPlayersAchievements(AchievementManager.java:105) 2012-05-06 13:39:56 [SEVERE] at me.tehbeard.BeardAch.achievement.AchListener.onPlayerJoin(AchListener.java:39) 2012-05-06 13:39:56 [SEVERE] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 2012-05-06 13:39:56 [SEVERE] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 2012-05-06 13:39:56 [SEVERE] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 2012-05-06 13:39:56 [SEVERE] at java.lang.reflect.Method.invoke(Unknown Source) 2012-05-06 13:39:56 [SEVERE] at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:301) 2012-05-06 13:39:56 [SEVERE] at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) 2012-05-06 13:39:56 [SEVERE] at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:459) 2012-05-06 13:39:56 [SEVERE] at net.minecraft.server.ServerConfigurationManager.c(ServerConfigurationManager.java:132) 2012-05-06 13:39:56 [SEVERE] at net.minecraft.server.NetLoginHandler.b(NetLoginHandler.java:129) 2012-05-06 13:39:56 [SEVERE] at net.minecraft.server.NetLoginHandler.a(NetLoginHandler.java:41) 2012-05-06 13:39:56 [SEVERE] at net.minecraft.server.NetworkListenThread.a(NetworkListenThread.java:61) 2012-05-06 13:39:56 [SEVERE] at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:551) 2012-05-06 13:39:56 [SEVERE] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:449) 2012-05-06 13:39:56 [SEVERE] at net.minecraft.server.ThreadServerApplication.run(SourceFile:492) 2012-05-06 13:39:56 [SEVERE] Caused by: java.net.SocketException: Software caused connection abort: recv failed 2012-05-06 13:39:56 [SEVERE] at java.net.SocketInputStream.socketRead0(Native Method) 2012-05-06 13:39:56 [SEVERE] at java.net.SocketInputStream.read(Unknown Source) 2012-05-06 13:39:56 [SEVERE] at java.net.SocketInputStream.read(Unknown Source) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2526) 2012-05-06 13:39:56 [SEVERE] at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2979) 2012-05-06 13:39:56 [SEVERE] ... 24 more
Is there any update planned? not sure what these errors come from, but the database seems to function fine otherwise (is a mysql database on localhost)
-
View User Profile
-
Send Message
Posted May 3, 2012Can we had a WEB-BASED reader ?
-
View User Profile
-
Send Message
Posted Apr 29, 2012@dieprogamer
mysql not sql :)
-
View User Profile
-
Send Message
Posted Apr 29, 2012Hi, I think that´s the Plugin I searched for, but I have some Errors. Here they are:
I think I have the correct information in my configs, but I write it down:
-
View User Profile
-
Send Message
Posted Apr 28, 2012@Tehbeard
That is a good idea, confused me too for a while.
-
View User Profile
-
Send Message
Posted Apr 26, 2012SimpleSpleef will support beardstat in the next build :-)
-
View User Profile
-
Send Message
Posted Apr 26, 2012@Doctacosa
That is how it's designed to work (mysql does the same thing insert if not there or update and set to new value). PlayerStatManager caches the data inside bukkit.
I'm going to have a look into how the File storage is running, see if it's a logic bug somewhere.
-
View User Profile
-
Send Message
Posted Apr 25, 2012Still on this...
My configuration is set to store the stats in YAML format. Looking at FlatFileStatDataProvider.java, in the method pushPlayerStatBlob(), I see that the player's stats are pushed for saving. However, if I'm reading this right while comparing to the MySQL version, it looks like the existing data isn't read before we write the new values. As such, every time that a new cache of data is saved to the flatfile DB, we overwrite whatever stats had been gathered previously for that player.
Anyone care to confirm this?
-
View User Profile
-
Send Message
Posted Apr 21, 2012@psirusa
Which bukkit build are you on?
-
View User Profile
-
Send Message
Posted Apr 21, 2012Distance traveled in a minecart doesn't seem to function quite as intended. I think it registers as walking....
Other than that, great plugin!
-
View User Profile
-
Send Message
Posted Apr 11, 2012@Doctacosa
Anyone has a clue on my problem? The stats aren't reset globally everyday as I believed, it's a by-user thing. People who haven't logged in for two weeks still have their stats in there, while my own numbers include only my last play session. Some players, who disconnect and reconnect often within a single day, have a stats-login value up to 5 so the wipe doesn't happen on each login.
I'd rather get this fixed than start coding my own plugin... :-/
-
View User Profile
-
Send Message
Posted Apr 10, 2012@jdastrup
Sorry, a debug message left over from getting crafting stats working.
it's fixed in the next release. No eta on that due to exams and such :(
-
View User Profile
-
Send Message
Posted Apr 6, 2012I get unknown messages in my console after enabling this. For example:
2012-04-06 13:29:12 [INFO] ItemStack{IRON_INGOT x 9}
Is there anyway to turn these messages off?
-
View User Profile
-
Send Message
Posted Apr 4, 2012Started using this on our server and its working great so far! Also using the webstats on our site.
Keep up the great work, I can't wait for the achievements web page. :)
-
View User Profile
-
Send Message
Posted Apr 3, 20121. Awesome plugin. 2. Update to 1.2.4-R1.0? Or will the R0.2 version work... 3. Thanks for the Conversation API tutorial, it's amazing :D 4. Hey @furdabip.
-
View User Profile
-
Send Message
Posted Apr 3, 2012I installed this two weeks ago for an upcoming project of mine, and let it run it's course since.
Looking today at the stats it compiled so far, the numbers are surprisingly low. It looks like only the stats from my last play session (or possibly the last 24 hours hours) are kept. For example, I login pretty much daily, yet my "stats-login" value is set to 1.
Is there a problem with my setup, or am I missing something obvious here?
-
View User Profile
-
Send Message
Posted Mar 31, 2012@rbos
tbf, that part was coded while drunk :P I'll be changing it around for next release to something more sane.
-
View User Profile
-
Send Message
Posted Mar 31, 2012edit: going through comments.
Seriously? you called your blacklist 'worlds'? :)
-
View User Profile
-
Send Message
Posted Mar 31, 2012I don't see anything like a blacklist in the config file.