package org.telegram.telegrambots.api.objects; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; import org.json.JSONArray; import org.json.JSONObject; import org.telegram.telegrambots.api.interfaces.IBotApiObject; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @author Ruben Bermudez * @version 1.0 * @brief This object represents a message. * @date 20 of June of 2015 */ public class Message implements IBotApiObject { private static final String MESSAGEID_FIELD = "message_id"; private static final String FROM_FIELD = "from"; private static final String DATE_FIELD = "date"; private static final String CHAT_FIELD = "chat"; private static final String FORWARDFROM_FIELD = "forward_from"; private static final String FORWARDFROMCHAT_FIELD = "forward_from_chat"; private static final String FORWARDDATE_FIELD = "forward_date"; private static final String TEXT_FIELD = "text"; private static final String ENTITIES_FIELD = "entities"; private static final String AUDIO_FIELD = "audio"; private static final String DOCUMENT_FIELD = "document"; private static final String PHOTO_FIELD = "photo"; private static final String STICKER_FIELD = "sticker"; private static final String VIDEO_FIELD = "video"; private static final String CONTACT_FIELD = "contact"; private static final String LOCATION_FIELD = "location"; private static final String VENUE_FIELD = "venue"; private static final String PINNED_MESSAGE_FIELD = "pinned_message"; private static final String NEWCHATMEMBER_FIELD = "new_chat_member"; private static final String LEFTCHATMEMBER_FIELD = "left_chat_member"; private static final String NEWCHATTITLE_FIELD = "new_chat_title"; private static final String NEWCHATPHOTO_FIELD = "new_chat_photo"; private static final String DELETECHATPHOTO_FIELD = "delete_chat_photo"; private static final String GROUPCHATCREATED_FIELD = "group_chat_created"; private static final String REPLYTOMESSAGE_FIELD = "reply_to_message"; private static final String VOICE_FIELD = "voice"; private static final String CAPTION_FIELD = "caption"; private static final String SUPERGROUPCREATED_FIELD = "supergroup_chat_created"; private static final String CHANNELCHATCREATED_FIELD = "channel_chat_created"; private static final String MIGRATETOCHAT_FIELD = "migrate_to_chat_id"; private static final String MIGRATEFROMCHAT_FIELD = "migrate_from_chat_id"; private static final String EDITDATE_FIELD = "edit_date"; @JsonProperty(MESSAGEID_FIELD) private Integer messageId; ///< Integer Unique message identifier @JsonProperty(FROM_FIELD) private User from; ///< Optional. Sender, can be empty for messages sent to channels @JsonProperty(DATE_FIELD) private Integer date; ///< Optional. Date the message was sent in Unix time @JsonProperty(CHAT_FIELD) private Chat chat; ///< Conversation the message belongs to @JsonProperty(FORWARDFROM_FIELD) private User forwardFrom; ///< Optional. For forwarded messages, sender of the original message @JsonProperty(FORWARDFROMCHAT_FIELD) private Chat forwardFromChat; ///< Optional. For messages forwarded from a channel, information about the original channel @JsonProperty(FORWARDDATE_FIELD) private Integer forwardDate; ///< Optional. For forwarded messages, date the original message was sent @JsonProperty(TEXT_FIELD) private String text; ///< Optional. For text messages, the actual UTF-8 text of the message @JsonProperty(ENTITIES_FIELD) /** * Optional. For text messages, special entities like usernames, URLs, * bot commands, etc. that appear in the text */ private List entities; @JsonProperty(AUDIO_FIELD) private Audio audio; ///< Optional. Message is an audio file, information about the file @JsonProperty(DOCUMENT_FIELD) private Document document; ///< Optional. Message is a general file, information about the file @JsonProperty(PHOTO_FIELD) private List photo; ///< Optional. Message is a photo, available sizes of the photo @JsonProperty(STICKER_FIELD) private Sticker sticker; ///< Optional. Message is a sticker, information about the sticker @JsonProperty(VIDEO_FIELD) private Video video; ///< Optional. Message is a video, information about the video @JsonProperty(CONTACT_FIELD) private Contact contact; ///< Optional. Message is a shared contact, information about the contact @JsonProperty(LOCATION_FIELD) private Location location; ///< Optional. Message is a shared location, information about the location @JsonProperty(VENUE_FIELD) private Venue venue; ///< Optional. Message is a venue, information about the venue @JsonProperty(PINNED_MESSAGE_FIELD) private Message pinnedMessage; ///< Optional. Specified message was pinned. Note that the Message object in this field will not contain further reply_to_message fields even if it is itself a reply. @JsonProperty(NEWCHATMEMBER_FIELD) private User newChatMember; ///< Optional. A new member was added to the group, information about them (this member may be bot itself) @JsonProperty(LEFTCHATMEMBER_FIELD) private User leftChatMember; ///< Optional. A member was removed from the group, information about them (this member may be bot itself) @JsonProperty(NEWCHATTITLE_FIELD) private String newChatTitle; ///< Optional. A chat title was changed to this value @JsonProperty(NEWCHATPHOTO_FIELD) private List newChatPhoto; ///< Optional. A chat photo was change to this value @JsonProperty(DELETECHATPHOTO_FIELD) private Boolean deleteChatPhoto; ///< Optional. Informs that the chat photo was deleted @JsonProperty(GROUPCHATCREATED_FIELD) private Boolean groupchatCreated; ///< Optional. Informs that the group has been created @JsonProperty(REPLYTOMESSAGE_FIELD) private Message replyToMessage; @JsonProperty(VOICE_FIELD) private Voice voice; ///< Optional. Message is a voice message, information about the file @JsonProperty(CAPTION_FIELD) private String caption; ///< Optional. Caption for the document, photo or video, 0-200 characters @JsonProperty(SUPERGROUPCREATED_FIELD) private Boolean superGroupCreated; ///< Optional. Informs that the supergroup has been created @JsonProperty(CHANNELCHATCREATED_FIELD) private Boolean channelChatCreated; ///< Optional. Informs that the channel has been created @JsonProperty(MIGRATETOCHAT_FIELD) private Long migrateToChatId; ///< Optional. The chat has been migrated to a chat with specified identifier, not exceeding 1e13 by absolute value @JsonProperty(MIGRATEFROMCHAT_FIELD) private Long migrateFromChatId; ///< Optional. The chat has been migrated from a chat with specified identifier, not exceeding 1e13 by absolute value @JsonProperty(EDITDATE_FIELD) private Integer editDate; ///< Optional. Date the message was last edited in Unix time public Message() { super(); } public Message(JSONObject jsonObject) { super(); this.messageId = jsonObject.getInt(MESSAGEID_FIELD); if (jsonObject.has(FROM_FIELD)) { this.from = new User(jsonObject.getJSONObject(FROM_FIELD)); } if (jsonObject.has(DATE_FIELD)) { this.date = jsonObject.getInt(DATE_FIELD); } this.chat = new Chat(jsonObject.getJSONObject(CHAT_FIELD)); if (jsonObject.has(FORWARDFROMCHAT_FIELD)) { this.forwardFromChat = new Chat(jsonObject.getJSONObject(FORWARDFROMCHAT_FIELD)); } if (jsonObject.has(FORWARDFROM_FIELD)) { this.forwardFrom = new User(jsonObject.getJSONObject(FORWARDFROM_FIELD)); } if (jsonObject.has(FORWARDDATE_FIELD)) { this.forwardDate = jsonObject.getInt(FORWARDDATE_FIELD); } if (jsonObject.has(TEXT_FIELD)) { this.text = jsonObject.getString(TEXT_FIELD); } if (jsonObject.has(ENTITIES_FIELD)) { this.entities = new ArrayList<>(); JSONArray entities = jsonObject.getJSONArray(ENTITIES_FIELD); for (int i = 0; i < entities.length(); i++) { this.entities.add(new MessageEntity(entities.getJSONObject(i))); } } if (jsonObject.has(AUDIO_FIELD)) { this.audio = new Audio(jsonObject.getJSONObject(AUDIO_FIELD)); } if (jsonObject.has(DOCUMENT_FIELD)) { this.document = new Document(jsonObject.getJSONObject(DOCUMENT_FIELD)); } if (jsonObject.has(PHOTO_FIELD)) { this.photo = new ArrayList<>(); JSONArray photos = jsonObject.getJSONArray(PHOTO_FIELD); for (int i = 0; i < photos.length(); i++) { this.photo.add(new PhotoSize(photos.getJSONObject(i))); } } if (jsonObject.has(STICKER_FIELD)) { this.sticker = new Sticker(jsonObject.getJSONObject(STICKER_FIELD)); } if (jsonObject.has(VIDEO_FIELD)) { this.video = new Video(jsonObject.getJSONObject(VIDEO_FIELD)); } if (jsonObject.has(CONTACT_FIELD)) { this.contact = new Contact(jsonObject.getJSONObject(CONTACT_FIELD)); } if (jsonObject.has(LOCATION_FIELD)) { this.location = new Location(jsonObject.getJSONObject(LOCATION_FIELD)); } if (jsonObject.has(VENUE_FIELD)) { venue = new Venue(jsonObject.getJSONObject(VENUE_FIELD)); } if (jsonObject.has(PINNED_MESSAGE_FIELD)) { pinnedMessage = new Message(jsonObject.getJSONObject(PINNED_MESSAGE_FIELD)); } if (jsonObject.has(VOICE_FIELD)) { this.voice = new Voice(jsonObject.getJSONObject(VOICE_FIELD)); } if (jsonObject.has(CAPTION_FIELD)) { this.caption = jsonObject.getString(CAPTION_FIELD); } if (jsonObject.has(NEWCHATMEMBER_FIELD)) { this.newChatMember = new User(jsonObject.getJSONObject(NEWCHATMEMBER_FIELD)); } if (jsonObject.has(LEFTCHATMEMBER_FIELD)) { this.leftChatMember = new User(jsonObject.getJSONObject(LEFTCHATMEMBER_FIELD)); } if (jsonObject.has(REPLYTOMESSAGE_FIELD)) { this.replyToMessage = new Message(jsonObject.getJSONObject(REPLYTOMESSAGE_FIELD)); } if (jsonObject.has(NEWCHATTITLE_FIELD)) { this.newChatTitle = jsonObject.getString(NEWCHATTITLE_FIELD); } if (jsonObject.has(NEWCHATPHOTO_FIELD)) { JSONArray photoArray = jsonObject.getJSONArray(NEWCHATPHOTO_FIELD); this.newChatPhoto = new ArrayList<>(); for (int i = 0; i < photoArray.length(); i++) { this.newChatPhoto.add(new PhotoSize(photoArray.getJSONObject(i))); } } if (jsonObject.has(DELETECHATPHOTO_FIELD)) { this.deleteChatPhoto = true; } if (jsonObject.has(GROUPCHATCREATED_FIELD)) { this.groupchatCreated = true; } if (jsonObject.has(SUPERGROUPCREATED_FIELD)) { this.superGroupCreated = true; } if (jsonObject.has(CHANNELCHATCREATED_FIELD)) { this.channelChatCreated = true; } if (jsonObject.has(MIGRATETOCHAT_FIELD)) { this.migrateToChatId = jsonObject.getLong(MIGRATETOCHAT_FIELD); } if (jsonObject.has(MIGRATEFROMCHAT_FIELD)) { this.migrateFromChatId = jsonObject.getLong(MIGRATEFROMCHAT_FIELD); } if (jsonObject.has(EDITDATE_FIELD)) { editDate = jsonObject.getInt(EDITDATE_FIELD); } if (hasText() && entities != null) { entities.forEach(x -> x.computeText(text)); } } public Integer getMessageId() { return messageId; } public User getFrom() { return from; } public Integer getDate() { return date; } public Chat getChat() { return chat; } public User getForwardFrom() { return forwardFrom; } public Integer getForwardDate() { return forwardDate; } public String getText() { return text; } public List getEntities() { return entities; } public Audio getAudio() { return audio; } public Document getDocument() { return document; } public List getPhoto() { return photo; } public Sticker getSticker() { return sticker; } public Video getVideo() { return video; } public Contact getContact() { return contact; } public Location getLocation() { return location; } public Venue getVenue() { return venue; } public Message getPinnedMessage() { return pinnedMessage; } public User getNewChatMember() { return newChatMember; } public User getLeftChatMember() { return leftChatMember; } public String getNewChatTitle() { return newChatTitle; } public List getNewChatPhoto() { return newChatPhoto; } public Boolean getDeleteChatPhoto() { return deleteChatPhoto; } public Boolean getGroupchatCreated() { return groupchatCreated; } public Message getReplyToMessage() { return replyToMessage; } public Voice getVoice() { return voice; } public String getCaption() { return caption; } public Boolean getSuperGroupCreated() { return superGroupCreated; } public Boolean getChannelChatCreated() { return channelChatCreated; } public Long getMigrateToChatId() { return migrateToChatId; } public Long getMigrateFromChatId() { return migrateFromChatId; } public boolean isGroupMessage() { return chat.isGroupChat(); } public boolean isUserMessage() { return chat.isUserChat(); } public boolean isChannelMessage() { return chat.isChannelChat(); } public boolean isSuperGroupMessage() { return chat.isSuperGroupChat(); } public Long getChatId() { return chat.getId(); } public boolean hasText() { return text != null && !text.isEmpty(); } public boolean isCommand() { if (hasText() && entities != null) { for (MessageEntity entity : entities) { if (entity != null && entity.getOffset() == 0 && EntityType.BOTCOMMAND.equals(entity.getType())) { return true; } } } return false; } public boolean hasDocument() { return this.document != null; } public boolean isReply() { return this.replyToMessage != null; } public boolean hasLocation() { return location != null; } public Chat getForwardFromChat() { return forwardFromChat; } public Integer getEditDate() { return editDate; } @Override public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeStartObject(); gen.writeNumberField(MESSAGEID_FIELD, messageId); if (from != null) { gen.writeObjectField(FROM_FIELD, from); } if (date != null) { gen.writeNumberField(DATE_FIELD, date); } gen.writeObjectField(CHAT_FIELD, chat); if (forwardFromChat != null) { gen.writeObjectField(FORWARDFROMCHAT_FIELD, forwardFromChat); } if (forwardFrom != null) { gen.writeObjectField(FORWARDFROM_FIELD, forwardFrom); } if (forwardDate != null) { gen.writeNumberField(FORWARDDATE_FIELD, forwardDate); } if (text != null) { gen.writeStringField(TEXT_FIELD, text); } if (audio != null) { gen.writeObjectField(AUDIO_FIELD, audio); } if (document != null) { gen.writeObjectField(DOCUMENT_FIELD, document); } if (photo != null && photo.size() > 0) { gen.writeArrayFieldStart(PHOTO_FIELD); for (PhotoSize photoSize : photo) { gen.writeObject(photoSize); } gen.writeEndArray(); } if (sticker != null) { gen.writeObjectField(STICKER_FIELD, sticker); } if (video != null) { gen.writeObjectField(VIDEO_FIELD, video); } if (contact != null) { gen.writeObjectField(CONTACT_FIELD, contact); } if (location != null) { gen.writeObjectField(LOCATION_FIELD, location); } if (venue != null) { gen.writeObjectField(VENUE_FIELD, venue); } if (voice != null) { gen.writeObjectField(VOICE_FIELD, voice); } if (caption != null) { gen.writeObjectField(CAPTION_FIELD, caption); } if (newChatMember != null) { gen.writeObjectField(NEWCHATMEMBER_FIELD, newChatMember); } if (leftChatMember != null) { gen.writeObjectField(LEFTCHATMEMBER_FIELD, leftChatMember); } if (replyToMessage != null) { gen.writeObjectField(REPLYTOMESSAGE_FIELD, replyToMessage); } if (newChatTitle != null) { gen.writeStringField(NEWCHATTITLE_FIELD, newChatTitle); } if (newChatPhoto != null && newChatPhoto.size() > 0) { gen.writeArrayFieldStart(NEWCHATPHOTO_FIELD); for (PhotoSize photoSize: newChatPhoto) { gen.writeObject(photoSize); } gen.writeEndArray(); } if (deleteChatPhoto != null) { gen.writeBooleanField(DELETECHATPHOTO_FIELD, deleteChatPhoto); } if (groupchatCreated != null) { gen.writeBooleanField(GROUPCHATCREATED_FIELD, groupchatCreated); } if (superGroupCreated != null) { gen.writeBooleanField(SUPERGROUPCREATED_FIELD, superGroupCreated); } if (channelChatCreated != null) { gen.writeBooleanField(CHANNELCHATCREATED_FIELD, channelChatCreated); } if (migrateToChatId != null) { gen.writeNumberField(MIGRATETOCHAT_FIELD, migrateToChatId); } if (migrateFromChatId != null) { gen.writeNumberField(MIGRATEFROMCHAT_FIELD, migrateFromChatId); } if (editDate != null) { gen.writeNumberField(EDITDATE_FIELD, editDate); } gen.writeEndObject(); gen.flush(); } @Override public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException { serialize(gen, serializers); } @Override public String toString() { return "Message{" + "messageId=" + messageId + ", from=" + from + ", date=" + date + ", chat=" + chat + ", forwardFrom=" + forwardFrom + ", forwardFromChat=" + forwardFromChat + ", forwardDate=" + forwardDate + ", text='" + text + '\'' + ", audio=" + audio + ", document=" + document + ", photo=" + photo + ", sticker=" + sticker + ", video=" + video + ", contact=" + contact + ", location=" + location + ", venue=" + venue + ", newChatMember=" + newChatMember + ", leftChatMember=" + leftChatMember + ", newChatTitle='" + newChatTitle + '\'' + ", newChatPhoto=" + newChatPhoto + ", deleteChatPhoto=" + deleteChatPhoto + ", groupchatCreated=" + groupchatCreated + ", replyToMessage=" + replyToMessage + ", voice=" + voice + ", caption=" + caption + ", superGroupCreated=" + superGroupCreated + ", channelChatCreated=" + channelChatCreated + ", migrateToChatId=" + migrateToChatId + ", migrateFromChatId=" + migrateFromChatId + ", editDate=" + editDate + '}'; } }