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 }