1
0
mirror of https://github.com/aNNiMON/ffmpegbot synced 2024-09-19 22:54:20 +03:00

Switch prev/next buttons with selectable parameters

This commit is contained in:
aNNiMON 2023-10-19 20:19:57 +03:00
parent 92c036267a
commit dec332cab5
13 changed files with 119 additions and 90 deletions

View File

@ -1,9 +1,7 @@
package com.annimon.ffmpegbot.commands.ffmpeg;
public final class CallbackQueryCommands {
public static final String PREV = "prev";
public static final String NEXT = "next";
public static final String DETAIL = "detail";
public static final String PARAMETER = "p";
public static final String PROCESS = "process";
public static final String YTDLP_START = "ytdlp_start";
public static final String YTDLP_INFO = "ytdlp_info";

View File

@ -23,7 +23,6 @@ import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import static com.annimon.ffmpegbot.Permissions.ALLOWED_USERS;
import static com.annimon.ffmpegbot.commands.ffmpeg.CallbackQueryCommands.*;
@ -43,9 +42,7 @@ public class MediaProcessingBundle implements CommandBundle<For> {
@Override
public void register(@NotNull CommandRegistry commands) {
commands.register(new SimpleCallbackQueryCommand(PREV, ALLOWED_USERS, ctx -> toggleParameter(ctx, true)));
commands.register(new SimpleCallbackQueryCommand(NEXT, ALLOWED_USERS, ctx -> toggleParameter(ctx, false)));
commands.register(new SimpleCallbackQueryCommand(DETAIL, ALLOWED_USERS, sessionCommand(this::details)));
commands.register(new SimpleCallbackQueryCommand(PARAMETER, ALLOWED_USERS, sessionCommand(this::parameter)));
commands.register(new SimpleCallbackQueryCommand(PROCESS, ALLOWED_USERS, sessionCommand(this::process)));
}
@ -76,38 +73,26 @@ public class MediaProcessingBundle implements CommandBundle<For> {
.call(sender);
}
private void toggleParameter(final CallbackQueryContext ctx, final boolean toLeft) {
final var msg = ctx.message();
if (msg == null) return;
private void parameter(final CallbackQueryContext ctx, final MediaSession session) {
if (ctx.argumentsLength() == 0) {
session.setSelectedParam(null);
} else {
final String id = ctx.argument(0);
final var param = session.getParams().stream()
.filter(p -> p.getId().equals(id))
.findFirst().orElse(null);
final var session = sessions.getMediaSession(msg.getChatId(), msg.getMessageId());
if (session == null) return;
session.setSelectedParam(param);
final String id = ctx.argument(0);
final var parameters = session.getParams().stream()
.filter(p -> p.getId().equals(id))
.collect(Collectors.toSet());
if (parameters.isEmpty()) return;
for (Parameter<?> param : parameters) {
if (toLeft) {
param.toggleLeft();
} else {
param.toggleRight();
if (param != null && ctx.argumentsLength() == 2) {
final int index = Integer.parseInt(ctx.argument(1));
param.select(index);
session.setSelectedParam(null);
}
}
editMessage(ctx, session);
}
private void details(final CallbackQueryContext ctx, final MediaSession session) {
final String id = ctx.argument(0);
session.getParams().stream()
.filter(p -> p.getId().equals(id))
.findFirst()
.ifPresent(p ->
ctx.answerAsAlert(p.describe()).callAsync(ctx.sender));
}
private void process(final CallbackQueryContext ctx, final MediaSession session) {
if (!session.isDownloaded()) {
sendAction(ctx, session);

View File

@ -7,25 +7,63 @@ import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMa
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static com.annimon.ffmpegbot.commands.ffmpeg.CallbackQueryCommands.*;
public class MediaProcessingKeyboard {
private static final int BUTTON_COLUMNS = 2;
public static InlineKeyboardMarkup createKeyboard(MediaSession session) {
final var selectedParam = session.getSelectedParam();
if (selectedParam != null) {
return createParamKeyboard(selectedParam);
} else {
return createParamsListKeyboard(session.getParams());
}
}
private static InlineKeyboardMarkup createParamsListKeyboard(List<Parameter<?>> params) {
final var keyboard = new ArrayList<List<InlineKeyboardButton>>();
for (Parameter<?> param : session.getParams()) {
final String paramId = param.getId();
keyboard.add(List.of(
inlineKeyboardButton("<", callbackData(PREV, paramId)),
inlineKeyboardButton(param.describe(), callbackData(DETAIL, paramId)),
inlineKeyboardButton(">", callbackData(NEXT, paramId))
));
final var it = params.iterator();
while (it.hasNext()) {
final var row = new ArrayList<InlineKeyboardButton>();
for (int i = 0; i < BUTTON_COLUMNS; i++) {
if (it.hasNext()) {
final var param = it.next();
final String paramId = param.getId();
row.add(inlineKeyboardButton(param.describe(), callbackData(PARAMETER, paramId)));
}
}
keyboard.add(row);
}
keyboard.add(List.of(inlineKeyboardButton("Process", callbackData(PROCESS))));
return new InlineKeyboardMarkup(keyboard);
}
private static InlineKeyboardMarkup createParamKeyboard(Parameter<?> param) {
final var keyboard = new ArrayList<List<InlineKeyboardButton>>();
final String paramId = param.getId();
final int maxSize = param.getPossibleValuesSize();
int index = 0;
while (index < maxSize) {
final var row = new ArrayList<InlineKeyboardButton>();
for (int i = 0; i < BUTTON_COLUMNS; i++) {
if (index < maxSize) {
String value = param.describeValueByIndex(index);
row.add(inlineKeyboardButton(value, callbackData(PARAMETER, callbackParams(paramId, index))));
index++;
}
}
keyboard.add(row);
}
keyboard.add(List.of(inlineKeyboardButton("Back", callbackData(PARAMETER))));
return new InlineKeyboardMarkup(keyboard);
}
public static InlineKeyboardMarkup createKeyboard(YtDlpSession session) {
final var keyboard = new ArrayList<List<InlineKeyboardButton>>();
if (!session.hasAdditionalInfo()) {
@ -42,12 +80,16 @@ public class MediaProcessingKeyboard {
return button;
}
@SuppressWarnings("SameParameterValue")
private static String callbackData(String command) {
return command;
}
@SuppressWarnings("SameParameterValue")
private static String callbackData(String command, String data) {
return command + ":" + data;
}
private static String callbackParams(Object... params) {
return Arrays.stream(params).map(Objects::toString).collect(Collectors.joining(" "));
}
}

View File

@ -15,11 +15,11 @@ public class AudioBitrate extends StringParameter {
}
@Override
public String describe() {
public String describeValue(String value) {
if (value.isEmpty()) {
return describeValue("AUTO");
return "AUTO";
} else {
return super.describe();
return super.describeValue(value);
}
}

View File

@ -20,11 +20,11 @@ public class AudioEffect extends StringParameter {
}
@Override
public String describe() {
public String describeValue(String value) {
if (value.isEmpty()) {
return describeValue("NONE");
return "NONE";
} else {
return super.describe();
return super.describeValue(value);
}
}

View File

@ -14,11 +14,11 @@ public class AudioStreamByLanguage extends StringParameter {
}
@Override
public String describe() {
public String describeValue(String value) {
if (value.isEmpty()) {
return describeValue("AUTO");
return "AUTO";
} else {
return super.describe();
return super.describeValue(value);
}
}

View File

@ -14,11 +14,11 @@ public class AudioVolume extends StringParameter {
}
@Override
public String describe() {
public String describeValue(String value) {
if (value.isEmpty()) {
return describeValue("ORIGINAL");
return "ORIGINAL";
} else {
return super.describe();
return super.describeValue(value);
}
}

View File

@ -8,16 +8,11 @@ public abstract class BooleanParameter extends Parameter<Boolean> {
}
@Override
public String describe() {
public String describeValue(Boolean value) {
if (value) {
return describeValue("ON");
return "ON";
} else {
return describeValue("OFF");
return "OFF";
}
}
@Override
protected void toggle(int dir) {
value = !value;
}
}

View File

@ -30,41 +30,38 @@ public abstract class Parameter<T> {
return value;
}
public List<? extends T> getPossibleValues() {
return possibleValues;
public int getPossibleValuesSize() {
return possibleValues.size();
}
public abstract <I> void accept(Visitor<I> visitor, I input);
public String describe() {
return describeValue(Objects.toString(value));
public final String describe() {
return displayName + ": " + describeValue(value);
}
protected final String describeValue(String customValue) {
return displayName + ": " + customValue;
public final String describeValueByIndex(int index) {
return describeValue(safeGet(index));
}
public void toggleLeft() {
toggle(-1);
protected String describeValue(T valueToDescribe) {
return Objects.toString(valueToDescribe);
}
public void toggleRight() {
toggle(+1);
}
protected void toggle(int dir) {
final int size = possibleValues.size();
if (size == 1) return;
int nextIndex = possibleValues.indexOf(value) + dir;
if (nextIndex >= size) nextIndex -= size;
else if (nextIndex < 0) nextIndex += size;
value = possibleValues.get(nextIndex);
public void select(int index) {
value = safeGet(index);
}
@Override
public String toString() {
return "[" + id + "] " + displayName + ": " + value;
}
private T safeGet(int index) {
final int size = possibleValues.size();
if (index >= size) index = size - 1;
else if (index < 0) index = 0;
return possibleValues.get(index);
}
}

View File

@ -15,11 +15,11 @@ public class VideoBitrate extends StringParameter {
}
@Override
public String describe() {
public String describeValue(String value) {
if (value.isEmpty()) {
return describeValue("AUTO");
return "AUTO";
} else {
return super.describe();
return super.describeValue(value);
}
}

View File

@ -14,11 +14,11 @@ public class VideoFrameRate extends StringParameter {
}
@Override
public String describe() {
public String describeValue(String value) {
if (value.isEmpty()) {
return describeValue("ORIGINAL");
return "ORIGINAL";
} else {
return super.describe();
return super.describeValue(value);
}
}

View File

@ -14,11 +14,11 @@ public class VideoScale extends StringParameter {
}
@Override
public String describe() {
public String describeValue(String value) {
if (value.isEmpty()) {
return describeValue("ORIGINAL");
return "ORIGINAL";
} else {
return describeValue(value + "p");
return value + "p";
}
}

View File

@ -17,6 +17,7 @@ public final class MediaSession extends Session {
private Integer duration;
private String resolution;
// Parameters
private Parameter<?> selectedParam;
private List<Parameter<?>> params;
// Files
private File inputFile;
@ -77,6 +78,14 @@ public final class MediaSession extends Session {
this.params = params;
}
public void setSelectedParam(Parameter<?> selectedParam) {
this.selectedParam = selectedParam;
}
public Parameter<?> getSelectedParam() {
return selectedParam;
}
public boolean isDownloaded() {
return (inputFile != null) && (inputFile.canRead());
}
@ -128,6 +137,9 @@ public final class MediaSession extends Session {
if (status != null) {
joiner.add("<i>" + safeHtml(status) + "</i>");
}
if (selectedParam != null) {
joiner.add(safeHtml(selectedParam.describe()));
}
return joiner;
}