use of net.dv8tion.jda.api.entities.Message.Attachment in project ExciteBot by TheGameCommunity.
the class ArchiveCommand method archive.
private static int archive(MessageContext source, String argument) {
if (source.isAdmin()) {
if (source.isGuildMessage()) {
if (argument.isEmpty()) {
source.sendMessage("Usage: archive <TextChannels>");
return 1;
}
DiscordServer server = source.getServer();
Guild guild = server.getGuild();
Member member = DiscordUser.getMember(source.getDiscordAuthor(), server);
HashSet<TextChannel> channelsToArchive = getChannels(source, guild, Arrays.asList(argument.split(" ")));
for (TextChannel channel : channelsToArchive) {
if (!member.hasPermission(channel, Permission.MANAGE_CHANNEL, Permission.MESSAGE_MANAGE)) {
source.sendMessage("You must have the `MANAGE_CHANNEL` and `MESSAGE_MANAGE` permission in " + channel.getAsMention() + " in order to archive it.");
return 1;
}
}
Thread workerThread = ThreadService.run("Archiver thread", new Thread() {
private final Thread workerThread = this;
private final int newlineSize = System.lineSeparator().length();
public volatile WorkerStatus status = NOT_STARTED;
public volatile byte updates = 0;
public volatile int messagesArchived = 0;
public volatile int wiiMessagesArchived = 0;
public volatile int attachmentsArchived = 0;
public volatile long estimatedSize = 0;
private volatile Throwable error;
@Override
public void run() {
Thread monitorThread = ThreadService.run("Archive monitor", new Thread() {
public void run() {
Instant start = Instant.now();
EmbedBuilder embed = new EmbedBuilder();
embed.setTitle("Archive in progress...");
Field archivedDiscordMessagesField = new Field("Discord Messages archived:", "0", true, true);
Field archivedDiscordAttachmentsField = new Field("Discord Attachments archived:", "0", true, true);
Field emailsArchivedField = new Field("Wii Mails archived:", "0", true, true);
Field estimatedSizeField = new Field("Estimated size:", FileUtils.humanReadableByteCount(0), true, true);
Field timeElapsedField = new Field("Time elapsed:", "0 seconds", true, true);
embed.setTimestamp(start);
WorkerStatus currentStatus = status;
embed.addField(archivedDiscordMessagesField);
embed.addField(archivedDiscordAttachmentsField);
embed.addField(emailsArchivedField);
embed.addField(estimatedSizeField);
embed.addField(timeElapsedField);
Message message = source.sendMessage(embed.build());
while (!currentStatus.finished()) {
try {
Thread.sleep(2500);
currentStatus = status;
Instant now = Instant.now();
embed = new EmbedBuilder();
if (currentStatus == NOT_STARTED) {
embed.setColor(Color.DARK_GRAY);
}
if (currentStatus == WORKING) {
if (updates++ % 2 == 0) {
embed.setColor(Color.YELLOW);
} else {
// dark yellow
embed.setColor(new Color(204, 204, 0));
}
embed.setTitle("Archive in progress...");
embed.addField(archivedDiscordMessagesField = new Field("Discord Messages archived:", messagesArchived + "", true, true));
embed.addField(archivedDiscordAttachmentsField = new Field("Discord Attachments archived:", attachmentsArchived + "", true, true));
embed.addField(emailsArchivedField = new Field("Wii Messages archived:", wiiMessagesArchived + "", true, true));
embed.addField(estimatedSizeField = new Field("Estimated size:", FileUtils.humanReadableByteCount(estimatedSize), true, true));
embed.addField(timeElapsedField = new Field("Time elapsed:", TimeUtils.readableDuration(Duration.between(start, now)), true, true));
embed.setTimestamp(now);
message.editMessage(embed.build()).complete();
}
Thread.sleep(2500);
} catch (InterruptedException e) {
currentStatus = ERRORED;
embed.setTitle("Archive failed");
embed.setColor(Color.RED);
message.editMessage(embed.build()).complete();
System.out.println("Monitor thread interrupted... stopping!");
return;
}
}
Instant now = Instant.now();
embed.addField(archivedDiscordMessagesField = new Field("Discord Messages archived:", messagesArchived + "", true, true));
embed.addField(archivedDiscordAttachmentsField = new Field("Discord Attachments archived:", attachmentsArchived + "", true, true));
embed.addField(emailsArchivedField = new Field("Wii Messages archived:", wiiMessagesArchived + "", true, true));
embed.addField(estimatedSizeField = new Field("Estimated size:", FileUtils.humanReadableByteCount(estimatedSize), true, true));
embed.addField(timeElapsedField = new Field("Time elapsed:", TimeUtils.readableDuration(Duration.between(start, now)), true, true));
embed.setTimestamp(now);
message.editMessage(embed.build()).complete();
if (currentStatus == COMPLETE) {
embed.setColor(Color.GREEN);
embed.setTitle("Archive complete");
source.sendMessage(source.getDiscordAuthor().getJDAUser().getAsMention() + " Archive complete.");
} else {
embed.setColor(Color.RED);
embed.setTitle("Archive failed");
source.sendMessage(source.getDiscordAuthor().getJDAUser().getAsMention() + " Archive FAILED.");
}
message.editMessage(embed.build()).complete();
}
});
String date = TimeUtils.getDBDate(Instant.now());
try {
status = WORKING;
for (File f : org.apache.commons.io.FileUtils.listFiles(Mailbox.MAILBOX, null, true)) {
File archive = new File(".archive/" + date + "/" + f.getPath().replace("/run", ""));
if (!archive.getParentFile().mkdirs() && !archive.getParentFile().exists()) {
throw new IOException("Could not create " + archive.getAbsolutePath());
}
org.apache.commons.io.FileUtils.copyFile(f, archive);
wiiMessagesArchived++;
estimatedSize += archive.length();
}
for (TextChannel channel : channelsToArchive) {
try {
File file = new File(".archive/" + date + "/" + channel.getName() + "/" + channel.getName() + ".arc");
if (!file.getParentFile().mkdirs()) {
throw new IOException("Could not create " + file.getAbsolutePath());
}
System.out.println(file.getAbsolutePath());
file.createNewFile();
MessagePaginationAction action = channel.getIterableHistory();
BufferedWriter fileWriter = new BufferedWriter(new FileWriter(file));
action.forEach((message) -> {
try {
List<Attachment> attachments = message.getAttachments();
write(fileWriter, "==========START " + message.getIdLong() + " USER:" + message.getAuthor().getAsTag());
write(fileWriter, message.getContentRaw());
if (!attachments.isEmpty()) {
write(fileWriter, "==========ATTACHMENTS " + message.getIdLong());
for (Attachment attachment : attachments) {
File attachmentFile = new File(file.getParentFile().getPath() + "/attach" + attachment.getIdLong() + attachment.getFileName());
CompletableFuture<File> future = attachment.downloadToFile(attachmentFile);
future.exceptionally(error -> {
int i = 0;
source.sendMessage("Encountered " + error.getClass().getSimpleName() + " while downloading " + attachmentFile + " retrying... (" + i++ + "/4)");
while (i < 4) {
try {
future.get();
i++;
} catch (Throwable t) {
if (t instanceof InterruptedException) {
throw new ThreadDeath();
}
if (i < 4) {
source.sendMessage("Encountered " + t.getClass().getSimpleName() + " while downloading " + attachmentFile + " retrying... (" + i + "/4)");
}
}
}
return null;
}).get();
write(fileWriter, attachment.getId() + attachmentFile.getName());
estimatedSize += attachment.getSize();
attachmentsArchived++;
}
}
write(fileWriter, "==========END " + message.getIdLong());
messagesArchived++;
} catch (IOException | InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
});
fileWriter.close();
} catch (Throwable t) {
source.sendMessage("Could not back up channel " + channel.getAsMention());
throw t;
}
}
status = COMPLETE;
} catch (Throwable t) {
source.sendMessage(StacktraceUtil.getStackTrace(t));
status = ERRORED;
}
}
private void write(BufferedWriter writer, String text) throws IOException {
estimatedSize += text.length() + newlineSize;
writer.write(text);
writer.newLine();
}
});
} else {
source.sendMessage("You must execute this command in a server");
}
} else {
source.sendMessage("You must be an administator to execute this command");
}
return 1;
}
use of net.dv8tion.jda.api.entities.Message.Attachment in project Factorio-FBSR by demodude4u.
the class BlueprintBotDiscordService method handleBlueprintUpgradeBeltsCommand.
private void handleBlueprintUpgradeBeltsCommand(SlashCommandEvent event) {
String content = event.getCommandString();
Optional<Attachment> attachment = event.optParamAttachment("file");
if (attachment.isPresent()) {
content += " " + attachment.get().getUrl();
}
List<BlueprintStringData> blueprintStringDatas = BlueprintFinder.search(content, event.getReporting());
int upgradedCount = 0;
for (BlueprintStringData blueprintStringData : blueprintStringDatas) {
for (Blueprint blueprint : blueprintStringData.getBlueprints()) {
for (BlueprintEntity blueprintEntity : blueprint.getEntities()) {
String upgradeName = upgradeBeltsEntityMapping.get(blueprintEntity.getName());
if (upgradeName != null) {
blueprintEntity.json().put("name", upgradeName);
upgradedCount++;
}
}
}
}
if (upgradedCount > 0) {
for (BlueprintStringData blueprintStringData : blueprintStringDatas) {
try {
event.replyFile(BlueprintStringData.encode(blueprintStringData.json()).getBytes(), "blueprint.txt");
} catch (IOException e) {
event.getReporting().addException(e);
}
}
event.reply("Upgraded " + upgradedCount + " entities.");
} else if (blueprintStringDatas.stream().anyMatch(d -> !d.getBlueprints().isEmpty())) {
event.replyIfNoException("I couldn't find anything to upgrade!");
} else {
event.replyIfNoException("No blueprint found!");
}
}
use of net.dv8tion.jda.api.entities.Message.Attachment in project Factorio-FBSR by demodude4u.
the class BlueprintBotDiscordService method handleBlueprintTotalsCommand.
private void handleBlueprintTotalsCommand(SlashCommandEvent event) {
DataTable table;
try {
table = FactorioData.getTable();
} catch (JSONException | IOException e1) {
throw new InternalError(e1);
}
String content = event.getCommandString();
Optional<Attachment> attachment = event.optParamAttachment("file");
if (attachment.isPresent()) {
content += " " + attachment.get().getUrl();
}
List<BlueprintStringData> blueprintStringDatas = BlueprintFinder.search(content, event.getReporting());
Map<String, Double> totalItems = new LinkedHashMap<>();
for (BlueprintStringData blueprintStringData : blueprintStringDatas) {
for (Blueprint blueprint : blueprintStringData.getBlueprints()) {
Map<String, Double> items = FBSR.generateSummedTotalItems(table, blueprint);
items.forEach((k, v) -> {
totalItems.compute(k, ($, old) -> old == null ? v : old + v);
});
}
}
if (!totalItems.isEmpty()) {
String responseContent = totalItems.entrySet().stream().sorted((e1, e2) -> e1.getKey().compareTo(e2.getKey())).map(e -> e.getKey() + ": " + RenderUtils.fmtDouble2(e.getValue())).collect(Collectors.joining("\n"));
String response = "```ldif\n" + responseContent + "```";
if (response.length() < 2000) {
event.reply(response);
} else {
event.replyFile(responseContent.getBytes(), "totals.txt");
}
} else if (blueprintStringDatas.stream().anyMatch(d -> !d.getBlueprints().isEmpty())) {
event.replyIfNoException("I couldn't find any items!");
} else {
event.replyIfNoException("No blueprint found!");
}
}
use of net.dv8tion.jda.api.entities.Message.Attachment in project Factorio-FBSR by demodude4u.
the class BlueprintBotDiscordService method handleBlueprintBookExtractCommand.
private void handleBlueprintBookExtractCommand(SlashCommandEvent event) {
String content = event.getCommandString();
Optional<Attachment> attachment = event.optParamAttachment("file");
if (attachment.isPresent()) {
content += " " + attachment.get().getUrl();
}
List<BlueprintStringData> blueprintStringDatas = BlueprintFinder.search(content, event.getReporting());
List<Blueprint> blueprints = blueprintStringDatas.stream().flatMap(bs -> bs.getBlueprints().stream()).collect(Collectors.toList());
List<Entry<String, String>> links = new ArrayList<>();
for (Blueprint blueprint : blueprints) {
try {
blueprint.json().remove("index");
String url = WebUtils.uploadToHostingService("blueprint.txt", BlueprintStringData.encode(blueprint.json()).getBytes());
links.add(new SimpleEntry<>(url, blueprint.getLabel().orElse(null)));
} catch (Exception e) {
event.getReporting().addException(e);
}
}
List<EmbedBuilder> embedBuilders = new ArrayList<>();
if (!links.isEmpty()) {
ArrayDeque<String> lines = links.stream().map(p -> (p.getValue() != null && !p.getValue().isEmpty()) ? ("[" + p.getValue() + "](" + p.getKey() + ")") : p.getKey()).collect(Collectors.toCollection(ArrayDeque::new));
while (!lines.isEmpty()) {
EmbedBuilder builder = new EmbedBuilder();
StringBuilder description = new StringBuilder();
while (!lines.isEmpty()) {
if (description.length() + lines.peek().length() + 1 < MessageEmbed.DESCRIPTION_MAX_LENGTH) {
description.append(lines.pop()).append('\n');
} else {
break;
}
}
builder.setDescription(description);
embedBuilders.add(builder);
}
} else {
embedBuilders.add(new EmbedBuilder().setDescription("Blueprint not found!"));
}
List<MessageEmbed> embeds = embedBuilders.stream().map(EmbedBuilder::build).collect(Collectors.toList());
for (MessageEmbed embed : embeds) {
event.replyEmbed(embed);
}
}
use of net.dv8tion.jda.api.entities.Message.Attachment in project SkyBot by duncte123.
the class ImageCommandBase method tryGetAttachment.
@Nullable
private String tryGetAttachment(CommandContext ctx) {
final Attachment attachment = ctx.getMessage().getAttachments().get(0);
final File file = new File(attachment.getFileName());
String mimetype = null;
try {
mimetype = Files.probeContentType(file.toPath());
} catch (IOException e) {
e.printStackTrace();
}
// if (mimetype == null || !mimetype.split("/")[0].equals("image")) {
if (mimetype == null || !mimetype.startsWith("image/")) {
sendMsg(ctx, "That file does not look like an image");
return null;
}
return attachment.getUrl();
}
Aggregations