/** * Gets whether the collection contains a message with the given ID. * * @param id The ID to search for. * @return Whether the collection contains a message with the given ID. */ public boolean contains(long id) { return Arrays.stream(backing) .anyMatch(msg -> msg.getLongID() == id); }
/** * Gets a message by its unique snowflake ID. * * @param id The ID of the desired role. * @return The message with the provided ID (or null if one was not found). */ public IMessage get(long id) { return Arrays.stream(backing) .filter(msg -> msg.getLongID() == id) .findFirst() .orElse(null); }
public MessageEvent(IMessage message) { super(message.getChannel()); this.message = message; this.messageID = message.getLongID(); }
@Override public MessageHistory getMessageHistoryIn(long beginID, long endID, int maxCount) { final List<IMessage> history = new ArrayList<>(); final int originalMaxCount = maxCount; // Adds 1L so beginID will be included long previousMessageID = beginID + 1L; int added = -1; while ((history.size() < originalMaxCount) && (added != 0)) { maxCount = originalMaxCount - history.size(); final int chunkSize = (maxCount < MESSAGE_CHUNK_COUNT) ? maxCount : MESSAGE_CHUNK_COUNT; final IMessage[] chunk = getHistory(previousMessageID, chunkSize); added = 0; for (final IMessage message : chunk) { if (message.getLongID() >= endID) { // We want to EXCLUDE previous messages later previousMessageID = message.getLongID() - 1L; history.add(message); added++; } else { // We don't need anything else return new MessageHistory(history); } } } return new MessageHistory(history); }
@Override public IMessage getMessageByID(long id) { IMessage message = channels.stream() .map(IChannel::getMessageHistory) .flatMap(List::stream) .filter(msg -> msg.getLongID() == id) .findAny().orElse(null); if (message == null) { Collection<IChannel> toCheck = channels.stream() .filter(it -> { EnumSet<Permissions> perms = it.getModifiedPermissions(client.getOurUser()); return perms.contains(Permissions.READ_MESSAGE_HISTORY) && perms.contains(Permissions.READ_MESSAGES); }) .collect(Collectors.toSet()); for (IChannel channel : toCheck) { message = channel.getMessageByID(id); if (message != null) return message; } } return message; }
@Override public MessageHistory getMessageHistory(int messageCount) { if (messageCount <= messages.size()) { // we already have all of the wanted messages in the cache return new MessageHistory(messages.values().stream() .sorted(new MessageComparator(true)) .limit(messageCount) .collect(Collectors.toList())); } else { List<IMessage> retrieved = new ArrayList<>(messageCount); AtomicLong lastMessage = new AtomicLong(DiscordUtils.getSnowflakeFromTimestamp(Instant.now())); int chunkSize = messageCount < MESSAGE_CHUNK_COUNT ? messageCount : MESSAGE_CHUNK_COUNT; while (retrieved.size() < messageCount) { // while we dont have messageCount messages IMessage[] chunk = getHistory(lastMessage.get(), chunkSize); if (chunk.length == 0) break; lastMessage.set(chunk[chunk.length - 1].getLongID()); Collections.addAll(retrieved, chunk); } return new MessageHistory(retrieved.size() > messageCount ? retrieved.subList(0, messageCount) : retrieved); } }
@Override public List<IMessage> bulkDelete(List<IMessage> messages) { PermissionUtils.requirePermissions(this, client.getOurUser(), Permissions.MANAGE_MESSAGES); if (isPrivate()) throw new UnsupportedOperationException("Cannot bulk delete in private channels!"); if (messages.size() == 1) { //Skip further processing if only one message was provided messages.get(0).delete(); return messages; } List<IMessage> toDelete = messages.stream() .filter(msg -> msg.getLongID() >= (((System.currentTimeMillis() - 14 * 24 * 60 * 60 * 1000) - 1420070400000L) << 22)) // Taken from Jake .distinct() .collect(Collectors.toList()); if (toDelete.size() < 1) throw new DiscordException("Must provide at least 1 valid message to delete."); if (toDelete.size() == 1) { //Bulk delete is no longer valid, time for normal delete. toDelete.get(0).delete(); return toDelete; } else if (toDelete.size() > 100) { //Above the max limit, time to create a sublist Discord4J.LOGGER.warn(LogMarkers.HANDLE, "More than 100 messages requested to be bulk deleted! Bulk deleting only the first 100..."); toDelete = toDelete.subList(0, 100); } client.REQUESTS.POST.makeRequest( DiscordEndpoints.CHANNELS + id + "/messages/bulk-delete", new BulkDeleteRequest(toDelete)); return toDelete; }