migration

This commit is contained in:
hdvt
2025-11-03 21:16:02 +03:00
parent 6093465f0d
commit d80d4e3b94
26 changed files with 96 additions and 610 deletions

View File

@@ -21,6 +21,8 @@ public interface TelegramBot {
void shutdown();
void start(UpdateConsumer updateConsumer);
default CompletableFuture<File> downloadFile(TelegramFile telegramFile, Path targetDirectory) {
CompletableFuture<File> completableFuture = CompletableFuture.supplyAsync(() -> awaitDownloadFile(telegramFile, targetDirectory));
completableFuture.exceptionally(e -> {

View File

@@ -1,23 +1,7 @@
package hdvtdev.telegram.core;
import hdvtdev.telegram.core.objects.ChosenInlineResult;
import hdvtdev.telegram.core.objects.InlineQuery;
import hdvtdev.telegram.core.objects.Update;
import hdvtdev.telegram.core.objects.business.BusinessConnection;
import hdvtdev.telegram.core.objects.business.BusinessMessagesDeleted;
import hdvtdev.telegram.core.objects.callback.CallbackQuery;
import hdvtdev.telegram.core.objects.chat.ChatJoinRequest;
import hdvtdev.telegram.core.objects.chat.ChatMemberUpdated;
import hdvtdev.telegram.core.objects.chatboost.ChatBoostRemoved;
import hdvtdev.telegram.core.objects.chatboost.ChatBoostUpdated;
import hdvtdev.telegram.core.objects.media.paidmedia.PaidMediaPurchased;
import hdvtdev.telegram.core.objects.message.Message;
import hdvtdev.telegram.core.objects.message.MessageReactionCountUpdated;
import hdvtdev.telegram.core.objects.message.MessageReactionUpdated;
import hdvtdev.telegram.core.objects.payment.PreCheckoutQuery;
import hdvtdev.telegram.core.objects.payment.ShippingQuery;
import hdvtdev.telegram.core.objects.poll.Poll;
import hdvtdev.telegram.core.objects.poll.PollAnswer;
import java.util.List;
@@ -25,7 +9,7 @@ public interface UpdateConsumer {
void onUpdates(List<Update> updates);
default void onUpdate(Update update) {}

View File

@@ -1,80 +0,0 @@
package hdvtdev.telegram.core;
import hdvtdev.telegram.core.objects.ChosenInlineResult;
import hdvtdev.telegram.core.objects.InlineQuery;
import hdvtdev.telegram.core.objects.Update;
import hdvtdev.telegram.core.objects.business.BusinessConnection;
import hdvtdev.telegram.core.objects.business.BusinessMessagesDeleted;
import hdvtdev.telegram.core.objects.callback.CallbackQuery;
import hdvtdev.telegram.core.objects.chat.ChatJoinRequest;
import hdvtdev.telegram.core.objects.chat.ChatMemberUpdated;
import hdvtdev.telegram.core.objects.chatboost.ChatBoostRemoved;
import hdvtdev.telegram.core.objects.chatboost.ChatBoostUpdated;
import hdvtdev.telegram.core.objects.media.paidmedia.PaidMediaPurchased;
import hdvtdev.telegram.core.objects.message.Message;
import hdvtdev.telegram.core.objects.message.MessageReactionCountUpdated;
import hdvtdev.telegram.core.objects.message.MessageReactionUpdated;
import hdvtdev.telegram.core.objects.payment.PreCheckoutQuery;
import hdvtdev.telegram.core.objects.payment.ShippingQuery;
import hdvtdev.telegram.core.objects.poll.Poll;
import hdvtdev.telegram.core.objects.poll.PollAnswer;
import java.util.List;
public interface UpdateHandler extends UpdateConsumer {
@Override
default void onUpdates(List<Update> updates) {
for (Update update : updates) {
if (update.hasMessage()) onMessage(update.message());
if (update.hasEditedMessage()) onEditedMessage(update.editedMessage());
if (update.hasChannelPost()) onChannelPost(update.channelPost());
if (update.hasEditedChannelPost()) onEditedChannelPost(update.editedChannelPost());
if (update.hasBusinessConnection()) onBusinessConnection(update.businessConnection());
if (update.hasBusinessMessage()) onBusinessMessage(update.businessMessage());
if (update.hasEditedBusinessMessage()) onEditedBusinessMessage(update.editedBusinessMessage());
if (update.hasDeletedBusinessMessages()) onDeletedBusinessMessages(update.businessMessagesDeleted());
if (update.hasMessageReaction()) onMessageReaction(update.messageReaction());
if (update.hasMessageReactionCount()) onMessageReactionCount(update.messageReactionCount());
if (update.hasInlineQuery()) onInlineQuery(update.inlineQuery());
if (update.hasChosenInlineResult()) onChosenInlineResult(update.chosenInlineResult());
if (update.hasCallbackQuery()) onCallbackQuery(update.callbackQuery());
if (update.hasShippingQuery()) onShippingQuery(update.shippingQuery());
if (update.hasPreCheckoutQuery()) onPreCheckoutQuery(update.preCheckoutQuery());
if (update.hasPurchasedPaidMedia()) onPaidMediaPurchased(update.paidMediaPurchased());
if (update.hasPoll()) onPoll(update.poll());
if (update.hasPollAnswer()) onPollAnswer(update.pollAnswer());
if (update.hasMyChatMember()) onMyChatMember(update.myChatMember());
if (update.hasChatMember()) onChatMember(update.chatMember());
if (update.hasChatJoinRequest()) onChatJoinRequest(update.chatJoinRequest());
if (update.hasChatBoost()) onChatBoost(update.chatBoost());
if (update.hasRemovedChatBoost()) onChatBoostRemoved(update.chatBoostRemoved());
}
}
default void onMessage(Message message) {}
default void onEditedMessage(Message message) {}
default void onChannelPost(Message message) {}
default void onEditedChannelPost(Message message) {}
default void onBusinessConnection(BusinessConnection connection) {}
default void onBusinessMessage(Message message) {}
default void onEditedBusinessMessage(Message message) {}
default void onDeletedBusinessMessages(BusinessMessagesDeleted deleted) {}
default void onMessageReaction(MessageReactionUpdated reaction) {}
default void onMessageReactionCount(MessageReactionCountUpdated count) {}
default void onInlineQuery(InlineQuery query) {}
default void onChosenInlineResult(ChosenInlineResult result) {}
default void onCallbackQuery(CallbackQuery callbackQuery) {}
default void onShippingQuery(ShippingQuery query) {}
default void onPreCheckoutQuery(PreCheckoutQuery query) {}
default void onPaidMediaPurchased(PaidMediaPurchased paidMedia) {}
default void onPoll(Poll poll) {}
default void onPollAnswer(PollAnswer answer) {}
default void onMyChatMember(ChatMemberUpdated member) {}
default void onChatMember(ChatMemberUpdated member) {}
default void onChatJoinRequest(ChatJoinRequest request) {}
default void onChatBoost(ChatBoostUpdated boost) {}
default void onChatBoostRemoved(ChatBoostRemoved removedBoost) {}
}

View File

@@ -1,19 +0,0 @@
package hdvtdev.telegram.core.annotaions;
import hdvtdev.telegram.core.methods.TelegramApiMethod;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* This annotation is used to indicate {@link TelegramApiMethod} that should be serialized into JSON.
* <h5>Last documentation update: 2025-04-05</h5>
* @see com.fasterxml.jackson.databind.ObjectMapper
* @since 1.0.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Jsonable {
}

View File

@@ -8,7 +8,7 @@ import hdvtdev.telegram.core.objects.User;
/**
* Use this method to approve a chat join request.
* The command must be an <u>administrator</u> in the chat for this to work and must have the {@link ChatAdministratorRights#canInviteUsers()} administrator right.
* Returns True on success.
* Returns {@code true} on success.
* @param chatId Unique username of the target channel in the format @channelusername
* @param userId Unique identifier of the target user
* @see ChatAdministratorRights
@@ -17,6 +17,7 @@ import hdvtdev.telegram.core.objects.User;
* @since 0.1.0
*/
//TODO NotTested
public record ApproveChatJoinRequest(String chatId, long userId) implements TelegramApiMethod<Boolean> {
/**

View File

@@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import hdvtdev.telegram.core.annotaions.Jsonable;
import hdvtdev.telegram.core.methods.util.ParseMode;
import hdvtdev.telegram.core.objects.message.MessageEntity;
import hdvtdev.telegram.core.objects.poll.Poll;
@@ -24,7 +23,6 @@ import java.util.List;
* @since 1.0.0
*/
//TODO NotTested
@Jsonable
@JsonInclude(JsonInclude.Include.NON_NULL)
public final class CopyMessage implements TelegramApiMethod<Long> {
@@ -136,6 +134,12 @@ public final class CopyMessage implements TelegramApiMethod<Long> {
this.replyMarkup = replyMarkup;
}
@JsonIgnore
@Override
public boolean isJsonable() {
return true;
}
@JsonIgnore
@Override
public TelegramApiMethodBody getBody() {

View File

@@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import hdvtdev.telegram.core.annotaions.Jsonable;
import hdvtdev.telegram.core.objects.poll.Poll;
import java.util.ArrayList;
@@ -21,7 +20,7 @@ import java.util.List;
* @see Poll#correctOptionId()
* @since 1.0.0
*/
@Jsonable
@JsonInclude(JsonInclude.Include.NON_NULL)
public final class CopyMessages implements TelegramApiMethod<Long[]> {
@@ -124,6 +123,12 @@ public final class CopyMessages implements TelegramApiMethod<Long[]> {
return Long[].class;
}
@JsonIgnore
@Override
public boolean isJsonable() {
return true;
}
public static final class Builder {
private final String chatId;
private Long messageThreadId;

View File

@@ -4,16 +4,14 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import hdvtdev.telegram.core.annotaions.Jsonable;
import hdvtdev.telegram.core.objects.message.Message;
/**
* Use this method to forward message of any kind.
* Service message and message with protected content can't be forwarded.
* On success, the sent {@link Message} is returned.
*/
@Jsonable
@JsonInclude(JsonInclude.Include.NON_NULL)
public final class ForwardMessage implements TelegramApiMethod<Message> {
@@ -90,6 +88,12 @@ public final class ForwardMessage implements TelegramApiMethod<Message> {
return Message.class;
}
@JsonIgnore
@Override
public boolean isJsonable() {
return true;
}
public static final class Builder {
private final String chatId;
private Long messageThreadId;

View File

@@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import hdvtdev.telegram.core.annotaions.Jsonable;
import hdvtdev.telegram.core.objects.message.Message;
import java.util.ArrayList;
@@ -17,7 +16,6 @@ import java.util.List;
* @see Message#hasProtectedContent()
*/
// TODO NotTested
@Jsonable
@JsonInclude(JsonInclude.Include.NON_NULL)
public final class ForwardMessages implements TelegramApiMethod<Long[]> {
@@ -93,6 +91,11 @@ public final class ForwardMessages implements TelegramApiMethod<Long[]> {
return Long[].class;
}
@JsonIgnore
@Override
public boolean isJsonable() {
return true;
}
public static final class Builder {
private final String chatId;

View File

@@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import hdvtdev.telegram.core.annotaions.Jsonable;
import hdvtdev.telegram.core.objects.command.BotCommand;
import hdvtdev.telegram.core.objects.command.BotCommandScope;
import hdvtdev.telegram.core.objects.command.BotCommandScopeDefault;
@@ -17,7 +16,6 @@ import hdvtdev.telegram.core.objects.command.BotCommandScopeDefault;
* @see BotCommandScope
* @since 1.0.0
*/
@Jsonable
@JsonInclude(JsonInclude.Include.NON_NULL)
public record GetMyCommands(
@JsonProperty("scope") BotCommandScope scope,
@@ -53,4 +51,10 @@ public record GetMyCommands(
public Class<BotCommand[]> getResponseClass() {
return BotCommand[].class;
}
@JsonIgnore
@Override
public boolean isJsonable() {
return true;
}
}

View File

@@ -1,5 +1,7 @@
package hdvtdev.telegram.core.methods;
import org.jetbrains.annotations.NotNull;
public record GetMyName(String languageCode) implements TelegramApiMethod<GetMyName.BotName> {
public GetMyName() {
@@ -30,7 +32,7 @@ public record GetMyName(String languageCode) implements TelegramApiMethod<GetMyN
public record BotName(String name) {
@Override
public String toString() {
public @NotNull String toString() {
return this.name;
}

View File

@@ -4,12 +4,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import hdvtdev.telegram.core.annotaions.Jsonable;
import hdvtdev.telegram.core.objects.message.Message;
import hdvtdev.telegram.core.objects.markup.ReplyMarkup;
import hdvtdev.telegram.core.objects.ReplyParameters;
@Jsonable
@JsonInclude(JsonInclude.Include.NON_NULL)
public final class SendDice implements TelegramApiMethod<Message> {
@@ -106,6 +104,12 @@ public final class SendDice implements TelegramApiMethod<Message> {
return Message.class;
}
@JsonIgnore
@Override
public boolean isJsonable() {
return true;
}
public enum Emoji {
DICE("🎲"),
DART("🎯"),

View File

@@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import hdvtdev.telegram.core.annotaions.Jsonable;
import hdvtdev.telegram.core.methods.util.ParseMode;
import hdvtdev.telegram.core.objects.*;
import hdvtdev.telegram.core.objects.markup.ReplyMarkup;
@@ -13,7 +12,6 @@ import hdvtdev.telegram.core.objects.message.Message;
import hdvtdev.telegram.core.objects.message.MessageEntity;
@Jsonable
@JsonInclude(JsonInclude.Include.NON_NULL)
public final class SendMessage implements TelegramApiMethod<Message> {
@@ -137,6 +135,12 @@ public final class SendMessage implements TelegramApiMethod<Message> {
return Message.class;
}
@JsonIgnore
@Override
public boolean isJsonable() {
return true;
}
public static final class Builder {
private final String chatId;
private final String text;

View File

@@ -4,12 +4,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import hdvtdev.telegram.core.annotaions.Jsonable;
import hdvtdev.telegram.core.objects.reaction.ReactionType;
import java.util.List;
@Jsonable
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SetMessageReaction implements TelegramApiMethod<Boolean> {
@@ -65,6 +63,12 @@ public class SetMessageReaction implements TelegramApiMethod<Boolean> {
return Boolean.class;
}
@JsonIgnore
@Override
public boolean isJsonable() {
return true;
}
public static final class Builder {
private final String chatId;
private final long messageId;

View File

@@ -4,13 +4,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import hdvtdev.telegram.core.annotaions.Jsonable;
import hdvtdev.telegram.core.objects.command.BotCommand;
import hdvtdev.telegram.core.objects.command.BotCommandScope;
import java.util.List;
@Jsonable
@JsonInclude(JsonInclude.Include.NON_NULL)
public final class SetMyCommands implements TelegramApiMethod<Boolean> {
@@ -68,6 +66,12 @@ public final class SetMyCommands implements TelegramApiMethod<Boolean> {
return Boolean.class;
}
@JsonIgnore
@Override
public boolean isJsonable() {
return true;
}
public static final class Builder {
private final List<BotCommand> commands;

View File

@@ -8,4 +8,8 @@ public interface TelegramApiMethod<T> {
Class<T> getResponseClass();
default boolean isJsonable() {
return false;
}
}

View File

@@ -1,7 +1,6 @@
package hdvtdev.telegram.core.methods;
import java.util.ArrayList;
import java.util.function.Consumer;
public final class TelegramApiMethodBody {

View File

@@ -3,6 +3,7 @@ package hdvtdev.telegram.core.objects;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import hdvtdev.telegram.core.objects.business.BusinessConnection;
import hdvtdev.telegram.core.objects.business.BusinessMessagesDeleted;
import hdvtdev.telegram.core.objects.callback.CallbackQuery;
@@ -19,6 +20,9 @@ import hdvtdev.telegram.core.objects.payment.ShippingQuery;
import hdvtdev.telegram.core.objects.poll.Poll;
import hdvtdev.telegram.core.objects.poll.PollAnswer;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.Nullable;
import java.util.Optional;
@JsonInclude(JsonInclude.Include.NON_NULL)
@@ -48,8 +52,15 @@ public record Update(
@JsonProperty("chat_join_request") ChatJoinRequest chatJoinRequest,
@JsonProperty("chat_boost") ChatBoostUpdated chatBoost,
@JsonProperty("removed_chat_boost") ChatBoostRemoved chatBoostRemoved
) {
) implements GeneralObject {
@Override
@Nullable
public Message message() {
return message;
}
@Contract(pure = true)
public boolean hasMessage() {
return this.message != null;
}

View File

@@ -3,6 +3,7 @@ package hdvtdev.telegram.core.objects.callback;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import hdvtdev.telegram.core.objects.GeneralObject;
import hdvtdev.telegram.core.objects.User;
import hdvtdev.telegram.core.objects.message.MaybeInaccessibleMessage;
@@ -16,7 +17,7 @@ public record CallbackQuery(
@JsonProperty("chat_instance") String chatInstance,
@JsonProperty("data") String data,
@JsonProperty("game_short_name") String gameShortName
) {
) implements GeneralObject {
public boolean hasMessage() {
return this.message != null;

View File

@@ -113,7 +113,7 @@ public record Message(
@JsonProperty("web_app_data") WebAppData webAppData,
@JsonProperty("reply_markup") InlineKeyboardMarkup inlineKeyboardMarkup
) implements MaybeInaccessibleMessage {
) implements MaybeInaccessibleMessage, GeneralObject {
public boolean hasMessageThreadId() {
return messageThreadId != null;