В дополнение к этому вопросу, я пытаюсь придумать, как на самом деле реализовать getMyCommands. В Интернете не так много документации.
Я все еще новичок и предполагал, что следующий метод должен быть близок к правильному, но это не помогло.
Внутри класса бота я сначала пытаюсь назначить команды:
public class Bot extends TelegramLongPollingBot {
...
List<BotCommand> commands = new ArrayList<>();
public void setMyCommands(){
commands.add(new BotCommand("start", "Starts the bot"));
commands.add(new BotCommand("menu", "Opens the menu"));
commands.add(new BotCommand("next", "Next menu page"));
commands.add(new BotCommand("back", "Previous menu page"));
commands.add(new BotCommand("help", "Explains how to use bot"));
}
В методе Main я вызвал следующее, чтобы команды устанавливались при запуске:
bot.setMyCommands();
Чтобы проверить, что приведенное выше назначение работает должным образом, и передать команду /help, которая выводит список команд ботов, в классе ботов я попробовал следующее:
public List<BotCommand> actualcmds = getMyCommands();
public List<BotCommand> getMyCommands() {
return actualcmds;
}
...
@Override
public void onUpdateReceived(Update update) {
Я проверил, и actualcmds на данный момент null.
StringBuilder hlp = new StringBuilder();
hlp.append(helptxt);
for (BotCommand blah : actualcmds) {
hlp.append("\n");
hlp.append(blah);
}
//never reaches this point
System.out.println(hlp);
Как указано выше, не похоже, что команды были назначены или правильно ли я использовал getMyCommands.
Любой совет?
Вот в чем проблема. Я не понимаю, как использовать getMyCommands для присвоения вывода переменной. Каким будет правильный путь?




Хотя мне не очень понятно, чего пытается достичь ваш код. Но вот фрагмент в этом духе.
public class CommandsDemoBot extends TelegramLongPollingBot {
private String commandsHelpText;
public void start() throws TelegramApiException {
new TelegramBotsApi(DefaultBotSession.class).registerBot(this);
List<BotCommand> commands = Arrays.asList(
new BotCommand("start", "Starts the bot"),
new BotCommand("menu", "Opens the menu"),
new BotCommand("next", "Next menu page"),
new BotCommand("back", "Previous menu page"),
new BotCommand("help", "Explains how to use bot")
);
super.execute(new SetMyCommands(commands, null, null));
// saving result text to a class field, but you could also save commands list if needed
this.commandsHelpText = "Usage:\n" + commands.stream()
.map(command -> '/' + command.getCommand() + " - " + command.getDescription())
.collect(Collectors.joining("\n"));
System.out.println(this.commandsHelpText);
}
@Override
public void onUpdateReceived(Update update) {
try {
if (update.hasMessage()) {
Message message = update.getMessage();
String messageText = message.getText();
switch (messageText) {
case "/help":
super.execute(SendMessage.builder()
.chatId(message.getChatId())
.text(commandsHelpText)
.build());
break;
case "/start":
// ...
}
}
} catch (TelegramApiException e) {
throw new RuntimeException("onUpdateReceived failed", e);
}
}
@Override
public String getBotUsername() {
return ..
}
@Override
public String getBotToken() {
return ..
}
}
public class Application() {
public static void main(String[] args) throws TelegramApiException {
new CommandsDemoBot().start();
}
}
Результат: бот запустился, ему указаны команды в стандартном Меню.
Команды перечислены в переменной «commandsText».
Команда бота "/help" отвечает:
Использование:
/start - Запускает бота
/menu - Открывает меню
/next - Следующая страница меню
/back - Предыдущая страница меню
/help — объясняет, как использовать бота.
Этот текст также выводится на консоль при запуске.
библиотека телеграмботов версии 6.x
Спасибо. Это позволяет достичь желаемого результата: вернуть команду и пометить ее как ответ. Однако похоже, что он использует переменную, которой мы ранее присвоили команды — если в будущем команды будут изменены через Bot Father, я не уверен, что это все равно вернет правильный список команд? Частично это было причиной моего вопроса о getMyCommands, который, как я полагаю, может справиться с этой ситуацией. Я новичок в этом, поэтому, возможно, описанная выше проблема не является реальной.
Итак, переменная «actualcmds» является результатом метода getMyCommands(), который возвращает «actualcmds»? Это не имеет никакого смысла. Что касается ваших фрагментов кода, вы нигде не заполнили «actualcmds».