From 6d7c78d44dd814e87a725101ebf62db875eb102f Mon Sep 17 00:00:00 2001 From: root Date: Sun, 5 Aug 2018 00:19:11 +0700 Subject: [PATCH] Bot API 4.0 --- telebot.nimble | 2 +- telebot/api.nim | 39 ++++++++++++++++++++++++++++++++++++++- telebot/inputmedia.nim | 29 +++++++++++++++++++++++++++++ telebot/types.nim | 17 ++++++++++++----- telebot/utils.nim | 16 +++++++++++++++- 5 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 telebot/inputmedia.nim diff --git a/telebot.nimble b/telebot.nimble index 40cd0e4..af21f44 100644 --- a/telebot.nimble +++ b/telebot.nimble @@ -1,4 +1,4 @@ -version = "0.3.7" +version = "0.4.0" author = "Huy Doan" description = "Async Telegram Bot API Client" license = "MIT" diff --git a/telebot/api.nim b/telebot/api.nim index 388121a..eca9a80 100644 --- a/telebot/api.nim +++ b/telebot/api.nim @@ -88,6 +88,7 @@ magic Venue: title: string address: string foursquareId: string {.optional.} + foursquareType: string {.optional.} disableNotification: bool {.optional.} replyToMessageId: int {.optional.} replyMarkup: KeyboardMarkup {.optional.} @@ -97,6 +98,7 @@ magic Contact: phoneNumber: string firstName: string lastName: string {.optional.} + vcard: string {.optional.} disableNotification: bool {.optional.} replyToMessageId: int {.optional.} replyMarkup: KeyboardMarkup {.optional.} @@ -126,6 +128,19 @@ magic Invoice: replyToMessageId: int {.optional.} replyMarkup: KeyboardMarkup {.optional.} +magic Animation: + chatId: int + animation: string + duration: int {.optional.} + width: int {.optional.} + height: int {.optional.} + thumb: string {.optional.} + caption: string {.optional.} + parseMode: string {.optional.} + disableNotification: string {.optional.} + replyToMessageId: int {.optional.} + replyMarkup: KeyboardMarkup {.optional.} + proc getMe*(b: TeleBot): Future[User] {.async.} = ## Returns basic information about the bot in form of a ``User`` object. @@ -438,7 +453,9 @@ proc stopMessageLiveLocation*(b: TeleBot, chatId = "", messageId = 0, inlineMess proc sendMediaGroup*(b: TeleBot, chatId = "", media: seq[InputMedia], disableNotification = false, replyToMessageId = 0): Future[bool] {.async.} = END_POINT("sendMediaGroup") var data = newMultipartData() - data["chat_id"] = chat_id + data["chat_id"] = chatId + for m in media: + uploadInputMedia(data, m) var json = "" marshal(media, json) data["media"] = json @@ -450,6 +467,26 @@ proc sendMediaGroup*(b: TeleBot, chatId = "", media: seq[InputMedia], disableNot let res = await makeRequest(endpoint % b.token, data) result = res.bval +proc editMessageMedia*(b: TeleBot, media: InputMedia, chatId = "", messageId = 0, inlineMessageId = 0, replyMarkup: KeyboardMarkup = nil): Future[bool] {.async.} = + END_POINT("editMessageMedia") + var data = newMultipartData() + if chatId.len > 0: + data["chat_id"] = chat_id + if messageId != 0: + data["message_id"] = $messageId + if inlineMessageId != 0: + data["inline_message_id"] = $inlineMessageId + + uploadInputMedia(data, media) + var json = "" + marshal(media, json) + data["media"] = json + if replyMarkup != nil: + data["reply_markup"] = $replyMarkup + + let res = await makeRequest(endpoint % b.token, data) + result = res.bval + proc answerCallbackQuery*(b: TeleBot, callbackQueryId: string, text = "", showAlert = false, url = "", cacheTime = 0): Future[bool] {.async.} = END_POINT("answerCallbackQuery") var data = newMultipartData() diff --git a/telebot/inputmedia.nim b/telebot/inputmedia.nim new file mode 100644 index 0000000..b06d9b4 --- /dev/null +++ b/telebot/inputmedia.nim @@ -0,0 +1,29 @@ +import types, json, strutils, utils, options + +proc `$`*(m: InputMedia): string = + result = "" + if m of InputMediaPhoto: + var photo = InputMediaPhoto(m) + photo.kind = "photo" + marshal(photo[], result) + elif m of InputMediaVideo: + var video = InputMediaVideo(m) + marshal(video[], result) + +proc newInputMediaPhoto*(media: string, caption = "", parseMode = ""): InputMediaPhoto = + new(result) + result.kind = "photo" + result.media = media + if caption.len > 0: + result.caption = some(caption) + if parseMode.len > 0: + result.parseMode = some(parseMode) + +proc newInputMediaVideo*(media: string, caption = "", parseMode = ""): InputMediaVideo = + new(result) + result.kind = "video" + result.media = media + if caption.len > 0: + result.caption = some(caption) + if parseMode.len > 0: + result.parseMode = some(parseMode) \ No newline at end of file diff --git a/telebot/types.nim b/telebot/types.nim index ee2886f..e7431da 100644 --- a/telebot/types.nim +++ b/telebot/types.nim @@ -52,6 +52,7 @@ type title*: Option[string] mimeType*: Option[string] fileSize*: Option[int] + thumb*: Option[PhotoSize] Document* = object of TelegramObject fileId*: string @@ -107,6 +108,7 @@ type firstName*: string lastName*: Option[string] userId*: Option[string] + vcard*: Option[string] Location* = object of TelegramObject longitude*: float @@ -117,6 +119,7 @@ type title*: string address*: string foursquareId*: Option[string] + foursquareName*: Option[string] UserProfilePhotos* = object of TelegramObject totalCount*: int @@ -196,6 +199,7 @@ type captionEntities*: Option[seq[MessageEntity]] audio*: Option[Audio] document*: Option[Document] + animation*: Option[Animation] game*: Option[Game] photo*: Option[seq[PhotoSize]] sticker*: Option[Sticker] @@ -360,12 +364,14 @@ type longitude*: float title*: string address*: string - foursquareId*: string + foursquareId*: Option[string] + foursquareName*: Option[string] InputContactMessageContent* = object of InputMessageContent phoneNumber*: string firstName*: string - lastName*: string + lastName*: Option[string] + vcard*: Option[string] InlineQueryResultArticle* = object of InlineQueryResultWithThumb title*: string @@ -441,12 +447,14 @@ type longitude*: float title*: string address*: string - foursquareId*: string + foursquareId*: Option[string] + foursquareName*: Option[string] InlineQueryResultContact* = object of InlineQueryResultWithThumb phoneNumber*: string firstName*: string lastName*: string + vcard*: Option[string] InlineQueryResultGame* = object of InlineQueryResult gameShortName*: string @@ -511,13 +519,13 @@ type InputMedia* = ref object of TelegramObject kind*: string media*: string + thumb*: Option[string] caption*: Option[string] parseMode*: Option[string] InputMediaPhoto* = ref object of InputMedia InputMediaVideo* = ref object of InputMedia - thumb*: Option[string] width*: Option[int] height*: Option[int] duration*: Option[int] @@ -534,5 +542,4 @@ type title*: Option[string] InputMediaDocument* = ref object of InputMedia - thumb*: Option[string] diff --git a/telebot/utils.nim b/telebot/utils.nim index 72c04bc..e7dacb8 100644 --- a/telebot/utils.nim +++ b/telebot/utils.nim @@ -1,5 +1,6 @@ +import macros, httpclient, asyncdispatch, json, strutils, types, options, logging, strtabs, random -import macros, httpclient, asyncdispatch, json, strutils, types, options, logging, strtabs +randomize() const API_URL* = "https://api.telegram.org/bot$#/" @@ -194,6 +195,19 @@ proc addData*(p: var MultipartData, name: string, content: auto, fileCheck = fal else: p.add(name, $content) +proc uploadInputMedia*(p: var MultipartData, m: InputMedia) = + var name = "file_upload_" & $rand(high(int)) + if m.media.startsWith("file://"): + m.media = "attach://" & name + p.addFiles({name: m.media[7..m.media.len-1]}) + + if m.thumb.isSome: + name = "file_upload_" & $rand(high(int)) + m.thumb = some("attach://" & name) + p.addFiles({name: m.media[7..m.media.len-1]}) + + + macro magic*(head, body: untyped): untyped = result = newStmtList()