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:
parent
92c036267a
commit
dec332cab5
@ -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";
|
||||
|
@ -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);
|
||||
|
@ -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(" "));
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user