Forge
csharp1a59f514
1using System.Text.Json;
2using Spectre.Console;
3using Spectre.Console.Cli;
4using TL;
5using TelegramNotifier;
6
7namespace TelegramNotifier.Commands;
8
9// --- send-message-to-user ---
10internal sealed class SendMessageToUserCommand : AsyncCommand<SendMessageToUserCommand.Settings>
11{
12 public sealed class Settings : CommandSettings
13 {
14 [CommandArgument(0, "<USERNAME>")]
15 public string Username { get; set; } = "";
16
17 [CommandArgument(1, "<MESSAGE>")]
18 public string Message { get; set; } = "";
19 }
20
21 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
22 {
23 await RunContext.TelegramManager.SendMessageToUser(settings.Username, settings.Message).ConfigureAwait(false);
24 AnsiConsole.MarkupLine("[green]Message sent.[/]");
25 return 0;
26 }
27}
28
29// --- create-chat ---
30internal sealed class CreateChatCommand : AsyncCommand<CreateChatCommand.Settings>
31{
32 public sealed class Settings : CommandSettings
33 {
34 [CommandArgument(0, "<CHAT_NAME>")]
35 public string ChatName { get; set; } = "";
36
37 [CommandArgument(1, "<USERNAME>")]
38 public string Username { get; set; } = "";
39 }
40
41 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
42 {
43 await RunContext.TelegramManager.CreateChat(settings.ChatName, settings.Username).ConfigureAwait(false);
44 return 0;
45 }
46}
47
48// --- delete-chat ---
49internal sealed class DeleteChatCommand : AsyncCommand<DeleteChatCommand.Settings>
50{
51 public sealed class Settings : CommandSettings
52 {
53 [CommandArgument(0, "<CHAT_ID>")]
54 public long ChatId { get; set; }
55 }
56
57 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
58 {
59 await RunContext.TelegramManager.DeleteChat(settings.ChatId).ConfigureAwait(false);
60 AnsiConsole.MarkupLine("[green]Chat deleted.[/]");
61 return 0;
62 }
63}
64
65// --- invite-user ---
66internal sealed class InviteUserCommand : AsyncCommand<InviteUserCommand.Settings>
67{
68 public sealed class Settings : CommandSettings
69 {
70 [CommandArgument(0, "<CHAT_ID>")]
71 public long ChatId { get; set; }
72
73 [CommandArgument(1, "<USERNAME>")]
74 public string Username { get; set; } = "";
75 }
76
77 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
78 {
79 await RunContext.TelegramManager.AddUserToChat(settings.ChatId, settings.Username).ConfigureAwait(false);
80 AnsiConsole.MarkupLine("[green]User invited.[/]");
81 return 0;
82 }
83}
84
85// --- delete-user-from-chat ---
86internal sealed class DeleteUserFromChatCommand : AsyncCommand<DeleteUserFromChatCommand.Settings>
87{
88 public sealed class Settings : CommandSettings
89 {
90 [CommandArgument(0, "<CHAT_ID>")]
91 public long ChatId { get; set; }
92
93 [CommandArgument(1, "<USERNAME>")]
94 public string Username { get; set; } = "";
95 }
96
97 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
98 {
99 await RunContext.TelegramManager.DeleteUserFromChat(settings.ChatId, settings.Username).ConfigureAwait(false);
100 AnsiConsole.MarkupLine("[green]User removed from chat.[/]");
101 return 0;
102 }
103}
104
105// --- list-chats (JSON to stdout for MCP) ---
106internal sealed class ListChatsCommand : AsyncCommand<ListChatsCommand.Settings>
107{
108 public sealed class Settings : CommandSettings { }
109
110 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
111 {
112 var chats = await RunContext.TelegramManager.ListChatsAsync().ConfigureAwait(false);
113 var arr = chats.Select(c => new { chat_id = c.ChatId, title = c.Title }).ToArray();
114 Console.WriteLine(JsonSerializer.Serialize(arr));
115 return 0;
116 }
117}
118
119// --- get-messages (JSON to stdout for MCP) ---
120internal sealed class GetMessagesCommand : AsyncCommand<GetMessagesCommand.Settings>
121{
122 public sealed class Settings : CommandSettings
123 {
124 [CommandArgument(0, "<CHAT_ID>")]
125 public long ChatId { get; set; }
126
127 [CommandArgument(1, "[TOPIC_ID]")]
128 public int? TopicId { get; set; }
129 }
130
131 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
132 {
133 var dtos = await RunContext.TelegramManager.GetMessagesFromChatAsDtos(settings.ChatId, settings.TopicId).ConfigureAwait(false);
134 var json = JsonSerializer.Serialize(dtos, new JsonSerializerOptions { WriteIndented = false });
135 Console.Out.WriteLine(json);
136 return 0;
137 }
138}
139
140// --- get-media ---
141internal sealed class GetMediaCommand : AsyncCommand<GetMediaCommand.Settings>
142{
143 public sealed class Settings : CommandSettings
144 {
145 [CommandArgument(0, "<CHAT_ID>")]
146 public long ChatId { get; set; }
147 }
148
149 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
150 {
151 var messages = await RunContext.TelegramManager.GetMessagesFromChat(settings.ChatId).ConfigureAwait(false);
152 var withMedia = messages.Where(m => m.flags.HasFlag(Message.Flags.has_media)).ToList();
153 var path = RunContext.Config.ApplicationSettings.SavedMediaLocationPath;
154 foreach (var msg in withMedia)
155 await RunContext.TelegramManager.DownloadMediaFromMessage(msg, path).ConfigureAwait(false);
156 AnsiConsole.MarkupLine("[green]Downloaded [bold]{0}[/] media file(s).[/]", withMedia.Count);
157 return 0;
158 }
159}
160
161// --- create-topic ---
162internal sealed class CreateTopicCommand : AsyncCommand<CreateTopicCommand.Settings>
163{
164 public sealed class Settings : CommandSettings
165 {
166 [CommandArgument(0, "<CHAT_ID>")]
167 public long ChatId { get; set; }
168
169 [CommandArgument(1, "<TITLE>")]
170 public string Title { get; set; } = "";
171 }
172
173 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
174 {
175 var topicId = await RunContext.TelegramManager.CreateForumTopic(settings.ChatId, settings.Title).ConfigureAwait(false);
176 AnsiConsole.MarkupLine("[green]Topic created.[/] Topic id (top_msg_id): [bold]{0}[/]", topicId);
177 return 0;
178 }
179}
180
181// --- send-message-to-chat ---
182internal sealed class SendMessageToChatCommand : AsyncCommand<SendMessageToChatCommand.Settings>
183{
184 public sealed class Settings : CommandSettings
185 {
186 [CommandArgument(0, "<CHAT_ID>")]
187 public long ChatId { get; set; }
188
189 [CommandArgument(1, "<MESSAGE>")]
190 public string Message { get; set; } = "";
191
192 [CommandArgument(2, "[TOPIC_ID]")]
193 public int? TopicId { get; set; }
194 }
195
196 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
197 {
198 await RunContext.TelegramManager.SendMessageToChat(settings.ChatId, settings.Message, settings.TopicId).ConfigureAwait(false);
199 AnsiConsole.MarkupLine("[green]Message sent.[/]");
200 return 0;
201 }
202}
203
204// --- edit-message ---
205internal sealed class EditMessageCommand : AsyncCommand<EditMessageCommand.Settings>
206{
207 public sealed class Settings : CommandSettings
208 {
209 [CommandArgument(0, "<CHAT_ID>")]
210 public long ChatId { get; set; }
211
212 [CommandArgument(1, "<MESSAGE_ID>")]
213 public int MessageId { get; set; }
214
215 [CommandArgument(2, "<NEW_TEXT>")]
216 public string NewText { get; set; } = "";
217 }
218
219 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
220 {
221 await RunContext.TelegramManager.EditMessage(settings.ChatId, settings.MessageId, settings.NewText).ConfigureAwait(false);
222 AnsiConsole.MarkupLine("[green]Message edited.[/]");
223 return 0;
224 }
225}
226
227// --- delete-message ---
228internal sealed class DeleteMessageCommand : AsyncCommand<DeleteMessageCommand.Settings>
229{
230 public sealed class Settings : CommandSettings
231 {
232 [CommandArgument(0, "<CHAT_ID>")]
233 public long ChatId { get; set; }
234
235 [CommandArgument(1, "<MESSAGE_ID>")]
236 public int MessageId { get; set; }
237 }
238
239 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
240 {
241 await RunContext.TelegramManager.DeleteMessage(settings.ChatId, settings.MessageId).ConfigureAwait(false);
242 AnsiConsole.MarkupLine("[green]Message deleted.[/]");
243 return 0;
244 }
245}
246
247// --- update-old-messages ---
248internal sealed class UpdateOldMessagesCommand : AsyncCommand<UpdateOldMessagesCommand.Settings>
249{
250 public sealed class Settings : CommandSettings
251 {
252 [CommandArgument(0, "<CHAT_ID>")]
253 public long ChatId { get; set; }
254
255 [CommandArgument(1, "[TOPIC_ID]")]
256 public int? TopicId { get; set; }
257 }
258
259 public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
260 {
261 int edited = await RunContext.TelegramManager.UpdateOldMessagesInChat(settings.ChatId, settings.TopicId).ConfigureAwait(false);
262 AnsiConsole.MarkupLine("[green]Updated {0} message(s).[/]", edited);
263 return 0;
264 }
265}
266
View only · write via MCP/CIDE