/** Creates tables if they do not exist. */ private void initializeTables() { Connection conn = null; Statement statement = null; try { conn = retrieveConnection(); statement = conn.createStatement(); statement.setQueryTimeout(30); // One table holding the playername id relation String playerQuery = String.format( "CREATE TABLE IF NOT EXISTS %s (id INTEGER PRIMARY KEY AUTOINCREMENT, %s STRING)", playerTable, "name"); statement.executeUpdate(playerQuery); // One column for every message StringBuilder columns = new StringBuilder(); for (MessageNode node : MessageNode.getMessageNodes()) { MsgCategory cat = messages.getCat(node); if (node.getColumnName() != null && (cat == MsgCategory.TUTORIAL || cat == MsgCategory.ONE_TIME)) { columns.append(','); columns.append(node.getColumnName()); } } String msgQuery = String.format( "CREATE TABLE IF NOT EXISTS %s (id INTEGER PRIMARY KEY UNIQUE %s)", msgTable, columns); statement.executeUpdate(msgQuery); // Check if all columns are present DatabaseMetaData dmd = conn.getMetaData(); // Add missing columns for (MessageNode node : MessageNode.getMessageNodes()) { MsgCategory cat = messages.getCat(node); if (cat == MsgCategory.TUTORIAL || cat == MsgCategory.ONE_TIME) { ResultSet set = dmd.getColumns(null, null, msgTable, node.getColumnName()); if (!set.next()) { String updateQuery = String.format("ALTER TABLE %s ADD COLUMN %s", msgTable, node.getColumnName()); statement.executeUpdate(updateQuery); } } } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (conn != null) conn.close(); if (statement != null) statement.close(); } catch (SQLException e) { e.printStackTrace(); } } }
/** * Send the player an informative message to explain what he's doing wrong. Play an optional sound * aswell * * <p> * * @param player to send msg to * @param perm permission to silence the message * @param sound errorsound to play after the event got cancelled * @param soundPitch 20-35 is good */ public void send( Player player, MessageNode node, PermissionNode perm, Sound sound, float soundPitch) { if (!player.hasPermission(perm.getNode())) { send(player, node, messages.getString(node)); if (sound != null) player.playSound(player.getLocation(), sound, 1, soundPitch); } }
private void send(Player player, MessageNode node, String message) { switch (messages.getCat(node)) { case NOTIFICATION: if (player == null) { plugin.getLogger().warning("Could not send the following message: " + message); } else { // FEATURE: don't spam messages PlayerData playerData = plugin.getModuleForClass(DataStoreModule.class).getPlayerData(player.getName()); long now = Calendar.getInstance().getTimeInMillis(); if (!node.equals(playerData.lastMessageSent) || now - playerData.lastMessageTimestamp > 30000) { if (popupsAreEnabled(MsgCategory.NOTIFICATION)) sendPopup(player, MsgCategory.NOTIFICATION, message); else player.sendMessage(message); playerData.lastMessageSent = node; playerData.lastMessageTimestamp = now; } } break; case TUTORIAL: Validate.notNull(player); if (persistModule.getCountFor(node, player.getName()) < messages.getMsgCount(node)) { long now = Calendar.getInstance().getTimeInMillis(); if (!timeouts.contains(player.getName(), node) || now - timeouts.get(player.getName(), node) > 120000) // only if contains { timeouts.put(player.getName(), node, now); String msgText = messages.getString(node); if (manager != null) sendPopup(player, MsgCategory.TUTORIAL, msgText); else player.sendMessage( ChatColor.DARK_RED + plugin.getTag() + ChatColor.WHITE + " " + msgText); persistModule.increment(node, player.getName()); } } else timeouts.remove(player, message); break; case BROADCAST: plugin.getServer().broadcastMessage(message); break; default: throw new UnsupportedOperationException(messages.getCat(node) + " not implemented"); } }
/** * Are popops enabled * * @return if popupmanager is loaded */ public boolean popupsAreEnabled(MsgCategory category) { if (messages.getBoolean(MessageNode.SB_MSG_ENABLE)) switch (category.getSubcategory() != null ? category.getSubcategory() : category) // Some messages might inherit from another MsgCategory { case TUTORIAL: return messages.getBoolean(MessageNode.SB_MSG_TUTORIAL); case NOTIFICATION: return messages.getBoolean(MessageNode.SB_MSG_NOTIFICATION); case BROADCAST: return messages.getBoolean(MessageNode.SB_MSG_BROADCAST); default: return false; } return false; }
/** * Sends a message with variables which will be inserted in the specified areas * * @param player Player to send the message to * @param message to send */ public void send(Player player, MessageNode message, FindAndReplace... fars) { String msgText = messages.getString(message); for (FindAndReplace far : fars) { /* Replace the placeholder with the actual value */ msgText = far.replace(msgText); } send(player, message, msgText); }
/** * Send a short message using SbPopupAPI * * @param player player to send the message to * @param category type defines the length color for consistency * @param message text to display */ public void sendPopup(Player player, MsgCategory category, String message) { if (popupsAreEnabled(category)) { int length; ChatColor titleColor; ChatColor textColor; String titleText = messages.getString(MessageNode.SB_MSG_TITLE); if (messages.getBoolean(MessageNode.SB_MSG_REMOVE_COLOR)) message = ChatColor.stripColor(message); switch (category) { case BROADCAST: length = messages.getInt(MessageNode.SB_MSG_BROADCAST_LEN); titleColor = null; textColor = messages.getColor(MessageNode.SB_MSG_BROADCAST_TEXT_CLR); break; case ONE_TIME: case NOTIFICATION: length = messages.getInt(MessageNode.SB_MSG_NOTIFICATION_LEN); titleColor = null; textColor = messages.getColor(MessageNode.SB_MSG_NOTIFICATION_TEXT_CLR); break; case TUTORIAL: length = messages.getInt(MessageNode.SB_MSG_TUTORIAL_LEN); titleColor = null; textColor = messages.getColor(MessageNode.SB_MSG_TUTORIAL_TEXT_CLR); break; case DISABLED: default: length = 0; titleColor = null; textColor = null; } manager.showPopup( player.getName(), category.getUniqueIdentifier(), length, titleColor, textColor, titleText, message); } }
/** * Send a short message using SbPopupAPI * * @param player player to send the message to * @param category type defines the length color for consistency * @param message text already seperated into lines */ public void sendPopup(Player player, MsgCategory category, List<String> message) { sendPopup(player, category, message, messages.getBoolean(MessageNode.SB_MSG_REMOVE_COLOR)); }
/** * Send a message to a Player. * * @param player to send the message to * @param node message, gets loaded from the config */ public void send(Player player, MessageNode node) { send(player, node, messages.getString(node)); }