From 693738960908b475417f29a4940dc8388f0cdce4 Mon Sep 17 00:00:00 2001 From: Nick Robson Date: Wed, 19 Dec 2018 11:02:05 +0100 Subject: [PATCH 1/9] Fix NPE when thumbnail is null in ThumbableInputMedia --- .../message/input/media/ThumbableInputMedia.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/input/media/ThumbableInputMedia.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/input/media/ThumbableInputMedia.java index f55ecc4ec..f9597c6fd 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/input/media/ThumbableInputMedia.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/input/media/ThumbableInputMedia.java @@ -4,12 +4,13 @@ import com.jtelegram.api.message.input.file.InputFile; import com.jtelegram.api.message.input.file.LocalInputFile; import com.jtelegram.api.requests.message.framework.ParseMode; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; import lombok.Getter; import lombok.ToString; -import java.util.Arrays; -import java.util.List; - @Getter @ToString(callSuper = true) public abstract class ThumbableInputMedia extends InputMedia { @@ -24,6 +25,10 @@ protected ThumbableInputMedia(InputMediaType type, InputFile media, String capti @Override public List getAllMedia() { - return Arrays.asList(getMedia(), thumbnail); + List media = new ArrayList<>(); + media.add(getMedia()); + media.add(thumbnail); + media.removeIf(Objects::isNull); + return Collections.unmodifiableList(media); } } From f55d04a87a400eb3c22cd240bb077b569ff83ee4 Mon Sep 17 00:00:00 2001 From: Mazen Kotb Date: Sun, 24 Feb 2019 21:35:23 -0800 Subject: [PATCH 2/9] Add parse_mode to inline result captions --- .../com/jtelegram/api/inline/result/InlineResultAudio.java | 5 ++++- .../jtelegram/api/inline/result/InlineResultDocument.java | 5 ++++- .../com/jtelegram/api/inline/result/InlineResultGif.java | 5 ++++- .../com/jtelegram/api/inline/result/InlineResultMpegGif.java | 5 ++++- .../com/jtelegram/api/inline/result/InlineResultPhoto.java | 5 ++++- .../com/jtelegram/api/inline/result/InlineResultVideo.java | 2 ++ .../com/jtelegram/api/inline/result/InlineResultVoice.java | 5 ++++- .../api/inline/result/cached/InlineCachedResultAudio.java | 5 ++++- .../api/inline/result/cached/InlineCachedResultDocument.java | 5 ++++- .../api/inline/result/cached/InlineCachedResultGif.java | 5 ++++- .../api/inline/result/cached/InlineCachedResultMpegGif.java | 5 ++++- .../api/inline/result/cached/InlineCachedResultPhoto.java | 5 ++++- .../api/inline/result/cached/InlineCachedResultVideo.java | 5 ++++- .../api/inline/result/cached/InlineCachedResultVoice.java | 5 ++++- .../jtelegram/api/inline/result/framework/InlineResult.java | 2 ++ 15 files changed, 56 insertions(+), 13 deletions(-) diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultAudio.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultAudio.java index 80c1da9e8..88314919e 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultAudio.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultAudio.java @@ -4,6 +4,7 @@ import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup; import com.jtelegram.api.inline.result.framework.InlineResult; import com.jtelegram.api.inline.input.InputMessageContent; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -14,6 +15,7 @@ public class InlineResultAudio extends InlineResult implements InlineResult.Dura InlineResult.Titled, InlineResult.Urlable { private String title; private String caption; + private ParseMode captionParseMode; private String performer; @SerializedName("audio_duration") private Integer duration; @@ -21,10 +23,11 @@ public class InlineResultAudio extends InlineResult implements InlineResult.Dura private String url; @Builder - private InlineResultAudio(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String title, String caption, String performer, Integer duration, String url) { + private InlineResultAudio(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String title, String caption, ParseMode captionParseMode, String performer, Integer duration, String url) { super(id, replyMarkup, inputMessageContent); this.title = title; this.caption = caption; + this.captionParseMode = captionParseMode; this.performer = performer; this.duration = duration; this.url = url; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultDocument.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultDocument.java index 2acb5c371..66da2cc11 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultDocument.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultDocument.java @@ -5,6 +5,7 @@ import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup; import com.jtelegram.api.inline.result.framework.DimensionalThumbableInlineResult; import com.jtelegram.api.inline.result.framework.InlineResult; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -15,6 +16,7 @@ public class InlineResultDocument extends DimensionalThumbableInlineResult imple InlineResult.Captioned, InlineResult.Describeable, InlineResult.Urlable { private String title; private String caption; + private ParseMode captionParseMode; private String description; private String mimeType; @SerializedName("document_url") @@ -22,7 +24,8 @@ public class InlineResultDocument extends DimensionalThumbableInlineResult imple @Builder private InlineResultDocument(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String thumbUrl, - Integer thumbWidth, Integer thumbHeight, String title, String caption, String description, String mimeType, String url) { + Integer thumbWidth, Integer thumbHeight, String title, String caption, ParseMode captionParseMode, + String description, String mimeType, String url) { super(id, replyMarkup, inputMessageContent, thumbUrl, thumbWidth, thumbHeight); this.title = title; this.caption = caption; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultGif.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultGif.java index f9c3f444b..52713506f 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultGif.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultGif.java @@ -5,6 +5,7 @@ import com.jtelegram.api.inline.result.framework.InlineResult; import com.jtelegram.api.inline.input.InputMessageContent; import com.jtelegram.api.inline.result.framework.ThumbableInlineResult; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -15,6 +16,7 @@ public class InlineResultGif extends ThumbableInlineResult implements InlineResu InlineResult.Titled, InlineResult.Captioned, InlineResult.Duratable { private String title; private String caption; + private ParseMode captionParseMode; @SerializedName("gif_url") private String url; @SerializedName("gif_width") @@ -25,10 +27,11 @@ public class InlineResultGif extends ThumbableInlineResult implements InlineResu private Integer duration; @Builder - private InlineResultGif(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String thumbUrl, String title, String caption, String url, Integer width, Integer height, Integer duration) { + private InlineResultGif(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String thumbUrl, String title, String caption, ParseMode captionParseMode, String url, Integer width, Integer height, Integer duration) { super(id, replyMarkup, inputMessageContent, thumbUrl); this.title = title; this.caption = caption; + this.captionParseMode = captionParseMode; this.url = url; this.width = width; this.height = height; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultMpegGif.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultMpegGif.java index 685f7b4bf..162318b67 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultMpegGif.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultMpegGif.java @@ -5,6 +5,7 @@ import com.jtelegram.api.inline.result.framework.InlineResult; import com.jtelegram.api.inline.input.InputMessageContent; import com.jtelegram.api.inline.result.framework.ThumbableInlineResult; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -15,6 +16,7 @@ public class InlineResultMpegGif extends ThumbableInlineResult implements Inline InlineResult.Titled, InlineResult.Captioned, InlineResult.Duratable { private String title; private String caption; + private ParseMode captionParseMode; @SerializedName("mpeg4_duration") private Integer duration; @SerializedName("mpeg4_width") @@ -25,10 +27,11 @@ public class InlineResultMpegGif extends ThumbableInlineResult implements Inline private String url; @Builder - private InlineResultMpegGif(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String thumbUrl, String title, String caption, Integer duration, Integer width, Integer height, String url) { + private InlineResultMpegGif(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String thumbUrl, String title, String caption, ParseMode captionParseMode, Integer duration, Integer width, Integer height, String url) { super(id, replyMarkup, inputMessageContent, thumbUrl); this.title = title; this.caption = caption; + this.captionParseMode = captionParseMode; this.duration = duration; this.width = width; this.height = height; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultPhoto.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultPhoto.java index fd8beedc0..320be8d90 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultPhoto.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultPhoto.java @@ -5,6 +5,7 @@ import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup; import com.jtelegram.api.inline.result.framework.InlineResult; import com.jtelegram.api.inline.result.framework.ThumbableInlineResult; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -14,6 +15,7 @@ public class InlineResultPhoto extends ThumbableInlineResult implements InlineResult.Visual, InlineResult.Titled, InlineResult.Captioned, InlineResult.Describeable { private String caption; + private ParseMode captionParseMode; private String title; private String description; @SerializedName("photo_url") @@ -25,9 +27,10 @@ public class InlineResultPhoto extends ThumbableInlineResult implements InlineRe @Builder private InlineResultPhoto(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, String thumbUrl, - String caption, String title, String description, String url, Integer width, Integer height) { + String caption, ParseMode captionParseMode, String title, String description, String url, Integer width, Integer height) { super(id, replyMarkup, inputMessageContent, thumbUrl); this.caption = caption; + this.captionParseMode = captionParseMode; this.title = title; this.description = description; this.url = url; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVideo.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVideo.java index 0cabdb152..6c79eabe7 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVideo.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVideo.java @@ -5,6 +5,7 @@ import com.jtelegram.api.inline.result.framework.InlineResult; import com.jtelegram.api.inline.result.framework.ThumbableInlineResult; import com.jtelegram.api.inline.input.InputMessageContent; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -16,6 +17,7 @@ public class InlineResultVideo extends ThumbableInlineResult implements InlineRe private String description; private String title; private String caption; + private ParseMode captionParseMode; private String mimeType; @SerializedName("video_url") private String url; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVoice.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVoice.java index eddbdc0c5..bef01ae14 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVoice.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/InlineResultVoice.java @@ -4,6 +4,7 @@ import com.jtelegram.api.inline.result.framework.InlineResult; import com.jtelegram.api.inline.input.InputMessageContent; import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -14,6 +15,7 @@ public class InlineResultVoice extends InlineResult implements InlineResult.Urla InlineResult.Titled, InlineResult.Duratable { private String title; private String caption; + private ParseMode captionParseMode; @SerializedName("voice_duration") private Integer duration; @SerializedName("voice_url") @@ -21,10 +23,11 @@ public class InlineResultVoice extends InlineResult implements InlineResult.Urla @Builder private InlineResultVoice(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, - String title, String caption, Integer duration, String url) { + String title, String caption, ParseMode captionParseMode, Integer duration, String url) { super(id, replyMarkup, inputMessageContent); this.title = title; this.caption = caption; + this.captionParseMode = captionParseMode; this.duration = duration; this.url = url; } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultAudio.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultAudio.java index 19e395d4e..7beda5d1e 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultAudio.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultAudio.java @@ -5,6 +5,7 @@ import com.jtelegram.api.inline.result.framework.InlineResult; import com.jtelegram.api.message.input.file.IdInputFile; import com.jtelegram.api.inline.input.InputMessageContent; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -15,12 +16,14 @@ public class InlineCachedResultAudio extends InlineResult implements InlineResul @SerializedName("audio_file_id") private IdInputFile fileId; private String caption; + private ParseMode captionParseMode; @Builder private InlineCachedResultAudio(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, - IdInputFile fileId, String caption) { + IdInputFile fileId, String caption, ParseMode captionParseMode) { super(id, replyMarkup, inputMessageContent); this.fileId = fileId; this.caption = caption; + this.captionParseMode = captionParseMode; } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultDocument.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultDocument.java index 6b3d3ec59..64b98d1c7 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultDocument.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultDocument.java @@ -5,6 +5,7 @@ import com.jtelegram.api.inline.result.framework.InlineResult; import com.jtelegram.api.message.input.file.IdInputFile; import com.jtelegram.api.inline.input.InputMessageContent; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -17,13 +18,15 @@ public class InlineCachedResultDocument extends InlineResult implements InlineRe private IdInputFile fileId; private String title; private String caption; + private ParseMode captionParseMode; @Builder private InlineCachedResultDocument(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, - IdInputFile fileId, String title, String caption) { + IdInputFile fileId, String title, String caption, ParseMode captionParseMode) { super(id, replyMarkup, inputMessageContent); this.fileId = fileId; this.title = title; this.caption = caption; + this.captionParseMode = captionParseMode; } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultGif.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultGif.java index 735d0a38d..09d16e7ec 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultGif.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultGif.java @@ -5,6 +5,7 @@ import com.jtelegram.api.inline.result.framework.InlineResult; import com.jtelegram.api.message.input.file.IdInputFile; import com.jtelegram.api.inline.input.InputMessageContent; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -17,13 +18,15 @@ public class InlineCachedResultGif extends InlineResult implements InlineResult. private IdInputFile fileId; private String title; private String caption; + private ParseMode captionParseMode; @Builder private InlineCachedResultGif(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, - IdInputFile fileId, String title, String caption) { + IdInputFile fileId, String title, String caption, ParseMode captionParseMode) { super(id, replyMarkup, inputMessageContent); this.fileId = fileId; this.title = title; this.caption = caption; + this.captionParseMode = captionParseMode; } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultMpegGif.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultMpegGif.java index c8437267d..a2336b19b 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultMpegGif.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultMpegGif.java @@ -5,6 +5,7 @@ import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup; import com.jtelegram.api.inline.result.framework.InlineResult; import com.jtelegram.api.message.input.file.IdInputFile; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -17,13 +18,15 @@ public class InlineCachedResultMpegGif extends InlineResult implements InlineRes private IdInputFile fileId; private String title; private String caption; + private ParseMode captionParseMode; @Builder private InlineCachedResultMpegGif(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, - IdInputFile fileId, String title, String caption) { + IdInputFile fileId, String title, String caption, ParseMode captionParseMode) { super(id, replyMarkup, inputMessageContent); this.fileId = fileId; this.title = title; this.caption = caption; + this.captionParseMode = captionParseMode; } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultPhoto.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultPhoto.java index 221fc2b56..aa150abd6 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultPhoto.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultPhoto.java @@ -5,6 +5,7 @@ import com.jtelegram.api.message.input.file.IdInputFile; import com.jtelegram.api.inline.input.InputMessageContent; import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -17,15 +18,17 @@ public class InlineCachedResultPhoto extends InlineResult implements InlineResul private IdInputFile fileId; private String description; private String caption; + private ParseMode captionParseMode; private String title; @Builder private InlineCachedResultPhoto(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, - IdInputFile fileId, String description, String caption, String title) { + IdInputFile fileId, String description, String caption, ParseMode captionParseMode, String title) { super(id, replyMarkup, inputMessageContent); this.fileId = fileId; this.description = description; this.caption = caption; + this.captionParseMode = captionParseMode; this.title = title; } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVideo.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVideo.java index 191325a40..0c2bb2892 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVideo.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVideo.java @@ -5,6 +5,7 @@ import com.jtelegram.api.inline.result.framework.InlineResult; import com.jtelegram.api.message.input.file.IdInputFile; import com.jtelegram.api.inline.input.InputMessageContent; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -17,13 +18,15 @@ public class InlineCachedResultVideo extends InlineResult implements InlineResul private IdInputFile fileId; private String title; private String caption; + private ParseMode captionParseMode; @Builder private InlineCachedResultVideo(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, - IdInputFile fileId, String title, String caption) { + IdInputFile fileId, String title, String caption, ParseMode captionParseMode) { super(id, replyMarkup, inputMessageContent); this.fileId = fileId; this.title = title; this.caption = caption; + this.captionParseMode = captionParseMode; } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVoice.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVoice.java index 4dcc3b9b5..e5cf7e2d3 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVoice.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/cached/InlineCachedResultVoice.java @@ -5,6 +5,7 @@ import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup; import com.jtelegram.api.inline.result.framework.InlineResult; import com.jtelegram.api.message.input.file.IdInputFile; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -17,14 +18,16 @@ public class InlineCachedResultVoice extends InlineResult implements InlineResul private IdInputFile fileId; private String title; private String caption; + private ParseMode captionParseMode; @Builder private InlineCachedResultVoice(String id, InlineKeyboardMarkup replyMarkup, InputMessageContent inputMessageContent, - IdInputFile fileId, String title, String caption) { + IdInputFile fileId, String title, String caption, ParseMode captionParseMode) { super(id, replyMarkup, inputMessageContent); this.fileId = fileId; this.title = title; this.caption = caption; + this.captionParseMode = captionParseMode; } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/framework/InlineResult.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/framework/InlineResult.java index a74555671..ce40e2314 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/framework/InlineResult.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/framework/InlineResult.java @@ -3,6 +3,7 @@ import com.jtelegram.api.inline.input.InputMessageContent; import com.jtelegram.api.inline.keyboard.InlineKeyboardMarkup; import com.jtelegram.api.message.input.file.IdInputFile; +import com.jtelegram.api.requests.message.framework.ParseMode; import lombok.Getter; import lombok.ToString; @@ -26,6 +27,7 @@ public interface Cached { public interface Captioned { String getCaption(); + ParseMode getCaptionParseMode(); } public interface Describeable { From 5b1ffeee3892a8e6c905a4f884b4780c5fdba6c6 Mon Sep 17 00:00:00 2001 From: Mark Hendriks Date: Wed, 2 Oct 2019 21:47:22 +0200 Subject: [PATCH 3/9] Update maven compiler plugin and lombok, and switch to Java 11 (latest LTS) --- pom.xml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 0b71248d5..556efa2f9 100644 --- a/pom.xml +++ b/pom.xml @@ -100,7 +100,7 @@ org.projectlombok lombok - 1.16.18 + 1.18.10 provided @@ -158,10 +158,9 @@ org.apache.maven.plugins maven-compiler-plugin - 3.7.0 + 3.8.1 - 1.8 - 1.8 + 11 @@ -198,7 +197,7 @@ org.projectlombok lombok-maven-plugin - 1.16.18.1 + 1.18.10.0 ${project.basedir}/src/main/java ${project.basedir}/src/main/delombok From f28ff22b39d34fb15db0944059c42cc12ff4fa82 Mon Sep 17 00:00:00 2001 From: Nick Robson Date: Tue, 13 Nov 2018 23:17:55 +1100 Subject: [PATCH 4/9] =?UTF-8?q?Na=C3=AFve=20Telegraf=20wrapper=20on=20top?= =?UTF-8?q?=20of=20jTelegram?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jtelegrambotapi-core/pom.xml | 5 ++ .../java/com/jtelegram/api/events/Event.java | 3 + .../jtelegram/api/events/EventRegistry.java | 21 +++-- .../com/jtelegram/api/events/UpdateEvent.java | 22 +++++ .../events/channel/ChannelPostEditEvent.java | 11 +-- .../api/events/channel/ChannelPostEvent.java | 11 +-- .../events/chat/ChatMemberJoinedEvent.java | 5 +- .../api/events/chat/ChatMemberLeftEvent.java | 5 +- .../chat/ChatMigratedFromChatEvent.java | 5 +- .../events/chat/ChatMigratedToChatEvent.java | 5 +- .../events/chat/ChatPhotoDeletedEvent.java | 5 +- .../events/chat/GroupChatCreatedEvent.java | 5 +- .../api/events/chat/NewChatPhotoEvent.java | 5 +- .../api/events/chat/NewChatTitleEvent.java | 5 +- .../api/events/chat/PinnedMessageEvent.java | 5 +- .../api/events/chat/UserLoggedInEvent.java | 5 +- .../inline/ChosenInlineResultEvent.java | 10 ++- .../api/events/inline/InlineQueryEvent.java | 11 +-- .../inline/keyboard/CallbackQueryEvent.java | 11 +-- .../events/location/LocationUpdateEvent.java | 11 +-- .../events/message/AnimationMessageEvent.java | 5 +- .../api/events/message/AudioMessageEvent.java | 5 +- .../events/message/ContactMessageEvent.java | 5 +- .../events/message/DocumentMessageEvent.java | 5 +- .../api/events/message/GameMessageEvent.java | 5 +- .../events/message/InvoiceMessageEvent.java | 5 +- .../events/message/LocationMessageEvent.java | 5 +- .../api/events/message/MessageEvent.java | 9 +- .../api/events/message/PhotoMessageEvent.java | 5 +- .../events/message/ServiceMessageEvent.java | 5 +- .../events/message/StickerMessageEvent.java | 5 +- .../api/events/message/TextMessageEvent.java | 5 +- .../api/events/message/VenueMessageEvent.java | 5 +- .../api/events/message/VideoMessageEvent.java | 5 +- .../events/message/VideoNoteMessageEvent.java | 5 +- .../api/events/message/VoiceMessageEvent.java | 5 +- .../events/message/edit/CaptionEditEvent.java | 9 +- .../message/edit/TextMessageEditEvent.java | 8 +- .../events/payment/PreCheckoutQueryEvent.java | 10 ++- .../events/payment/ShippingQueryEvent.java | 11 +-- .../payment/SuccessfulPaymentEvent.java | 5 +- .../jtelegram/api/inline/CallbackQuery.java | 3 +- .../com/jtelegram/api/inline/InlineQuery.java | 3 +- .../api/inline/result/ChosenInlineResult.java | 3 +- .../com/jtelegram/api/message/Message.java | 3 +- .../input/file/InputStreamInputFile.java | 48 ++++++++++ .../message/payments/PreCheckoutQuery.java | 3 +- .../api/message/payments/ShippingQuery.java | 3 +- .../java/com/jtelegram/api/update/Update.java | 88 ++++++++++++++++--- .../jtelegram/api/update/UpdateContents.java | 9 ++ .../com/jtelegram/api/update/UpdateType.java | 43 +++++---- jtelegrambotapi-jtelegraf/pom.xml | 27 ++++++ .../com/jtelegram/jtelegraf/TelegrafBot.java | 58 ++++++++++++ .../jtelegram/jtelegraf/TelegrafContext.java | 24 +++++ .../jtelegram/jtelegraf/TelegrafListener.java | 14 +++ pom.xml | 1 + 56 files changed, 476 insertions(+), 147 deletions(-) create mode 100644 jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/UpdateEvent.java create mode 100644 jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/input/file/InputStreamInputFile.java create mode 100644 jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/UpdateContents.java create mode 100644 jtelegrambotapi-jtelegraf/pom.xml create mode 100644 jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java create mode 100644 jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafContext.java create mode 100644 jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafListener.java diff --git a/jtelegrambotapi-core/pom.xml b/jtelegrambotapi-core/pom.xml index 2abf92482..51a182542 100644 --- a/jtelegrambotapi-core/pom.xml +++ b/jtelegrambotapi-core/pom.xml @@ -29,6 +29,11 @@ okhttp + + com.google.code.findbugs + jsr305 + + diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/Event.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/Event.java index 29e7b7033..b249533f2 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/Event.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/Event.java @@ -1,6 +1,7 @@ package com.jtelegram.api.events; import com.jtelegram.api.TelegramBot; +import javax.annotation.Nonnull; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; @@ -10,8 +11,10 @@ @AllArgsConstructor(access = AccessLevel.PROTECTED) public abstract class Event { @Getter + @Nonnull private final TelegramBot bot; + @Nonnull public Class getType() { return getClass(); } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/EventRegistry.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/EventRegistry.java index 499c4945c..cd00dc6b9 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/EventRegistry.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/EventRegistry.java @@ -4,7 +4,6 @@ import com.jtelegram.api.events.inline.ChosenInlineResultEvent; import com.jtelegram.api.requests.inline.AnswerInlineQuery; import com.jtelegram.api.util.ExceptionThreadFactory; - import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -58,14 +57,20 @@ public void dispatch(E event) { } this.threadPool.submit(() -> { - List> h = handlers.get(event.getType()); - - if (h != null) { - h.forEach(handler -> { - EventHandler eh = (EventHandler) handler; - eh.onEvent(event); - }); + Class eventClass = event.getClass(); + List> h = new ArrayList<>(); + while (Event.class.isAssignableFrom(eventClass) && eventClass != Event.class) { + List> handlerList = handlers.get(eventClass.asSubclass(Event.class)); + if (handlerList != null) { + h.addAll(handlerList); + } + eventClass = eventClass.getSuperclass(); } + + h.forEach(handler -> { + EventHandler eh = (EventHandler) handler; + eh.onEvent(event); + }); }); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/UpdateEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/UpdateEvent.java new file mode 100644 index 000000000..87524ea3c --- /dev/null +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/UpdateEvent.java @@ -0,0 +1,22 @@ +package com.jtelegram.api.events; + +import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.update.Update; +import javax.annotation.Nonnull; +import lombok.Getter; + +/** + * @author Nick Robson + */ +@Getter +public abstract class UpdateEvent> extends Event { + + @Nonnull + private T update; + + protected UpdateEvent(@Nonnull TelegramBot bot, @Nonnull T update) { + super(bot); + this.update = update; + } + +} diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEditEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEditEvent.java index 67367e342..2df8fee1d 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEditEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEditEvent.java @@ -1,8 +1,9 @@ package com.jtelegram.api.events.channel; import com.jtelegram.api.TelegramBot; -import com.jtelegram.api.events.Event; +import com.jtelegram.api.events.UpdateEvent; import com.jtelegram.api.message.Message; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @@ -11,11 +12,11 @@ */ @Getter @ToString(callSuper = true) -public class ChannelPostEditEvent extends Event { +public class ChannelPostEditEvent extends UpdateEvent { private Message post; - public ChannelPostEditEvent(TelegramBot bot, Message post) { - super(bot); - this.post = post; + public ChannelPostEditEvent(TelegramBot bot, Update.EditedChannelPostUpdate update) { + super(bot, update); + this.post = update.getEditedChannelPost(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEvent.java index f152cfb0c..921b91013 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/channel/ChannelPostEvent.java @@ -1,8 +1,9 @@ package com.jtelegram.api.events.channel; import com.jtelegram.api.TelegramBot; -import com.jtelegram.api.events.Event; +import com.jtelegram.api.events.UpdateEvent; import com.jtelegram.api.message.Message; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @@ -11,11 +12,11 @@ */ @Getter @ToString(callSuper = true) -public class ChannelPostEvent extends Event { +public class ChannelPostEvent extends UpdateEvent { private Message post; - public ChannelPostEvent(TelegramBot bot, Message post) { - super(bot); - this.post = post; + public ChannelPostEvent(TelegramBot bot, Update.ChannelPostUpdate update) { + super(bot, update); + this.post = update.getChannelPost(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberJoinedEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberJoinedEvent.java index f50fd9d0b..698905483 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberJoinedEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberJoinedEvent.java @@ -3,6 +3,7 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.events.message.ServiceMessageEvent; import com.jtelegram.api.message.impl.service.NewChatMembersMessage; +import com.jtelegram.api.update.Update; import com.jtelegram.api.user.User; import lombok.Getter; @@ -14,8 +15,8 @@ public class ChatMemberJoinedEvent extends ServiceMessageEvent { private List newMembers; - public ChatMemberJoinedEvent(TelegramBot bot, NewChatMembersMessage originMessage) { - super(bot, originMessage); + public ChatMemberJoinedEvent(TelegramBot bot, Update.MessageUpdate update, NewChatMembersMessage originMessage) { + super(bot, update, originMessage); this.newMembers = originMessage.getNewChatMembers(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberLeftEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberLeftEvent.java index 49f41dd16..4472e99be 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberLeftEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMemberLeftEvent.java @@ -2,6 +2,7 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.events.message.ServiceMessageEvent; +import com.jtelegram.api.update.Update; import com.jtelegram.api.user.User; import com.jtelegram.api.message.impl.service.LeftChatMemberMessage; import lombok.Getter; @@ -12,8 +13,8 @@ public class ChatMemberLeftEvent extends ServiceMessageEvent { private User leftMember; - public ChatMemberLeftEvent(TelegramBot bot, LeftChatMemberMessage originMessage) { - super(bot, originMessage); + public ChatMemberLeftEvent(TelegramBot bot, Update.MessageUpdate update, LeftChatMemberMessage originMessage) { + super(bot, update, originMessage); this.leftMember = originMessage.getLeftChatMember(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedFromChatEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedFromChatEvent.java index 96a886672..1f79f6c2a 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedFromChatEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedFromChatEvent.java @@ -4,6 +4,7 @@ import com.jtelegram.api.chat.Chat; import com.jtelegram.api.events.message.ServiceMessageEvent; import com.jtelegram.api.message.impl.service.MigrateFromChatIdMessage; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @@ -12,8 +13,8 @@ public class ChatMigratedFromChatEvent extends ServiceMessageEvent { private Chat newChat; - public ChatMigratedFromChatEvent(TelegramBot bot, MigrateFromChatIdMessage originMessage) { - super(bot, originMessage); + public ChatMigratedFromChatEvent(TelegramBot bot, Update.MessageUpdate update, MigrateFromChatIdMessage originMessage) { + super(bot, update, originMessage); this.newChat = originMessage.getChat(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedToChatEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedToChatEvent.java index 3968f1bb6..7be2c3636 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedToChatEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatMigratedToChatEvent.java @@ -4,6 +4,7 @@ import com.jtelegram.api.chat.Chat; import com.jtelegram.api.events.message.ServiceMessageEvent; import com.jtelegram.api.message.impl.service.MigrateToChatIdMessage; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @@ -12,8 +13,8 @@ public class ChatMigratedToChatEvent extends ServiceMessageEvent { private Chat newChat; - public ChatMigratedToChatEvent(TelegramBot bot, MigrateToChatIdMessage originMessage) { - super(bot, originMessage); + public ChatMigratedToChatEvent(TelegramBot bot, Update.MessageUpdate update, MigrateToChatIdMessage originMessage) { + super(bot, update, originMessage); this.newChat = originMessage.getChat(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatPhotoDeletedEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatPhotoDeletedEvent.java index 59fcda4d0..8763a0dfb 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatPhotoDeletedEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/ChatPhotoDeletedEvent.java @@ -3,11 +3,12 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.events.message.ServiceMessageEvent; import com.jtelegram.api.message.impl.service.DeleteChatPhotoMessage; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class ChatPhotoDeletedEvent extends ServiceMessageEvent { - public ChatPhotoDeletedEvent(TelegramBot bot, DeleteChatPhotoMessage originMessage) { - super(bot, originMessage); + public ChatPhotoDeletedEvent(TelegramBot bot, Update.MessageUpdate update, DeleteChatPhotoMessage originMessage) { + super(bot, update, originMessage); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/GroupChatCreatedEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/GroupChatCreatedEvent.java index 825574c6b..741d6afca 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/GroupChatCreatedEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/GroupChatCreatedEvent.java @@ -4,6 +4,7 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.events.message.ServiceMessageEvent; import com.jtelegram.api.message.impl.service.GroupChatCreatedMessage; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @@ -12,8 +13,8 @@ public class GroupChatCreatedEvent extends ServiceMessageEvent { private Chat newChat; - public GroupChatCreatedEvent(TelegramBot bot, GroupChatCreatedMessage originMessage) { - super(bot, originMessage); + public GroupChatCreatedEvent(TelegramBot bot, Update.MessageUpdate update, GroupChatCreatedMessage originMessage) { + super(bot, update, originMessage); this.newChat = originMessage.getChat(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatPhotoEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatPhotoEvent.java index 791a2c962..8ce1d9064 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatPhotoEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatPhotoEvent.java @@ -4,6 +4,7 @@ import com.jtelegram.api.events.message.ServiceMessageEvent; import com.jtelegram.api.message.impl.service.NewChatPhotoMessage; import com.jtelegram.api.message.media.PhotoSize; +import com.jtelegram.api.update.Update; import java.util.List; import lombok.Getter; import lombok.ToString; @@ -13,8 +14,8 @@ public class NewChatPhotoEvent extends ServiceMessageEvent { private List newChatPhoto; - public NewChatPhotoEvent(TelegramBot bot, NewChatPhotoMessage originMessage) { - super(bot, originMessage); + public NewChatPhotoEvent(TelegramBot bot, Update.MessageUpdate update, NewChatPhotoMessage originMessage) { + super(bot, update, originMessage); this.newChatPhoto = originMessage.getNewChatPhoto(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatTitleEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatTitleEvent.java index fcff36e48..2838b9394 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatTitleEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/NewChatTitleEvent.java @@ -3,6 +3,7 @@ import com.jtelegram.api.events.message.ServiceMessageEvent; import com.jtelegram.api.message.impl.service.NewChatTitleMessage; import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @@ -11,8 +12,8 @@ public class NewChatTitleEvent extends ServiceMessageEvent { private String newTitle; - public NewChatTitleEvent(TelegramBot bot, NewChatTitleMessage originMessage) { - super(bot, originMessage); + public NewChatTitleEvent(TelegramBot bot, Update.MessageUpdate update, NewChatTitleMessage originMessage) { + super(bot, update, originMessage); this.newTitle = originMessage.getNewChatTitle(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/PinnedMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/PinnedMessageEvent.java index 55a31f2db..b3a708ea8 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/PinnedMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/PinnedMessageEvent.java @@ -4,6 +4,7 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.Message; import com.jtelegram.api.message.impl.service.PinnedMessageMessage; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @@ -12,8 +13,8 @@ public class PinnedMessageEvent extends ServiceMessageEvent { private Message pinnedMessage; - public PinnedMessageEvent(TelegramBot bot, PinnedMessageMessage originMessage) { - super(bot, originMessage); + public PinnedMessageEvent(TelegramBot bot, Update.MessageUpdate update, PinnedMessageMessage originMessage) { + super(bot, update, originMessage); this.pinnedMessage = originMessage.getPinnedMessage(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/UserLoggedInEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/UserLoggedInEvent.java index f3b34bf7c..6ce857571 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/UserLoggedInEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/UserLoggedInEvent.java @@ -3,6 +3,7 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.events.message.ServiceMessageEvent; import com.jtelegram.api.message.impl.service.UserLoggedInMessage; +import com.jtelegram.api.update.Update; import lombok.ToString; /** @@ -14,7 +15,7 @@ */ @ToString(callSuper = true) public class UserLoggedInEvent extends ServiceMessageEvent { - public UserLoggedInEvent(TelegramBot bot, UserLoggedInMessage originMessage) { - super(bot, originMessage); + public UserLoggedInEvent(TelegramBot bot, Update.MessageUpdate update, UserLoggedInMessage originMessage) { + super(bot, update, originMessage); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/ChosenInlineResultEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/ChosenInlineResultEvent.java index 0f0803931..36479ae03 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/ChosenInlineResultEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/ChosenInlineResultEvent.java @@ -2,7 +2,9 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.events.Event; +import com.jtelegram.api.events.UpdateEvent; import com.jtelegram.api.inline.result.ChosenInlineResult; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @@ -11,11 +13,11 @@ */ @Getter @ToString(callSuper = true) -public class ChosenInlineResultEvent extends Event { +public class ChosenInlineResultEvent extends UpdateEvent { private ChosenInlineResult chosenResult; - public ChosenInlineResultEvent(TelegramBot bot, ChosenInlineResult chosenResult) { - super(bot); - this.chosenResult = chosenResult; + public ChosenInlineResultEvent(TelegramBot bot, Update.ChosenInlineResultUpdate update) { + super(bot, update); + this.chosenResult = update.getChosenInlineResult(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/InlineQueryEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/InlineQueryEvent.java index 5b626fc6c..fa3b4121e 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/InlineQueryEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/InlineQueryEvent.java @@ -1,8 +1,9 @@ package com.jtelegram.api.events.inline; import com.jtelegram.api.TelegramBot; -import com.jtelegram.api.events.Event; +import com.jtelegram.api.events.UpdateEvent; import com.jtelegram.api.inline.InlineQuery; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @@ -11,11 +12,11 @@ */ @Getter @ToString(callSuper = true) -public class InlineQueryEvent extends Event { +public class InlineQueryEvent extends UpdateEvent { private InlineQuery query; - public InlineQueryEvent(TelegramBot bot, InlineQuery query) { - super(bot); - this.query = query; + public InlineQueryEvent(TelegramBot bot, Update.InlineQueryUpdate update) { + super(bot, update); + this.query = update.getInlineQuery(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/keyboard/CallbackQueryEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/keyboard/CallbackQueryEvent.java index 0b780d967..7a8334b68 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/keyboard/CallbackQueryEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/inline/keyboard/CallbackQueryEvent.java @@ -1,18 +1,19 @@ package com.jtelegram.api.events.inline.keyboard; import com.jtelegram.api.TelegramBot; -import com.jtelegram.api.events.Event; +import com.jtelegram.api.events.UpdateEvent; import com.jtelegram.api.inline.CallbackQuery; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @Getter @ToString(callSuper = true) -public class CallbackQueryEvent extends Event { +public class CallbackQueryEvent extends UpdateEvent { private CallbackQuery query; - public CallbackQueryEvent(TelegramBot bot, CallbackQuery query) { - super(bot); - this.query = query; + public CallbackQueryEvent(TelegramBot bot, Update.CallbackQueryUpdate update) { + super(bot, update); + this.query = update.getCallbackQuery(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/location/LocationUpdateEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/location/LocationUpdateEvent.java index f3d476f62..6e0b74ed7 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/location/LocationUpdateEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/location/LocationUpdateEvent.java @@ -1,20 +1,21 @@ package com.jtelegram.api.events.location; -import com.jtelegram.api.message.impl.LocationMessage; import com.jtelegram.api.TelegramBot; -import com.jtelegram.api.events.Event; +import com.jtelegram.api.events.UpdateEvent; +import com.jtelegram.api.message.impl.LocationMessage; import com.jtelegram.api.message.media.Location; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @Getter @ToString(callSuper = true) -public class LocationUpdateEvent extends Event { +public class LocationUpdateEvent extends UpdateEvent { private Location location; private LocationMessage message; - public LocationUpdateEvent(TelegramBot bot, LocationMessage message) { - super(bot); + public LocationUpdateEvent(TelegramBot bot, Update.EditedMessageUpdate update, LocationMessage message) { + super(bot, update); this.location = message.getLocation(); this.message = message; } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AnimationMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AnimationMessageEvent.java index b3bdeb4e0..2979e63e5 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AnimationMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AnimationMessageEvent.java @@ -2,9 +2,10 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.impl.AnimationMessage; +import com.jtelegram.api.update.Update; public class AnimationMessageEvent extends MessageEvent { - public AnimationMessageEvent(TelegramBot bot, AnimationMessage message) { - super(bot, message); + public AnimationMessageEvent(TelegramBot bot, Update.MessageUpdate update, AnimationMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AudioMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AudioMessageEvent.java index 21a175fdf..eb5bc2482 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AudioMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/AudioMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.impl.AudioMessage; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class AudioMessageEvent extends MessageEvent { - public AudioMessageEvent(TelegramBot bot, AudioMessage message) { - super(bot, message); + public AudioMessageEvent(TelegramBot bot, Update.MessageUpdate update, AudioMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ContactMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ContactMessageEvent.java index df2ed5729..167fe880b 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ContactMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ContactMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.impl.ContactMessage; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class ContactMessageEvent extends MessageEvent { - public ContactMessageEvent(TelegramBot bot, ContactMessage message) { - super(bot, message); + public ContactMessageEvent(TelegramBot bot, Update.MessageUpdate update, ContactMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/DocumentMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/DocumentMessageEvent.java index 12924263e..a0cdcb7a9 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/DocumentMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/DocumentMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.impl.DocumentMessage; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class DocumentMessageEvent extends MessageEvent { - public DocumentMessageEvent(TelegramBot bot, DocumentMessage message) { - super(bot, message); + public DocumentMessageEvent(TelegramBot bot, Update.MessageUpdate update, DocumentMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/GameMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/GameMessageEvent.java index 08dacd869..d1158d751 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/GameMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/GameMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.impl.GameMessage; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class GameMessageEvent extends MessageEvent { - public GameMessageEvent(TelegramBot bot, GameMessage message) { - super(bot, message); + public GameMessageEvent(TelegramBot bot, Update.MessageUpdate update, GameMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/InvoiceMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/InvoiceMessageEvent.java index f90785e88..71fb08a83 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/InvoiceMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/InvoiceMessageEvent.java @@ -2,9 +2,10 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.impl.InvoiceMessage; +import com.jtelegram.api.update.Update; public class InvoiceMessageEvent extends MessageEvent { - public InvoiceMessageEvent(TelegramBot bot, InvoiceMessage message) { - super(bot, message); + public InvoiceMessageEvent(TelegramBot bot, Update.MessageUpdate update, InvoiceMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/LocationMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/LocationMessageEvent.java index 315dcecdf..537ffc68d 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/LocationMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/LocationMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.message.impl.LocationMessage; import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class LocationMessageEvent extends MessageEvent { - public LocationMessageEvent(TelegramBot bot, LocationMessage message) { - super(bot, message); + public LocationMessageEvent(TelegramBot bot, Update.MessageUpdate update, LocationMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/MessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/MessageEvent.java index 6841690b8..45ca7dca3 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/MessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/MessageEvent.java @@ -1,18 +1,19 @@ package com.jtelegram.api.events.message; import com.jtelegram.api.TelegramBot; -import com.jtelegram.api.events.Event; +import com.jtelegram.api.events.UpdateEvent; import com.jtelegram.api.message.Message; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @ToString(callSuper = true) -public class MessageEvent extends Event { +public class MessageEvent extends UpdateEvent { @Getter private T message; - public MessageEvent(TelegramBot bot, T message) { - super(bot); + public MessageEvent(TelegramBot bot, Update.MessageUpdate update, T message) { + super(bot, update); this.message = message; } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/PhotoMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/PhotoMessageEvent.java index 80901684b..cd94413ca 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/PhotoMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/PhotoMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.impl.PhotoMessage; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class PhotoMessageEvent extends MessageEvent { - public PhotoMessageEvent(TelegramBot bot, PhotoMessage message) { - super(bot, message); + public PhotoMessageEvent(TelegramBot bot, Update.MessageUpdate update, PhotoMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ServiceMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ServiceMessageEvent.java index afc0a0109..4fa0eb3ab 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ServiceMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/ServiceMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.message.impl.service.ServiceMessage; import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public abstract class ServiceMessageEvent extends MessageEvent { - protected ServiceMessageEvent(TelegramBot bot, T originMessage) { - super(bot, originMessage); + protected ServiceMessageEvent(TelegramBot bot, Update.MessageUpdate update, T originMessage) { + super(bot, update, originMessage); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/StickerMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/StickerMessageEvent.java index 1d234134a..5356764a6 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/StickerMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/StickerMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.impl.StickerMessage; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class StickerMessageEvent extends MessageEvent { - public StickerMessageEvent(TelegramBot bot, StickerMessage message) { - super(bot, message); + public StickerMessageEvent(TelegramBot bot, Update.MessageUpdate update, StickerMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/TextMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/TextMessageEvent.java index 21537d062..1764cc67e 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/TextMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/TextMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.message.impl.TextMessage; import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class TextMessageEvent extends MessageEvent { - public TextMessageEvent(TelegramBot bot, TextMessage message) { - super(bot, message); + public TextMessageEvent(TelegramBot bot, Update.MessageUpdate update, TextMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VenueMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VenueMessageEvent.java index 74092832a..cb9a83124 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VenueMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VenueMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.impl.VenueMessage; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class VenueMessageEvent extends MessageEvent { - public VenueMessageEvent(TelegramBot bot, VenueMessage message) { - super(bot, message); + public VenueMessageEvent(TelegramBot bot, Update.MessageUpdate update, VenueMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoMessageEvent.java index d9945ee78..c67c44ca9 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.message.impl.VideoMessage; import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class VideoMessageEvent extends MessageEvent { - public VideoMessageEvent(TelegramBot bot, VideoMessage message) { - super(bot, message); + public VideoMessageEvent(TelegramBot bot, Update.MessageUpdate update, VideoMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoNoteMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoNoteMessageEvent.java index c66bcee09..909b3eb22 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoNoteMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VideoNoteMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.impl.VideoNoteMessage; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class VideoNoteMessageEvent extends MessageEvent { - public VideoNoteMessageEvent(TelegramBot bot, VideoNoteMessage message) { - super(bot, message); + public VideoNoteMessageEvent(TelegramBot bot, Update.MessageUpdate update, VideoNoteMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VoiceMessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VoiceMessageEvent.java index 695441fa9..941cda54b 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VoiceMessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/VoiceMessageEvent.java @@ -2,11 +2,12 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.impl.VoiceMessage; +import com.jtelegram.api.update.Update; import lombok.ToString; @ToString(callSuper = true) public class VoiceMessageEvent extends MessageEvent { - public VoiceMessageEvent(TelegramBot bot, VoiceMessage message) { - super(bot, message); + public VoiceMessageEvent(TelegramBot bot, Update.MessageUpdate update, VoiceMessage message) { + super(bot, update, message); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/CaptionEditEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/CaptionEditEvent.java index fe8cd73ad..8b4c47e8c 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/CaptionEditEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/CaptionEditEvent.java @@ -1,18 +1,19 @@ package com.jtelegram.api.events.message.edit; import com.jtelegram.api.TelegramBot; -import com.jtelegram.api.events.Event; +import com.jtelegram.api.events.UpdateEvent; import com.jtelegram.api.message.CaptionableMessage; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @ToString(callSuper = true) -public class CaptionEditEvent extends Event { +public class CaptionEditEvent extends UpdateEvent { @Getter private CaptionableMessage message; - public CaptionEditEvent(TelegramBot bot, CaptionableMessage message) { - super(bot); + public CaptionEditEvent(TelegramBot bot, Update.EditedMessageUpdate update, CaptionableMessage message) { + super(bot, update); this.message = message; } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/TextMessageEditEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/TextMessageEditEvent.java index e4da2e54b..caedcd837 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/TextMessageEditEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/edit/TextMessageEditEvent.java @@ -1,18 +1,20 @@ package com.jtelegram.api.events.message.edit; +import com.jtelegram.api.events.UpdateEvent; import com.jtelegram.api.message.impl.TextMessage; import com.jtelegram.api.TelegramBot; import com.jtelegram.api.events.Event; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @ToString(callSuper = true) -public class TextMessageEditEvent extends Event { +public class TextMessageEditEvent extends UpdateEvent { @Getter private TextMessage newMessage; - public TextMessageEditEvent(TelegramBot bot, TextMessage newMessage) { - super(bot); + public TextMessageEditEvent(TelegramBot bot, Update.EditedMessageUpdate update, TextMessage newMessage) { + super(bot, update); this.newMessage = newMessage; } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/PreCheckoutQueryEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/PreCheckoutQueryEvent.java index c2c0a29c9..dc4cde810 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/PreCheckoutQueryEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/PreCheckoutQueryEvent.java @@ -2,17 +2,19 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.events.Event; +import com.jtelegram.api.events.UpdateEvent; import com.jtelegram.api.message.payments.PreCheckoutQuery; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @Getter @ToString(callSuper = true) -public class PreCheckoutQueryEvent extends Event { +public class PreCheckoutQueryEvent extends UpdateEvent { private PreCheckoutQuery checkoutQuery; - public PreCheckoutQueryEvent(TelegramBot bot, PreCheckoutQuery checkoutQuery) { - super(bot); - this.checkoutQuery = checkoutQuery; + public PreCheckoutQueryEvent(TelegramBot bot, Update.PreCheckoutQueryUpdate update) { + super(bot, update); + this.checkoutQuery = update.getPreCheckoutQuery(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/ShippingQueryEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/ShippingQueryEvent.java index d297143ca..c960713f1 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/ShippingQueryEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/ShippingQueryEvent.java @@ -1,19 +1,20 @@ package com.jtelegram.api.events.payment; import com.jtelegram.api.TelegramBot; -import com.jtelegram.api.events.Event; +import com.jtelegram.api.events.UpdateEvent; import com.jtelegram.api.message.payments.ShippingQuery; +import com.jtelegram.api.update.Update; import lombok.ToString; /** * When a new shipping query is received */ @ToString(callSuper = true) -public class ShippingQueryEvent extends Event { +public class ShippingQueryEvent extends UpdateEvent { private ShippingQuery shippingQuery; - public ShippingQueryEvent(TelegramBot bot, ShippingQuery shippingQuery) { - super(bot); - this.shippingQuery = shippingQuery; + public ShippingQueryEvent(TelegramBot bot, Update.ShippingQueryUpdate update) { + super(bot, update); + this.shippingQuery = update.getShippingQuery(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/SuccessfulPaymentEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/SuccessfulPaymentEvent.java index 37d59dfc0..8d3d4d646 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/SuccessfulPaymentEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/payment/SuccessfulPaymentEvent.java @@ -4,6 +4,7 @@ import com.jtelegram.api.message.impl.SuccessfulPaymentMessage; import com.jtelegram.api.message.payments.SuccessfulPayment; import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.update.Update; import lombok.Getter; import lombok.ToString; @@ -12,8 +13,8 @@ public class SuccessfulPaymentEvent extends MessageEvent { private SuccessfulPayment payment; - public SuccessfulPaymentEvent(TelegramBot bot, SuccessfulPaymentMessage message) { - super(bot, message); + public SuccessfulPaymentEvent(TelegramBot bot, Update.MessageUpdate update, SuccessfulPaymentMessage message) { + super(bot, update, message); this.payment = message.getSuccessfulPayment(); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/CallbackQuery.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/CallbackQuery.java index e784988bc..d342853ab 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/CallbackQuery.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/CallbackQuery.java @@ -1,5 +1,6 @@ package com.jtelegram.api.inline; +import com.jtelegram.api.update.UpdateContents; import com.jtelegram.api.user.User; import com.jtelegram.api.message.Message; import lombok.AccessLevel; @@ -12,7 +13,7 @@ @ToString @EqualsAndHashCode(of = "id") @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class CallbackQuery { +public class CallbackQuery implements UpdateContents { private String id; private User from; private Message message; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/InlineQuery.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/InlineQuery.java index 0f5280c50..17ccc9ff4 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/InlineQuery.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/InlineQuery.java @@ -1,5 +1,6 @@ package com.jtelegram.api.inline; +import com.jtelegram.api.update.UpdateContents; import com.jtelegram.api.user.User; import com.jtelegram.api.message.media.Location; import lombok.*; @@ -8,7 +9,7 @@ @ToString @EqualsAndHashCode(of = "id") @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class InlineQuery { +public class InlineQuery implements UpdateContents { private String id; private User from; private Location location; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/ChosenInlineResult.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/ChosenInlineResult.java index 6f0a35cb9..dfabba5f1 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/ChosenInlineResult.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/inline/result/ChosenInlineResult.java @@ -1,6 +1,7 @@ package com.jtelegram.api.inline.result; import com.jtelegram.api.message.media.Location; +import com.jtelegram.api.update.UpdateContents; import com.jtelegram.api.user.User; import lombok.*; @@ -8,7 +9,7 @@ @ToString @EqualsAndHashCode(of = "resultId") @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ChosenInlineResult { +public class ChosenInlineResult implements UpdateContents { private String resultId; private User from; private String query; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/Message.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/Message.java index ddebe8cc6..274e95f22 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/Message.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/Message.java @@ -9,6 +9,7 @@ import com.jtelegram.api.requests.message.DeleteMessage; import com.jtelegram.api.requests.message.ForwardMessage; import com.jtelegram.api.requests.message.edit.EditMessageReplyMarkup; +import com.jtelegram.api.update.UpdateContents; import com.jtelegram.api.user.User; import java.lang.reflect.Type; import lombok.Getter; @@ -16,7 +17,7 @@ @Getter @ToString -public abstract class Message { +public abstract class Message implements UpdateContents { private int messageId; private User from; private long date; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/input/file/InputStreamInputFile.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/input/file/InputStreamInputFile.java new file mode 100644 index 000000000..1256d758d --- /dev/null +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/input/file/InputStreamInputFile.java @@ -0,0 +1,48 @@ +package com.jtelegram.api.message.input.file; + +import java.io.IOException; +import java.io.InputStream; +import javax.annotation.Nonnull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.ToString; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import okio.BufferedSink; +import okio.Okio; + +@Getter +@ToString +@AllArgsConstructor +public class InputStreamInputFile implements InputFile { + private final String identifier; + private final InputStream data; + + @Override + public boolean isAttachable() { + return false; + } + + @Override + public void attachTo(MultipartBody.Builder builder) { + builder.addFormDataPart(identifier, identifier, new RequestBody() { + @Override + public MediaType contentType() { + return InputFileRequest.OCTET_STREAM_TYPE; + } + + @Override + public void writeTo(@Nonnull BufferedSink bufferedSink) throws IOException { + if (data.markSupported()) { + try { + data.reset(); + } catch (IOException ignored) { + // mark may not have been called + } + } + bufferedSink.writeAll(Okio.source(data)); + } + }); + } +} diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/payments/PreCheckoutQuery.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/payments/PreCheckoutQuery.java index c4d0613df..f4a336e10 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/payments/PreCheckoutQuery.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/payments/PreCheckoutQuery.java @@ -1,5 +1,6 @@ package com.jtelegram.api.message.payments; +import com.jtelegram.api.update.UpdateContents; import com.jtelegram.api.user.User; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; @@ -7,7 +8,7 @@ @RequiredArgsConstructor(access = AccessLevel.PROTECTED) @ToString -public class PreCheckoutQuery { +public class PreCheckoutQuery implements UpdateContents { private final String id; private final User from; private final String currency; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/payments/ShippingQuery.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/payments/ShippingQuery.java index 8283b7deb..5cc3c8884 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/payments/ShippingQuery.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/payments/ShippingQuery.java @@ -1,5 +1,6 @@ package com.jtelegram.api.message.payments; +import com.jtelegram.api.update.UpdateContents; import com.jtelegram.api.user.User; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; @@ -7,7 +8,7 @@ @RequiredArgsConstructor(access = AccessLevel.PROTECTED) @ToString -public class ShippingQuery { +public class ShippingQuery implements UpdateContents { private final String id; private final User from; private final String invoicePayload; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/Update.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/Update.java index d929c157c..9c6eae233 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/Update.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/Update.java @@ -7,68 +7,136 @@ import com.jtelegram.api.message.Message; import com.jtelegram.api.message.payments.PreCheckoutQuery; import com.jtelegram.api.message.payments.ShippingQuery; +import javax.annotation.Nonnull; import lombok.Getter; import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; +import lombok.NonNull; import lombok.ToString; @Getter @ToString -public class Update { +public abstract class Update { private int updateId; + @Nonnull + public abstract T getContents(); + @Getter @ToString(callSuper = true) - public static class ChannelPostUpdate extends Update { + public static class ChannelPostUpdate extends Update { + @NonNull private Message channelPost; + + @Nonnull + @Override + public Message getContents() { + return channelPost; + } } @Getter @ToString(callSuper = true) - public static class ChosenInlineResultUpdate extends Update { + public static class ChosenInlineResultUpdate extends Update { + @NonNull private ChosenInlineResult chosenInlineResult; + + @Nonnull + @Override + public ChosenInlineResult getContents() { + return chosenInlineResult; + } } @Getter @ToString(callSuper = true) - public static class EditedChannelPostUpdate extends Update { + public static class EditedChannelPostUpdate extends Update { + @NonNull private Message editedChannelPost; + + @Nonnull + @Override + public Message getContents() { + return editedChannelPost; + } } @Getter @ToString(callSuper = true) - public static class EditedMessageUpdate extends Update { + public static class EditedMessageUpdate extends Update { + @NonNull private Message editedMessage; + + @Nonnull + @Override + public Message getContents() { + return editedMessage; + } } @Getter @ToString(callSuper = true) - public static class InlineQueryUpdate extends Update { + public static class InlineQueryUpdate extends Update { + @NonNull private InlineQuery inlineQuery; + + @Nonnull + @Override + public InlineQuery getContents() { + return inlineQuery; + } } @Getter @ToString(callSuper = true) - public static class CallbackQueryUpdate extends Update { + public static class CallbackQueryUpdate extends Update { + @NonNull private CallbackQuery callbackQuery; + + @Nonnull + @Override + public CallbackQuery getContents() { + return callbackQuery; + } } @Getter @ToString(callSuper = true) - public static class MessageUpdate extends Update { + public static class MessageUpdate extends Update { + @NonNull private Message message; + + @Nonnull + @Override + public Message getContents() { + return message; + } } @Getter - public static class PreCheckoutQueryUpdate extends Update { + public static class PreCheckoutQueryUpdate extends Update { + @NonNull private PreCheckoutQuery preCheckoutQuery; + + @Nonnull + @Override + public PreCheckoutQuery getContents() { + return preCheckoutQuery; + } } @Getter - public static class ShippingQueryUpdate extends Update { + public static class ShippingQueryUpdate extends Update { + @NonNull private ShippingQuery shippingQuery; + + @Nonnull + @Override + public ShippingQuery getContents() { + return shippingQuery; + } } public static class Deserializer implements JsonDeserializer { diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/UpdateContents.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/UpdateContents.java new file mode 100644 index 000000000..788cb7ad9 --- /dev/null +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/UpdateContents.java @@ -0,0 +1,9 @@ +package com.jtelegram.api.update; + +/** + * Marks an object as being a potential content type for an {@link Update} + * + * @author Nick Robson + */ +public interface UpdateContents { +} diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/UpdateType.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/UpdateType.java index f50c21737..010db5feb 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/UpdateType.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/UpdateType.java @@ -3,32 +3,31 @@ import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import com.jtelegram.api.events.Event; -import com.jtelegram.api.events.location.LocationUpdateEvent; -import com.jtelegram.api.events.payment.ShippingQueryEvent; -import com.jtelegram.api.message.CaptionableMessage; -import com.jtelegram.api.message.Message; -import com.jtelegram.api.message.impl.LocationMessage; import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.events.Event; import com.jtelegram.api.events.channel.ChannelPostEditEvent; import com.jtelegram.api.events.channel.ChannelPostEvent; import com.jtelegram.api.events.inline.ChosenInlineResultEvent; import com.jtelegram.api.events.inline.InlineQueryEvent; import com.jtelegram.api.events.inline.keyboard.CallbackQueryEvent; +import com.jtelegram.api.events.location.LocationUpdateEvent; import com.jtelegram.api.events.message.MessageEvent; import com.jtelegram.api.events.message.edit.CaptionEditEvent; import com.jtelegram.api.events.message.edit.TextMessageEditEvent; import com.jtelegram.api.events.payment.PreCheckoutQueryEvent; +import com.jtelegram.api.events.payment.ShippingQueryEvent; +import com.jtelegram.api.message.CaptionableMessage; +import com.jtelegram.api.message.Message; import com.jtelegram.api.message.MessageType; +import com.jtelegram.api.message.impl.LocationMessage; import com.jtelegram.api.message.impl.TextMessage; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; - import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.function.BiFunction; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.ToString; @Getter @@ -38,43 +37,43 @@ public class UpdateType { public static final UpdateType CHANNEL_POST = new UpdateType<>( "CHANNEL_POST", Update.ChannelPostUpdate.class, - (bot, update) -> new ChannelPostEvent(bot, update.getChannelPost()) + ChannelPostEvent::new ); public static final UpdateType EDITED_CHANNEL_POST = new UpdateType<>( "EDITED_CHANNEL_POST", Update.EditedChannelPostUpdate.class, - (bot, update) -> new ChannelPostEditEvent(bot, update.getEditedChannelPost()) + ChannelPostEditEvent::new ); public static final UpdateType INLINE_QUERY = new UpdateType<>( "INLINE_QUERY", Update.InlineQueryUpdate.class, - (bot, update) -> new InlineQueryEvent(bot, update.getInlineQuery()) + InlineQueryEvent::new ); public static final UpdateType CHOSEN_INLINE_RESULT = new UpdateType<>( "CHOSEN_INLINE_RESULT", Update.ChosenInlineResultUpdate.class, - (bot, update) -> new ChosenInlineResultEvent(bot, update.getChosenInlineResult()) + ChosenInlineResultEvent::new ); public static final UpdateType SHIPPING_QUERY = new UpdateType<>( "SHIPPING_QUERY", Update.ShippingQueryUpdate.class, - (bot, update) -> new ShippingQueryEvent(bot, update.getShippingQuery()) + ShippingQueryEvent::new ); public static final UpdateType PRE_CHECKOUT_QUERY = new UpdateType<>( "PRE_CHECKOUT_QUERY", Update.PreCheckoutQueryUpdate.class, - (bot, update) -> new PreCheckoutQueryEvent(bot, update.getPreCheckoutQuery()) + PreCheckoutQueryEvent::new ); public static final UpdateType CALLBACK_QUERY = new UpdateType<>( "CALLBACK_QUERY", Update.CallbackQueryUpdate.class, - (bot, update) -> new CallbackQueryEvent(bot, update.getCallbackQuery()) + CallbackQueryEvent::new ); public static final UpdateType MESSAGE = new UpdateType<>( @@ -86,7 +85,7 @@ public class UpdateType { Constructor constructor; try { - constructor = eventClass.getDeclaredConstructor(TelegramBot.class, type.getMessageClass()); + constructor = eventClass.getDeclaredConstructor(TelegramBot.class, Update.MessageUpdate.class, type.getMessageClass()); } catch (NoSuchMethodException ex) { System.out.println("INTERNAL ERROR: Cannot find appropriate event constructor for " + eventClass.getName()); return null; @@ -95,7 +94,7 @@ public class UpdateType { MessageEvent event; try { - event = constructor.newInstance(bot, update.getMessage()); + event = constructor.newInstance(bot, update, update.getMessage()); } catch (InstantiationException | IllegalAccessException | InvocationTargetException ex) { System.out.println("There was an error creating a new instance of " + eventClass.getSimpleName() + "!"); ex.printStackTrace(); @@ -113,11 +112,11 @@ public class UpdateType { Message updatedMessage = update.getEditedMessage(); if (updatedMessage instanceof TextMessage) { - return new TextMessageEditEvent(bot, (TextMessage) updatedMessage); + return new TextMessageEditEvent(bot, update, (TextMessage) updatedMessage); } else if (updatedMessage instanceof LocationMessage) { - return new LocationUpdateEvent(bot, (LocationMessage) updatedMessage); + return new LocationUpdateEvent(bot, update, (LocationMessage) updatedMessage); } else if (updatedMessage instanceof CaptionableMessage) { - return new CaptionEditEvent(bot, (CaptionableMessage) updatedMessage); + return new CaptionEditEvent(bot, update, (CaptionableMessage) updatedMessage); } return null; diff --git a/jtelegrambotapi-jtelegraf/pom.xml b/jtelegrambotapi-jtelegraf/pom.xml new file mode 100644 index 000000000..10af021a1 --- /dev/null +++ b/jtelegrambotapi-jtelegraf/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + + com.jtelegram + jtelegrambotapi + 4.0.1-SNAPSHOT + + + jtelegrambotapi-jtelegraf + ${parent.version} + + + + ${parent.groupId} + jtelegrambotapi-core + ${parent.version} + + + org.projectlombok + lombok + + + diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java new file mode 100644 index 000000000..68cba2c53 --- /dev/null +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java @@ -0,0 +1,58 @@ +package com.jtelegram.jtelegraf; + +import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.events.UpdateEvent; +import com.jtelegram.api.update.Update; +import com.jtelegram.api.update.UpdateContents; +import com.jtelegram.api.update.UpdateType; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.ParametersAreNonnullByDefault; + +/** + * @author Nick Robson + */ +@ParametersAreNonnullByDefault +public class TelegrafBot { + + private final Map, List>> updateListeners = new HashMap<>(); + + public TelegrafBot(TelegramBot bot) { + bot.getEventRegistry().registerEvent(UpdateEvent.class, event -> { + Update update = event.getUpdate(); + Class updateClass = update.getClass(); + List> listeners = updateListeners.get(updateClass); + if (listeners != null) { + TelegrafContext context = new TelegrafContext<>(update); + for (TelegrafListener listener : listeners) { + try { + //noinspection unchecked + listener.onUpdate(context, bot); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + }); + } + + public , U extends UpdateContents> + void on(UpdateType updateType, TelegrafListener listener) { + Class updateClass = updateType.getUpdateClass(); + + //noinspection Duplicates + updateListeners.compute( + updateClass, + (k, v) -> { + if (v == null) { + v = new ArrayList<>(); + } + v.add(listener); + return v; + } + ); + } + +} diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafContext.java new file mode 100644 index 000000000..e7d2e99e2 --- /dev/null +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafContext.java @@ -0,0 +1,24 @@ +package com.jtelegram.jtelegraf; + +import com.jtelegram.api.update.Update; +import com.jtelegram.api.update.UpdateContents; +import javax.annotation.Nonnull; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * @author Nick Robson + */ +@Getter +@RequiredArgsConstructor +public class TelegrafContext, U extends UpdateContents> { + + @Nonnull + private final T update; + + @Nonnull + public U getContents() { + return update.getContents(); + } + +} diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafListener.java new file mode 100644 index 000000000..e77bbf840 --- /dev/null +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafListener.java @@ -0,0 +1,14 @@ +package com.jtelegram.jtelegraf; + +import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.update.Update; +import com.jtelegram.api.update.UpdateContents; + +/** + * @author Nick Robson + */ +public interface TelegrafListener, U extends UpdateContents> { + + void onUpdate(TelegrafContext context, TelegramBot bot); + +} diff --git a/pom.xml b/pom.xml index 556efa2f9..dce08c5d5 100644 --- a/pom.xml +++ b/pom.xml @@ -80,6 +80,7 @@ jtelegrambotapi-menus jtelegrambotapi-test jtelegrambotapi-webhooks + jtelegrambotapi-jtelegraf From 92d5374c962929c736018fc85bdaaca3764a6b89 Mon Sep 17 00:00:00 2001 From: Nick Robson Date: Wed, 14 Nov 2018 12:48:14 +1100 Subject: [PATCH 5/9] Add .on for messages --- .../jtelegram/api/TelegramBotRegistry.java | 2 + .../chat/SupergroupChatCreatedEvent.java | 20 +++ .../api/events/message/MessageEvent.java | 2 +- .../com/jtelegram/api/message/Message.java | 4 +- .../jtelegram/api/message/MessageType.java | 153 +++++++++++++----- .../api/message/impl/PhotoMessage.java | 13 +- .../message/impl/service/ServiceMessage.java | 2 +- .../jtelegram/api/message/media/Photo.java | 43 +++++ .../java/com/jtelegram/api/update/Update.java | 15 +- .../com/jtelegram/api/update/UpdateType.java | 2 +- .../com/jtelegram/jtelegraf/TelegrafBot.java | 49 +++++- .../jtelegraf/TelegrafMessageContext.java | 36 +++++ .../jtelegraf/TelegrafMessageListener.java | 13 ++ ...ontext.java => TelegrafUpdateContext.java} | 6 +- ...tener.java => TelegrafUpdateListener.java} | 4 +- 15 files changed, 292 insertions(+), 72 deletions(-) create mode 100644 jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/SupergroupChatCreatedEvent.java create mode 100644 jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/media/Photo.java create mode 100644 jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageContext.java create mode 100644 jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageListener.java rename jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/{TelegrafContext.java => TelegrafUpdateContext.java} (71%) rename jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/{TelegrafListener.java => TelegrafUpdateListener.java} (54%) diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/TelegramBotRegistry.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/TelegramBotRegistry.java index 801e972cc..7f257ffeb 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/TelegramBotRegistry.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/TelegramBotRegistry.java @@ -11,6 +11,7 @@ import com.jtelegram.api.inline.keyboard.InlineKeyboardRow; import com.jtelegram.api.inline.result.framework.InlineResultType; import com.jtelegram.api.message.entity.MessageEntity; +import com.jtelegram.api.message.media.Photo; import com.jtelegram.api.update.Update; import com.jtelegram.api.update.UpdateProvider; import com.jtelegram.api.update.UpdateType; @@ -46,6 +47,7 @@ public class TelegramBotRegistry { .registerTypeAdapter(InlineKeyboardRow.class, new InlineKeyboardRow.Serializer()) .registerTypeAdapter(ReplyKeyboardRow.class, new ReplyKeyboardRow.Serializer()) .registerTypeAdapter(Update.class, new Update.Deserializer()) + .registerTypeAdapter(Photo.class, new Photo.Deserializer()) .registerTypeAdapter(Chat.class, new Chat.Deserializer()) .registerTypeAdapter(Message.class, new Message.Deserializer()) .registerTypeAdapter(MessageEntity.class, new MessageEntity.Deserializer()) diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/SupergroupChatCreatedEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/SupergroupChatCreatedEvent.java new file mode 100644 index 000000000..0d17c66fd --- /dev/null +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/chat/SupergroupChatCreatedEvent.java @@ -0,0 +1,20 @@ +package com.jtelegram.api.events.chat; + +import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.chat.Chat; +import com.jtelegram.api.events.message.ServiceMessageEvent; +import com.jtelegram.api.message.impl.service.SupergroupChatCreatedMessage; +import com.jtelegram.api.update.Update; +import lombok.Getter; +import lombok.ToString; + +@Getter +@ToString(callSuper = true) +public class SupergroupChatCreatedEvent extends ServiceMessageEvent { + private Chat newChat; + + public SupergroupChatCreatedEvent(TelegramBot bot, Update.MessageUpdate update, SupergroupChatCreatedMessage originMessage) { + super(bot, update, originMessage); + this.newChat = originMessage.getChat(); + } +} diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/MessageEvent.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/MessageEvent.java index 45ca7dca3..84f1e5c42 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/MessageEvent.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/events/message/MessageEvent.java @@ -8,7 +8,7 @@ import lombok.ToString; @ToString(callSuper = true) -public class MessageEvent extends UpdateEvent { +public class MessageEvent> extends UpdateEvent { @Getter private T message; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/Message.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/Message.java index 274e95f22..eeaeb26d9 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/Message.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/Message.java @@ -71,8 +71,8 @@ public static class Deserializer implements JsonDeserializer { public Message deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException { JsonObject object = jsonElement.getAsJsonObject(); - for (MessageType messageType : MessageType.values()) { - if (object.has(messageType.name().toLowerCase())) { + for (MessageType messageType : MessageType.values) { + if (object.has(messageType.getName().toLowerCase())) { return context.deserialize(object, messageType.getMessageClass()); } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/MessageType.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/MessageType.java index 0b4dedb34..020d778e3 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/MessageType.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/MessageType.java @@ -1,54 +1,119 @@ package com.jtelegram.api.message; -import com.jtelegram.api.events.chat.*; -import com.jtelegram.api.events.message.*; +import com.jtelegram.api.events.chat.ChatMemberJoinedEvent; +import com.jtelegram.api.events.chat.ChatMemberLeftEvent; +import com.jtelegram.api.events.chat.ChatMigratedFromChatEvent; +import com.jtelegram.api.events.chat.ChatMigratedToChatEvent; +import com.jtelegram.api.events.chat.ChatPhotoDeletedEvent; +import com.jtelegram.api.events.chat.GroupChatCreatedEvent; +import com.jtelegram.api.events.chat.NewChatPhotoEvent; +import com.jtelegram.api.events.chat.NewChatTitleEvent; +import com.jtelegram.api.events.chat.PinnedMessageEvent; +import com.jtelegram.api.events.chat.SupergroupChatCreatedEvent; +import com.jtelegram.api.events.chat.UserLoggedInEvent; +import com.jtelegram.api.events.message.AnimationMessageEvent; +import com.jtelegram.api.events.message.AudioMessageEvent; +import com.jtelegram.api.events.message.ContactMessageEvent; +import com.jtelegram.api.events.message.DocumentMessageEvent; +import com.jtelegram.api.events.message.GameMessageEvent; +import com.jtelegram.api.events.message.InvoiceMessageEvent; +import com.jtelegram.api.events.message.LocationMessageEvent; +import com.jtelegram.api.events.message.MessageEvent; +import com.jtelegram.api.events.message.PhotoMessageEvent; +import com.jtelegram.api.events.message.StickerMessageEvent; +import com.jtelegram.api.events.message.TextMessageEvent; +import com.jtelegram.api.events.message.VenueMessageEvent; +import com.jtelegram.api.events.message.VideoMessageEvent; +import com.jtelegram.api.events.message.VideoNoteMessageEvent; +import com.jtelegram.api.events.message.VoiceMessageEvent; import com.jtelegram.api.events.payment.SuccessfulPaymentEvent; -import com.jtelegram.api.message.impl.*; -import com.jtelegram.api.message.impl.service.*; +import com.jtelegram.api.message.games.Game; +import com.jtelegram.api.message.impl.AnimationMessage; +import com.jtelegram.api.message.impl.AudioMessage; +import com.jtelegram.api.message.impl.ContactMessage; +import com.jtelegram.api.message.impl.DocumentMessage; +import com.jtelegram.api.message.impl.GameMessage; +import com.jtelegram.api.message.impl.InvoiceMessage; +import com.jtelegram.api.message.impl.LocationMessage; +import com.jtelegram.api.message.impl.PhotoMessage; +import com.jtelegram.api.message.impl.StickerMessage; +import com.jtelegram.api.message.impl.SuccessfulPaymentMessage; +import com.jtelegram.api.message.impl.TextMessage; +import com.jtelegram.api.message.impl.VenueMessage; +import com.jtelegram.api.message.impl.VideoMessage; +import com.jtelegram.api.message.impl.VideoNoteMessage; +import com.jtelegram.api.message.impl.VoiceMessage; +import com.jtelegram.api.message.impl.service.DeleteChatPhotoMessage; +import com.jtelegram.api.message.impl.service.GroupChatCreatedMessage; +import com.jtelegram.api.message.impl.service.LeftChatMemberMessage; +import com.jtelegram.api.message.impl.service.MigrateFromChatIdMessage; +import com.jtelegram.api.message.impl.service.MigrateToChatIdMessage; +import com.jtelegram.api.message.impl.service.NewChatMembersMessage; +import com.jtelegram.api.message.impl.service.NewChatPhotoMessage; +import com.jtelegram.api.message.impl.service.NewChatTitleMessage; +import com.jtelegram.api.message.impl.service.PinnedMessageMessage; +import com.jtelegram.api.message.impl.service.SupergroupChatCreatedMessage; +import com.jtelegram.api.message.impl.service.UserLoggedInMessage; +import com.jtelegram.api.message.media.Animation; +import com.jtelegram.api.message.media.Audio; +import com.jtelegram.api.message.media.Contact; +import com.jtelegram.api.message.media.Document; +import com.jtelegram.api.message.media.Location; +import com.jtelegram.api.message.media.Photo; +import com.jtelegram.api.message.media.Venue; +import com.jtelegram.api.message.media.Video; +import com.jtelegram.api.message.media.VideoNote; +import com.jtelegram.api.message.media.Voice; +import com.jtelegram.api.message.payments.Invoice; +import com.jtelegram.api.message.payments.SuccessfulPayment; +import com.jtelegram.api.message.sticker.Sticker; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Getter; -public enum MessageType { - TEXT(TextMessage.class, TextMessageEvent.class), - ANIMATION(AnimationMessage.class, AnimationMessageEvent.class), - AUDIO(AudioMessage.class, AudioMessageEvent.class), - DOCUMENT(DocumentMessage.class, DocumentMessageEvent.class), - GAME(GameMessage.class, GameMessageEvent.class), - PHOTO(PhotoMessage.class, PhotoMessageEvent.class), - STICKER(StickerMessage.class, StickerMessageEvent.class), - VIDEO(VideoMessage.class, VideoMessageEvent.class), - VOICE(VoiceMessage.class, VoiceMessageEvent.class), - VIDEO_NOTE(VideoNoteMessage.class, VideoNoteMessageEvent.class), - CONTACT(ContactMessage.class, ContactMessageEvent.class), - VENUE(VenueMessage.class, VenueMessageEvent.class), - LOCATION(LocationMessage.class, LocationMessageEvent.class), - INVOICE(InvoiceMessage.class, InvoiceMessageEvent.class), - SUCCESSFUL_PAYMENT(SuccessfulPaymentMessage.class, SuccessfulPaymentEvent.class), - - NEW_CHAT_MEMBERS(NewChatMembersMessage.class, ChatMemberJoinedEvent.class), - LEFT_CHAT_MEMBER(LeftChatMemberMessage.class, ChatMemberLeftEvent.class), - NEW_CHAT_TITLE(NewChatTitleMessage.class, NewChatTitleEvent.class), - NEW_CHAT_PHOTO(NewChatPhotoMessage.class, NewChatPhotoEvent.class), - DELETE_CHAT_PHOTO(DeleteChatPhotoMessage.class, ChatPhotoDeletedEvent.class), - GROUP_CHAT_CREATED(GroupChatCreatedMessage.class, GroupChatCreatedEvent.class), - PINNED_MESSAGE(PinnedMessageMessage.class, PinnedMessageEvent.class), - CONNECTED_WEBSITE(UserLoggedInMessage.class, UserLoggedInEvent.class), - SUPERGROUP_CHAT_CREATED(SupergroupChatCreatedMessage.class, GroupChatCreatedEvent.class), - MIGRATE_TO_CHAT_ID(MigrateToChatIdMessage.class, ChatMigratedToChatEvent.class), - MIGRATE_FROM_CHAT_ID(MigrateFromChatIdMessage.class, ChatMigratedFromChatEvent.class) - ; - - @Getter - private Class messageClass; - @Getter - private Class receiveEventClass; - - MessageType(Class messageClass, Class receiveEventClass) { - this.messageClass = messageClass; - this.receiveEventClass = receiveEventClass; - } +@Getter +@AllArgsConstructor(access = AccessLevel.PACKAGE) +public class MessageType, E extends MessageEvent> { + public static final MessageType TEXT = new MessageType<>("TEXT", String.class, TextMessage.class, TextMessageEvent.class); + public static final MessageType ANIMATION = new MessageType<>("ANIMATION", Animation.class, AnimationMessage.class, AnimationMessageEvent.class); + public static final MessageType AUDIO = new MessageType<>("AUDIO", Audio.class, AudioMessage.class, AudioMessageEvent.class); + public static final MessageType DOCUMENT = new MessageType<>("DOCUMENT", Document.class, DocumentMessage.class, DocumentMessageEvent.class); + public static final MessageType GAME = new MessageType<>("GAME", Game.class, GameMessage.class, GameMessageEvent.class); + public static final MessageType PHOTO = new MessageType<>("PHOTO", Photo.class, PhotoMessage.class, PhotoMessageEvent.class); + public static final MessageType STICKER = new MessageType<>("STICKER", Sticker.class, StickerMessage.class, StickerMessageEvent.class); + public static final MessageType VIDEO = new MessageType<>("VIDEO", Video.class, VideoMessage.class, VideoMessageEvent.class); + public static final MessageType VOICE = new MessageType<>("VOICE", Voice.class, VoiceMessage.class, VoiceMessageEvent.class); + public static final MessageType VIDEO_NOTE = new MessageType<>("VIDEO_NOTE", VideoNote.class, VideoNoteMessage.class, VideoNoteMessageEvent.class); + public static final MessageType CONTACT = new MessageType<>("CONTACT", Contact.class, ContactMessage.class, ContactMessageEvent.class); + public static final MessageType VENUE = new MessageType<>("VENUE", Venue.class, VenueMessage.class, VenueMessageEvent.class); + public static final MessageType LOCATION = new MessageType<>("LOCATION", Location.class, LocationMessage.class, LocationMessageEvent.class); + public static final MessageType INVOICE = new MessageType<>("INVOICE", Invoice.class, InvoiceMessage.class, InvoiceMessageEvent.class); + public static final MessageType SUCCESSFUL_PAYMENT = new MessageType<>("SUCCESSFUL_PAYMENT", SuccessfulPayment.class, SuccessfulPaymentMessage.class, SuccessfulPaymentEvent.class); + + public static final MessageType NEW_CHAT_MEMBERS = new MessageType<>("NEW_CHAT_MEMBERS", Object.class, NewChatMembersMessage.class, ChatMemberJoinedEvent.class); + public static final MessageType LEFT_CHAT_MEMBER = new MessageType<>("LEFT_CHAT_MEMBER", Object.class, LeftChatMemberMessage.class, ChatMemberLeftEvent.class); + public static final MessageType NEW_CHAT_TITLE = new MessageType<>("NEW_CHAT_TITLE", Object.class, NewChatTitleMessage.class, NewChatTitleEvent.class); + public static final MessageType NEW_CHAT_PHOTO = new MessageType<>("NEW_CHAT_PHOTO", Object.class, NewChatPhotoMessage.class, NewChatPhotoEvent.class); + public static final MessageType DELETE_CHAT_PHOTO = new MessageType<>("DELETE_CHAT_PHOTO", Object.class, DeleteChatPhotoMessage.class, ChatPhotoDeletedEvent.class); + public static final MessageType GROUP_CHAT_CREATED = new MessageType<>("GROUP_CHAT_CREATED", Object.class, GroupChatCreatedMessage.class, GroupChatCreatedEvent.class); + public static final MessageType PINNED_MESSAGE = new MessageType<>("PINNED_MESSAGE", Object.class, PinnedMessageMessage.class, PinnedMessageEvent.class); + public static final MessageType CONNECTED_WEBSITE = new MessageType<>("CONNECTED_WEBSITE", Object.class, UserLoggedInMessage.class, UserLoggedInEvent.class); + public static final MessageType SUPERGROUP_CHAT_CREATED = new MessageType<>("SUPERGROUP_CHAT_CREATED", Object.class, SupergroupChatCreatedMessage.class, SupergroupChatCreatedEvent.class); + public static final MessageType MIGRATE_TO_CHAT_ID = new MessageType<>("MIGRATE_TO_CHAT_ID", Object.class, MigrateToChatIdMessage.class, ChatMigratedToChatEvent.class); + public static final MessageType MIGRATE_FROM_CHAT_ID = new MessageType<>("MIGRATE_FROM_CHAT_ID", Object.class, MigrateFromChatIdMessage.class, ChatMigratedFromChatEvent.class); + + public static final MessageType[] values = { + TEXT, ANIMATION, AUDIO, DOCUMENT, GAME, PHOTO, STICKER, VIDEO, VOICE, VIDEO_NOTE, CONTACT, VENUE, LOCATION, INVOICE, SUCCESSFUL_PAYMENT, + NEW_CHAT_MEMBERS, LEFT_CHAT_MEMBER, NEW_CHAT_TITLE, NEW_CHAT_PHOTO, DELETE_CHAT_PHOTO, GROUP_CHAT_CREATED, PINNED_MESSAGE, CONNECTED_WEBSITE, SUPERGROUP_CHAT_CREATED, MIGRATE_TO_CHAT_ID, MIGRATE_FROM_CHAT_ID }; + + private String name; + private Class messageContentsClass; + private Class messageClass; + private Class receiveEventClass; public static MessageType typeFrom(Class clazz) { - for (MessageType type : values()) { + for (MessageType type : values) { + //noinspection unchecked if (type.getMessageClass().isAssignableFrom(clazz)) { return type; } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/impl/PhotoMessage.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/impl/PhotoMessage.java index 53075728f..edb60c483 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/impl/PhotoMessage.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/impl/PhotoMessage.java @@ -1,20 +1,19 @@ package com.jtelegram.api.message.impl; import com.jtelegram.api.message.CaptionableMessage; +import com.jtelegram.api.message.media.Photo; import com.jtelegram.api.message.media.PhotoSize; import com.jtelegram.api.requests.message.edit.EditMessageCaption; import com.jtelegram.api.requests.message.edit.EditMessageMedia; -import lombok.Getter; -import lombok.ToString; - import java.util.ArrayList; import java.util.Comparator; -import java.util.List; +import lombok.Getter; +import lombok.ToString; @Getter @ToString(callSuper = true) -public class PhotoMessage extends CaptionableMessage> { - private List photo = new ArrayList<>(); +public class PhotoMessage extends CaptionableMessage { + private Photo photo = new Photo(new ArrayList<>()); /** * This field does not exist in the Telegram Docs, however is * non-zero whenever a photo is a fragment of an album. Albums @@ -25,7 +24,7 @@ public class PhotoMessage extends CaptionableMessage> { private long mediaGroupId; @Override - public List getContent() { + public Photo getContent() { return photo; } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/impl/service/ServiceMessage.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/impl/service/ServiceMessage.java index 5848e97da..ac204616b 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/impl/service/ServiceMessage.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/impl/service/ServiceMessage.java @@ -7,7 +7,7 @@ * Sharable class between all service messages */ @ToString(callSuper = true) -public abstract class ServiceMessage extends Message { +public abstract class ServiceMessage extends Message { @Override public Object getContent() { return null; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/media/Photo.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/media/Photo.java new file mode 100644 index 000000000..280ef4503 --- /dev/null +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/media/Photo.java @@ -0,0 +1,43 @@ +package com.jtelegram.api.message.media; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import java.lang.reflect.Type; +import java.util.AbstractList; +import java.util.List; +import javax.annotation.Nonnull; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Represents an immutable list of photo sizes. + * + * @author Nick Robson + */ +@Getter +@AllArgsConstructor +public class Photo extends AbstractList { + + @Nonnull + private final List photoSizeList; + + @Override + public PhotoSize get(int index) { + return photoSizeList.get(index); + } + + @Override + public int size() { + return photoSizeList.size(); + } + + public static class Deserializer implements JsonDeserializer { + @Override + public Photo deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + List photoSizeList = jsonDeserializationContext.deserialize(jsonElement, List.class); + return new Photo(photoSizeList); + } + } +} diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/Update.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/Update.java index 9c6eae233..15d6d2bbc 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/Update.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/Update.java @@ -1,18 +1,21 @@ package com.jtelegram.api.update; -import com.google.gson.*; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import com.jtelegram.api.inline.CallbackQuery; import com.jtelegram.api.inline.InlineQuery; import com.jtelegram.api.inline.result.ChosenInlineResult; import com.jtelegram.api.message.Message; import com.jtelegram.api.message.payments.PreCheckoutQuery; import com.jtelegram.api.message.payments.ShippingQuery; -import javax.annotation.Nonnull; -import lombok.Getter; - import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; +import javax.annotation.Nonnull; +import lombok.Getter; import lombok.NonNull; import lombok.ToString; @@ -106,11 +109,11 @@ public CallbackQuery getContents() { @ToString(callSuper = true) public static class MessageUpdate extends Update { @NonNull - private Message message; + private Message message; @Nonnull @Override - public Message getContents() { + public Message getContents() { return message; } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/UpdateType.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/UpdateType.java index 010db5feb..ba1cd67e8 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/UpdateType.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/update/UpdateType.java @@ -80,7 +80,7 @@ public class UpdateType { "MESSAGE", Update.MessageUpdate.class, (bot, update) -> { - MessageType type = MessageType.typeFrom(update.getMessage()); + MessageType type = MessageType.typeFrom(update.getMessage()); Class eventClass = type.getReceiveEventClass(); Constructor constructor; diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java index 68cba2c53..46804b772 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java @@ -2,6 +2,9 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.events.UpdateEvent; +import com.jtelegram.api.events.message.MessageEvent; +import com.jtelegram.api.message.Message; +import com.jtelegram.api.message.MessageType; import com.jtelegram.api.update.Update; import com.jtelegram.api.update.UpdateContents; import com.jtelegram.api.update.UpdateType; @@ -17,16 +20,35 @@ @ParametersAreNonnullByDefault public class TelegrafBot { - private final Map, List>> updateListeners = new HashMap<>(); + private final Map, List>> updateListeners = new HashMap<>(); + private final Map, List>> messageListeners = new HashMap<>(); public TelegrafBot(TelegramBot bot) { bot.getEventRegistry().registerEvent(UpdateEvent.class, event -> { Update update = event.getUpdate(); Class updateClass = update.getClass(); - List> listeners = updateListeners.get(updateClass); + List> listeners = updateListeners.get(updateClass); if (listeners != null) { - TelegrafContext context = new TelegrafContext<>(update); - for (TelegrafListener listener : listeners) { + TelegrafUpdateContext context = new TelegrafUpdateContext<>(update); + for (TelegrafUpdateListener listener : listeners) { + try { + //noinspection unchecked + listener.onUpdate(context, bot); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + }); + bot.getEventRegistry().registerEvent(MessageEvent.class, event -> { + Update.MessageUpdate update = (Update.MessageUpdate) event.getUpdate(); + Message message = update.getContents(); + Class messageClass = message.getClass(); + List> listeners = messageListeners.get(messageClass); + if (listeners != null) { + //noinspection unchecked + TelegrafMessageContext context = new TelegrafMessageContext<>(update, message); + for (TelegrafMessageListener listener : listeners) { try { //noinspection unchecked listener.onUpdate(context, bot); @@ -39,7 +61,7 @@ public TelegrafBot(TelegramBot bot) { } public , U extends UpdateContents> - void on(UpdateType updateType, TelegrafListener listener) { + void on(UpdateType updateType, TelegrafUpdateListener listener) { Class updateClass = updateType.getUpdateClass(); //noinspection Duplicates @@ -55,4 +77,21 @@ void on(UpdateType updateType, TelegrafListener listener) { ); } + public , E extends MessageEvent> + void on(MessageType messageType, TelegrafMessageListener listener) { + Class messageClass = messageType.getMessageClass(); + + //noinspection Duplicates + messageListeners.compute( + messageClass, + (k, v) -> { + if (v == null) { + v = new ArrayList<>(); + } + v.add(listener); + return v; + } + ); + } + } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageContext.java new file mode 100644 index 000000000..ada1a6f2f --- /dev/null +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageContext.java @@ -0,0 +1,36 @@ +package com.jtelegram.jtelegraf; + +import com.jtelegram.api.message.Message; +import com.jtelegram.api.update.Update; +import javax.annotation.Nonnull; +import lombok.Getter; + +/** + * @author Nick Robson + */ +@Getter +public class TelegrafMessageContext> extends TelegrafUpdateContext { + + private final M message; + + public TelegrafMessageContext(@Nonnull Update.MessageUpdate update, @Nonnull M message) { + super(update); + this.message = message; + } + + @Nonnull + @Override + public M getContents() { + // overridden to provide stronger typing + return message; + } + + public M getMessage() { + return message; + } + + public C getMessageContents() { + return message.getContent(); + } + +} diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageListener.java new file mode 100644 index 000000000..62b8e49eb --- /dev/null +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageListener.java @@ -0,0 +1,13 @@ +package com.jtelegram.jtelegraf; + +import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.message.Message; + +/** + * @author Nick Robson + */ +public interface TelegrafMessageListener> { + + void onUpdate(TelegrafMessageContext context, TelegramBot bot); + +} diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateContext.java similarity index 71% rename from jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafContext.java rename to jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateContext.java index e7d2e99e2..824579c25 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafContext.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateContext.java @@ -3,15 +3,15 @@ import com.jtelegram.api.update.Update; import com.jtelegram.api.update.UpdateContents; import javax.annotation.Nonnull; +import lombok.AllArgsConstructor; import lombok.Getter; -import lombok.RequiredArgsConstructor; /** * @author Nick Robson */ @Getter -@RequiredArgsConstructor -public class TelegrafContext, U extends UpdateContents> { +@AllArgsConstructor +public class TelegrafUpdateContext, U extends UpdateContents> { @Nonnull private final T update; diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateListener.java similarity index 54% rename from jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafListener.java rename to jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateListener.java index e77bbf840..a92ddb648 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafListener.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateListener.java @@ -7,8 +7,8 @@ /** * @author Nick Robson */ -public interface TelegrafListener, U extends UpdateContents> { +public interface TelegrafUpdateListener, U extends UpdateContents> { - void onUpdate(TelegrafContext context, TelegramBot bot); + void onUpdate(TelegrafUpdateContext context, TelegramBot bot); } From fd14908b456b446cd1a03a656a3074a3c87f1141 Mon Sep 17 00:00:00 2001 From: Nick Robson Date: Thu, 22 Nov 2018 16:23:36 +0100 Subject: [PATCH 6/9] jTelegraf: .hears(...), .command(...), and .entity(...) support --- .../jtelegram/api/TelegramBotRegistry.java | 2 + .../api/message/entity/MessageEntity.java | 10 +- .../api/message/entity/MessageEntityType.java | 128 +++++-- .../message/entity/TextLinkMessageEntity.java | 2 +- .../entity/TextMentionMessageEntity.java | 2 +- .../entity/UnsupportedMessageEntity.java | 4 +- .../com/jtelegram/api/util/TextBuilder.java | 6 + .../com/jtelegram/jtelegraf/TelegrafBot.java | 333 +++++++++++++++++- .../jtelegraf/TelegrafCommandContext.java | 24 ++ .../jtelegraf/TelegrafCommandListener.java | 10 + .../TelegrafHeardMessageContext.java | 26 ++ .../TelegrafHeardMessageListener.java | 10 + .../jtelegraf/TelegrafMessageContext.java | 14 +- .../TelegrafMessageEntityContext.java | 39 ++ .../TelegrafMessageEntityListener.java | 13 + .../jtelegraf/TelegrafMessageListener.java | 5 +- .../jtelegraf/TelegrafUpdateContext.java | 20 +- .../jtelegraf/TelegrafUpdateListener.java | 5 +- 18 files changed, 585 insertions(+), 68 deletions(-) create mode 100644 jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandContext.java create mode 100644 jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandListener.java create mode 100644 jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageContext.java create mode 100644 jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageListener.java create mode 100644 jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityContext.java create mode 100644 jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityListener.java diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/TelegramBotRegistry.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/TelegramBotRegistry.java index 7f257ffeb..e48a02863 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/TelegramBotRegistry.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/TelegramBotRegistry.java @@ -11,6 +11,7 @@ import com.jtelegram.api.inline.keyboard.InlineKeyboardRow; import com.jtelegram.api.inline.result.framework.InlineResultType; import com.jtelegram.api.message.entity.MessageEntity; +import com.jtelegram.api.message.entity.MessageEntityType; import com.jtelegram.api.message.media.Photo; import com.jtelegram.api.update.Update; import com.jtelegram.api.update.UpdateProvider; @@ -51,6 +52,7 @@ public class TelegramBotRegistry { .registerTypeAdapter(Chat.class, new Chat.Deserializer()) .registerTypeAdapter(Message.class, new Message.Deserializer()) .registerTypeAdapter(MessageEntity.class, new MessageEntity.Deserializer()) + .registerTypeAdapter(MessageEntityType.class, new MessageEntityType.Adapter()) .registerTypeHierarchyAdapter(InputFile.class, new InputFile.Serializer()) .registerTypeHierarchyAdapter(ChatId.class, new ChatId.Serializer()) .create(); diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/MessageEntity.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/MessageEntity.java index 1f7eabbca..a2a8fb406 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/MessageEntity.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/MessageEntity.java @@ -13,8 +13,8 @@ @Getter @ToString @EqualsAndHashCode -public class MessageEntity { - protected MessageEntityType type; +public class MessageEntity> { + protected MessageEntityType type; protected int offset; protected int length; protected String content; @@ -23,7 +23,10 @@ public void updateContent(String text) { this.content = text.substring(offset, offset + length); } - static class DefaultMessageEntity extends MessageEntity {} + public static final class DefaultMessageEntity extends MessageEntity { + private DefaultMessageEntity() {} + } + public static class Deserializer implements JsonDeserializer { @Override @@ -33,6 +36,7 @@ public MessageEntity deserialize(JsonElement json, Type typeOfT, JsonDeserializa Class implementationClass; if (type != null) { + //noinspection unchecked implementationClass = type.getImplementationClass(); } else { implementationClass = UnsupportedMessageEntity.class; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/MessageEntityType.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/MessageEntityType.java index 04d060a29..df68eea6e 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/MessageEntityType.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/MessageEntityType.java @@ -1,46 +1,100 @@ package com.jtelegram.api.message.entity; -import com.google.gson.annotations.SerializedName; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import java.lang.reflect.Type; +import java.util.Objects; import lombok.Getter; @Getter -public enum MessageEntityType { - @SerializedName("mention") - MENTION, - @SerializedName("hashtag") - HASHTAG, - @SerializedName("bot_command") - BOT_COMMAND, - @SerializedName("url") - URL, - @SerializedName("email") - EMAIL, - @SerializedName("bold") - BOLD, - @SerializedName("italic") - ITALIC, - @SerializedName("code") - CODE, - @SerializedName("pre") - PRE, - @SerializedName("cashtag") - CASHTAG, - @SerializedName("phone_number") - PHONE_NUMBER, - @SerializedName("text_link") - TEXT_LINK(TextLinkMessageEntity.class), - @SerializedName("text_mention") - TEXT_MENTION(TextMentionMessageEntity.class), - @SerializedName("@@unsupported_by_api@@") - UNSUPPORTED(UnsupportedMessageEntity.class); - - private Class implementationClass; - - MessageEntityType() { - this.implementationClass = MessageEntity.DefaultMessageEntity.class; - } +public final class MessageEntityType { + + public static final MessageEntityType MENTION + = new MessageEntityType<>("mention", MessageEntity.DefaultMessageEntity.class); + + public static final MessageEntityType HASHTAG + = new MessageEntityType<>("hashtag", MessageEntity.DefaultMessageEntity.class); + + public static final MessageEntityType BOT_COMMAND + = new MessageEntityType<>("bot_command", MessageEntity.DefaultMessageEntity.class); + + public static final MessageEntityType URL + = new MessageEntityType<>("url", MessageEntity.DefaultMessageEntity.class); + + public static final MessageEntityType EMAIL + = new MessageEntityType<>("email", MessageEntity.DefaultMessageEntity.class); + + public static final MessageEntityType BOLD + = new MessageEntityType<>("bold", MessageEntity.DefaultMessageEntity.class); + + public static final MessageEntityType ITALIC + = new MessageEntityType<>("italic", MessageEntity.DefaultMessageEntity.class); + + public static final MessageEntityType CODE + = new MessageEntityType<>("code", MessageEntity.DefaultMessageEntity.class); + + public static final MessageEntityType PRE + = new MessageEntityType<>("pre", MessageEntity.DefaultMessageEntity.class); + + public static final MessageEntityType CASHTAG + = new MessageEntityType<>("cashtag", MessageEntity.DefaultMessageEntity.class); + + public static final MessageEntityType PHONE_NUMBER + = new MessageEntityType<>("phone_number", MessageEntity.DefaultMessageEntity.class); + + public static final MessageEntityType TEXT_LINK + = new MessageEntityType<>("text_link", TextLinkMessageEntity.class); - MessageEntityType(Class implementationClass) { + public static final MessageEntityType TEXT_MENTION + = new MessageEntityType<>("text_mention", TextMentionMessageEntity.class); + + public static final MessageEntityType UNSUPPORTED + = new MessageEntityType<>("@@unsupported_by_api@@", UnsupportedMessageEntity.class); + + public static final MessageEntityType[] ALL = { MENTION, HASHTAG, BOT_COMMAND, URL, EMAIL, BOLD, ITALIC, CODE, PRE, CASHTAG, PHONE_NUMBER, TEXT_LINK, TEXT_MENTION }; + + private final String name; + private final Class implementationClass; + + private MessageEntityType(String name, Class implementationClass) { + this.name = name.toLowerCase(); this.implementationClass = implementationClass; } + + @Override + public int hashCode() { + return name.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) + return true; + if (!(obj instanceof MessageEntityType)) { + return false; + } + return Objects.equals(name, ((MessageEntityType) obj).name); + } + + public static class Adapter implements JsonSerializer, JsonDeserializer { + @Override + public JsonElement serialize(MessageEntityType src, Type typeOfSrc, JsonSerializationContext context) { + return context.serialize(src.name); + } + + @Override + public MessageEntityType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + String string = json.getAsString(); + for (MessageEntityType type : ALL) { + if (type.name.equals(string)) { + return type; + } + } + return null; + } + } } diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/TextLinkMessageEntity.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/TextLinkMessageEntity.java index 8dcde82f3..545ec7009 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/TextLinkMessageEntity.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/TextLinkMessageEntity.java @@ -7,7 +7,7 @@ @Getter @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) -public class TextLinkMessageEntity extends MessageEntity { +public class TextLinkMessageEntity extends MessageEntity { private String url; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/TextMentionMessageEntity.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/TextMentionMessageEntity.java index f90cc17cd..09c3e2088 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/TextMentionMessageEntity.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/TextMentionMessageEntity.java @@ -8,7 +8,7 @@ @Getter @ToString(callSuper = true) @EqualsAndHashCode(callSuper = true) -public class TextMentionMessageEntity extends MessageEntity { +public class TextMentionMessageEntity extends MessageEntity { private User user; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/UnsupportedMessageEntity.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/UnsupportedMessageEntity.java index 4cdfde117..bb012008f 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/UnsupportedMessageEntity.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/message/entity/UnsupportedMessageEntity.java @@ -12,15 +12,13 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.ToString; @ToString(callSuper = true) @EqualsAndHashCode(callSuper = false) @JsonAdapter(UnsupportedMessageEntity.Adapter.class) -public class UnsupportedMessageEntity extends MessageEntity { +public class UnsupportedMessageEntity extends MessageEntity { private Map properties; diff --git a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/util/TextBuilder.java b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/util/TextBuilder.java index 89f6d9728..ff694e50b 100644 --- a/jtelegrambotapi-core/src/main/java/com/jtelegram/api/util/TextBuilder.java +++ b/jtelegrambotapi-core/src/main/java/com/jtelegram/api/util/TextBuilder.java @@ -28,6 +28,12 @@ public static TextBuilder create() { return new TextBuilder(); } + public static TextBuilder create(TextBuilder textBuilder) { + TextBuilder newTextBuilder = new TextBuilder(); + newTextBuilder.message.append(textBuilder.message); + return newTextBuilder; + } + private TextBuilder() { } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java index 46804b772..6b6017304 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java @@ -3,15 +3,28 @@ import com.jtelegram.api.TelegramBot; import com.jtelegram.api.events.UpdateEvent; import com.jtelegram.api.events.message.MessageEvent; +import com.jtelegram.api.events.message.TextMessageEvent; import com.jtelegram.api.message.Message; import com.jtelegram.api.message.MessageType; +import com.jtelegram.api.message.entity.MessageEntity; +import com.jtelegram.api.message.entity.MessageEntityType; +import com.jtelegram.api.message.impl.TextMessage; +import com.jtelegram.api.requests.message.send.SendText; import com.jtelegram.api.update.Update; import com.jtelegram.api.update.UpdateContents; import com.jtelegram.api.update.UpdateType; +import com.jtelegram.api.util.TextBuilder; +import java.util.AbstractMap; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.function.Predicate; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; /** @@ -20,20 +33,34 @@ @ParametersAreNonnullByDefault public class TelegrafBot { - private final Map, List>> updateListeners = new HashMap<>(); - private final Map, List>> messageListeners = new HashMap<>(); + public static final String COMMAND_START = "start"; + public static final String COMMAND_HELP = "help"; + public static final String COMMAND_SETTINGS = "settings"; - public TelegrafBot(TelegramBot bot) { + private final Map, List>> updateListeners = new HashMap<>(); + private final Map, List>> messageListeners = new HashMap<>(); + private final Map>> messageEntityListeners = new HashMap<>(); + + private final List>> hearsTextListeners = new LinkedList<>(); + private final List, TelegrafMessageListener>> hearsPredicateListeners = new LinkedList<>(); + private final List> hearsPatternListeners = new LinkedList<>(); + + @Nonnull + private final TelegramBot bot; + + @SuppressWarnings("unchecked") + public TelegrafBot(@Nonnull TelegramBot bot) { + this.bot = bot; bot.getEventRegistry().registerEvent(UpdateEvent.class, event -> { Update update = event.getUpdate(); Class updateClass = update.getClass(); - List> listeners = updateListeners.get(updateClass); + List> listeners = updateListeners.get(updateClass); if (listeners != null) { - TelegrafUpdateContext context = new TelegrafUpdateContext<>(update); + TelegrafUpdateContext context = new TelegrafUpdateContext<>(bot, update); for (TelegrafUpdateListener listener : listeners) { try { //noinspection unchecked - listener.onUpdate(context, bot); + listener.onUpdate(context); } catch (Exception ex) { ex.printStackTrace(); } @@ -44,24 +71,95 @@ public TelegrafBot(TelegramBot bot) { Update.MessageUpdate update = (Update.MessageUpdate) event.getUpdate(); Message message = update.getContents(); Class messageClass = message.getClass(); - List> listeners = messageListeners.get(messageClass); + List> listeners = messageListeners.get(messageClass); if (listeners != null) { //noinspection unchecked - TelegrafMessageContext context = new TelegrafMessageContext<>(update, message); + TelegrafMessageContext context = new TelegrafMessageContext<>(bot, update, message); for (TelegrafMessageListener listener : listeners) { try { //noinspection unchecked - listener.onUpdate(context, bot); + listener.onMessage(context); } catch (Exception ex) { ex.printStackTrace(); } } } }); + bot.getEventRegistry().registerEvent(TextMessageEvent.class, event -> { + Update.MessageUpdate update = event.getUpdate(); + TextMessage message = event.getMessage(); + + TelegrafMessageContext context = new TelegrafMessageContext(bot, update, message); + String text = message.getText(); + hearsTextListeners.forEach(e -> { + try { + if (text.contains(e.getKey())) { + e.getValue().onMessage(context); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + }); + hearsPredicateListeners.forEach(e -> { + try { + if (e.getKey().test(text)) { + e.getValue().onMessage(context); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + }); + hearsPatternListeners.forEach(e -> { + try { + Matcher matcher = e.getKey().matcher(text); + if (matcher.find()) { + TelegrafHeardMessageContext ctx = new TelegrafHeardMessageContext(bot, update, message, matcher); + e.getValue().onMessage(ctx); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + }); + + Map> entities = new HashMap<>(); + event.getMessage().getEntities().forEach(e -> + entities.compute(e.getType(), (k, v) -> { + if (v == null) { + v = new ArrayList<>(); + } + v.add(e); + return v; + } + )); + entities.forEach((type, entity) -> { + List> listeners = messageEntityListeners.get(type); + if (listeners != null) { + //noinspection unchecked + TelegrafMessageEntityContext entityContext = new TelegrafMessageEntityContext(bot, update, message, type, entity); + for (TelegrafMessageEntityListener listener : listeners) { + try { + //noinspection unchecked + listener.onMessageEntity(entityContext); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + }); + }); } - public , U extends UpdateContents> - void on(UpdateType updateType, TelegrafUpdateListener listener) { + /** + * Registers an update listener, to be called whenever an update of the given type is received. + * + * @param updateType the update type to listen for + * @param listener a listener to be called when an update of the given type is received + * + * @param the update content type + * @param the update type + */ + public , UpdateContext extends TelegrafUpdateContext> + void on(UpdateType updateType, TelegrafUpdateListener listener) { Class updateClass = updateType.getUpdateClass(); //noinspection Duplicates @@ -77,8 +175,18 @@ void on(UpdateType updateType, TelegrafUpdateListener listener) { ); } - public , E extends MessageEvent> - void on(MessageType messageType, TelegrafMessageListener listener) { + /** + * Registers a message listener, to be called whenever a message of the given type is received. + * + * @param messageType the message type to listen for + * @param listener a listener to be called when a message of the given type is received + * + * @param the message content type + * @param the message type, which must contain contents of type {@code } + * @param the event type, which must contain a message of type {@code } + */ + public , E extends MessageEvent, MessageContext extends TelegrafMessageContext> + void on(MessageType messageType, TelegrafMessageListener listener) { Class messageClass = messageType.getMessageClass(); //noinspection Duplicates @@ -94,4 +202,203 @@ void on(MessageType messageType, TelegrafMessageListener listener ); } + /** + * Registers a hear-listener. + * This listener will be called once for every message that contains the given text.
+ * + * @param text the text the message must contain + * @param listener a listener to be called every time a message contains the given text + */ + @SuppressWarnings("unchecked") + public void hears(String text, TelegrafMessageListener, String, TextMessage> listener) { + hearsTextListeners.add(new AbstractMap.SimpleEntry(text, listener)); + } + + /** + * Registers a hear-listener. + * This listener will be called once for every message for which the predicate returns true.
+ * + * @param predicate the predicate to use to determine if the listener should be called + * @param listener a listener to be called every time the predicate returns true on a message + */ + @SuppressWarnings("unchecked") + public void hears(Predicate predicate, TelegrafMessageListener, String, TextMessage> listener) { + hearsPredicateListeners.add(new AbstractMap.SimpleEntry(predicate, listener)); + } + + /** + * Registers a hear-listener. + * This listener will be called once for every message that contains the given pattern. + * The pattern does not need to match the entire message text, only part of it.
+ *
+ * Multiple matches inside the same message will only result in the message being called once. + * That is, for a message of {@code "hi hi"} and a pattern of {@code "hi"}, the listener will be called only once.
+ *
+ * To circumnavigate this, you can use the context's matcher in a do-while loop, + * with the condition as {@code context.getMatcher().find()}. + * + * @param pattern the regular expression to find in the message + * @param listener a listener to be called every time the pattern matches a message + */ + public void hears(Pattern pattern, TelegrafHeardMessageListener listener) { + hearsPatternListeners.add(new AbstractMap.SimpleEntry<>(pattern, listener)); + } + + /** + * Registers a command listener, to be called every time the given command is sent. + * + * @param label the command's text + * @param listener a listener to be called when the command is executed + */ + public void command(String label, TelegrafCommandListener listener) { + bot.getCommandRegistry().registerCommand(label.toLowerCase(), (event, command) -> { + TelegrafCommandContext context = new TelegrafCommandContext(bot, event.getUpdate(), event.getMessage(), command); + listener.onCommand(context); + return true; + }); + } + + /** + * Registers a {@code /start} command listener, to be called when a user sends the bot {@code /start}. + * + * @param listener a listener to be called when {@code /start} is received + */ + public void start(TelegrafCommandListener listener) { + command(COMMAND_START, listener); + } + + /** + * Registers a {@code /start} command listener, to be called when a user sends the bot {@code /start}. + * + * @param startMessageText text to be sent when {@code /start} is received + */ + public void start(TextBuilder startMessageText) { + final TextBuilder textBuilder = TextBuilder.create().html(startMessageText.toHtml()); + start(ctx -> + ctx.getBot().perform(SendText.builder() + .chatId(ctx.getMessage().getChat().getChatId()) + .replyToMessageID(ctx.getMessage().getMessageId()) + .text(textBuilder) + .build())); + } + + /** + * Registers a {@code /help} command listener, to be called when a user sends the bot {@code /help}. + * + * @param listener a listener to be called when {@code /help} is received + */ + public void help(TelegrafCommandListener listener) { + command(COMMAND_HELP, listener); + } + + /** + * Registers a {@code /help} command listener, to be called when a user sends the bot {@code /help}. + * + * @param helpMessageText text to be sent when {@code /help} is received + */ + public void help(TextBuilder helpMessageText) { + final TextBuilder textBuilder = TextBuilder.create().html(helpMessageText.toHtml()); + help(ctx -> + ctx.getBot().perform(SendText.builder() + .chatId(ctx.getMessage().getChat().getChatId()) + .replyToMessageID(ctx.getMessage().getMessageId()) + .text(textBuilder) + .build())); + } + + /** + * Registers a {@code /settings} command listener, to be called when a user sends the bot {@code /settings}. + * + * @param listener a listener to be called when {@code /settings} is received + */ + public void settings(TelegrafCommandListener listener) { + command(COMMAND_SETTINGS, listener); + } + + /** + * Registers a {@code /settings} command listener, to be called when a user sends the bot {@code /settings}. + * + * @param settingsMessageText text to be sent when {@code /settings} is received + */ + public void settings(TextBuilder settingsMessageText) { + final TextBuilder textBuilder = TextBuilder.create().html(settingsMessageText.toHtml()); + settings(ctx -> + ctx.getBot().perform(SendText.builder() + .chatId(ctx.getMessage().getChat().getChatId()) + .replyToMessageID(ctx.getMessage().getMessageId()) + .text(textBuilder) + .build())); + } + + /** + * Registers a message entity listener, to be called whenever a user sends a text message containing a given message entity. + * + * @param entityType the message entity type + * @param listener a listener to be called when a message entity of the given type is received + * + * @param the message entity + */ + public > + void entity(MessageEntityType entityType, TelegrafMessageEntityListener, E> listener) { + //noinspection Duplicates + messageEntityListeners.compute( + entityType, + (k, v) -> { + if (v == null) { + v = new ArrayList<>(); + } + v.add(listener); + return v; + } + ); + } + + public void mention(String mention, TelegrafMessageEntityListener, MessageEntity.DefaultMessageEntity> listener) { + entity(MessageEntityType.MENTION, ctx -> { + List entities = ctx.getEntities() + .stream() + .filter(e -> mention.equalsIgnoreCase(e.getContent())) + .collect(Collectors.toList()); + if (!entities.isEmpty()) { + listener.onMessageEntity(ctx.withEntities(entities)); + } + }); + } + + public void phone(String phone, TelegrafMessageEntityListener, MessageEntity.DefaultMessageEntity> listener) { + entity(MessageEntityType.PHONE_NUMBER, ctx -> { + List entities = ctx.getEntities() + .stream() + .filter(e -> phone.equalsIgnoreCase(e.getContent())) + .collect(Collectors.toList()); + if (!entities.isEmpty()) { + listener.onMessageEntity(ctx.withEntities(entities)); + } + }); + } + + public void hashtag(String hashtag, TelegrafMessageEntityListener, MessageEntity.DefaultMessageEntity> listener) { + entity(MessageEntityType.HASHTAG, ctx -> { + List entities = ctx.getEntities() + .stream() + .filter(e -> hashtag.equalsIgnoreCase(e.getContent())) + .collect(Collectors.toList()); + if (!entities.isEmpty()) { + listener.onMessageEntity(ctx.withEntities(entities)); + } + }); + } + + public void cashtag(String cashtag, TelegrafMessageEntityListener, MessageEntity.DefaultMessageEntity> listener) { + entity(MessageEntityType.CASHTAG, ctx -> { + List entities = ctx.getEntities() + .stream() + .filter(e -> cashtag.equalsIgnoreCase(e.getContent())) + .collect(Collectors.toList()); + if (!entities.isEmpty()) { + listener.onMessageEntity(ctx.withEntities(entities)); + } + }); + } + } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandContext.java new file mode 100644 index 000000000..b06eb9714 --- /dev/null +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandContext.java @@ -0,0 +1,24 @@ +package com.jtelegram.jtelegraf; + +import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.commands.Command; +import com.jtelegram.api.message.impl.TextMessage; +import com.jtelegram.api.update.Update; +import javax.annotation.Nonnull; +import lombok.Getter; + +/** + * @author Nick Robson + */ +@Getter +public class TelegrafCommandContext extends TelegrafMessageContext { + + @Nonnull + private final Command command; + + public TelegrafCommandContext(@Nonnull TelegramBot bot, @Nonnull Update.MessageUpdate update, @Nonnull TextMessage message, @Nonnull Command command) { + super(bot, update, message); + this.command = command; + } + +} diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandListener.java new file mode 100644 index 000000000..46916be33 --- /dev/null +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandListener.java @@ -0,0 +1,10 @@ +package com.jtelegram.jtelegraf; + +/** + * @author Nick Robson + */ +public interface TelegrafCommandListener { + + void onCommand(TelegrafCommandContext context); + +} diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageContext.java new file mode 100644 index 000000000..8b7a4dea6 --- /dev/null +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageContext.java @@ -0,0 +1,26 @@ +package com.jtelegram.jtelegraf; + +import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.message.impl.TextMessage; +import com.jtelegram.api.update.Update; +import java.util.regex.Matcher; +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; +import lombok.Getter; + +/** + * @author Nick Robson + */ +@Getter +@ParametersAreNonnullByDefault +public class TelegrafHeardMessageContext extends TelegrafMessageContext { + + @Nonnull + private final Matcher matcher; + + public TelegrafHeardMessageContext(TelegramBot bot, Update.MessageUpdate update, TextMessage message, Matcher matcher) { + super(bot, update, message); + this.matcher = matcher; + } + +} diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageListener.java new file mode 100644 index 000000000..118deaf5e --- /dev/null +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageListener.java @@ -0,0 +1,10 @@ +package com.jtelegram.jtelegraf; + +/** + * @author Nick Robson + */ +public interface TelegrafHeardMessageListener { + + void onMessage(TelegrafHeardMessageContext context); + +} diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageContext.java index ada1a6f2f..092a56378 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageContext.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageContext.java @@ -1,20 +1,26 @@ package com.jtelegram.jtelegraf; +import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.Message; import com.jtelegram.api.update.Update; import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; import lombok.Getter; /** * @author Nick Robson */ @Getter -public class TelegrafMessageContext> extends TelegrafUpdateContext { +@Nonnull +@ParametersAreNonnullByDefault +public class TelegrafMessageContext, C, M extends Message> extends TelegrafUpdateContext { + @Nonnull private final M message; - public TelegrafMessageContext(@Nonnull Update.MessageUpdate update, @Nonnull M message) { - super(update); + public TelegrafMessageContext(TelegramBot bot, Update.MessageUpdate update, M message) { + super(bot, update); this.message = message; } @@ -25,10 +31,12 @@ public M getContents() { return message; } + @Nonnull public M getMessage() { return message; } + @Nullable public C getMessageContents() { return message.getContent(); } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityContext.java new file mode 100644 index 000000000..a01905eb4 --- /dev/null +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityContext.java @@ -0,0 +1,39 @@ +package com.jtelegram.jtelegraf; + +import com.jtelegram.api.TelegramBot; +import com.jtelegram.api.message.entity.MessageEntity; +import com.jtelegram.api.message.entity.MessageEntityType; +import com.jtelegram.api.message.impl.TextMessage; +import com.jtelegram.api.update.Update; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; +import lombok.Getter; + +/** + * @author Nick Robson + */ +@Getter +@ParametersAreNonnullByDefault +public class TelegrafMessageEntityContext, E extends MessageEntity> extends TelegrafMessageContext, String, TextMessage> { + + @Nonnull + private final T entityType; + + @Nonnull + private final List entities; + + public TelegrafMessageEntityContext(TelegramBot bot, Update.MessageUpdate update, TextMessage message, T entityType, List entities) { + super(bot, update, message); + this.entityType = entityType; + this.entities = Collections.unmodifiableList(entities); + } + + public TelegrafMessageEntityContext withEntities(List entities) { + Objects.requireNonNull(entities, "entities cannot be null"); + return new TelegrafMessageEntityContext<>(this.getBot(), this.getUpdate(), this.getMessage(), entityType, entities); + } + +} diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityListener.java new file mode 100644 index 000000000..35de01921 --- /dev/null +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityListener.java @@ -0,0 +1,13 @@ +package com.jtelegram.jtelegraf; + +import com.jtelegram.api.message.entity.MessageEntity; +import com.jtelegram.api.message.entity.MessageEntityType; + +/** + * @author Nick Robson + */ +public interface TelegrafMessageEntityListener, E extends MessageEntity> { + + void onMessageEntity(TelegrafMessageEntityContext context); + +} diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageListener.java index 62b8e49eb..fbdc84213 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageListener.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageListener.java @@ -1,13 +1,12 @@ package com.jtelegram.jtelegraf; -import com.jtelegram.api.TelegramBot; import com.jtelegram.api.message.Message; /** * @author Nick Robson */ -public interface TelegrafMessageListener> { +public interface TelegrafMessageListener, C, T extends Message> { - void onUpdate(TelegrafMessageContext context, TelegramBot bot); + void onMessage(TelegrafMessageContext context); } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateContext.java index 824579c25..36f03d5f4 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateContext.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateContext.java @@ -1,8 +1,13 @@ package com.jtelegram.jtelegraf; +import com.jtelegram.api.TelegramBot; import com.jtelegram.api.update.Update; import com.jtelegram.api.update.UpdateContents; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Predicate; import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; import lombok.AllArgsConstructor; import lombok.Getter; @@ -11,7 +16,11 @@ */ @Getter @AllArgsConstructor -public class TelegrafUpdateContext, U extends UpdateContents> { +@ParametersAreNonnullByDefault +public class TelegrafUpdateContext, U extends UpdateContents, T extends Update> { + + @Nonnull + private final TelegramBot bot; @Nonnull private final T update; @@ -21,4 +30,13 @@ public U getContents() { return update.getContents(); } + @SuppressWarnings("unchecked") + public Optional filter(Predicate predicate) { + return predicate.test((UpdateContext) this) ? Optional.of((UpdateContext) this) : Optional.empty(); + } + + public void filter(Predicate predicate, Consumer consumer) { + filter(predicate).ifPresent(consumer); + } + } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateListener.java index a92ddb648..b3da409c6 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateListener.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateListener.java @@ -1,14 +1,13 @@ package com.jtelegram.jtelegraf; -import com.jtelegram.api.TelegramBot; import com.jtelegram.api.update.Update; import com.jtelegram.api.update.UpdateContents; /** * @author Nick Robson */ -public interface TelegrafUpdateListener, U extends UpdateContents> { +public interface TelegrafUpdateListener, U extends UpdateContents, T extends Update> { - void onUpdate(TelegrafUpdateContext context, TelegramBot bot); + void onUpdate(TelegrafUpdateContext context); } From 319975fa7d9d5dce337df8dcda526a1105846ad1 Mon Sep 17 00:00:00 2001 From: Nick Robson Date: Thu, 22 Nov 2018 16:24:05 +0100 Subject: [PATCH 7/9] jTelegraf: textLink and textMention --- .../com/jtelegram/jtelegraf/TelegrafBot.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java index 6b6017304..6036490ae 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java @@ -8,6 +8,8 @@ import com.jtelegram.api.message.MessageType; import com.jtelegram.api.message.entity.MessageEntity; import com.jtelegram.api.message.entity.MessageEntityType; +import com.jtelegram.api.message.entity.TextLinkMessageEntity; +import com.jtelegram.api.message.entity.TextMentionMessageEntity; import com.jtelegram.api.message.impl.TextMessage; import com.jtelegram.api.requests.message.send.SendText; import com.jtelegram.api.update.Update; @@ -401,4 +403,28 @@ public void cashtag(String cashtag, TelegrafMessageEntityListener, TextLinkMessageEntity> listener) { + entity(MessageEntityType.TEXT_LINK, ctx -> { + List entities = ctx.getEntities() + .stream() + .filter(e -> url.equalsIgnoreCase(e.getUrl())) + .collect(Collectors.toList()); + if (!entities.isEmpty()) { + listener.onMessageEntity(ctx.withEntities(entities)); + } + }); + } + + public void textMention(long userId, TelegrafMessageEntityListener, TextMentionMessageEntity> listener) { + entity(MessageEntityType.TEXT_MENTION, ctx -> { + List entities = ctx.getEntities() + .stream() + .filter(e -> userId == e.getUser().getId()) + .collect(Collectors.toList()); + if (!entities.isEmpty()) { + listener.onMessageEntity(ctx.withEntities(entities)); + } + }); + } + } From b85f7bf8fb6ea0129fa4f66e9761a2053782fac5 Mon Sep 17 00:00:00 2001 From: Nick Robson Date: Wed, 19 Dec 2018 10:56:42 +0100 Subject: [PATCH 8/9] Add documentation --- .../com/jtelegram/jtelegraf/TelegrafBot.java | 230 +++++++++++++++--- .../jtelegraf/TelegrafCommandContext.java | 7 +- .../jtelegraf/TelegrafCommandListener.java | 7 + .../TelegrafHeardMessageContext.java | 10 +- .../TelegrafHeardMessageListener.java | 7 + .../jtelegraf/TelegrafMessageContext.java | 19 +- .../TelegrafMessageEntityContext.java | 22 +- .../TelegrafMessageEntityListener.java | 14 +- .../jtelegraf/TelegrafMessageListener.java | 15 +- .../jtelegraf/TelegrafUpdateContext.java | 34 ++- .../jtelegraf/TelegrafUpdateListener.java | 15 +- 11 files changed, 319 insertions(+), 61 deletions(-) diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java index 6036490ae..b878f2b33 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java @@ -16,10 +16,8 @@ import com.jtelegram.api.update.UpdateContents; import com.jtelegram.api.update.UpdateType; import com.jtelegram.api.util.TextBuilder; -import java.util.AbstractMap; import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.function.Predicate; @@ -30,22 +28,59 @@ import javax.annotation.ParametersAreNonnullByDefault; /** + * A wrapper around {@link TelegramBot} allowing usage of the jTelegramBotAPI in the same style as that of + * telegraf, a popular Telegram Bot API for JavaScript. + * * @author Nick Robson */ @ParametersAreNonnullByDefault public class TelegrafBot { + /** + * Corresponds to the Telegram /start command + */ public static final String COMMAND_START = "start"; + + /** + * Corresponds to the Telegram /help command + */ public static final String COMMAND_HELP = "help"; + + /** + * Corresponds to the Telegram /settings command + */ public static final String COMMAND_SETTINGS = "settings"; + /** + * Tracks update listeners. i.e. listeners that are notified for different types of {@link Update updates} + */ private final Map, List>> updateListeners = new HashMap<>(); + + /** + * Tracks message listeners. i.e. listeners that are notified for different types of {@link Message messages} + */ private final Map, List>> messageListeners = new HashMap<>(); + + /** + * Tracks message entity listeners. i.e. listeners that are notified for different + * {@link MessageEntityType types} of {@link MessageEntity message entity} + */ private final Map>> messageEntityListeners = new HashMap<>(); - private final List>> hearsTextListeners = new LinkedList<>(); - private final List, TelegrafMessageListener>> hearsPredicateListeners = new LinkedList<>(); - private final List> hearsPatternListeners = new LinkedList<>(); + /** + * Tracks listeners that are notified when certain strings are mentioned in text messages + */ + private final Map>> hearsTextListeners = new HashMap<>(); + + /** + * Tracks listeners that are notified when their corresponding predicates match the text of a text message + */ + private final Map, List>> hearsPredicateListeners = new HashMap<>(); + + /** + * Tracks listeners that are notified when their corresponding patterns match the text of a text message + */ + private final Map> hearsPatternListeners = new HashMap<>(); @Nonnull private final TelegramBot bot; @@ -53,11 +88,14 @@ public class TelegrafBot { @SuppressWarnings("unchecked") public TelegrafBot(@Nonnull TelegramBot bot) { this.bot = bot; + // register a general listener that will be called for all events that extend UpdateEvent bot.getEventRegistry().registerEvent(UpdateEvent.class, event -> { Update update = event.getUpdate(); Class updateClass = update.getClass(); + // e.g. if the Update is a MessageUpdate this will get all listeners that want to see MessageUpdates List> listeners = updateListeners.get(updateClass); if (listeners != null) { + // create an update context for the update and propagate it to all listeners that want to listen to that type of update TelegrafUpdateContext context = new TelegrafUpdateContext<>(bot, update); for (TelegrafUpdateListener listener : listeners) { try { @@ -69,13 +107,15 @@ public TelegrafBot(@Nonnull TelegramBot bot) { } } }); + // register a general listener that will be called for all events that extend MessageEvent bot.getEventRegistry().registerEvent(MessageEvent.class, event -> { Update.MessageUpdate update = (Update.MessageUpdate) event.getUpdate(); Message message = update.getContents(); Class messageClass = message.getClass(); + // e.g. if the Message is a TextMessage this will get all listeners that want to see text messages List> listeners = messageListeners.get(messageClass); if (listeners != null) { - //noinspection unchecked + // create an message context for the message and propagate it to all listeners that want to listen to that type of message TelegrafMessageContext context = new TelegrafMessageContext<>(bot, update, message); for (TelegrafMessageListener listener : listeners) { try { @@ -87,42 +127,56 @@ public TelegrafBot(@Nonnull TelegramBot bot) { } } }); + // register a general listener that will be called for all events that extend TextMessageEvent bot.getEventRegistry().registerEvent(TextMessageEvent.class, event -> { Update.MessageUpdate update = event.getUpdate(); TextMessage message = event.getMessage(); + // create an message context for the message TelegrafMessageContext context = new TelegrafMessageContext(bot, update, message); String text = message.getText(); - hearsTextListeners.forEach(e -> { + hearsTextListeners.forEach((k, v) -> { try { - if (text.contains(e.getKey())) { - e.getValue().onMessage(context); + // call the listener if the message contains the desired text + if (text.contains(k)) { + v.forEach(l -> l.onMessage(context)); } } catch (Exception ex) { ex.printStackTrace(); } }); - hearsPredicateListeners.forEach(e -> { + hearsPredicateListeners.forEach((k, v) -> { try { - if (e.getKey().test(text)) { - e.getValue().onMessage(context); + // if the listener's predicate matches, call the listener + if (k.test(text)) { + v.forEach(l -> l.onMessage(context)); } } catch (Exception ex) { ex.printStackTrace(); } }); - hearsPatternListeners.forEach(e -> { + hearsPatternListeners.forEach((k, v) -> { try { - Matcher matcher = e.getKey().matcher(text); + Matcher matcher = k.matcher(text); + // call the listeners once each, if the text contains 1 or more matches if (matcher.find()) { TelegrafHeardMessageContext ctx = new TelegrafHeardMessageContext(bot, update, message, matcher); - e.getValue().onMessage(ctx); + v.forEach(l -> { + l.onMessage(ctx); + // reset() and find() reset it so if there are multiple listeners registered with the same + // pattern they won't interfere with each other (i.e. one consuming all the pattern matches + // won't screw over the other one) + matcher.reset(); + matcher.find(); + }); } } catch (Exception ex) { ex.printStackTrace(); } }); + // collect all message entities into lists by the type of entity they are + // e.g. "@abc @def" would be grouped into a List<"abc", "def"> under the type of MessageEntityType.MENTION Map> entities = new HashMap<>(); event.getMessage().getEntities().forEach(e -> entities.compute(e.getType(), (k, v) -> { @@ -133,21 +187,23 @@ public TelegrafBot(@Nonnull TelegramBot bot) { return v; } )); + // for each (Type, List) tuple, get all listeners for each type + // and call them with all the entities of that type entities.forEach((type, entity) -> { - List> listeners = messageEntityListeners.get(type); - if (listeners != null) { + List> listeners = messageEntityListeners.get(type); + if (listeners != null) { + //noinspection unchecked + TelegrafMessageEntityContext entityContext = new TelegrafMessageEntityContext(bot, update, message, type, entity); + for (TelegrafMessageEntityListener listener : listeners) { + try { //noinspection unchecked - TelegrafMessageEntityContext entityContext = new TelegrafMessageEntityContext(bot, update, message, type, entity); - for (TelegrafMessageEntityListener listener : listeners) { - try { - //noinspection unchecked - listener.onMessageEntity(entityContext); - } catch (Exception ex) { - ex.printStackTrace(); - } - } + listener.onMessageEntity(entityContext); + } catch (Exception ex) { + ex.printStackTrace(); } - }); + } + } + }); }); } @@ -160,8 +216,8 @@ public TelegrafBot(@Nonnull TelegramBot bot) { * @param the update content type * @param the update type */ - public , UpdateContext extends TelegrafUpdateContext> - void on(UpdateType updateType, TelegrafUpdateListener listener) { + public , UpdateContext extends TelegrafUpdateContext> + void on(UpdateType updateType, TelegrafUpdateListener listener) { Class updateClass = updateType.getUpdateClass(); //noinspection Duplicates @@ -187,8 +243,8 @@ void on(UpdateType updateType, TelegrafUpdateListener li * @param the message type, which must contain contents of type {@code } * @param the event type, which must contain a message of type {@code } */ - public , E extends MessageEvent, MessageContext extends TelegrafMessageContext> - void on(MessageType messageType, TelegrafMessageListener listener) { + public , E extends MessageEvent, MessageContext extends TelegrafMessageContext> + void on(MessageType messageType, TelegrafMessageListener listener) { Class messageClass = messageType.getMessageClass(); //noinspection Duplicates @@ -212,8 +268,18 @@ void on(MessageType messageType, TelegrafMessageListener, String, TextMessage> listener) { - hearsTextListeners.add(new AbstractMap.SimpleEntry(text, listener)); + public void hears(String text, TelegrafMessageListener, TextMessage, String> listener) { + //noinspection Duplicates + hearsTextListeners.compute( + text, + (k, v) -> { + if (v == null) { + v = new ArrayList<>(); + } + v.add(listener); + return v; + } + ); } /** @@ -224,8 +290,18 @@ public void hears(String text, TelegrafMessageListener predicate, TelegrafMessageListener, String, TextMessage> listener) { - hearsPredicateListeners.add(new AbstractMap.SimpleEntry(predicate, listener)); + public void hears(Predicate predicate, TelegrafMessageListener, TextMessage, String> listener) { + //noinspection Duplicates + hearsPredicateListeners.compute( + predicate, + (k, v) -> { + if (v == null) { + v = new ArrayList<>(); + } + v.add(listener); + return v; + } + ); } /** @@ -243,7 +319,17 @@ public void hears(Predicate predicate, TelegrafMessageListener(pattern, listener)); + //noinspection Duplicates + hearsPatternListeners.compute( + pattern, + (k, v) -> { + if (v == null) { + v = new ArrayList<>(); + } + v.add(listener); + return v; + } + ); } /** @@ -355,6 +441,12 @@ void entity(MessageEntityType entityType, TelegrafMessageEntityListener, MessageEntity.DefaultMessageEntity> listener) { entity(MessageEntityType.MENTION, ctx -> { List entities = ctx.getEntities() @@ -367,6 +459,12 @@ public void mention(String mention, TelegrafMessageEntityListener, MessageEntity.DefaultMessageEntity> listener) { entity(MessageEntityType.PHONE_NUMBER, ctx -> { List entities = ctx.getEntities() @@ -379,6 +477,30 @@ public void phone(String phone, TelegrafMessageEntityListener, MessageEntity.DefaultMessageEntity> listener) { + entity(MessageEntityType.EMAIL, ctx -> { + List entities = ctx.getEntities() + .stream() + .filter(e -> email.equalsIgnoreCase(e.getContent())) + .collect(Collectors.toList()); + if (!entities.isEmpty()) { + listener.onMessageEntity(ctx.withEntities(entities)); + } + }); + } + + /** + * Registers a hashtag listener, to be called whenever a user sends a text message containing a specific {@link MessageEntityType#HASHTAG}. + * + * @param hashtag the hashtag to listen for (case insensitive) + * @param listener a listener to be called when a matching hashtag is received + */ public void hashtag(String hashtag, TelegrafMessageEntityListener, MessageEntity.DefaultMessageEntity> listener) { entity(MessageEntityType.HASHTAG, ctx -> { List entities = ctx.getEntities() @@ -391,6 +513,12 @@ public void hashtag(String hashtag, TelegrafMessageEntityListener, MessageEntity.DefaultMessageEntity> listener) { entity(MessageEntityType.CASHTAG, ctx -> { List entities = ctx.getEntities() @@ -403,6 +531,30 @@ public void cashtag(String cashtag, TelegrafMessageEntityListener, MessageEntity.DefaultMessageEntity> listener) { + entity(MessageEntityType.URL, ctx -> { + List entities = ctx.getEntities() + .stream() + .filter(e -> url.equalsIgnoreCase(e.getContent())) + .collect(Collectors.toList()); + if (!entities.isEmpty()) { + listener.onMessageEntity(ctx.withEntities(entities)); + } + }); + } + + /** + * Registers a text link listener, to be called whenever a user sends a text message containing a specific {@link MessageEntityType#TEXT_LINK URL}. + * + * @param url the URL to listen for (case insensitive) + * @param listener a listener to be called when a matching URL is received + */ public void textLink(String url, TelegrafMessageEntityListener, TextLinkMessageEntity> listener) { entity(MessageEntityType.TEXT_LINK, ctx -> { List entities = ctx.getEntities() @@ -415,6 +567,12 @@ public void textLink(String url, TelegrafMessageEntityListener, TextMentionMessageEntity> listener) { entity(MessageEntityType.TEXT_MENTION, ctx -> { List entities = ctx.getEntities() diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandContext.java index b06eb9714..922f1e57e 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandContext.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandContext.java @@ -8,11 +8,16 @@ import lombok.Getter; /** + * A wrapper around a command, for use with a {@link TelegrafBot}. + * * @author Nick Robson */ @Getter -public class TelegrafCommandContext extends TelegrafMessageContext { +public class TelegrafCommandContext extends TelegrafMessageContext { + /** + * The command object corresponding to the command received from a user. + */ @Nonnull private final Command command; diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandListener.java index 46916be33..6e546b04a 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandListener.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandListener.java @@ -1,10 +1,17 @@ package com.jtelegram.jtelegraf; /** + * A listener for a {@link TelegrafCommandContext}, to be called when such a context is received. + * * @author Nick Robson */ public interface TelegrafCommandListener { + /** + * Called when a command is received corresponding to this listener + * + * @param context the context of the command + */ void onCommand(TelegrafCommandContext context); } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageContext.java index 8b7a4dea6..561376f71 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageContext.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageContext.java @@ -4,17 +4,25 @@ import com.jtelegram.api.message.impl.TextMessage; import com.jtelegram.api.update.Update; import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; import lombok.Getter; /** + * A wrapper around a message, for use with {@link TelegrafBot#hears(Pattern, TelegrafHeardMessageListener)}. + * * @author Nick Robson */ @Getter @ParametersAreNonnullByDefault -public class TelegrafHeardMessageContext extends TelegrafMessageContext { +public class TelegrafHeardMessageContext extends TelegrafMessageContext { + /** + * The matcher instance containing matches for the pattern.
+ * Note: The matcher ALREADY contains the first match.
+ * Use a {@code do-while} loop if you need to get all matches. + */ @Nonnull private final Matcher matcher; diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageListener.java index 118deaf5e..f147996cb 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageListener.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafHeardMessageListener.java @@ -1,10 +1,17 @@ package com.jtelegram.jtelegraf; /** + * A listener for a {@link TelegrafHeardMessageContext}, to be called when such a context is received. + * * @author Nick Robson */ public interface TelegrafHeardMessageListener { + /** + * Called when a message is received corresponding to this listener + * + * @param context the context of the message + */ void onMessage(TelegrafHeardMessageContext context); } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageContext.java index 092a56378..e0fe4de31 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageContext.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageContext.java @@ -9,35 +9,42 @@ import lombok.Getter; /** + * A wrapper around a message, for use with a {@link TelegrafBot}. + * * @author Nick Robson + * + * @param the type of this context, essentially a "self-type", so that any filter operations can be + * strongly typed according to the actual type of this update context + * @param the type of the update: e.g. a MessageUpdate + * @param the type of the update contents: e.g. a Message */ @Getter @Nonnull @ParametersAreNonnullByDefault -public class TelegrafMessageContext, C, M extends Message> extends TelegrafUpdateContext { +public class TelegrafMessageContext, MessageType extends Message, ContentsType> extends TelegrafUpdateContext { @Nonnull - private final M message; + private final MessageType message; - public TelegrafMessageContext(TelegramBot bot, Update.MessageUpdate update, M message) { + public TelegrafMessageContext(TelegramBot bot, Update.MessageUpdate update, MessageType message) { super(bot, update); this.message = message; } @Nonnull @Override - public M getContents() { + public MessageType getContents() { // overridden to provide stronger typing return message; } @Nonnull - public M getMessage() { + public MessageType getMessage() { return message; } @Nullable - public C getMessageContents() { + public ContentsType getMessageContents() { return message.getContent(); } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityContext.java index a01905eb4..bed63a321 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityContext.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityContext.java @@ -13,25 +13,37 @@ import lombok.Getter; /** + * A wrapper around a message entity, for use with a {@link TelegrafBot}. + * * @author Nick Robson + * + * @param the entity type being listened for + * @param the type of the entity: e.g. a {@link com.jtelegram.api.message.entity.TextMentionMessageEntity} */ @Getter @ParametersAreNonnullByDefault -public class TelegrafMessageEntityContext, E extends MessageEntity> extends TelegrafMessageContext, String, TextMessage> { +public class TelegrafMessageEntityContext, Entity extends MessageEntity> extends TelegrafMessageContext, TextMessage, String> { @Nonnull - private final T entityType; + private final EntityType entityType; @Nonnull - private final List entities; + private final List entities; - public TelegrafMessageEntityContext(TelegramBot bot, Update.MessageUpdate update, TextMessage message, T entityType, List entities) { + public TelegrafMessageEntityContext(TelegramBot bot, Update.MessageUpdate update, TextMessage message, EntityType entityType, List entities) { super(bot, update, message); this.entityType = entityType; this.entities = Collections.unmodifiableList(entities); } - public TelegrafMessageEntityContext withEntities(List entities) { + /** + * Returns a new message entity context with the given list of entities + * + * @param entities the new entities + * + * @return the new message entity context + */ + public TelegrafMessageEntityContext withEntities(List entities) { Objects.requireNonNull(entities, "entities cannot be null"); return new TelegrafMessageEntityContext<>(this.getBot(), this.getUpdate(), this.getMessage(), entityType, entities); } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityListener.java index 35de01921..e696f95cc 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityListener.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageEntityListener.java @@ -4,10 +4,20 @@ import com.jtelegram.api.message.entity.MessageEntityType; /** + * A listener for a {@link TelegrafMessageEntityContext}, to be called when such a context is received. + * * @author Nick Robson + * + * @param the entity type being listened for + * @param the type of the entity: e.g. a {@link com.jtelegram.api.message.entity.TextMentionMessageEntity} */ -public interface TelegrafMessageEntityListener, E extends MessageEntity> { +public interface TelegrafMessageEntityListener, Entity extends MessageEntity> { - void onMessageEntity(TelegrafMessageEntityContext context); + /** + * Called when a message entity is received corresponding to this listener + * + * @param context the context of the message entity + */ + void onMessageEntity(TelegrafMessageEntityContext context); } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageListener.java index fbdc84213..dd90b4af5 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageListener.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafMessageListener.java @@ -3,10 +3,21 @@ import com.jtelegram.api.message.Message; /** + * A listener for a {@link TelegrafMessageContext}, to be called when such a context is received. + * * @author Nick Robson + * + * @param the type of the message context being listened to + * @param the type of the message: e.g. TextMessage + * @param the type of the message contents: e.g. a String (for a TextMessage) or a Video (for a VideoMessage) */ -public interface TelegrafMessageListener, C, T extends Message> { +public interface TelegrafMessageListener, MessageType extends Message, ContentsType> { - void onMessage(TelegrafMessageContext context); + /** + * Called when a message is received corresponding to this listener + * + * @param context the context of the message + */ + void onMessage(TelegrafMessageContext context); } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateContext.java index 36f03d5f4..190cf34cb 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateContext.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateContext.java @@ -12,30 +12,52 @@ import lombok.Getter; /** + * A wrapper around an update, for use with a {@link TelegrafBot}. + * * @author Nick Robson + * + * @param the type of this context, essentially a "self-type", so that any filter operations can be + * strongly typed according to the actual type of this update context + * @param the type of the update: e.g. a MessageUpdate + * @param the type of the update contents: e.g. a Message */ @Getter @AllArgsConstructor @ParametersAreNonnullByDefault -public class TelegrafUpdateContext, U extends UpdateContents, T extends Update> { +public class TelegrafUpdateContext, UpdateType extends Update, ContentsType extends UpdateContents> { @Nonnull private final TelegramBot bot; @Nonnull - private final T update; + private final UpdateType update; @Nonnull - public U getContents() { + public ContentsType getContents() { return update.getContents(); } + /** + * Filters this context according to the given predicate. If the predicate returns true, the returned + * {@link Optional} is non-empty. If false, an empty Optional is returned. + * + * @param predicate the predicate to test against. + * + * @return an optional, as described above + */ @SuppressWarnings("unchecked") - public Optional filter(Predicate predicate) { - return predicate.test((UpdateContext) this) ? Optional.of((UpdateContext) this) : Optional.empty(); + public Optional filter(Predicate predicate) { + return predicate.test((ContextType) this) ? Optional.of((ContextType) this) : Optional.empty(); } - public void filter(Predicate predicate, Consumer consumer) { + /** + * Filters this context according to the given predicate. If the predicate returns true, the consumer is called + * with this context. If false, it is a no-op. + * + * @param predicate the predicate + * @param consumer the update context consumer + */ + public void filter(Predicate predicate, Consumer consumer) { filter(predicate).ifPresent(consumer); } diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateListener.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateListener.java index b3da409c6..c39b3f817 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateListener.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafUpdateListener.java @@ -4,10 +4,21 @@ import com.jtelegram.api.update.UpdateContents; /** + * A listener for a {@link TelegrafUpdateContext}, to be called when such a context is received. + * * @author Nick Robson + * + * @param the type of the update context being listened to + * @param the type of the update: e.g. MessageUpdate + * @param the type of the update contents: e.g. a Message */ -public interface TelegrafUpdateListener, U extends UpdateContents, T extends Update> { +public interface TelegrafUpdateListener, UpdateType extends Update, ContentsType extends UpdateContents> { - void onUpdate(TelegrafUpdateContext context); + /** + * Called when an update is received corresponding to this listener + * + * @param context the context of the update + */ + void onUpdate(TelegrafUpdateContext context); } From bcf6a42ac7e735cf5d5db0735ab8a0fb7f8ad474 Mon Sep 17 00:00:00 2001 From: Mark Hendriks Date: Wed, 2 Oct 2019 23:02:15 +0200 Subject: [PATCH 9/9] Clean up some javadoc, and convert compute calls into computeIfAbsent with an add call (as all of the computes were used for 'multimaps') --- .../com/jtelegram/jtelegraf/TelegrafBot.java | 92 ++++--------------- .../jtelegraf/TelegrafCommandContext.java | 2 + .../TelegrafHeardMessageContext.java | 4 +- 3 files changed, 20 insertions(+), 78 deletions(-) diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java index b878f2b33..8e028acbc 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafBot.java @@ -179,14 +179,8 @@ public TelegrafBot(@Nonnull TelegramBot bot) { // e.g. "@abc @def" would be grouped into a List<"abc", "def"> under the type of MessageEntityType.MENTION Map> entities = new HashMap<>(); event.getMessage().getEntities().forEach(e -> - entities.compute(e.getType(), (k, v) -> { - if (v == null) { - v = new ArrayList<>(); - } - v.add(e); - return v; - } - )); + entities.computeIfAbsent(e.getType(), $ -> new ArrayList<>()).add(e) + ); // for each (Type, List) tuple, get all listeners for each type // and call them with all the entities of that type entities.forEach((type, entity) -> { @@ -215,22 +209,14 @@ public TelegrafBot(@Nonnull TelegramBot bot) { * * @param the update content type * @param the update type + * @param the update context type */ public , UpdateContext extends TelegrafUpdateContext> void on(UpdateType updateType, TelegrafUpdateListener listener) { Class updateClass = updateType.getUpdateClass(); //noinspection Duplicates - updateListeners.compute( - updateClass, - (k, v) -> { - if (v == null) { - v = new ArrayList<>(); - } - v.add(listener); - return v; - } - ); + updateListeners.computeIfAbsent(updateClass, $ -> new ArrayList<>()).add(listener); } /** @@ -242,27 +228,19 @@ void on(UpdateType updateType, TelegrafUpdateListener li * @param the message content type * @param the message type, which must contain contents of type {@code } * @param the event type, which must contain a message of type {@code } + * @param the message context type */ public , E extends MessageEvent, MessageContext extends TelegrafMessageContext> void on(MessageType messageType, TelegrafMessageListener listener) { Class messageClass = messageType.getMessageClass(); //noinspection Duplicates - messageListeners.compute( - messageClass, - (k, v) -> { - if (v == null) { - v = new ArrayList<>(); - } - v.add(listener); - return v; - } - ); + messageListeners.computeIfAbsent(messageClass, $ -> new ArrayList<>()).add(listener); } /** * Registers a hear-listener. - * This listener will be called once for every message that contains the given text.
+ * This listener will be called once for every message that contains the given text.
* * @param text the text the message must contain * @param listener a listener to be called every time a message contains the given text @@ -270,21 +248,12 @@ void on(MessageType messageType, TelegrafMessageListener, TextMessage, String> listener) { //noinspection Duplicates - hearsTextListeners.compute( - text, - (k, v) -> { - if (v == null) { - v = new ArrayList<>(); - } - v.add(listener); - return v; - } - ); + hearsTextListeners.computeIfAbsent(text, $ -> new ArrayList<>()).add(listener); } /** * Registers a hear-listener. - * This listener will be called once for every message for which the predicate returns true.
+ * This listener will be called once for every message for which the predicate returns true.
* * @param predicate the predicate to use to determine if the listener should be called * @param listener a listener to be called every time the predicate returns true on a message @@ -292,26 +261,17 @@ public void hears(String text, TelegrafMessageListener predicate, TelegrafMessageListener, TextMessage, String> listener) { //noinspection Duplicates - hearsPredicateListeners.compute( - predicate, - (k, v) -> { - if (v == null) { - v = new ArrayList<>(); - } - v.add(listener); - return v; - } - ); + hearsPredicateListeners.computeIfAbsent(predicate, $ -> new ArrayList<>()).add(listener); } /** * Registers a hear-listener. * This listener will be called once for every message that contains the given pattern. - * The pattern does not need to match the entire message text, only part of it.
- *
+ * The pattern does not need to match the entire message text, only part of it.
+ *
* Multiple matches inside the same message will only result in the message being called once. - * That is, for a message of {@code "hi hi"} and a pattern of {@code "hi"}, the listener will be called only once.
- *
+ * That is, for a message of {@code "hi hi"} and a pattern of {@code "hi"}, the listener will be called only once.
+ *
* To circumnavigate this, you can use the context's matcher in a do-while loop, * with the condition as {@code context.getMatcher().find()}. * @@ -319,17 +279,7 @@ public void hears(Predicate predicate, TelegrafMessageListener { - if (v == null) { - v = new ArrayList<>(); - } - v.add(listener); - return v; - } - ); + hearsPatternListeners.computeIfAbsent(pattern, $ -> new ArrayList<>()).add(listener); } /** @@ -428,17 +378,7 @@ public void settings(TextBuilder settingsMessageText) { */ public > void entity(MessageEntityType entityType, TelegrafMessageEntityListener, E> listener) { - //noinspection Duplicates - messageEntityListeners.compute( - entityType, - (k, v) -> { - if (v == null) { - v = new ArrayList<>(); - } - v.add(listener); - return v; - } - ); + messageEntityListeners.computeIfAbsent(entityType, $ -> new ArrayList<>()).add(listener); } /** diff --git a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandContext.java b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandContext.java index 922f1e57e..49a3c6207 100644 --- a/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandContext.java +++ b/jtelegrambotapi-jtelegraf/src/main/java/com/jtelegram/jtelegraf/TelegrafCommandContext.java @@ -17,6 +17,8 @@ public class TelegrafCommandContext extends TelegrafMessageContext { /** - * The matcher instance containing matches for the pattern.
- * Note: The matcher ALREADY contains the first match.
+ * The matcher instance containing matches for the pattern.
+ * Note: The matcher ALREADY contains the first match.
* Use a {@code do-while} loop if you need to get all matches. */ @Nonnull