<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: BotticelliBots</title>
    <description>The latest articles on DEV Community by BotticelliBots (@botticellibots).</description>
    <link>https://dev.to/botticellibots</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1230138%2Fb6402761-5e3d-4dd9-a73d-ccb5e2e9d9ee.png</url>
      <title>DEV Community: BotticelliBots</title>
      <link>https://dev.to/botticellibots</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/botticellibots"/>
    <language>en</language>
    <item>
      <title>Forward to BotticelliBots v.0.9</title>
      <dc:creator>BotticelliBots</dc:creator>
      <pubDate>Sun, 30 Nov 2025 09:52:19 +0000</pubDate>
      <link>https://dev.to/botticellibots/forward-to-botticellibots-v09-1c7f</link>
      <guid>https://dev.to/botticellibots/forward-to-botticellibots-v09-1c7f</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4t7u53r2eec0pl7vtrg5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4t7u53r2eec0pl7vtrg5.png" alt=" " width="250" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Several new main issues, currently we're working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easiness of deployment — Docker: provide Dockerfiles, docker-compose examples, and documented deployment steps; aim for one-command startup.&lt;/li&gt;
&lt;li&gt;Output BotId while starting a bot — log/display the BotId at startup for tracking and debugging.&lt;/li&gt;
&lt;li&gt;Botticelli.Framework unit tests — create and run unit tests for the Botticelli.Framework components. Target coverage — minimum 30% unit test coverage for Botticelli.Framework.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Join us on GitHub: &lt;a href="https://github.com/devgopher/botticelli" rel="noopener noreferrer"&gt;https://github.com/devgopher/botticelli&lt;/a&gt;&lt;/p&gt;

</description>
      <category>telegram</category>
      <category>chatbots</category>
      <category>ai</category>
      <category>messengers</category>
    </item>
    <item>
      <title>BotticelliBundle: Simplified Deployment of Chatbots using Docker</title>
      <dc:creator>BotticelliBots</dc:creator>
      <pubDate>Sat, 25 Oct 2025 21:11:00 +0000</pubDate>
      <link>https://dev.to/botticellibots/botticellibundle-simplified-deployment-of-chatbots-using-docker-4i4o</link>
      <guid>https://dev.to/botticellibots/botticellibundle-simplified-deployment-of-chatbots-using-docker-4i4o</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxl1ns2zeifi69hz5qt9f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxl1ns2zeifi69hz5qt9f.png" alt=" " width="763" height="766"&gt;&lt;/a&gt;&lt;br&gt;
First of all, you should be aware about a Botticellibots project:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/botticellibots/creating-a-telegram-bot-with-botticellibots-a-quick-guide-28j1"&gt;Creating a simple Telegram bot using BotticelliBots: a quick guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/devgopher/botticelli" rel="noopener noreferrer"&gt;BotticelliBots on Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/devgopher/botticelli/releases/tag/0.8.1" rel="noopener noreferrer"&gt;BotticelliBots v.0.8.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BotticelliBundle&lt;/strong&gt; is a Docker image specifically designed to streamline the deployment of a basic Botticelli bot. It offers a quick way to set up and customize your own bot configuration by leveraging the Botticelli framework. The use of Docker enables users to easily run and test their bots in a containerized environment, enhancing development efficiency.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Docker Integration&lt;/strong&gt;: BotticelliBundle simplifies the process of deploying chatbots by encapsulating all dependencies and configurations within a Docker container.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sample Configuration&lt;/strong&gt;: The repository includes a sample bot configuration to guide users in setting up their personalized bots.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ease of Testing&lt;/strong&gt;: Running the bot in a Docker container allows for isolated testing, reducing compatibility issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Deploy Your Bot
&lt;/h2&gt;

