Skip to content

Instantly share code, notes, and snippets.

@nickrobson
Last active November 12, 2018 05:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nickrobson/880a1306ffeacea61c14c7a47153a070 to your computer and use it in GitHub Desktop.
Save nickrobson/880a1306ffeacea61c14c7a47153a070 to your computer and use it in GitHub Desktop.
An example of how the DatePicker extension for jTelegramBotAPI can be used.
import com.jtelegram.api.TelegramBotRegistry;
import com.jtelegram.api.chat.id.ChatId;
import com.jtelegram.api.commands.filters.MentionFilter;
import com.jtelegram.api.commands.filters.TextFilter;
import com.jtelegram.api.menu.Menu;
import com.jtelegram.api.menu.MenuHandler;
import com.jtelegram.api.menu.viewer.RegularMenuViewer;
import com.jtelegram.api.requests.message.send.SendText;
import com.jtelegram.api.update.PollingUpdateProvider;
import com.jtelegram.api.util.TextBuilder;
import com.jtelegram.ext.datepicker.DatePickerExtension;
import com.jtelegram.ext.datepicker.menu.DatePickerMenu;
import com.jtelegram.ext.datepicker.picker.DatePicker;
import com.jtelegram.ext.datepicker.picker.DatePickerOptions;
import java.time.LocalDate;
import java.util.Locale;
/**
* @author Nick Robson
*/
public class MyAwesomeBot {
public static void main(String[] args) {
TelegramBotRegistry registry = TelegramBotRegistry.builder()
.updateProvider(new PollingUpdateProvider())
.build();
registry.registerBot(System.getenv("BOT_TOKEN"), (bot, ex) -> {
if (ex != null) {
ex.printStackTrace();
System.exit(1);
}
System.out.format("Started bot: @%s\n", bot.getBotInfo().getUsername());
// when /datepicker@botusername is sent (or /datepicker is PM'd)
bot.getCommandRegistry().registerCommand(new MentionFilter(
new TextFilter("datepicker", false, (event, command) -> {
try {
String localeString = command.getArgsAsText();
Locale locale = Locale.forLanguageTag(localeString);
if (localeString.isEmpty() || locale == null) {
locale = Locale.forLanguageTag(command.getSender().getLanguageCode());
}
// get the date picker instance corresponding to their locale
DatePicker datePicker = DatePickerExtension.forLocale(locale);
Menu menu = DatePickerMenu.builder()
.bot(bot)
.datePicker(datePicker)
.datePickerOptions(DatePickerOptions.builder()
// always highlight today's date with a • next to it
.dateHighlightedPredicate(LocalDate.now()::isEqual)
.build())
// only the command sender can change the month
.monthSelectionPredicate((cb, date) -> cb.getQuery().getFrom().getId() == command.getSender().getId())
// only the command sender can change the month
.dateSelectionPredicate((cb, date) -> cb.getQuery().getFrom().getId() == command.getSender().getId())
// when the date is clicked...
.dateSelectionConsumer((cb, date) -> {
System.out.format(
"@%s clicked %s\n",
cb.getQuery().getFrom().getUsername(),
date.toString()
);
bot.perform(SendText.builder()
.chatId(ChatId.of(cb.getQuery().getMessage()))
.replyToMessageID(cb.getQuery().getMessage().getMessageId())
.text(TextBuilder.create().escaped("I like ").bold(date.toString()).escaped(" too!"))
.errorHandler(Throwable::printStackTrace)
.build());
})
// OPTIONAL, to be displayed once the menu has loaded
.messageSupplier(() -> TextBuilder.create().escaped("Choose a date"))
.build();
bot.perform(SendText.builder()
.chatId(ChatId.of(event.getMessage()))
.replyToMessageID(event.getMessage().getMessageId())
.text(TextBuilder.create().escaped("Loading..."))
.callback(tm -> {
menu.addViewer(RegularMenuViewer.builder()
.chatId(tm.getChat().getChatId())
.messageId(tm.getMessageId())
.build());
MenuHandler.registerMenu(menu);
})
.errorHandler(Throwable::printStackTrace)
.build());
} catch (Exception e) {
e.printStackTrace();
}
return true;
})));
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment