Compare commits

...
18 Commits
Author SHA1 Message Date
Florian Zevedei 93fda551e1 Merge pull request #57 from Kataane/master
Russian translation added
2024-01-28 02:04:13 +01:00
Kataanee 8b22fd7b74 Fast fix 2024-01-27 13:16:27 +07:00
Kataanee 254c002d4a Add Russian in ILanguageSelectionStage 2024-01-27 13:14:15 +07:00
Kataanee d833b1e088 Russian translation added 2024-01-26 12:42:41 +07:00
Florian Zevedei 084395e962 Bugfix, adding missing DeviceSession to UpdateResult 2024-01-24 22:15:16 +01:00
Florian Zevedei cc4c743721 Merge pull request #56 from MajMcCloud/dependabot/nuget/TelegramBotBase.Extensions.Serializer.Database.MSSQL/Microsoft.Data.SqlClient-5.1.3
Bump Microsoft.Data.SqlClient from 5.0.0 to 5.1.3 in /TelegramBotBase.Extensions.Serializer.Database.MSSQL
2024-01-17 22:41:15 +01:00
dependabot[bot] 4e55fd42d6 Bump Microsoft.Data.SqlClient
Bumps [Microsoft.Data.SqlClient](https://github.com/dotnet/sqlclient) from 5.0.0 to 5.1.3.
- [Release notes](https://github.com/dotnet/sqlclient/releases)
- [Changelog](https://github.com/dotnet/SqlClient/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dotnet/sqlclient/compare/v5.0.0...v5.1.3)

---
updated-dependencies:
- dependency-name: Microsoft.Data.SqlClient
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-16 19:28:47 +00:00
Florian Zevedei 83e09aec2a Removing System.Drawing.Common dependency 2023-12-29 14:38:11 +01:00
Florian Zevedei a63f71268c Update README.md 2023-12-28 15:17:14 +01:00
Florian Zevedei d56b26a788 Merge pull request #55 from MajMcCloud/development
Integrating development branch into master
2023-12-26 17:32:51 +01:00
Florian Zevedei c1018ac5a0 Adding ThrowPendingUpdates option to builder and Message client. 2023-12-09 14:56:02 +01:00
Florian Zevedei 064399ed77 Replace nuget reference with project for development 2023-12-09 14:54:23 +01:00
Florian Zevedei 121a788c17 Update README.md 2023-12-08 01:52:47 +01:00
Florian Zevedei 40199a1d81 Merge pull request #51 from contributeless/feature/ability-to-log-exceptions-to-any-destination
Added the ReceiveError event to MessageClient to provide the ability to handle exceptions in client code
2023-12-07 17:50:57 +01:00
Florian Zevedei 794dee7f58 improved readability 2023-12-07 17:49:35 +01:00
Florian Zevedei 88309e607b Adding localization notes to Readme file 2023-12-06 15:44:59 +01:00
Florian Zevedei a71eed5054 Merge pull request #54 from MajMcCloud/master
Syncing master and development branch
2023-12-06 15:36:53 +01:00
TCSBANK\e.khudik 89332244e3 Added the ReceiveError event to MessageClient to provide the ability to handle exceptions in client code 2023-12-04 15:10:28 +03:00
11 changed files with 168 additions and 36 deletions
+17 -3
View File
@@ -1,6 +1,6 @@
# .NET Telegram Bot Framework - Context based addon # .NET Telegram Bot Framework - Context based addon
[![NuGet version (TelegramBotBase)](https://img.shields.io/nuget/vpre/TelegramBotBase.svg?style=flat-square)](https://www.nuget.org/packages/TelegramBotBase/) [![NuGet version (TelegramBotBase)](https://img.shields.io/nuget/v/TelegramBotBase.svg?style=flat-square)](https://www.nuget.org/packages/TelegramBotBase/)
[![Telegram chat](https://img.shields.io/badge/Support_Chat-Telegram-blue.svg?style=flat-square)](https://www.t.me/tgbotbase) [![Telegram chat](https://img.shields.io/badge/Support_Chat-Telegram-blue.svg?style=flat-square)](https://www.t.me/tgbotbase)
[![License](https://img.shields.io/github/license/MajMcCloud/telegrambotframework.svg?style=flat-square&maxAge=2592000&label=License)](https://raw.githubusercontent.com/MajMcCloud/TelegramBotFramework/master/LICENCE.md) [![License](https://img.shields.io/github/license/MajMcCloud/telegrambotframework.svg?style=flat-square&maxAge=2592000&label=License)](https://raw.githubusercontent.com/MajMcCloud/TelegramBotFramework/master/LICENCE.md)
@@ -10,7 +10,7 @@
**Support group: [@tgbotbase](https://t.me/tgbotbase)** **Support group: [@tgbotbase](https://t.me/tgbotbase)**
**Discord Server: [https://discord.gg/p3PPhYbTf](https://discord.gg/p3PPhYbTf)** **Discord Server: [https://discord.gg/V3PxreDYfE](https://discord.gg/V3PxreDYfE)**
**Releases: [GitHub](https://github.com/MajMcCloud/TelegramBotFramework/releases)** **Releases: [GitHub](https://github.com/MajMcCloud/TelegramBotFramework/releases)**
@@ -59,6 +59,7 @@ BitTorrent: `TYVZSykaVT1nKZnz9hjDgBRNB9VavU1bpW`
* [TaggedButtonGrid](#tagged-button-grid) * [TaggedButtonGrid](#tagged-button-grid)
* [CheckedButtonList](#checked-button-list) * [CheckedButtonList](#checked-button-list)
* [MultiToggleButton](#multi-toggle-button) * [MultiToggleButton](#multi-toggle-button)
- [Localizations](#localizations)
- [Groups](#groups) - [Groups](#groups)
* [SplitterForm](#splitter-form) * [SplitterForm](#splitter-form)
* [GroupForm](#group-form) * [GroupForm](#group-form)
@@ -714,6 +715,19 @@ Check the example project [TelegramBotBase.Test/Tests/Controls/CheckedButtonList
Check the example project [TelegramBotBase.Test/Tests/Controls/MultiToggleButtonForm.cs](TelegramBotBase.Test/Tests/Controls/MultiToggleButtonForm.cs) Check the example project [TelegramBotBase.Test/Tests/Controls/MultiToggleButtonForm.cs](TelegramBotBase.Test/Tests/Controls/MultiToggleButtonForm.cs)
## Localizations
The current available languages for controls are:
- English
- German
- Persian
You can add other languages easily by creating a subclass of the [TelegramBotBase/Localizations/Localization.cs](TelegramBotBase/Localizations/Localization.cs) class.
To set the default language set the *Language* property on the static [TelegramBotBase/Localizations/Default.cs](TelegramBotBase/Localizations/Default.cs) instance.
## Groups ## Groups
For groups, there are multiple different tools which help to work with and allows bot also to manage For groups, there are multiple different tools which help to work with and allows bot also to manage
@@ -1087,4 +1101,4 @@ Want to use Inline- and ReplyMarkup at the same time ? Here is an example how yo
Alpha: Full Dependency Injection example within this framework. Alpha: Full Dependency Injection example within this framework.
- [Examples/DependencyInjection](Examples/DependencyInjection) - [Examples/DependencyInjection](Examples/DependencyInjection)
@@ -15,11 +15,14 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="System.Drawing.Common" Version="6.0.0" /> <PackageReference Include="System.Drawing.Common" Version="6.0.0" />
<PackageReference Include="TelegramBotBase" Version="6.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Properties\" /> <Folder Include="Properties\" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TelegramBotBase\TelegramBotBase.csproj" />
</ItemGroup>
</Project> </Project>
@@ -16,7 +16,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.0.0" /> <PackageReference Include="Microsoft.Data.SqlClient" Version="5.1.3" />
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1"> <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+14
View File
@@ -0,0 +1,14 @@
using System;
namespace TelegramBotBase.Base
{
public class ErrorResult : EventArgs
{
public ErrorResult(Exception exception)
{
Exception = exception;
}
public Exception Exception { get; }
}
}
+48 -13
View File
@@ -18,6 +18,7 @@ namespace TelegramBotBase.Base;
public class MessageClient public class MessageClient
{ {
private static readonly object EvOnMessageLoop = new(); private static readonly object EvOnMessageLoop = new();
private static readonly object EvOnReceiveError = new();
private static object __evOnMessage = new(); private static object __evOnMessage = new();
@@ -27,6 +28,14 @@ public class MessageClient
private CancellationTokenSource _cancellationTokenSource; private CancellationTokenSource _cancellationTokenSource;
/// <summary>
/// Indicates if all pending Telegram.Bot.Types.Updates should be thrown out before
// start polling. If set to true Telegram.Bot.Polling.ReceiverOptions.AllowedUpdates
// should be set to not null, otherwise Telegram.Bot.Polling.ReceiverOptions.AllowedUpdates
// will effectively be set to receive all Telegram.Bot.Types.Updates.
/// </summary>
public bool ThrowPendingUpdates { get; set; }
public MessageClient(string apiKey) public MessageClient(string apiKey)
{ {
@@ -113,6 +122,8 @@ public class MessageClient
var receiverOptions = new ReceiverOptions(); var receiverOptions = new ReceiverOptions();
receiverOptions.ThrowPendingUpdates = ThrowPendingUpdates;
TelegramClient.StartReceiving(HandleUpdateAsync, HandleErrorAsync, receiverOptions, TelegramClient.StartReceiving(HandleUpdateAsync, HandleErrorAsync, receiverOptions,
_cancellationTokenSource.Token); _cancellationTokenSource.Token);
} }
@@ -128,22 +139,12 @@ public class MessageClient
await OnMessageLoop(new UpdateResult(update, null)); await OnMessageLoop(new UpdateResult(update, null));
} }
public Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, public async Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
if (exception is ApiRequestException exApi) await OnReceiveError(new ErrorResult(exception));
{
Console.WriteLine($"Telegram API Error:\n[{exApi.ErrorCode}]\n{exApi.Message}");
}
else
{
Console.WriteLine(exception.ToString());
}
return Task.CompletedTask;
} }
/// <summary> /// <summary>
/// This will return the current list of bot commands. /// This will return the current list of bot commands.
/// </summary> /// </summary>
@@ -186,7 +187,41 @@ public class MessageClient
public async Task OnMessageLoop(UpdateResult update) public async Task OnMessageLoop(UpdateResult update)
{ {
await (Events[EvOnMessageLoop] as Async.AsyncEventHandler<UpdateResult>)?.Invoke(this, update); var eventHandlers = (Events[EvOnMessageLoop] as Async.AsyncEventHandler<UpdateResult>)?.Invoke(this, update);
if (eventHandlers != null)
{
await eventHandlers;
}
}
public event Async.AsyncEventHandler<ErrorResult> ReceiveError
{
add => Events.AddHandler(EvOnReceiveError, value);
remove => Events.RemoveHandler(EvOnReceiveError, value);
}
public async Task OnReceiveError(ErrorResult update)
{
var eventHandlers = (Events[EvOnReceiveError] as Async.AsyncEventHandler<ErrorResult>)?.Invoke(this, update);
if (eventHandlers != null)
{
await eventHandlers;
return;
}
//Fallback when no event handler is used.
if (update.Exception is ApiRequestException exApi)
{
Console.WriteLine($"Telegram API Error:\n[{exApi.ErrorCode}]\n{exApi.Message}");
}
else
{
Console.WriteLine(update.Exception.ToString());
}
} }
#endregion #endregion
+2 -1
View File
@@ -115,12 +115,13 @@ public sealed class BotBase
if (ds == null) if (ds == null)
{ {
ds = await Sessions.StartSession(e.DeviceId); ds = await Sessions.StartSession(e.DeviceId);
e.Device = ds;
ds.LastMessage = e.RawData.Message; ds.LastMessage = e.RawData.Message;
OnSessionBegins(new SessionBeginEventArgs(e.DeviceId, ds)); OnSessionBegins(new SessionBeginEventArgs(e.DeviceId, ds));
} }
e.Device = ds;
var mr = new MessageResult(e.RawData); var mr = new MessageResult(e.RawData);
var i = 0; var i = 0;
+22 -5
View File
@@ -207,7 +207,7 @@ public class BotBaseBuilder : IAPIKeySelectionStage, IMessageLoopSelectionStage,
#region "Step 4 (Network Settings)" #region "Step 4 (Network Settings)"
public IBotCommandsStage WithProxy(string proxyAddress) public IBotCommandsStage WithProxy(string proxyAddress, bool throwPendingUpdates = false)
{ {
var url = new Uri(proxyAddress); var url = new Uri(proxyAddress);
_client = new MessageClient(_apiKey, url) _client = new MessageClient(_apiKey, url)
@@ -217,11 +217,12 @@ public class BotBaseBuilder : IAPIKeySelectionStage, IMessageLoopSelectionStage,
Timeout = new TimeSpan(0, 1, 0) Timeout = new TimeSpan(0, 1, 0)
}, },
}; };
_client.ThrowPendingUpdates = throwPendingUpdates;
return this; return this;
} }
public IBotCommandsStage NoProxy() public IBotCommandsStage NoProxy(bool throwPendingUpdates = false)
{ {
_client = new MessageClient(_apiKey) _client = new MessageClient(_apiKey)
{ {
@@ -230,11 +231,12 @@ public class BotBaseBuilder : IAPIKeySelectionStage, IMessageLoopSelectionStage,
Timeout = new TimeSpan(0, 1, 0) Timeout = new TimeSpan(0, 1, 0)
} }
}; };
_client.ThrowPendingUpdates = throwPendingUpdates;
return this; return this;
} }
public IBotCommandsStage WithBotClient(TelegramBotClient tgclient) public IBotCommandsStage WithBotClient(TelegramBotClient tgclient, bool throwPendingUpdates = false)
{ {
_client = new MessageClient(_apiKey, tgclient) _client = new MessageClient(_apiKey, tgclient)
{ {
@@ -243,11 +245,12 @@ public class BotBaseBuilder : IAPIKeySelectionStage, IMessageLoopSelectionStage,
Timeout = new TimeSpan(0, 1, 0) Timeout = new TimeSpan(0, 1, 0)
} }
}; };
_client.ThrowPendingUpdates = throwPendingUpdates;
return this; return this;
} }
public IBotCommandsStage WithHostAndPort(string proxyHost, int proxyPort) public IBotCommandsStage WithHostAndPort(string proxyHost, int proxyPort, bool throwPendingUpdates = false)
{ {
_client = new MessageClient(_apiKey, proxyHost, proxyPort) _client = new MessageClient(_apiKey, proxyHost, proxyPort)
{ {
@@ -256,10 +259,11 @@ public class BotBaseBuilder : IAPIKeySelectionStage, IMessageLoopSelectionStage,
Timeout = new TimeSpan(0, 1, 0) Timeout = new TimeSpan(0, 1, 0)
} }
}; };
_client.ThrowPendingUpdates = throwPendingUpdates;
return this; return this;
} }
public IBotCommandsStage WithHttpClient(HttpClient tgclient) public IBotCommandsStage WithHttpClient(HttpClient tgclient, bool throwPendingUpdates = false)
{ {
_client = new MessageClient(_apiKey, tgclient) _client = new MessageClient(_apiKey, tgclient)
{ {
@@ -268,6 +272,7 @@ public class BotBaseBuilder : IAPIKeySelectionStage, IMessageLoopSelectionStage,
Timeout = new TimeSpan(0, 1, 0) Timeout = new TimeSpan(0, 1, 0)
} }
}; };
_client.ThrowPendingUpdates = throwPendingUpdates;
return this; return this;
} }
@@ -386,29 +391,41 @@ public class BotBaseBuilder : IAPIKeySelectionStage, IMessageLoopSelectionStage,
#region "Step 7 (Language)" #region "Step 7 (Language)"
/// <inheritdoc cref="ILanguageSelectionStage.DefaultLanguage"/>
public IBuildingStage DefaultLanguage() public IBuildingStage DefaultLanguage()
{ {
return this; return this;
} }
/// <inheritdoc cref="ILanguageSelectionStage.UseEnglish"/>
public IBuildingStage UseEnglish() public IBuildingStage UseEnglish()
{ {
Default.Language = new English(); Default.Language = new English();
return this; return this;
} }
/// <inheritdoc cref="ILanguageSelectionStage.UseGerman"/>
public IBuildingStage UseGerman() public IBuildingStage UseGerman()
{ {
Default.Language = new German(); Default.Language = new German();
return this; return this;
} }
/// <inheritdoc cref="ILanguageSelectionStage.UsePersian"/>
public IBuildingStage UsePersian() public IBuildingStage UsePersian()
{ {
Default.Language = new Persian(); Default.Language = new Persian();
return this; return this;
} }
/// <inheritdoc cref="ILanguageSelectionStage.UseRussian"/>
public IBuildingStage UseRussian()
{
Default.Language = new Russian();
return this;
}
/// <inheritdoc cref="ILanguageSelectionStage.Custom"/>
public IBuildingStage Custom(Localization language) public IBuildingStage Custom(Localization language)
{ {
Default.Language = language; Default.Language = language;
@@ -2,35 +2,44 @@
namespace TelegramBotBase.Builder.Interfaces; namespace TelegramBotBase.Builder.Interfaces;
/// <summary>
/// Represents the language selection stage in the localization process.
/// </summary>
public interface ILanguageSelectionStage public interface ILanguageSelectionStage
{ {
/// <summary> /// <summary>
/// Selects the default language for control usage. (English) /// Selects the default language for control usage. (English)
/// </summary> /// </summary>
/// <returns></returns> /// <returns>The next stage in the building process.</returns>
IBuildingStage DefaultLanguage(); IBuildingStage DefaultLanguage();
/// <summary> /// <summary>
/// Selects english as the default language for control labels. /// Selects english as the default language for control labels.
/// </summary> /// </summary>
/// <returns></returns> /// <returns>The next stage in the building process.</returns>
IBuildingStage UseEnglish(); IBuildingStage UseEnglish();
/// <summary> /// <summary>
/// Selects german as the default language for control labels. /// Selects german as the default language for control labels.
/// </summary> /// </summary>
/// <returns></returns> /// <returns>The next stage in the building process.</returns>
IBuildingStage UseGerman(); IBuildingStage UseGerman();
/// <summary> /// <summary>
/// Selects persian as the default language for control labels. /// Selects persian as the default language for control labels.
/// </summary> /// </summary>
/// <returns></returns> /// <returns>The next stage in the building process.</returns>
IBuildingStage UsePersian(); IBuildingStage UsePersian();
/// <summary>
/// Selects russian as the default language for control labels.
/// </summary>
/// <returns>The next stage in the building process.</returns>
IBuildingStage UseRussian();
/// <summary> /// <summary>
/// Selects a custom language as the default language for control labels. /// Selects a custom language as the default language for control labels.
/// </summary> /// </summary>
/// <returns></returns> /// <returns>The next stage in the building process.</returns>
IBuildingStage Custom(Localization language); IBuildingStage Custom(Localization language);
} }
@@ -9,22 +9,25 @@ public interface INetworkingSelectionStage
/// Chooses a proxy as network configuration. /// Chooses a proxy as network configuration.
/// </summary> /// </summary>
/// <param name="proxyAddress"></param> /// <param name="proxyAddress"></param>
/// <param name="throwPendingUpdates">Indicates if all pending Telegram.Bot.Types.Updates should be thrown out before start polling.</param>
/// <returns></returns> /// <returns></returns>
IBotCommandsStage WithProxy(string proxyAddress); IBotCommandsStage WithProxy(string proxyAddress, bool throwPendingUpdates = false);
/// <summary> /// <summary>
/// Do not choose a proxy as network configuration. /// Do not choose a proxy as network configuration.
/// </summary> /// </summary>
/// <param name="throwPendingUpdates">Indicates if all pending Telegram.Bot.Types.Updates should be thrown out before start polling.</param>
/// <returns></returns> /// <returns></returns>
IBotCommandsStage NoProxy(); IBotCommandsStage NoProxy(bool throwPendingUpdates = false);
/// <summary> /// <summary>
/// Chooses a custom instance of TelegramBotClient. /// Chooses a custom instance of TelegramBotClient.
/// </summary> /// </summary>
/// <param name="client"></param> /// <param name="client"></param>
/// <param name="throwPendingUpdates">Indicates if all pending Telegram.Bot.Types.Updates should be thrown out before start polling.</param>
/// <returns></returns> /// <returns></returns>
IBotCommandsStage WithBotClient(TelegramBotClient client); IBotCommandsStage WithBotClient(TelegramBotClient client, bool throwPendingUpdates = false);
/// <summary> /// <summary>
@@ -32,13 +35,15 @@ public interface INetworkingSelectionStage
/// </summary> /// </summary>
/// <param name="proxyHost"></param> /// <param name="proxyHost"></param>
/// <param name="Port"></param> /// <param name="Port"></param>
/// <param name="throwPendingUpdates">Indicates if all pending Telegram.Bot.Types.Updates should be thrown out before start polling.</param>
/// <returns></returns> /// <returns></returns>
IBotCommandsStage WithHostAndPort(string proxyHost, int Port); IBotCommandsStage WithHostAndPort(string proxyHost, int Port, bool throwPendingUpdates = false);
/// <summary> /// <summary>
/// Uses a custom http client. /// Uses a custom http client.
/// </summary> /// </summary>
/// <param name="client"></param> /// <param name="client"></param>
/// <param name="throwPendingUpdates">Indicates if all pending Telegram.Bot.Types.Updates should be thrown out before start polling.</param>
/// <returns></returns> /// <returns></returns>
IBotCommandsStage WithHttpClient(HttpClient client); IBotCommandsStage WithHttpClient(HttpClient client, bool throwPendingUpdates = false);
} }
+36
View File
@@ -0,0 +1,36 @@
namespace TelegramBotBase.Localizations;
public sealed class Russian : Localization
{
public Russian()
{
Values["Language"] = "Русский (Russian)";
Values["ButtonGrid_Title"] = "Меню";
Values["ButtonGrid_NoItems"] = "Нет доступных элементов.";
Values["ButtonGrid_PreviousPage"] = "◀️";
Values["ButtonGrid_NextPage"] = "▶️";
Values["ButtonGrid_CurrentPage"] = "Страница {0} из {1}";
Values["ButtonGrid_SearchFeature"] = "💡 Отправьте сообщение, чтобы отфильтровать список. Нажмите на 🔍, чтобы сбросить фильтр.";
Values["ButtonGrid_Back"] = "Назада";
Values["ButtonGrid_CheckAll"] = "Выделить все";
Values["ButtonGrid_UncheckAll"] = "Отменить выбор";
Values["CalendarPicker_Title"] = "Календарь / Выберите дату";
Values["CalendarPicker_PreviousPage"] = "◀️";
Values["CalendarPicker_NextPage"] = "▶️";
Values["TreeView_Title"] = "Выберите пункт";
Values["TreeView_LevelUp"] = "🔼 Обратно";
Values["ToggleButton_On"] = "Вкл";
Values["ToggleButton_Off"] = "Выкл";
Values["ToggleButton_OnIcon"] = "⚫";
Values["ToggleButton_OffIcon"] = "⚪";
Values["ToggleButton_Title"] = "Переключить";
Values["ToggleButton_Changed"] = "Выбрано";
Values["MultiToggleButton_SelectedIcon"] = "✅";
Values["MultiToggleButton_Title"] = "Множественный выбор";
Values["MultiToggleButton_Changed"] = "Выбрано";
Values["PromptDialog_Back"] = "Назад";
Values["ToggleButton_Changed"] = "Настройки изменены";
Values["ButtonGrid_SearchIcon"] = "🔍";
Values["ButtonGrid_TagIcon"] = "📁";
}
}
-2
View File
@@ -14,12 +14,10 @@
<dependencies> <dependencies>
<group targetFramework=".NETFramework4.6.1"> <group targetFramework=".NETFramework4.6.1">
<dependency id="Newtonsoft.Json" version="13.0.1" exclude="Build,Analyzers" /> <dependency id="Newtonsoft.Json" version="13.0.1" exclude="Build,Analyzers" />
<dependency id="System.Drawing.Common" version="4.6.0" exclude="Build,Analyzers" />
<dependency id="Telegram.Bot" version="19.0.0" exclude="Build,Analyzers" /> <dependency id="Telegram.Bot" version="19.0.0" exclude="Build,Analyzers" />
</group> </group>
<group targetFramework=".NETStandard2.0"> <group targetFramework=".NETStandard2.0">
<dependency id="Newtonsoft.Json" version="13.0.1" exclude="Build,Analyzers" /> <dependency id="Newtonsoft.Json" version="13.0.1" exclude="Build,Analyzers" />
<dependency id="System.Drawing.Common" version="4.6.0" exclude="Build,Analyzers" />
<dependency id="Telegram.Bot" version="19.0.0" exclude="Build,Analyzers" /> <dependency id="Telegram.Bot" version="19.0.0" exclude="Build,Analyzers" />
</group> </group>
</dependencies> </dependencies>