&lt;p&gt;To deploy your bot using BotticelliBundle, follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clone the Repository&lt;/strong&gt;: First, clone the BotticelliBundle repository to your local machine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Modify the Dockerfile and appsettings.json&lt;/strong&gt;: Adjust the Dockerfile and configuration settings.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here’s an example Dockerfile setup:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
dockerfile
   # Use .NET SDK 8 image for building
   FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build

   # Set the working directory
   WORKDIR /app

   # Clone the Botticelli repository and switch to the specified branch
   RUN git clone --single-branch --branch release/0.8 https://github.com/devgopher/botticelli.git .
   RUN git clone &amp;lt;your git repo&amp;gt; ./bot

   # Change to project directory
   WORKDIR /app/bot

   # Restore dependencies
   RUN dotnet restore

   # Build the project
   RUN dotnet build -c Release -o out

   # Use the ASP.NET Runtime image for running
   FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine
   WORKDIR /app
   COPY --from=build /app/bot/out .

   # Copy custom configuration file
   COPY appsettings.json .

   # Set the entry point for the application
   ENTRYPOINT ["dotnet", "&amp;lt;YourBot&amp;gt;.dll"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>botticellibots</category>
      <category>telegram</category>
      <category>ai</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Creating a Telegram Bot with BotticelliBots: A Quick Guide</title>
      <dc:creator>BotticelliBots</dc:creator>
      <pubDate>Tue, 08 Apr 2025 17:24:19 +0000</pubDate>
      <link>https://dev.to/botticellibots/creating-a-telegram-bot-with-botticellibots-a-quick-guide-28j1</link>
      <guid>https://dev.to/botticellibots/creating-a-telegram-bot-with-botticellibots-a-quick-guide-28j1</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4r2bvbkoors8czz069u2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4r2bvbkoors8czz069u2.webp" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BotticelliBots is an open-source .NET Core framework that streamlines the development of chatbots. In this guide, we’ll walk through creating a simple Telegram bot that displays the current UTC time, leveraging the framework's capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ensure you have .NET Core 8.0 or higher and either Visual Studio 2022 or Rider 2023.x. Download BotticelliBots v. 0.3 as a submodule in your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Register Your Bot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use the Telegram BotFather to create a new bot and obtain your bot token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Create a Web API Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Visual Studio, create a new .NET Core Web API project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Configure Your Bot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Program.cs, add the necessary services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddTelegramBot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BotOptionsBuilder&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TelegramBotSettings&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;BotName&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddHostedService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;VeryBasicBotService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddBotCommand&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GetUtcCommand&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GetUtcCommandProcessor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ReplyKeyboardMarkup&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;PassValidator&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GetUtcCommand&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Implement Command Processor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a command processor to handle the /GetUtc command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GetUtcCommandProcessor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TReplyMarkupBase&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CommandProcessor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GetUtcCommand&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;InnerProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;utcMessageRequest&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SendMessageRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewGuid&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Body&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"Current UTC Time is: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UtcNow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CultureInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InvariantCulture&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SendMessageAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;utcMessageRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5: Run Your Bot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Deploy your bot and ensure it’s operational. You can manage it through the admin pane, where you can register and configure your bot.&lt;/p&gt;

&lt;p&gt;About admin pane and it's setup you can read &lt;a href="https://dev.to/botticellibots/making-a-telegram-bot-with-botticellibots-2jmi"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample Bots&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For more examples and inspiration, check out the Telegram AI Sample on GitHub.&lt;/p&gt;

&lt;p&gt;For further details, visit BotticelliBots or join the community on Telegram for support and updates!&lt;br&gt;
Step 5: Run Your Bot&lt;/p&gt;

&lt;p&gt;Deploy your bot and ensure it’s operational. You can manage it through the admin pane, where you can register and configure your bot.&lt;br&gt;
Sample Bots&lt;/p&gt;

&lt;p&gt;For more examples and inspiration, check out the Telegram AI Sample on GitHub.&lt;/p&gt;

&lt;p&gt;For further details, visit BotticelliBots or join the community on Telegram for support and updates!&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>telegram</category>
      <category>dotnet</category>
      <category>chatbot</category>
    </item>
    <item>
      <title>Making a Telegram bot with BotticelliBots</title>
      <dc:creator>BotticelliBots</dc:creator>
      <pubDate>Wed, 10 Apr 2024 12:00:35 +0000</pubDate>
      <link>https://dev.to/botticellibots/making-a-telegram-bot-with-botticellibots-2jmi</link>
      <guid>https://dev.to/botticellibots/making-a-telegram-bot-with-botticellibots-2jmi</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fddj3d4ygi8tfk96b3m6w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fddj3d4ygi8tfk96b3m6w.jpg" alt=" " width="624" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's imagine, that we need to create a .NET core - based chatbot, that shows us current time in UTC.&lt;/p&gt;

&lt;p&gt;So, we need .NET Core 8.0 and very basic knowledge of C#.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before you start&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Please, check your .NET Core and Visual Studio version. You should have .NET Core 8 or higher and VS 2022 or Rider v. 2023.x (any edition). If no - check  &lt;a href="https://visualstudio.microsoft.com/ru/vs/" rel="noopener noreferrer"&gt;this&lt;/a&gt; and &lt;a href="https://dotnet.microsoft.com/en-us/download/dotnet/8.0" rel="noopener noreferrer"&gt;this&lt;/a&gt;. As a framework and chatbot-management system, we'll use &lt;a href="https://botticellibots.com" rel="noopener noreferrer"&gt;BotticelliBots&lt;/a&gt; v. 0.3: &lt;a href="https://github.com/devgopher/botticelli/releases/tag/v0.3" rel="noopener noreferrer"&gt;see here&lt;/a&gt;. You may load it as a submodule with your git repository. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://botticellibots.com/documentation" rel="noopener noreferrer"&gt;Botticelli common documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://botticellibots.com/documentation/management/registering-a-new-bot" rel="noopener noreferrer"&gt;Bot adding/registration in admin pane&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/devgopher/botticelli/tree/release/0.3/deploy" rel="noopener noreferrer"&gt;Admin pane deployment scripts for Linux and Windows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What do we want&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We need to create a chat bot, that will show you a UTC time on command&lt;/p&gt;

&lt;p&gt;And also we need to administrate this bot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's register our Telegram bot&lt;/strong&gt;&lt;br&gt;
Please, check a Telegram &lt;a href="https://t.me/BotFather" rel="noopener noreferrer"&gt;BotFather bot&lt;/a&gt; and follow the instructions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some basics for BotticelliBots&lt;/strong&gt;&lt;br&gt;
Botticelli is an open-source .NET Core framework for building your own universal bots integrated with databases, queue brokers, speech engines and AI engines (such as ChatGPT, DeepSeek and YaGPT). &lt;/p&gt;

&lt;p&gt;In our case, we need several entities to use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Commands - represents a messenger command (such as /test)&lt;/li&gt;
&lt;li&gt;Command Processors. Each command needs it's own processor to encapsulate any business logic&lt;/li&gt;
&lt;li&gt;IBot - interface, that represents main bot functions (such as sending message to a chat)&lt;/li&gt;
&lt;li&gt;Message - general message representation, that consists of ChatId, Id and contents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Let's start&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's open our Visual Studio/Rider and create a WebApi project for .Net Core.&lt;/p&gt;

&lt;p&gt;First of all, we need  to make some injections in Program.cs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetSection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nameof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VeryBasicBotSettings&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;VeryBasicBotSettings&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Adds telegram bot injections&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddTelegramBot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BotOptionsBuilder&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TelegramBotSettings&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SecureStorageSettings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SecureStorageSettings&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;ConnectionString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;SecureStorageConnectionString&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;BotName&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Adds a hosted service, intended for keeping bot working during all&lt;/span&gt;
&lt;span class="c1"&gt;// the lifecycle of a bot&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddHostedService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;VeryBasicBotService&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// Adds a command processor, being used for proceeding a business logic for&lt;/span&gt;
&lt;span class="c1"&gt;// '/GetUtc' command and also adds some validation (in this case - pass validator, that tells OK to any command args)&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddBotCommand&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GetUtcCommand&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GetUtcCommandProcessor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ReplyKeyboardMarkup&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;PassValidator&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GetUtcCommand&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;();&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegisterBotCommand&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GetUtcCommand&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GetUtcCommandProcessor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ReplyKeyboardMarkup&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;TelegramBot&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Command Processors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each command needs to be processed in it's own processor. Please note, that we should follow a calling convention for a processor and a command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;*&lt;/span&gt;&lt;span class="nc"&gt;YourCommandName&lt;/span&gt;&lt;span class="p"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;CommandProcessor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TReplyMarkupBase&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CommandProcessor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;*&lt;/span&gt;&lt;span class="n"&gt;YourCommandName&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="err"&gt;*&lt;/span&gt;&lt;span class="nc"&gt;YourCommandName&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ICommand&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, our command processor should be look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// A processor for "/GetUtc" command &lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;typeparam name="TReplyMarkupBase"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GetUtcCommandProcessor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TReplyMarkupBase&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CommandProcessor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GetUtcCommand&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
    &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;TReplyMarkupBase&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;
&lt;span class="err"&gt;{&lt;/span&gt;   
    &lt;span class="nc"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;GetUtcCommandProcessor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ILogger&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GetUtcCommandProcessor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TReplyMarkupBase&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;ICommandValidator&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GetUtcCommand&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;MetricsProcessor&lt;/span&gt; &lt;span class="n"&gt;metricsProcessor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metricsProcessor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;InnerProcessContact&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;argsString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;InnerProcessPoll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;argsString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;InnerProcessLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;argsString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// All business logic is being called here...&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;param name="message"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;param name="args"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="c1"&gt;/// &amp;lt;param name="token"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;InnerProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Creates a message for sending&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;utcMessageRequest&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SendMessageRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewGuid&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Uid&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewGuid&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="n"&gt;ChatIds&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChatIds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;Body&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"Current UTC Time is: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UtcNow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CultureInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;InvariantCulture&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="c1"&gt;// Tries to send a message using a concrete implementation of Bot (TelegramBot, for example)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SendMessageAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;utcMessageRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;optionsBuilder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ISendOptionsBuilder&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TReplyMarkupBase&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;)&lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;!,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Hosted service&lt;/strong&gt;&lt;br&gt;
Also, we should run a hosted service in order to keep our bot onair:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;VeryBasicBot.Telegram&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;///     This hosted service intended keeping an application alive till the termination&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;VeryBasicBotService&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IHostedService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IOptionsMonitor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;VeryBasicBotSettings&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_settings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IBot&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TelegramBot&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_telegramBot&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;VeryBasicBotService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IBot&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TelegramBot&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;telegramBot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IOptionsMonitor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;VeryBasicBotSettings&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_telegramBot&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;telegramBot&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;_settings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;StartAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Start serving..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;StopAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Stop serving..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you can download a whole code here: &lt;a href="https://github.com/devgopher/very_basic_bot" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First run&lt;/strong&gt;&lt;br&gt;
So, we need to run our bot now. We need to get a freshly-generated a bot Id:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgwyv6bpq6xpoxsm9kqmh.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgwyv6bpq6xpoxsm9kqmh.PNG" alt=" " width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploying an admin-side&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/devgopher/botticelli/tree/release/0.3/deploy/linux" rel="noopener noreferrer"&gt;Admin pane deployment scripts for Linux&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First of all, you need to choose where to deploy and admin pane.&lt;br&gt;
We've 2 parts of admin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend&lt;/li&gt;
&lt;li&gt;Frontend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After deploying using proposed scripts, we need to register. So, after setting up frontend and backend, you should go to: https://: and press &lt;strong&gt;Registration&lt;/strong&gt; button. On a registration form, please, put in your email and press &lt;strong&gt;Register&lt;/strong&gt;. If your backend email server settings are correct, you'll receive a registration letter with username and password.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;NOTE&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
If you experiencing some problems with untrusted certificate for backend, you may go to https://: in your browser and allow using untrusted certificate. &lt;/p&gt;

&lt;p&gt;So, after registration, you may refresh a page and log in. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adding a bot to admin pane&lt;/strong&gt;&lt;br&gt;
After registering and logging in, we need to add own freshly developed bot onto a "Your bots" pane and activate it as it's shown on pictures:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to 'Your bots' pane: &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuvfl6juczo3ytpbbv6je.PNG" alt=" " width="800" height="384"&gt;
&lt;/li&gt;
&lt;li&gt;Fill parameters and a description: &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdisq6mavwxw7qsk4xoil.PNG" alt=" " width="800" height="274"&gt;
&lt;/li&gt;
&lt;li&gt;Press 'Unlock' button: 
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxqezkilg6i91gradlhq2.PNG" alt=" " width="800" height="284"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;** Some additional settings **&lt;br&gt;
In a bot solution, please, find &lt;code&gt;appsettings.json&lt;/code&gt; and make some changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Logging"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"LogLevel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Information"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Microsoft.AspNetCore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Warning"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"VeryBasicBotSettings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SecureStorageConnectionString"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Filename=database.db;Password=123;ReadOnly=false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"BotName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TimeTellingBot"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ServerSettings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ServerUri"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://&amp;lt;backend_url&amp;gt;:&amp;lt;backend_http_port&amp;gt;/v1/"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"AnalyticsSettings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"TargetUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://&amp;lt;analytics_url&amp;gt;:&amp;lt;analytics_http_port&amp;gt;/v1/"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"AllowedHosts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since, we didn't deploy analytics component, we may set some mocking &lt;strong&gt;TargetUrl&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's check the result&lt;/strong&gt;&lt;br&gt;
Now, all we need is to run a VeryBasicBot.Telegram project.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/StDd0uqzzCo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;sources: &lt;a href="https://github.com/devgopher/very_basic_bot" rel="noopener noreferrer"&gt;github&lt;/a&gt;&lt;br&gt;
based on BotticelliBots: &lt;a href="https://botticellibots.com" rel="noopener noreferrer"&gt;https://botticellibots.com&lt;/a&gt;&lt;br&gt;
email: &lt;a href="mailto:botticellibots@gmail.com"&gt;botticellibots@gmail.com&lt;/a&gt;&lt;br&gt;
telegram group: &lt;a href="https://t.me/botticelli_bots" rel="noopener noreferrer"&gt;https://t.me/botticelli_bots&lt;/a&gt;&lt;br&gt;
Air quality telegram bot, based on BotticelliBots: &lt;a href="https://t.me/air_quality_info_bot" rel="noopener noreferrer"&gt;https://t.me/air_quality_info_bot&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bot</category>
      <category>telegram</category>
      <category>botticellibots</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Botticelli framework: a chat bot development platform for .NET</title>
      <dc:creator>BotticelliBots</dc:creator>
      <pubDate>Sun, 10 Dec 2023 12:06:31 +0000</pubDate>
      <link>https://dev.to/botticellibots/botticelli-framework-a-chat-bot-development-platform-for-net-j0o</link>
      <guid>https://dev.to/botticellibots/botticelli-framework-a-chat-bot-development-platform-for-net-j0o</guid>
      <description>&lt;p&gt;Chatbots are becoming increasingly popular due to their ability to provide instant and efficient interaction with users, automate customer service processes, and deliver personalized content. The progress of artificial intelligence and machine learning has become the reason for more functional and smarter bots. Bots find their application in the fields of messengers, commerce, education, and healthcare providing users with convenience and service accessibility. The ability of chatbots to promptly respond to queries, provide information, and even perform specific tasks makes them not only a modern trend but also a crucial element in the business’s customer interaction strategy.&lt;/p&gt;

&lt;p&gt;Bot builders provide convenient tools for creating chatbots without the need for deep programming knowledge. However, their functionality is often limited by templates and restricted options. Manual bot coding becomes necessary when developing more complex and individualized solutions. This allows for complete customization of the bot’s behavior, integration of specific functions, and the provision of a unique interaction experience. Such an approach requires deeper technical skills but ensures a more flexible and personalized result, which is particularly important in fields where a high degree of customization is required.&lt;/p&gt;

&lt;p&gt;It is essential to carefully consider the ability to work with different messengers developing bots. The diversity in the messenger world is vast, ranging from WhatsApp, Telegram, and Facebook Messenger to VK, Signal, and WeChat. Despite the popularity of Telegram, in some countries, it may be blocked. This forces adaptation to local messengers, such as WeChat in China. This geographic variability emphasizes the importance of supporting various platforms.&lt;/p&gt;

&lt;p&gt;We have developed the Botticelli framework, which can simplify the process of creating bots by ensuring compatibility with a wide range of messengers. Botticelli is an open-source .NET Core framework for building universal bots with integration for databases, message brokers, speech engines, and artificial intelligence (such as GPT-j and ChatGPT).&lt;/p&gt;

&lt;p&gt;Our goal is to standardize the bot creation process for various platforms. BotticelliBots ensures compatibility with diverse messengers, social networks, and other communication channels. Using this platform, developers can create and manage bots in a unified interface, significantly simplifying the development and maintenance processes. BotticelliBots aims to provide a unified and user-friendly bot management process, contributing to increased efficiency and reduced complexity in deploying chatbots across different environments and platforms.&lt;/p&gt;

&lt;p&gt;The key advantages of BotticelliBots include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    сross-platform support;&lt;/li&gt;
&lt;li&gt;    high reliability;&lt;/li&gt;
&lt;li&gt;    ease of usage (a guide to a quick start);&lt;/li&gt;
&lt;li&gt;    ease of deployment;&lt;/li&gt;
&lt;li&gt;    convenient database integration;&lt;/li&gt;
&lt;li&gt;    ease of implementing artificial intelligence ChatGPT, GPT-j (Botticelli.AI);&lt;/li&gt;
&lt;li&gt;    ease of interaction with speech synthesizers (Botticelli.Talks);&lt;/li&gt;
&lt;li&gt;    convenient integration with message brokers for highly loaded systems (Botticelli.Bus);&lt;/li&gt;
&lt;li&gt;    task planning convenience (Botticelli.Scheduler)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BotticelliBots is a highly flexible platform that not only enables the creation and management of bots, but also integration with advanced technologies such as GPT-j and ChatGPT. This unique capability allows the use of powerful text generation models for more intelligent and diverse bot responses. Additionally, BotticelliBots supports integration with speech synthesizers, expanding the spectrum of interaction with the bot by adding audio capabilities. This enables the creation of more natural and engaging chatbots capable of processing text queries and also providing information in audio format, enhancing the quality of their communication.&lt;/p&gt;

&lt;p&gt;For interaction with external APIs, you can use the bus (Botticelli.Bus), and there is integration with RabbitMQ. You can see the interaction scheme here.&lt;/p&gt;

&lt;p&gt;We are currently actively working on expanding functionality. One of the key directions of development is increasing the number of supported messengers. The integration with platforms such as Facebook and WeChat is planned in the near future.&lt;/p&gt;

&lt;p&gt;In addition, we are also focused on expanding integration capabilities with cutting-edge artificial intelligence solutions, such as ChatGPT and GPT-j. This opens up new horizons for creating more intelligent, adaptive, and contextually oriented chatbots. Developing synergy with such solutions will enhance the quality of user interaction with bots and allow to provide more personalized content.&lt;/p&gt;

&lt;p&gt;The BotticelliBots team follows a strategy of continuous development and innovation to create more intelligent and flexible solutions that meet the needs in the field of chatbots.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="http://botticellibots.com/" rel="noopener noreferrer"&gt;http://botticellibots.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Telegram Channel: &lt;a href="https://t.me/botticelli_bots" rel="noopener noreferrer"&gt;https://t.me/botticelli_bots&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Email: &lt;a href="mailto:botticellibots@gmail.com"&gt;botticellibots@gmail.com&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
