This has a potential problem with BlockCommandSenders (named command blocks) in conjunction with the getSourceAsOfflinePlayer() method. If I have a command block renamed to "Riking" that will ban the nearest player and McDerp triggers it, getSourceAsOfflinePlayer will make it appear as if I did it; similarly, if it was renamed to "CONSOLE", it would appear as if the console did it to the API. We need to think more about how this is being stored.