Просто посмотрите на этот код
Утром кодил и захотел с кем-нибудь поделиться кодом для обработки входящих сообщений. Обратите внимание на маленькие функции — каждая делает ровно одно.
Обработчики хранятся в мапе, ключ к ним определяется в messageType(), и всё это объединяется в processMessage()
private static final BiFunction<Message, User, @Nullable NewMessageBody> REGISTER_PROCESSOR = (message, user) -> {
var contactAttachment = ((ContactAttachment) message.body().attachments().getFirst());
var phoneNumber = Ezvcard.parse(contactAttachment.payload().vcfInfo())
.first()
.getTelephoneNumbers()
.getFirst()
.getText();
State.updateUserManagement(() -> UserManagement.registerVisitor(State.getUserManagement(), phoneNumber, user.firstName()));
return new NewMessageBody("""
🎉 Регистрация завершена!
Теперь я смогу напомнить вам о посещении в клинику.
""", null, null, null, null);
};
private static final BiFunction<Message, User, @Nullable NewMessageBody> AUTHOR_PROCESSOR = (_, _) -> new NewMessageBody(
"abc",
null,
null,
null,
TextFormat.MARKDOWN);
private static final BiFunction<Message, User, @Nullable NewMessageBody> UNKNOWN_PROCESSOR = (_, _) -> unknownInput();
static Map<String, BiFunction<Message, User, @Nullable NewMessageBody>> messageProcessors = Map.of(
"register", REGISTER_PROCESSOR,
"author", AUTHOR_PROCESSOR,
"unknown", UNKNOWN_PROCESSOR);
private static NewMessageBody processMessage(Message message, User user) {
return messageProcessors.get(messageType(message)).apply(message, user);
}
private static String messageType(Message message) {
if (isRegisterMessage(message)) return "register";
if (isAuthorMessage(message)) return "author";
return "unknown";
}
private static boolean isRegisterMessage(Message message) {
var attachments = message
.body()
.attachments();
if (attachments == null) {
return false;
}
return attachments.getFirst() instanceof ContactAttachment;
}
private static boolean isAuthorMessage(Message message) {
var text = message
.body()
.text();
return "автор".equals(text);
}
Всем хорошего дня!