-
Notifications
You must be signed in to change notification settings - Fork 1
/
Program.cs
126 lines (96 loc) · 4.19 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using MinimalTelegramBot.Builder;
using MinimalTelegramBot.Handling;
using MinimalTelegramBot.Handling.Filters;
using MinimalTelegramBot.Localization.Abstractions;
using MinimalTelegramBot.Localization.Extensions;
using MinimalTelegramBot.StateMachine.Extensions;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.ReplyMarkups;
using UsageExample.CallbackModels;
using UsageExample.CommandModels;
using UsageExample.Services;
using Results = MinimalTelegramBot.Results.Results;
// TODO: More Result templates.
// TODO: Different state models.
// TODO: Notifications.
// TODO: Different persistence and builder options in builders (State Machine, Notification Service).
var builder = BotApplication.CreateBuilder(args);
builder.Services.AddStateMachine();
builder.Services.AddSingleLocale(new Locale("ru"), locale => locale.EnrichFromFile("Localization/ru.yaml"));
builder.Services.AddScoped<WeatherService>();
builder.Services.AddKeyedSingleton("FirstName", new NameService { Name = "First Name", });
builder.Services.AddKeyedSingleton("LastName", new NameService { Name = "Last Name", });
var app = builder.Build();
app.UsePolling();
//app.UseWebhook(new WebhookOptions { Url = "", });
app.UseCallbackAutoAnswering();
app.UseStateMachine();
app.UseLocalization();
app.Handle((ILocalizer localizer) =>
{
var helloText = localizer["HelloText"];
var keyboard = MenuKeyboard(localizer);
return Results.Message(helloText, keyboard);
}).FilterCommand("/start");
app.Handle(([UseFormatProvider] AddCommandModel model, ILocalizer localizer) => model.IsError
? localizer["ParsingError"]
: localizer["AddCommandTemplate", model.Result]).FilterCommand("/add");
app.Handle(([FromKeyedServices("FirstName")] NameService nameService) => nameService.Name).FilterCommand("/firstname");
app.Handle(([FromKeyedServices("LastName")] NameService nameService) => nameService.Name).FilterCommand("/lastname");
app.HandleCommand("/throw", () =>
{
if (Random.Shared.Next(0, 2) == 0)
{
throw new Exception("Error");
}
return Results.Message("Ok");
});
app.Handle((ILocalizer localizer) =>
{
var menuText = localizer["Menu"];
var keyboard = MenuKeyboard(localizer);
return Results.Message(menuText, keyboard);
}).FilterCallbackData(x => x == "Menu");
app.Handle((ILocalizer localizer) =>
{
var backText = localizer["Button.Back"];
var model = new PaginationModel { PageNumber = 1, };
var keyboard = model.GetPageKeyboard(backText, "Menu");
return Results.Message("Page 1", keyboard);
}).FilterMessageTextWithLocalizer("Button.Page");
app.Handle((PaginationModel model, ILocalizer localizer) =>
{
var backText = localizer["Button.Back"];
var pageText = $"Page {model.PageNumber}";
var keyboard = model.GetPageKeyboard(backText, "Menu");
return keyboard is null
? Results.CallbackAnswer()
: Results.MessageEdit(pageText, keyboard);
}).FilterCallbackData(x => x.StartsWith(PaginationModel.CallbackPrefix));
app.Handle(() =>
{
var keyboard = new InlineKeyboardMarkup(InlineKeyboardButton.WithCallbackData("Send photo!", "Photo"));
return Results.MessageEdit("Button pressed", keyboard);
}).FilterCallbackData(x => x == "Hello");
app.Handle(() => Results.Photo(new Uri("cat.jpeg", UriKind.Relative), "Little cat")).FilterCallbackData(x => x == "Photo");
app.Handle(() => Results.MessageReply("I'm replied!")).FilterMessageText(x => x.Equals("reply", StringComparison.OrdinalIgnoreCase));
app.Handle(async (string messageText, WeatherService weatherService) =>
{
var weather = await weatherService.GetWeather();
var keyboard = new InlineKeyboardMarkup(InlineKeyboardButton.WithCallbackData("Hello", "Hello"));
return ($"Hello, {messageText}, weather is {weather}", keyboard);
}).FilterUpdateType(x => x == UpdateType.Message);
app.Run();
return;
static ReplyKeyboardMarkup MenuKeyboard(ILocalizer localizer)
{
var helloButton = localizer["Button.Hello"];
var catButton = localizer["Button.Cat"];
var pagesButton = localizer["Button.Page"];
return new ReplyKeyboardMarkup(new[]
{
new KeyboardButton(helloButton),
new KeyboardButton(catButton),
new KeyboardButton(pagesButton),
}) { ResizeKeyboard = true, };
}