1 module telega.telegram.updmessages; 2 3 import std.typecons : Nullable, nullable; 4 import telega.botapi : BotApi, TelegramMethod, HTTPMethod, ChatId, isTelegramId; 5 import telega.telegram.basic : ParseMode, ReplyMarkup, ForceReply, ReplyKeyboardMarkup, ReplyKeyboardRemove, 6 InlineKeyboardMarkup, isReplyMarkup, InputMedia, InputMediaPhoto; 7 8 version (unittest) 9 { 10 import telega.test : assertEquals; 11 } 12 13 struct EditMessageTextMethod 14 { 15 mixin TelegramMethod!"/editMessageText"; 16 17 ChatId chat_id; 18 uint message_id; 19 string inline_message_id; 20 string text; 21 Nullable!ParseMode parse_mode; 22 bool disable_web_page_preview; 23 ReplyMarkup reply_markup; 24 } 25 26 struct EditMessageCaptionMethod 27 { 28 mixin TelegramMethod!"/editMessageCaption"; 29 30 ChatId chat_id; 31 uint message_id; 32 string inline_message_id; 33 string caption; 34 Nullable!ParseMode parse_mode; 35 ReplyMarkup reply_markup; 36 } 37 38 struct EditMessageMediaMethod 39 { 40 mixin TelegramMethod!"/editMessageMedia"; 41 42 ChatId chat_id; 43 uint message_id; 44 string inline_message_id; 45 InputMedia media; 46 Nullable!ReplyMarkup reply_markup; 47 } 48 49 unittest 50 { 51 import telega.serialization : serializeToJsonString; 52 53 InputMediaPhoto imp = { 54 type: "t", 55 media: "m" 56 }; 57 58 EditMessageMediaMethod m = { 59 chat_id: "111", 60 message_id: 1, 61 media: InputMedia(imp), 62 }; 63 64 m.serializeToJsonString() 65 .assertEquals(`{"chat_id":"111","message_id":1,"media":{"type":"t","media":"m"}}`); 66 } 67 68 struct EditMessageReplyMarkupMethod 69 { 70 mixin TelegramMethod!"/editMessageReplyMarkupMethod"; 71 72 ChatId chat_id; 73 uint message_id; 74 string inline_message_id; 75 Nullable!ReplyMarkup reply_markup; 76 } 77 78 struct DeleteMessageMethod 79 { 80 mixin TelegramMethod!"/deleteMessageMethod"; 81 82 ChatId chat_id; 83 uint message_id; 84 } 85 86 bool editMessageText(BotApi api, ref EditMessageTextMethod m) 87 { 88 return api.callMethod!bool(m); 89 } 90 91 bool editMessageText(T1)(BotApi api, T1 chatId, uint messageId, string text) 92 if (isTelegramId!T1) 93 { 94 EditMessageTextMethod m = { 95 chat_id : chatId, 96 message_id : messageId, 97 text : text 98 }; 99 100 return editMessageText(api, m); 101 } 102 103 bool editMessageText(BotApi api, string inlineMessageId, string text) 104 { 105 EditMessageTextMethod m = { 106 inline_message_id : inlineMessageId, 107 text : text 108 }; 109 110 return editMessageText(api, m); 111 } 112 113 bool editMessageCaption(BotApi api, ref EditMessageCaptionMethod m) 114 { 115 return api.callMethod!bool(m); 116 } 117 118 bool editMessageCaption(T1)(BotApi api, T1 chatId, uint messageId, string caption = null) 119 if (isTelegramId!T1) 120 { 121 EditMessageCaptionMethod m = { 122 chat_id : chatId, 123 message_id : messageId, 124 caption : caption 125 }; 126 127 return editMessageCaption(api, m); 128 } 129 130 bool editMessageCaption(BotApi api, string inlineMessageId, string caption = null) 131 { 132 EditMessageCaptionMethod m = { 133 inline_message_id : inlineMessageId, 134 caption : caption 135 }; 136 137 return editMessageCaption(api, m); 138 } 139 140 bool editMessageMedia(BotApi api, ref EditMessageMediaMethod m) 141 { 142 return api.callMethod!bool(m); 143 } 144 145 bool editMessageMedia(T)(BotApi api, T chatId, uint messageId, InputMedia media) 146 if (isTelegramId!T) 147 { 148 EditMessageMediaMethod m = { 149 chat_id: chatId, 150 message_id: messageId, 151 media: media 152 }; 153 154 return editMessageMedia(api, m); 155 } 156 157 bool editMessageMedia(BotApi api, string inlineMessageId, InputMedia media) 158 { 159 EditMessageMediaMethod m = { 160 inline_message_id: inlineMessageId, 161 media: media 162 }; 163 164 return editMessageMedia(api, m); 165 } 166 167 bool editMessageReplyMarkup(BotApi api, ref EditMessageReplyMarkupMethod m) 168 { 169 return api.callMethod!bool(m); 170 } 171 172 bool editMessageReplyMarkup(T1, T2)(BotApi api, T1 chatId, uint messageId, T2 replyMarkup) 173 if (isTelegramId!T1 && isReplyMarkup!T2) 174 { 175 EditMessageReplyMarkupMethod m = { 176 chat_id : chatId, 177 message_id : messageId 178 }; 179 180 m.reply_markup = (cast(ReplyMarkup)replyMarkup).nullable; 181 182 return editMessageReplyMarkup(api, m); 183 } 184 185 bool editMessageReplyMarkup(BotApi api, string inlineMessageId, Nullable!ReplyMarkup replyMarkup) 186 { 187 EditMessageReplyMarkupMethod m = { 188 inline_message_id : inlineMessageId, 189 reply_markup : replyMarkup 190 }; 191 192 return editMessageReplyMarkup(api, m); 193 } 194 195 bool deleteMessage(BotApi api, ref DeleteMessageMethod m) 196 { 197 return api.callMethod!bool(m); 198 } 199 200 bool deleteMessage(T1)(BotApi api, T1 chatId, uint messageId) 201 if (isTelegramId!T1) 202 { 203 DeleteMessageMethod m = { 204 chat_id : chatId, 205 message_id : messageId 206 }; 207 208 return deleteMessage(api, m); 209 } 210 211 unittest 212 { 213 class BotApiMock : BotApi 214 { 215 this(string token) 216 { 217 super(token); 218 } 219 220 T callMethod(T, M)(M method) 221 { 222 T result; 223 224 logDiagnostic("[%d] Requesting %s", requestCounter, method.name); 225 226 return result; 227 } 228 } 229 230 auto api = new BotApiMock(null); 231 232 api.editMessageText("chat-id", 123, "new text"); 233 api.editMessageText("inline-message-id", "new text"); 234 api.editMessageCaption("chat-id", 123, "new caption"); 235 api.editMessageCaption("chat-id", 123, null); 236 api.editMessageCaption("inline-message-id", "new caption"); 237 api.editMessageCaption("inline-message-id", null); 238 239 InputMediaPhoto imp = { 240 type: "t", 241 media: "m" 242 }; 243 api.editMessageMedia("chat-id", 123, InputMedia(imp)); 244 api.editMessageMedia("inline-message-id", InputMedia(imp)); 245 246 api.editMessageReplyMarkup("chat-id", 123, ForceReply()); 247 api.editMessageReplyMarkup("chat-id", 123, ReplyKeyboardMarkup()); 248 api.editMessageReplyMarkup("chat-id", 123, ReplyKeyboardRemove()); 249 api.editMessageReplyMarkup("chat-id", 123, InlineKeyboardMarkup()); 250 api.editMessageReplyMarkup("chat-id", 123, ReplyMarkup()); 251 252 api.deleteMessage("chat-id", 123); 253 }