1 module telega.telegram.updmessages;
2 
3 import std.typecons : Nullable;
4 import telega.botapi : BotApi, TelegramMethod, HTTPMethod, ChatId, isTelegramId;
5 import telega.telegram.basic : ParseMode, ReplyMarkup, ForceReply, ReplyKeyboardMarkup, ReplyKeyboardRemove,
6         InlineKeyboardMarkup, isReplyMarkup;
7 
8 struct EditMessageTextMethod
9 {
10     mixin TelegramMethod!"/editMessageTextMethod";
11 
12     ChatId      chat_id;
13     uint        message_id;
14     string      inline_message_id;
15     string      text;
16     Nullable!ParseMode   parse_mode;
17     bool        disable_web_page_preview;
18     ReplyMarkup reply_markup;
19 }
20 
21 struct EditMessageCaptionMethod
22 {
23     mixin TelegramMethod!"/editMessageCaptionMethod";
24 
25     ChatId      chat_id;
26     uint        message_id;
27     string      inline_message_id;
28     string      caption;
29     Nullable!ParseMode   parse_mode;
30     ReplyMarkup reply_markup;
31 }
32 
33 struct EditMessageReplyMarkupMethod
34 {
35     mixin TelegramMethod!"/editMessageReplyMarkupMethod";
36 
37     ChatId      chat_id;
38     uint        message_id;
39     string      inline_message_id;
40     ReplyMarkup reply_markup;
41 }
42 
43 struct DeleteMessageMethod
44 {
45     mixin TelegramMethod!"/deleteMessageMethod";
46 
47     ChatId chat_id;
48     uint   message_id;
49 }
50 
51 bool editMessageText(BotApi api, ref EditMessageTextMethod m)
52 {
53     return api.callMethod!bool(m);
54 }
55 
56 bool editMessageText(T1)(BotApi api, T1 chatId, uint messageId, string text)
57     if (isTelegramId!T1)
58 {
59     EditMessageTextMethod m = {
60         chat_id : chatId,
61         message_id : messageId,
62         text : text
63     };
64 
65     return editMessageText(api, m);
66 }
67 
68 bool editMessageText(BotApi api, string inlineMessageId, string text)
69 {
70     EditMessageTextMethod m = {
71         inline_message_id : inlineMessageId,
72         text : text
73     };
74 
75     return editMessageText(api, m);
76 }
77 
78 bool editMessageCaption(BotApi api, ref EditMessageCaptionMethod m)
79 {
80     return api.callMethod!bool(m);
81 }
82 
83 bool editMessageCaption(T1)(BotApi api, T1 chatId, uint messageId, string caption = null)
84     if (isTelegramId!T1)
85 {
86     EditMessageCaptionMethod m = {
87         chat_id : chatId,
88         message_id : messageId,
89         caption : caption
90     };
91 
92     return editMessageCaption(api, m);
93 }
94 
95 bool editMessageCaption(BotApi api, string inlineMessageId, string caption = null)
96 {
97     EditMessageCaptionMethod m = {
98         inline_message_id : inlineMessageId,
99         caption : caption
100     };
101 
102     return editMessageCaption(api, m);
103 }
104 
105 bool editMessageReplyMarkup(BotApi api, ref EditMessageReplyMarkupMethod m)
106 {
107     return api.callMethod!bool(m);
108 }
109 
110 bool editMessageReplyMarkup(T1, T2)(BotApi api, T1 chatId, uint messageId, T2 replyMarkup)
111     if (isTelegramId!T1 && isReplyMarkup!T2)
112 {
113     EditMessageReplyMarkupMethod m = {
114         chat_id : chatId,
115         message_id : messageId
116     };
117 
118     m.reply_markup = replyMarkup;
119 
120     return editMessageReplyMarkup(api, m);
121 }
122 
123 bool editMessageReplyMarkup(BotApi api, string inlineMessageId, Nullable!ReplyMarkup replyMarkup)
124 {
125     EditMessageReplyMarkupMethod m = {
126         inline_message_id : inlineMessageId,
127         reply_markup : replyMarkup
128     };
129 
130     return editMessageReplyMarkup(api, m);
131 }
132 
133 bool deleteMessage(BotApi api, ref DeleteMessageMethod m)
134 {
135     return api.callMethod!bool(m);
136 }
137 
138 bool deleteMessage(T1)(BotApi api, T1 chatId, uint messageId)
139     if (isTelegramId!T1)
140 {
141     DeleteMessageMethod m = {
142         chat_id : chatId,
143         message_id : messageId
144     };
145 
146     return deleteMessage(api, m);
147 }
148 
149 unittest
150 {
151     class BotApiMock : BotApi
152     {
153         this(string token)
154         {
155             super(token);
156         }
157 
158         T callMethod(T, M)(M method)
159         {
160             T result;
161 
162             logDiagnostic("[%d] Requesting %s", requestCounter, method.name);
163 
164             return result;
165         }
166     }
167 
168     auto api = new BotApiMock(null);
169 
170     api.editMessageText("chat-id", 123, "new text");
171     api.editMessageText("inline-message-id", "new text");
172     api.editMessageCaption("chat-id", 123, "new caption");
173     api.editMessageCaption("chat-id", 123, null);
174     api.editMessageCaption("inline-message-id", "new caption");
175     api.editMessageCaption("inline-message-id", null);
176 
177     api.editMessageReplyMarkup("chat-id", 123, ForceReply());
178     api.editMessageReplyMarkup("chat-id", 123, ReplyKeyboardMarkup());
179     api.editMessageReplyMarkup("chat-id", 123, ReplyKeyboardRemove());
180     api.editMessageReplyMarkup("chat-id", 123, InlineKeyboardMarkup());
181     api.editMessageReplyMarkup("chat-id", 123, ReplyMarkup());
182 
183     api.deleteMessage("chat-id", 123);
184 }