Update 5.2

This commit is contained in:
rubenlagus 2021-04-26 20:55:00 +01:00 committed by Ruben Bermudez
parent 242af20024
commit 2b721194d1
62 changed files with 667 additions and 95 deletions

View File

@ -1,7 +1,7 @@
# Telegram Bot Java Library
[![Telegram](/TelegramBots.svg)](https://telegram.me/JavaBotsApi)
[![Build Status](https://telegrambots.teamcity.com/app/rest/builds/buildType:(id:TelegramBots_TelegramBotsBuild)/statusIcon.svg)](https://telegrambots.teamcity.com/viewType.html?buildTypeId=TelegramBots_TelegramBotsBuild)
[![Build Status](https://travis-ci.org/rubenlagus/TelegramBots.svg?branch=master)](https://travis-ci.org/rubenlagus/TelegramBots)
[![Jitpack](https://jitpack.io/v/rubenlagus/TelegramBots.svg)](https://jitpack.io/#rubenlagus/TelegramBots)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.telegram/telegrambots/badge.svg)](http://mvnrepository.com/artifact/org.telegram/telegrambots)
@ -27,18 +27,18 @@ Just import add the library to your project with one of these options:
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</dependency>
```
2. Using Gradle:
```gradle
implementation 'org.telegram:telegrambots:5.1.1'
implementation 'org.telegram:telegrambots:5.2.0'
```
3. Using Jitpack from [here](https://jitpack.io/#rubenlagus/TelegramBots/5.1.1)
4. Download the jar(including all dependencies) from [here](https://mvnrepository.com/artifact/org.telegram/telegrambots/5.1.1)
3. Using Jitpack from [here](https://jitpack.io/#rubenlagus/TelegramBots/5.2.0)
4. Download the jar(including all dependencies) from [here](https://mvnrepository.com/artifact/org.telegram/telegrambots/5.2.0)
In order to use Long Polling mode, just create your own bot extending `org.telegram.telegrambots.bots.TelegramLongPollingBot`.

View File

@ -1,3 +1,9 @@
### <a id="5.2.0"></a>5.2.0 ###
1. Update Api version [5.2](https://core.telegram.org/bots/api#april-26-2021)
2. Allow custom BackOff implementations
3. Spring version 2.4.5 in spring module
4. Bug fixing: #869, #888 and #892
### <a id="5.1.1"></a>5.1.1 ###
1. Bug fixing: #874

View File

@ -11,13 +11,13 @@ First you need ot get the library and add it to your project. There are few poss
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</dependency>
```
* With **Gradle**:
```gradle
implementation 'org.telegram:telegrambots:5.1.1'
implementation 'org.telegram:telegrambots:5.2.0'
```
2. Don't like **Maven Central Repository**? It can also be taken from [Jitpack](https://jitpack.io/#rubenlagus/TelegramBots).

View File

@ -9,12 +9,12 @@ As with any Java project, you will need to set your dependencies.
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-abilities</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</dependency>
```
* **Gradle**
```gradle
implementation 'org.telegram:telegrambots-abilities:5.1.1'
implementation 'org.telegram:telegrambots-abilities:5.2.0'
```
* [JitPack](https://jitpack.io/#rubenlagus/TelegramBots)

View File

@ -7,7 +7,7 @@
<groupId>org.telegram</groupId>
<artifactId>Bots</artifactId>
<packaging>pom</packaging>
<version>5.1.1</version>
<version>5.2.0</version>
<modules>
<module>telegrambots</module>

View File

@ -18,14 +18,14 @@ Usage
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-abilities</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</dependency>
```
**Gradle**
```gradle
implementation 'org.telegram:telegrambots-abilities:5.1.1'
implementation 'org.telegram:telegrambots-abilities:5.2.0'
```
**JitPack** - [JitPack](https://jitpack.io/#rubenlagus/TelegramBots/v5.0.1)

View File

@ -7,7 +7,7 @@
<parent>
<groupId>org.telegram</groupId>
<artifactId>Bots</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</parent>
<artifactId>telegrambots-abilities</artifactId>
@ -84,7 +84,7 @@
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>

View File

@ -15,14 +15,14 @@ Usage
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-chat-session-bot</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</dependency>
```
**Gradle**
```gradle
implementation 'org.telegram:telegrambots-chat-session-bot:5.1.1'
implementation 'org.telegram:telegrambots-chat-session-bot:5.2.0'
```
Motivation

View File

@ -7,7 +7,7 @@
<parent>
<groupId>org.telegram</groupId>
<artifactId>Bots</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</parent>
<artifactId>telegrambots-chat-session-bot</artifactId>
@ -84,7 +84,7 @@
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core -->

View File

@ -16,12 +16,12 @@ Just import add the library to your project with one of these options:
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambotsextensions</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</dependency>
```
2. Using Gradle:
```gradle
implementation 'org.telegram:telegrambotsextensions:5.1.1'
implementation 'org.telegram:telegrambotsextensions:5.2.0'
```

View File

@ -7,7 +7,7 @@
<parent>
<groupId>org.telegram</groupId>
<artifactId>Bots</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</parent>
<artifactId>telegrambotsextensions</artifactId>
@ -75,7 +75,7 @@
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</dependency>
</dependencies>

View File

@ -7,7 +7,7 @@
<parent>
<groupId>org.telegram</groupId>
<artifactId>Bots</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</parent>
<artifactId>telegrambots-meta</artifactId>

View File

@ -3,22 +3,31 @@ package org.telegram.telegrambots.meta.api.methods;
/**
* @author Ruben Bermudez
* @version 1.0
* @brief Types of actions for SendChatAction method.
* @date 20 of June of 2016
* Types of actions for SendChatAction method.
*/
public enum ActionType {
TYPING("typing"),
RECORDVIDEO("record_video"),
RECORDVIDEONOTE("record_video_note"),
/**
* @deprecated Use {@link #RECORDVOICE} instead
*/
@Deprecated
RECORDAUDIO("record_audio"),
RECORDVOICE("record_voice"),
UPLOADPHOTO("upload_photo"),
UPLOADVIDEO("upload_video"),
UPLOADVIDEONOTE("upload_video_note"),
/**
* @deprecated Use {@link #UPLOADVOICE} instead
*/
@Deprecated
UPLOADAUDIO("upload_audio"),
UPLOADVOICE("upload_voice"),
UPLOADDOCUMENT("upload_document"),
FINDLOCATION("find_location");
private String text;
private final String text;
ActionType(String text) {
this.text = text;
@ -41,7 +50,8 @@ public enum ActionType {
case "record_video_note":
return RECORDVIDEONOTE;
case "record_audio":
return RECORDAUDIO;
case "record_voice":
return RECORDVOICE;
case "upload_photo":
return UPLOADPHOTO;
case "upload_video":
@ -49,7 +59,8 @@ public enum ActionType {
case "upload_video_note":
return UPLOADVIDEONOTE;
case "upload_audio":
return UPLOADAUDIO;
case "upload_voice":
return UPLOADVOICE;
case "upload_document":
return UPLOADDOCUMENT;
case "find_location":

View File

@ -25,8 +25,10 @@ import java.util.List;
/**
* @author Ruben Bermudez
* @version 1.0
* Use this method to copy messages of any kind. The method is analogous to the method forwardMessages,
* but the copied message doesn't have a link to the original message.
* Use this method to copy messages of any kind.
* Service messages and invoice messages can't be copied.
*
* The method is analogous to the method forwardMessage, but the copied message doesn't have a link to the original message.
* Returns the MessageId of the sent message on success.
*/
@SuppressWarnings("unused")
@ -138,7 +140,7 @@ public class CopyMessage extends BotApiMethod<MessageId> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}
if (fromChatId == null) {

View File

@ -21,7 +21,10 @@ import java.io.IOException;
/**
* @author Ruben Bermudez
* @version 1.0
* Use this method to send text messages. On success, the sent Message is returned.
* Use this method to forward messages of any kind.
* Service messages can't be forwarded.
*
* On success, the sent Message is returned.
*/
@EqualsAndHashCode(callSuper = false)
@Getter

View File

@ -93,7 +93,7 @@ public class StopMessageLiveLocation extends BotApiMethod<Serializable> {
@Override
public void validate() throws TelegramApiValidationException {
if (inlineMessageId == null) {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty if inlineMessageId is not present", this);
}
if (messageId == null) {

View File

@ -102,7 +102,7 @@ public class GetGameHighScores extends BotApiMethod<ArrayList<GameHighScore>> {
throw new TelegramApiValidationException("UserId parameter can't be empty", this);
}
if (inlineMessageId == null) {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty if inlineMessageId is not present", this);
}
if (messageId == null) {

View File

@ -124,7 +124,7 @@ public class SetGameScore extends BotApiMethod<Serializable> {
throw new TelegramApiValidationException("Score parameter can't be empty", this);
}
if (inlineMessageId == null) {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty if inlineMessageId is not present", this);
}
if (messageId == null) {

View File

@ -64,7 +64,7 @@ public class DeleteChatPhoto extends BotApiMethod<Boolean> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId can't be null", this);
}
}

View File

@ -137,7 +137,7 @@ public class SendPoll extends BotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}
if (question == null || question.isEmpty()) {

View File

@ -67,7 +67,7 @@ public class StopPoll extends BotApiMethod<Poll> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}
if (messageId == null || messageId == 0) {

View File

@ -111,7 +111,7 @@ public class SendAnimation extends PartialBotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}

View File

@ -107,7 +107,7 @@ public class SendAudio extends PartialBotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}

View File

@ -85,7 +85,7 @@ public class SendChatAction extends BotApiMethod<Boolean> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}
if (action == null) {

View File

@ -99,7 +99,7 @@ public class SendContact extends BotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}
if (phoneNumber == null) {

View File

@ -103,7 +103,7 @@ public class SendDice extends BotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}
if (emoji != null && !VALIDEMOJIS.contains(emoji)) {

View File

@ -99,7 +99,7 @@ public class SendDocument extends PartialBotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}

View File

@ -105,7 +105,7 @@ public class SendGame extends BotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}
if (gameShortName == null || gameShortName.isEmpty()) {

View File

@ -2,6 +2,7 @@ package org.telegram.telegrambots.meta.api.methods.send;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.type.TypeReference;
import com.google.common.base.Strings;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
@ -10,6 +11,7 @@ import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.Singular;
import lombok.ToString;
import org.telegram.telegrambots.meta.api.methods.BotApiMethod;
import org.telegram.telegrambots.meta.api.objects.ApiResponse;
@ -62,10 +64,12 @@ public class SendInvoice extends BotApiMethod<Message> {
private static final String REPLY_MARKUP_FIELD = "reply_markup";
private static final String PROVIDER_DATA_FIELD = "provider_data";
private static final String ALLOWSENDINGWITHOUTREPLY_FIELD = "allow_sending_without_reply";
private static final String MAXTIPAMOUNT_FIELD = "max_tip_amount";
private static final String SUGGESTEDTIPAMOUNTS_FIELD = "suggested_tip_amounts";
@JsonProperty(CHATID_FIELD)
@NonNull
private Integer chatId; ///< Unique identifier for the target private chat
private String chatId; ///< Unique identifier for the target chat or username of the target channel (in the format @channelusername)
@JsonProperty(TITLE_FIELD)
@NonNull
private String title; ///< Product name
@ -78,14 +82,22 @@ public class SendInvoice extends BotApiMethod<Message> {
@JsonProperty(PROVIDER_TOKEN_FIELD)
@NonNull
private String providerToken; ///< Payments provider token, obtained via Botfather
/**
* Optional
* Unique deep-linking parameter. If left empty, forwarded copies of the sent message will have a Pay button,
* allowing multiple users to pay directly from the forwarded message, using the same invoice.
* If non-empty, forwarded copies of the sent message will have a URL button with a deep link to the bot (instead of a Pay button),
* with the value used as the start parameter
*/
@JsonProperty(START_PARAMETER_FIELD)
@NonNull
private String startParameter; ///< Unique deep-linking parameter that can be used to generate this invoice when used as a start parameter.
private String startParameter;
@JsonProperty(CURRENCY_FIELD)
@NonNull
private String currency; ///< 3-letter ISO 4217 currency code
@JsonProperty(PRICES_FIELD)
@NonNull
@Singular
private List<LabeledPrice> prices; ///< Price breakdown, a list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.)
/**
* Optional. URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service.
@ -134,6 +146,21 @@ public class SendInvoice extends BotApiMethod<Message> {
private String providerData;
@JsonProperty(ALLOWSENDINGWITHOUTREPLY_FIELD)
private Boolean allowSendingWithoutReply; ///< Optional Pass True, if the message should be sent even if the specified replied-to message is not found
/**
* The maximum accepted amount for tips in the smallest units of the currency (integer, not float/double).
* For example, for a maximum tip of US$ 1.45 pass max_tip_amount = 145.
* Defaults to 0
*/
@JsonProperty(MAXTIPAMOUNT_FIELD)
private Integer maxTipAmount;
/**
* A JSON-serialized array of suggested amounts of tips in the smallest units of the currency (integer, not float/double).
* At most 4 suggested tip amounts can be specified.
* The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed max_tip_amount.
*/
@JsonProperty(SUGGESTEDTIPAMOUNTS_FIELD)
@Singular
private List<Integer> suggestedTipAmounts;
@Override
public String getMethod() {
@ -157,25 +184,25 @@ public class SendInvoice extends BotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (Strings.isNullOrEmpty(chatId)) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}
if (title == null || title.isEmpty()) {
if (Strings.isNullOrEmpty(title)) {
throw new TelegramApiValidationException("Title parameter can't be empty", this);
}
if (description == null || description.isEmpty()) {
if (Strings.isNullOrEmpty(description)) {
throw new TelegramApiValidationException("Description parameter can't be empty", this);
}
if (payload == null || payload.isEmpty()) {
if (Strings.isNullOrEmpty(payload)) {
throw new TelegramApiValidationException("Payload parameter can't be empty", this);
}
if (providerToken == null || providerToken.isEmpty()) {
if (Strings.isNullOrEmpty(providerToken)) {
throw new TelegramApiValidationException("ProviderToken parameter can't be empty", this);
}
if (startParameter == null || startParameter.isEmpty()) {
if (Strings.isNullOrEmpty(startParameter)) {
throw new TelegramApiValidationException("StartParameter parameter can't be empty", this);
}
if (currency == null || currency.isEmpty()) {
if (Strings.isNullOrEmpty(currency)) {
throw new TelegramApiValidationException("Currency parameter can't be empty", this);
}
if (prices == null || prices.isEmpty()) {
@ -185,6 +212,9 @@ public class SendInvoice extends BotApiMethod<Message> {
price.validate();
}
}
if (suggestedTipAmounts != null && !suggestedTipAmounts.isEmpty() && suggestedTipAmounts.size() > 4) {
throw new TelegramApiValidationException("No more that 4 suggested tips allowed", this);
}
if (replyMarkup != null) {
replyMarkup.validate();
}

View File

@ -118,7 +118,7 @@ public class SendLocation extends BotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}
if (latitude == null) {

View File

@ -90,7 +90,7 @@ public class SendMediaGroup extends PartialBotApiMethod<ArrayList<Message>> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}

View File

@ -135,7 +135,7 @@ public class SendMessage extends BotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}
if (text == null || text.isEmpty()) {

View File

@ -93,7 +93,7 @@ public class SendPhoto extends PartialBotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}

View File

@ -81,7 +81,7 @@ public class SendSticker extends PartialBotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}

View File

@ -113,7 +113,7 @@ public class SendVenue extends BotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}
if (longitude == null) {

View File

@ -106,7 +106,7 @@ public class SendVideo extends PartialBotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}

View File

@ -92,7 +92,7 @@ public class SendVideoNote extends PartialBotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}

View File

@ -91,7 +91,7 @@ public class SendVoice extends PartialBotApiMethod<Message> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}

View File

@ -79,7 +79,7 @@ public class DeleteMessage extends BotApiMethod<Boolean> {
@Override
public void validate() throws TelegramApiValidationException {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty", this);
}
if (messageId == null) {

View File

@ -106,7 +106,7 @@ public class EditMessageCaption extends BotApiMethod<Serializable> {
@Override
public void validate() throws TelegramApiValidationException {
if (inlineMessageId == null) {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty if inlineMessageId is not present", this);
}
if (messageId == null) {

View File

@ -127,7 +127,7 @@ public class EditMessageLiveLocation extends BotApiMethod<Serializable> {
@Override
public void validate() throws TelegramApiValidationException {
if (inlineMessageId == null) {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty if inlineMessageId is not present", this);
}
if (messageId == null) {

View File

@ -104,7 +104,7 @@ public class EditMessageMedia extends PartialBotApiMethod<Serializable> {
@Override
public void validate() throws TelegramApiValidationException {
if (inlineMessageId == null) {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty if inlineMessageId is not present", this);
}
if (messageId == null) {

View File

@ -94,7 +94,7 @@ public class EditMessageReplyMarkup extends BotApiMethod<Serializable> {
@Override
public void validate() throws TelegramApiValidationException {
if (inlineMessageId == null) {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty if inlineMessageId is not present", this);
}
if (messageId == null) {

View File

@ -144,7 +144,7 @@ public class EditMessageText extends BotApiMethod<Serializable> {
@Override
public void validate() throws TelegramApiValidationException {
if (inlineMessageId == null) {
if (chatId == null) {
if (chatId == null || chatId.isEmpty()) {
throw new TelegramApiValidationException("ChatId parameter can't be empty if inlineMessageId is not present", this);
}
if (messageId == null) {

View File

@ -19,6 +19,7 @@ import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMa
import org.telegram.telegrambots.meta.api.objects.stickers.Sticker;
import org.telegram.telegrambots.meta.api.objects.voicechat.VoiceChatEnded;
import org.telegram.telegrambots.meta.api.objects.voicechat.VoiceChatParticipantsInvited;
import org.telegram.telegrambots.meta.api.objects.voicechat.VoiceChatScheduled;
import org.telegram.telegrambots.meta.api.objects.voicechat.VoiceChatStarted;
import java.util.ArrayList;
@ -91,6 +92,7 @@ public class Message implements BotApiObject {
private static final String VOICECHATSTARTED_FIELD = "voice_chat_started";
private static final String VOICECHATENDED_FIELD = "voice_chat_ended";
private static final String VOICECHATPARTICIPANTSINVITED_FIELD = "voice_chat_participants_invited";
private static final String VOICECHATSCHEDULED_FIELD = "voice_chat_scheduled";
@JsonProperty(MESSAGEID_FIELD)
private Integer messageId; ///< Integer Unique message identifier
@ -266,7 +268,8 @@ public class Message implements BotApiObject {
private VoiceChatEnded voiceChatEnded; ///< Optional. Service message: voice chat ended
@JsonProperty(VOICECHATPARTICIPANTSINVITED_FIELD)
private VoiceChatParticipantsInvited voiceChatParticipantsInvited; ///< Optional. Service message: new members invited to a voice chat
@JsonProperty(VOICECHATSCHEDULED_FIELD)
private VoiceChatScheduled voiceChatScheduled; ///< Optional. Service message: voice chat scheduled
public List<MessageEntity> getEntities() {
if (entities != null) {
@ -445,6 +448,11 @@ public class Message implements BotApiObject {
return voiceChatEnded != null;
}
@JsonIgnore
private boolean hasVoiceChatScheduled() {
return voiceChatScheduled != null;
}
@JsonIgnore
private boolean hasVoiceChatParticipantsInvited() {
return voiceChatParticipantsInvited != null;

View File

@ -34,6 +34,7 @@ public class InlineQuery implements BotApiObject {
private static final String LOCATION_FIELD = "location";
private static final String QUERY_FIELD = "query";
private static final String OFFSET_FIELD = "offset";
private static final String CHATTYPE_FIELD = "chat_type";
@JsonProperty(ID_FIELD)
@NonNull
@ -49,5 +50,13 @@ public class InlineQuery implements BotApiObject {
@JsonProperty(OFFSET_FIELD)
@NonNull
private String offset; ///< Offset of the results to be returned, can be controlled by the bot
/**
* Optional. Type of the chat, from which the inline query was sent.
* Can be either sender for a private chat with the inline query sender, private, group, supergroup, or channel.
* The chat type should be always known for requests sent from official clients and most third-party clients,
* unless the request was sent from a secret chat
*/
@JsonProperty(CHATTYPE_FIELD)
private String chatType;
}

View File

@ -0,0 +1,165 @@
package org.telegram.telegrambots.meta.api.objects.inlinequery.inputmessagecontent;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.google.common.base.Strings;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.Singular;
import lombok.ToString;
import org.telegram.telegrambots.meta.api.objects.payments.LabeledPrice;
import org.telegram.telegrambots.meta.exceptions.TelegramApiValidationException;
import java.util.List;
/**
* @author Ruben Bermudez
* @version 1.0
* Represents the content of a text message to be sent as the result of an inline query.
*/
@JsonDeserialize
@EqualsAndHashCode(callSuper = false)
@Getter
@Setter
@ToString
@RequiredArgsConstructor
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class InputInvoiceMessageContent implements InputMessageContent {
private static final String TITLE_FIELD = "title";
private static final String DESCRIPTION_FIELD = "description";
private static final String PAYLOAD_FIELD = "payload";
private static final String PROVIDERTOKEN_FIELD = "provider_token";
private static final String CURRENCY_FIELD = "currency";
private static final String PRICES_FIELD = "prices";
private static final String MAXTIPAMOUNT_FIELD = "max_tip_amount";
private static final String SUGGESTEDTIPAMOUNTS_FIELD = "suggested_tip_amounts";
private static final String PROVIDERDATA_FIELD = "provider_data";
private static final String PHOTOURL_FIELD = "photo_url";
private static final String PHOTOSIZE_FIELD = "photo_size";
private static final String PHOTOWIDTH_FIELD = "photo_width";
private static final String PHOTOHEIGHT_FIELD = "photo_height";
private static final String NEEDNAME_FIELD = "need_name";
private static final String NEEDPHONENUMBER_FIELD = "need_phone_number";
private static final String NEEDEMAIL_FIELD = "need_email";
private static final String NEEDSHIPPINGADDRESS_FIELD = "need_shipping_address";
private static final String SENDPHONENUMBERTOPROVIDER_FIELD = "send_phone_number_to_provider";
private static final String SENDEMAILTOPROVIDER_FIELD = "send_email_to_provider";
private static final String ISFLEXIBLE_FIELD = "is_flexible";
@JsonProperty(TITLE_FIELD)
@NonNull
private String title; ///< Product name, 1-32 characters
@JsonProperty(DESCRIPTION_FIELD)
@NonNull
private String description; ///< Product description, 1-255 characters
/**
* Bot-defined invoice payload, 1-128 bytes.
* This will not be displayed to the user, use for your internal processes.
*/
@JsonProperty(PAYLOAD_FIELD)
@NonNull
private String payload;
@JsonProperty(PROVIDERTOKEN_FIELD)
@NonNull
private String providerToken; ///< Payment provider token, obtained via Botfather
@JsonProperty(CURRENCY_FIELD)
@NonNull
private String currency; ///< Three-letter ISO 4217 currency code, see more on currencies
/**
* Price breakdown, a JSON-serialized list of components
* (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.)
*/
@JsonProperty(PRICES_FIELD)
@NonNull
@Singular
private List<LabeledPrice> prices;
/**
* Optional.
* The maximum accepted amount for tips in the smallest units of the currency (integer, not float/double).
* For example, for a maximum tip of US$ 1.45 pass max_tip_amount = 145.
* Defaults to 0
*/
@JsonProperty(MAXTIPAMOUNT_FIELD)
private Integer maxTipAmount;
/**
* Optional.
* A JSON-serialized array of suggested amounts of tip in the smallest units of the currency (integer, not float/double).
* At most 4 suggested tip amounts can be specified.
* The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed max_tip_amount.
*/
@JsonProperty(SUGGESTEDTIPAMOUNTS_FIELD)
@Singular
private List<Integer> suggestedTipAmounts;
/**
* Optional.
* A JSON-serialized object for data about the invoice, which will be shared with the payment provider.
* A detailed description of the required fields should be provided by the payment provider.
*/
@JsonProperty(PROVIDERDATA_FIELD)
private String providerData;
/**
* Optional.
* URL of the product photo for the invoice.
* Can be a photo of the goods or a marketing image for a service.
* People like it better when they see what they are paying for.
*/
@JsonProperty(PHOTOURL_FIELD)
private String photoUrl;
@JsonProperty(PHOTOSIZE_FIELD)
private Integer photoSize; ///< Optional. Photo size
@JsonProperty(PHOTOWIDTH_FIELD)
private Integer photoWidth; ///< Optional. Photo width
@JsonProperty(PHOTOHEIGHT_FIELD)
private Integer photoHeight; ///< Optional. Photo height
@JsonProperty(NEEDNAME_FIELD)
private Boolean needName; ///< Optional. Pass True, if you require the user's full name to complete the order
@JsonProperty(NEEDPHONENUMBER_FIELD)
private Boolean needPhoneNumber; ///< Optional. Pass True, if you require the user's phone number to complete the order
@JsonProperty(NEEDEMAIL_FIELD)
private Boolean needEmail; ///< Optional. Pass True, if you require the user's email address to complete the order
@JsonProperty(NEEDSHIPPINGADDRESS_FIELD)
private Boolean needShippingAddress; ///< Optional. Pass True, if you require the user's shipping address to complete the order
@JsonProperty(SENDPHONENUMBERTOPROVIDER_FIELD)
private Boolean sendPhoneNumberToProvider; ///< Optional. Pass True, if user's phone number should be sent to provider
@JsonProperty(SENDEMAILTOPROVIDER_FIELD)
private Boolean sendEmailToProvider; ///< Optional. Pass True, if user's email address should be sent to provider
@JsonProperty(ISFLEXIBLE_FIELD)
private Boolean isFlexible; ///< Optional. Pass True, if the final price depends on the shipping method
@Override
public void validate() throws TelegramApiValidationException {
if (Strings.isNullOrEmpty(title) || title.length() > 32) {
throw new TelegramApiValidationException("Title parameter must be between 1 and 32 characters", this);
}
if (Strings.isNullOrEmpty(description) || description.length() > 32) {
throw new TelegramApiValidationException("Description parameter must be between 1 and 255 characters", this);
}
if (Strings.isNullOrEmpty(payload) || payload.length() > 32) {
throw new TelegramApiValidationException("Payload parameter must be between 1 and 128 characters", this);
}
if (Strings.isNullOrEmpty(providerToken)) {
throw new TelegramApiValidationException("ProviderToken parameter must not be empty", this);
}
if (Strings.isNullOrEmpty(currency)) {
throw new TelegramApiValidationException("Currency parameter must not be empty", this);
}
if (prices == null || prices.isEmpty()) {
throw new TelegramApiValidationException("Prices parameter must not be empty", this);
}
for (LabeledPrice price : prices) {
price.validate();
}
if (suggestedTipAmounts != null && !suggestedTipAmounts.isEmpty() && suggestedTipAmounts.size() > 4) {
throw new TelegramApiValidationException("Only up to 4 suggested tip amounts are allowed", this);
}
}
}

View File

@ -52,6 +52,11 @@ public class InputMessageContentDeserializer extends StdDeserializer<InputMessag
new com.fasterxml.jackson.core.type.TypeReference<InputContactMessageContent>(){});
}
if (node.has("provider_token")) {
return objectMapper.readValue(node.toString(),
new com.fasterxml.jackson.core.type.TypeReference<InputInvoiceMessageContent>(){});
}
return null;
}
}

View File

@ -34,8 +34,11 @@ public class Invoice implements BotApiObject {
private String title; ///< Product name
@JsonProperty(DESCRIPTION_FIELD)
private String description; ///< Product description
/**
* Unique bot deep-linking parameter that can be used to generate this invoice; may be empty
*/
@JsonProperty(START_PARAMETER_FIELD)
private String startParameter; ///< Unique bot deep-linking parameter for generation of this invoice
private String startParameter;
@JsonProperty(CURRENCY_FIELD)
private String currency; ///< Three-letter ISO 4217 currency code
/**

View File

@ -2,9 +2,11 @@ package org.telegram.telegrambots.meta.api.objects.payments;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.Setter;
import lombok.ToString;
import org.telegram.telegrambots.meta.api.interfaces.BotApiObject;
@ -22,17 +24,20 @@ import org.telegram.telegrambots.meta.exceptions.TelegramApiValidationException;
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class LabeledPrice implements Validable, BotApiObject {
private static final String LABEL_FIELD = "label";
private static final String AMOUNT_FIELD = "amount";
@JsonProperty(LABEL_FIELD)
@NonNull
private String label; ///< Portion label
/**
* Price of the product in the smallest units of the currency (integer, not float/double).
* For example, for a price of US$ 1.45 pass amount = 145.
*/
@JsonProperty(AMOUNT_FIELD)
@NonNull
private Integer amount;
@Override

View File

@ -0,0 +1,31 @@
package org.telegram.telegrambots.meta.api.objects.voicechat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.Setter;
import lombok.ToString;
import org.telegram.telegrambots.meta.api.interfaces.BotApiObject;
/**
* @author Ruben Bermudez
* @version 5.2
*
* This object represents a service message about a voice chat scheduled in the chat.
*/
@EqualsAndHashCode(callSuper = false)
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class VoiceChatScheduled implements BotApiObject {
private static final String STARTDATE_FIELD = "start_date";
@JsonProperty(STARTDATE_FIELD)
@NonNull
private Integer startDate; ///< Point in time (Unix timestamp) when the voice chat is supposed to be started by a chat administrator
}

View File

@ -92,16 +92,16 @@ public class TelegramApiRequestException extends TelegramApiException {
@Override
public String getMessage() {
if (apiResponse == null) {
return super.toString();
return super.getMessage();
} else if (errorCode == null) {
return super.toString() + ": " + apiResponse;
return super.getMessage() + ": " + apiResponse;
} else {
return super.toString() + ": [" + errorCode + "] " + apiResponse;
return super.getMessage() + ": [" + errorCode + "] " + apiResponse;
}
}
/**
* Just left as backward compatibility if anybody used this in version 5.1.1 or older.
* Just left as backward compatibility if anybody used this in version 5.2.0 or older.
*
* @return the getMessage string
*/

View File

@ -0,0 +1,19 @@
package org.telegram.telegrambots.meta;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import java.util.Arrays;
/**
* @author Ruben Bermudez
* @version 1.0
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class TestUtils {
public static String getTextOfSize(int n) {
char[] text = new char[33];
Arrays.fill(text, 'A');
return new String(text);
}
}

View File

@ -0,0 +1,138 @@
package org.telegram.telegrambots.meta.api.methods.send;
import org.junit.jupiter.api.Test;
import org.telegram.telegrambots.meta.api.objects.payments.LabeledPrice;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton;
import org.telegram.telegrambots.meta.exceptions.TelegramApiValidationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
/**
* @author Ruben Bermudez
* @version 5.2
*/
public class SendInvoiceTest {
@Test
public void validObjectMustNotThrow() {
SendInvoice sendInvoice = createSendInvoiceObject();
assertDoesNotThrow(sendInvoice::validate);
sendInvoice.setSuggestedTipAmounts(new ArrayList<>());
assertDoesNotThrow(sendInvoice::validate);
}
@Test
public void chatIdCantBeEmpty() {
SendInvoice sendInvoice = createSendInvoiceObject();
sendInvoice.setChatId("");
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("ChatId parameter can't be empty", thrown.getMessage());
}
@Test
public void titleCantBeEmpty() {
SendInvoice sendInvoice = createSendInvoiceObject();
sendInvoice.setTitle("");
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Title parameter can't be empty", thrown.getMessage());
}
@Test
public void descriptionCantBeEmpty() {
SendInvoice sendInvoice = createSendInvoiceObject();
sendInvoice.setDescription("");
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Description parameter can't be empty", thrown.getMessage());
}
@Test
public void payloadCantBeEmpty() {
SendInvoice sendInvoice = createSendInvoiceObject();
sendInvoice.setPayload("");
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Payload parameter can't be empty", thrown.getMessage());
}
@Test
public void providerTokenCantBeEmpty() {
SendInvoice sendInvoice = createSendInvoiceObject();
sendInvoice.setProviderToken("");
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("ProviderToken parameter can't be empty", thrown.getMessage());
}
@Test
public void startParameterCantBeEmpty() {
SendInvoice sendInvoice = createSendInvoiceObject();
sendInvoice.setStartParameter("");
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("StartParameter parameter can't be empty", thrown.getMessage());
}
@Test
public void currencyCantBeEmpty() {
SendInvoice sendInvoice = createSendInvoiceObject();
sendInvoice.setCurrency("");
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Currency parameter can't be empty", thrown.getMessage());
}
@Test
public void pricesMustBeValidated() {
SendInvoice sendInvoice = createSendInvoiceObject();
sendInvoice.setPrices(Collections.singletonList(LabeledPrice.builder().label("").amount(1).build()));
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Label parameter can't be empty", thrown.getMessage());
}
@Test
public void pricesCantBeEmpty() {
SendInvoice sendInvoice = createSendInvoiceObject();
sendInvoice.setPrices(new ArrayList<>());
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Prices parameter can't be empty", thrown.getMessage());
sendInvoice.setPrices(Collections.singletonList(LabeledPrice.builder().label("").amount(1).build()));
thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Label parameter can't be empty", thrown.getMessage());
}
@Test
public void suggestedTipAmountsMustNotHaveMoreThan4Elements() {
SendInvoice sendInvoice = createSendInvoiceObject();
sendInvoice.setSuggestedTipAmounts(Arrays.asList(1,2,3,4,5));
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("No more that 4 suggested tips allowed", thrown.getMessage());
}
@Test
public void replyMarkupMustBeValidated() {
SendInvoice sendInvoice = createSendInvoiceObject();
sendInvoice.setReplyMarkup(InlineKeyboardMarkup.builder().keyboardRow(Collections.singletonList(InlineKeyboardButton.builder().text("").build())).build());
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Text parameter can't be empty", thrown.getMessage());
}
private SendInvoice createSendInvoiceObject() {
return SendInvoice.builder()
.chatId("123456")
.title("Title")
.description("Description")
.payload("Payload")
.providerToken("ProviderToken")
.startParameter("StartParameter")
.currency("Currency")
.price(LabeledPrice.builder().label("Label").amount(1).build())
.suggestedTipAmount(1)
.suggestedTipAmount(2)
.suggestedTipAmount(3)
.suggestedTipAmount(4)
.replyMarkup(InlineKeyboardMarkup.builder().keyboardRow(Collections.singletonList(InlineKeyboardButton.builder().text("Hello").build())).build())
.build();
}
}

View File

@ -0,0 +1,133 @@
package org.telegram.telegrambots.meta.api.objects.inlinequery.inputmessagecontent;
import org.junit.jupiter.api.Test;
import org.telegram.telegrambots.meta.TestUtils;
import org.telegram.telegrambots.meta.api.objects.payments.LabeledPrice;
import org.telegram.telegrambots.meta.exceptions.TelegramApiValidationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
/**
* @author Ruben Bermudez
* @version 1.0
*/
public class InputInvoiceMessageContentTest {
@Test
public void validObjectMustNotThrow() {
InputInvoiceMessageContent sendInvoice = createSendInvoiceObject();
assertDoesNotThrow(sendInvoice::validate);
}
@Test
public void titleCantBeEmpty() {
InputInvoiceMessageContent sendInvoice = createSendInvoiceObject();
sendInvoice.setTitle("");
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Title parameter must be between 1 and 32 characters", thrown.getMessage());
}
@Test
public void titleCantBeLongerThan32() {
InputInvoiceMessageContent sendInvoice = createSendInvoiceObject();
sendInvoice.setTitle(TestUtils.getTextOfSize(33));
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Title parameter must be between 1 and 32 characters", thrown.getMessage());
}
@Test
public void descriptionCantBeEmpty() {
InputInvoiceMessageContent sendInvoice = createSendInvoiceObject();
sendInvoice.setDescription("");
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Description parameter must be between 1 and 255 characters", thrown.getMessage());
}
@Test
public void descriptionCantBeLongerThan255() {
InputInvoiceMessageContent sendInvoice = createSendInvoiceObject();
sendInvoice.setDescription(TestUtils.getTextOfSize(256));
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Description parameter must be between 1 and 255 characters", thrown.getMessage());
}
@Test
public void payloadCantBeEmpty() {
InputInvoiceMessageContent sendInvoice = createSendInvoiceObject();
sendInvoice.setPayload("");
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Payload parameter must be between 1 and 128 characters", thrown.getMessage());
}
@Test
public void payloadCantBeLongerThan128() {
InputInvoiceMessageContent sendInvoice = createSendInvoiceObject();
sendInvoice.setPayload(TestUtils.getTextOfSize(129));
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Payload parameter must be between 1 and 128 characters", thrown.getMessage());
}
@Test
public void providerTokenCantBeEmpty() {
InputInvoiceMessageContent sendInvoice = createSendInvoiceObject();
sendInvoice.setProviderToken("");
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("ProviderToken parameter must not be empty", thrown.getMessage());
}
@Test
public void currencyCantBeEmpty() {
InputInvoiceMessageContent sendInvoice = createSendInvoiceObject();
sendInvoice.setCurrency("");
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Currency parameter must not be empty", thrown.getMessage());
}
@Test
public void pricesMustBeValidated() {
InputInvoiceMessageContent sendInvoice = createSendInvoiceObject();
sendInvoice.setPrices(Collections.singletonList(LabeledPrice.builder().label("").amount(1).build()));
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Label parameter can't be empty", thrown.getMessage());
}
@Test
public void pricesCantBeEmpty() {
InputInvoiceMessageContent sendInvoice = createSendInvoiceObject();
sendInvoice.setPrices(new ArrayList<>());
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Prices parameter must not be empty", thrown.getMessage());
sendInvoice.setPrices(Collections.singletonList(LabeledPrice.builder().label("").amount(1).build()));
thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Label parameter can't be empty", thrown.getMessage());
}
@Test
public void suggestedTipAmountsMustNotHaveMoreThan4Elements() {
InputInvoiceMessageContent sendInvoice = createSendInvoiceObject();
sendInvoice.setSuggestedTipAmounts(Arrays.asList(1,2,3,4,5));
Throwable thrown = assertThrows(TelegramApiValidationException.class, sendInvoice::validate);
assertEquals("Only up to 4 suggested tip amounts are allowed", thrown.getMessage());
}
private InputInvoiceMessageContent createSendInvoiceObject() {
return InputInvoiceMessageContent.builder()
.title("Title")
.description("Description")
.payload("Payload")
.providerToken("ProviderToken")
.currency("Currency")
.price(LabeledPrice.builder().label("Label").amount(1).build())
.suggestedTipAmount(1)
.suggestedTipAmount(2)
.suggestedTipAmount(3)
.suggestedTipAmount(4)
.build();
}
}

View File

@ -18,14 +18,14 @@ Usage
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-spring-boot-starter</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</dependency>
```
**Gradle**
```gradle
implementation 'org.telegram:telegrambots-spring-boot-starter:5.1.1'
implementation 'org.telegram:telegrambots-spring-boot-starter:5.2.0'
```
Motivation

View File

@ -7,7 +7,7 @@
<parent>
<groupId>org.telegram</groupId>
<artifactId>Bots</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</parent>
<artifactId>telegrambots-spring-boot-starter</artifactId>
@ -70,7 +70,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<telegrambots.version>5.1.1</telegrambots.version>
<telegrambots.version>5.2.0</telegrambots.version>
<spring-boot.version>2.4.5</spring-boot.version>
<maven-gpg-plugin.version>1.6</maven-gpg-plugin.version>

View File

@ -7,7 +7,7 @@
<parent>
<groupId>org.telegram</groupId>
<artifactId>Bots</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</parent>
<artifactId>telegrambots</artifactId>
@ -92,7 +92,7 @@
<dependency>
<groupId>org.telegram</groupId>
<artifactId>telegrambots-meta</artifactId>
<version>5.1.1</version>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>

View File

@ -1,7 +1,6 @@
package org.telegram.telegrambots.updatesreceivers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.extern.slf4j.Slf4j;
import org.telegram.telegrambots.Constants;
import org.telegram.telegrambots.meta.api.methods.BotApiMethod;
import org.telegram.telegrambots.meta.api.objects.Update;
@ -24,9 +23,8 @@ import java.util.concurrent.ConcurrentHashMap;
* Rest api to for webhook callback function
*/
@Path(Constants.WEBHOOK_URL_PATH)
@Slf4j
public class RestApi {
private static final Logger log = LoggerFactory.getLogger(RestApi.class);
private final ConcurrentHashMap<String, WebhookBot> callbacks = new ConcurrentHashMap<>();
public RestApi() {

View File

@ -71,7 +71,7 @@ public final class BotApiMethodHelperFactory {
.text("Hithere")
.replyToMessageId(12)
.parseMode(ParseMode.HTML)
.replyMarkup(new ForceReplyKeyboard())
.replyMarkup(ForceReplyKeyboard.builder().forceReply(true).build())
.build();
}
@ -362,12 +362,16 @@ public final class BotApiMethodHelperFactory {
return SendInvoice
.builder()
.chatId(12345)
.chatId("12345")
.title("Random title")
.description("Random description")
.payload("Random Payload")
.providerToken("Random provider token")
.startParameter("STARTPARAM")
.maxTipAmount(100)
.suggestedTipAmount(10)
.suggestedTipAmount(50)
.suggestedTipAmount(75)
.currency("EUR")
.prices(prices)
.build();

View File

@ -22,7 +22,9 @@ public class TelegramLongPollingBotTest {
TelegramLongPollingBot bot = Mockito.mock(TelegramLongPollingBot.class);
Mockito.doCallRealMethod().when(bot).onUpdatesReceived(any());
Update update1 = new Update();
update1.setUpdateId(1);
Update update2 = new Update();
update2.setUpdateId(2);
bot.onUpdatesReceived(asList(update1, update2));
Mockito.verify(bot).onUpdateReceived(update1);
Mockito.verify(bot).onUpdateReceived(update2);

View File

@ -113,7 +113,8 @@ public class TestRestApi extends JerseyTest {
.request(MediaType.APPLICATION_JSON)
.post(entity, AnswerInlineQuery.class);
assertEquals("{\"personal\":true,\"inline_query_id\":\"id\",\"results\":[{\"type\":\"article\",\"id\":\"0\",\"title\":\"Title\",\"input_message_content\":{\"message_text\":\"Text\",\"parse_mode\":\"Markdown\"},\"reply_markup\":{\"inline_keyboard\":[[{\"text\":\"Button1\",\"callback_data\":\"Callback\"}]]},\"url\":\"Url\",\"hide_url\":false,\"description\":\"Description\",\"thumb_url\":\"ThumbUrl\",\"thumb_width\":10,\"thumb_height\":20},{\"type\":\"photo\",\"id\":\"1\",\"photo_url\":\"PhotoUrl\",\"mime_type\":\"image/jpg\",\"photo_width\":10,\"photo_height\":20,\"thumb_url\":\"ThumbUrl\",\"title\":\"Title\",\"description\":\"Description\",\"caption\":\"Caption\",\"input_message_content\":{\"message_text\":\"Text\",\"parse_mode\":\"Markdown\"},\"reply_markup\":{\"inline_keyboard\":[[{\"text\":\"Button1\",\"callback_data\":\"Callback\"}]]}}],\"cache_time\":100,\"is_personal\":true,\"next_offset\":\"3\",\"switch_pm_text\":\"pmText\",\"switch_pm_parameter\":\"PmParameter\",\"method\":\"answerInlineQuery\"}", map(result));
assertEquals("{\"inline_query_id\":\"id\",\"results\":[{\"type\":\"article\",\"id\":\"0\",\"title\":\"Title\",\"input_message_content\":{\"message_text\":\"Text\",\"parse_mode\":\"Markdown\"},\"reply_markup\":{\"inline_keyboard\":[[{\"text\":\"Button1\",\"callback_data\":\"Callback\"}]]},\"url\":\"Url\",\"hide_url\":false,\"description\":\"Description\",\"thumb_url\":\"ThumbUrl\",\"thumb_width\":10,\"thumb_height\":20},{\"type\":\"photo\",\"id\":\"1\",\"photo_url\":\"PhotoUrl\",\"mime_type\":\"image/jpg\",\"photo_width\":10,\"photo_height\":20,\"thumb_url\":\"ThumbUrl\",\"title\":\"Title\",\"description\":\"Description\",\"caption\":\"Caption\",\"input_message_content\":{\"message_text\":\"Text\",\"parse_mode\":\"Markdown\"},\"reply_markup\":{\"inline_keyboard\":[[{\"text\":\"Button1\",\"callback_data\":\"Callback\"}]]},\"caption_entities\":[]}],\"cache_time\":100,\"is_personal\":true,\"next_offset\":\"3\",\"switch_pm_text\":\"pmText\",\"switch_pm_parameter\":\"PmParameter\",\"method\":\"answerInlineQuery\"}",
map(result));
}
@Test
@ -127,9 +128,8 @@ public class TestRestApi extends JerseyTest {
.post(entity, EditMessageCaption.class);
assertEquals("{\"chat_id\":\"ChatId\",\"message_id\":1,\"caption\":\"Caption\"," +
"\"reply_markup\":{\"inline_keyboard\":[[{" +
"\"text\":\"Button1\",\"callback_data\":\"Callback\"}]]},\"method\":" +
"\"editmessagecaption\"}", map(result));
"\"reply_markup\":{\"inline_keyboard\":[[{\"text\":\"Button1\",\"callback_data\":\"Callback\"}]]}," +
"\"caption_entities\":[],\"method\":\"editmessagecaption\"}", map(result));
}
@Test
@ -422,10 +422,10 @@ public class TestRestApi extends JerseyTest {
.request(MediaType.APPLICATION_JSON)
.post(entity, SendInvoice.class);
assertEquals("{\"chat_id\":12345,\"title\":\"Random title\",\"description\":\"Random description\"" +
",\"payload\":\"Random Payload\",\"provider_token\":\"Random provider token\",\"start_parameter\":" +
"\"STARTPARAM\",\"currency\":\"EUR\",\"prices\":[{\"label\":\"LABEL\"," +
"\"amount\":1000}],\"method\":\"sendinvoice\"}", map(result));
assertEquals("{\"chat_id\":\"12345\",\"title\":\"Random title\",\"description\":\"Random description\"," +
"\"payload\":\"Random Payload\",\"provider_token\":\"Random provider token\",\"start_parameter\":\"STARTPARAM\"," +
"\"currency\":\"EUR\",\"prices\":[{\"label\":\"LABEL\",\"amount\":1000}],\"max_tip_amount\":100," +
"\"suggested_tip_amounts\":[10,50,75],\"method\":\"sendinvoice\"}", map(result));
}
private Update getUpdate() {