Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature: follow your dreams #14

Merged
merged 66 commits into from
Aug 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
e1a9879
feat: update sdk to version 8
elementh Jul 26, 2024
80865ae
feat: add nuget.config
elementh Jul 26, 2024
b9a893d
feat: update projects and packages
elementh Jul 26, 2024
f2b6db6
feat: solve initial problems after update
elementh Jul 26, 2024
40acc3e
feat: define first iteration of the new action type
elementh Jul 26, 2024
4636bf8
feat: starting deleting some old code
elementh Jul 29, 2024
b1d0658
feat: define basic INavigatorBotBuilder
elementh Jul 29, 2024
55e54f0
feat: start implementing basic NavigatorBotBuilder
elementh Jul 29, 2024
41a1169
feat: add StrategyBuilder
elementh Jul 30, 2024
f2e6126
refactor: correct namespace
elementh Jul 31, 2024
7fdde3a
feat: make botName optional using default value
elementh Jul 31, 2024
0693ec6
refactor: use the correct type
elementh Jul 31, 2024
7103638
feat: experiment with delegate execution
elementh Jul 31, 2024
2508b56
feat: implement basic BotActionBuilder
elementh Jul 31, 2024
0335bba
feat: add more methods to IBotActionCatalogBuilder
elementh Jul 31, 2024
fe8ec67
refactor: simplify IBotActionCatalogBuilder
elementh Jul 31, 2024
9ecece0
feat: update BotActionBuilder with public property BotAction
elementh Jul 31, 2024
efad91a
feat: add BotAction related properties to IBotActionCatalogBuilder as…
elementh Jul 31, 2024
894aea7
refactor: make BotAction related properties public, following interfa…
elementh Jul 31, 2024
a06a0d7
feat: add storage of action type per action
elementh Jul 31, 2024
1a34110
refactor: add options to builder and simplify.
elementh Jul 31, 2024
a6d632f
feat: update IBotActionCatalogBuilder & IBotActionCatalogBuilderExten…
elementh Aug 9, 2024
3a6625f
feat: create IBotActionBuilder
elementh Aug 9, 2024
357cb98
feat: implement BotActionBuilder & update BotAction
elementh Aug 9, 2024
e867582
feat: implement BotActionCatalogBuilder
elementh Aug 9, 2024
4c30096
feat: implement BotActionCatalog
elementh Aug 9, 2024
6bc5732
refactor: update using references
elementh Aug 9, 2024
fe7a875
refactor: rename BotActionCatalogBuilder to BotActionCatalogFactory
elementh Aug 9, 2024
b417ebb
feat: implement NavigatorStrategy
elementh Aug 9, 2024
a02c0f7
feat: get ride of old stuff, bring some new stuff
elementh Aug 19, 2024
47e7cc0
chore: correct property name
elementh Aug 19, 2024
57d6122
feat: update NavigatorStrategy with new arguments
elementh Aug 19, 2024
d52687e
feat: improve BotAction and BotActionBuilder
elementh Aug 19, 2024
df89620
feat: update NavigatorStrategy
elementh Aug 19, 2024
6111840
feat: add implicit conversion between Chat and ChatId
elementh Aug 19, 2024
dea9054
feat: corrections here and there
elementh Aug 19, 2024
7530137
feat: update sample
elementh Aug 19, 2024
5d05150
feat: refactor and improve action types to update categories
elementh Aug 19, 2024
cefca79
refactor: use IAsyncEnumerable for FilterActionsThatCanHandleUpdate
elementh Aug 19, 2024
2a6cdc1
feat: make it work
elementh Aug 20, 2024
f75d22e
feat: update sample
elementh Aug 20, 2024
0d2be1f
feat: move UpdateClassifier to its own file
elementh Aug 20, 2024
3c7d219
chore: adjust namespaces in Navigator project
elementh Aug 20, 2024
29fbfc9
refactor: simplify class vs interface on some cases
elementh Aug 20, 2024
3613ff5
feat: add extensions for all types of messages and updates
elementh Aug 20, 2024
52080c9
feat: add support for typing notification, again
elementh Aug 20, 2024
e8674e0
chore: add some documentation
elementh Aug 20, 2024
be510ac
feat: correct behavior with NavigatorOptions
elementh Aug 20, 2024
5958ea5
refactor: convert Program to top level code
elementh Aug 20, 2024
227e857
feat: refactor argument injection to use IArgumentTypeProvider
elementh Aug 21, 2024
0752e25
feat: add implementation of IArgumentTypeProvider for Navigator entities
elementh Aug 21, 2024
d4934d9
feat: add implementation of IArgumentTypeProvider for Telegram entities
elementh Aug 21, 2024
0d35406
feat: add implementation of IArgumentTypeProvider for all possible Up…
elementh Aug 21, 2024
3e887d6
feat: update sample to showcase argument injection
elementh Aug 21, 2024
f5baaa0
feat: add implementation of IArgumentTypeProvider for all possible Me…
elementh Aug 21, 2024
63d2df0
feat: update sample again
elementh Aug 21, 2024
f868fcb
feat: update service collection & correct NavigatorStrategy
elementh Aug 21, 2024
7226650
refactor: simplify implementations of IArgumentTypeProvider when poss…
elementh Aug 21, 2024
da26ec8
feat: upgrade NavigatorStrategy to respect cooldowns
elementh Aug 21, 2024
e7cc95c
feat: delete store extension
elementh Aug 21, 2024
36ac26b
feat: add some logs to NavigatorStrategy
elementh Aug 21, 2024
832f53d
feat: delete unnecessary dependencies
elementh Aug 21, 2024
f948fac
chore: update sample and README.md
elementh Aug 21, 2024
04f8ff1
docs: improve all documentation of public members
elementh Aug 21, 2024
a9a6874
chore: clean sample
elementh Aug 21, 2024
50f697b
feat: update the LICENSE
elementh Aug 21, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 81 additions & 68 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007

Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

Preamble

The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The GNU General Public License is a free, copyleft license for
software and other kinds of works.

The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.

When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
Expand All @@ -24,34 +26,44 @@ them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.

Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

The precise terms and conditions for copying, distribution and
modification follow.
Expand All @@ -60,7 +72,7 @@ modification follow.

0. Definitions.

"This License" refers to version 3 of the GNU Affero General Public License.
"This License" refers to version 3 of the GNU General Public License.

"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
Expand Down Expand Up @@ -537,45 +549,35 @@ to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

13. Remote Network Interaction; Use with the GNU General Public License.

Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
13. Use with the GNU Affero General Public License.

Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

14. Revised Versions of this License.

The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

Expand Down Expand Up @@ -633,29 +635,40 @@ the "copyright" line and a pointer to where the full notice is found.
Copyright (C) <year> <name of author>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
GNU General Public License for more details.

You should have received a copy of the GNU Affero General Public License
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
139 changes: 37 additions & 102 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,132 +1,67 @@
# Navigator

A highly opinionated telegram bot framework, mainly based on [Telegram.Bot](https://github.com/TelegramBots/Telegram.Bot).

This framework relies heavily in [MediatR](https://github.com/jbogard/MediatR) and it is shaped accordingly.
The only requirement is `Microsoft.AspNetCore.App (>= 8.0)`.

The base package ([Navigator](https://www.nuget.org/packages/Navigator/)) it's usable on it's own but the [Actions](https://www.nuget.org/packages/Navigator.Extensions.Actions) extension it's highly encouraged as it brings default implementations for almost every type of incoming telegram update, in the future we may merge it into the base package.
The usage is very simple yet powerful:

For storage of users, chats and conversations the [Store](https://www.nuget.org/packages/Navigator.Extensions.Store) extension works really well with Navigator, it automatically recognizes users and groups, saves them to the database for future use and injects into the NavigatorContext all the data you may have about a user or a chat, you can also use your own models and it will still work, check out the examples for more information.
```csharp
...
using Navigator;
...

Finally the [Shipyard](https://www.nuget.org/packages/Navigator.Extensions.Shipyard) WIP package gives you an useful API to retrieve information about your bot, change some of it's configuration and launch some actions. A companion web-based UI is also planned.
var builder = WebApplication.CreateBuilder(args);

## Packages
builder.Services.AddMemoryCache();

| Package | Last Stable | Last Prerelease |
|------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Navigator | [![package.nav](https://img.shields.io/nuget/v/Navigator?style=flat-square)](https://www.nuget.org/packages/Navigator/) | [![package.nav.pre](https://img.shields.io/nuget/vpre/Navigator?style=flat-square)](https://www.nuget.org/packages/Navigator/) |
| Navigator.Extensions.Actions | [![package.nav.ext.act](https://img.shields.io/nuget/v/Navigator.Extensions.Actions?style=flat-square)](https://www.nuget.org/packages/Navigator.Extensions.Actions) | [![package.nav.ext.act.pre](https://img.shields.io/nuget/vpre/Navigator.Extensions.Actions?style=flat-square)](https://www.nuget.org/packages/Navigator.Extensions.Actions) |
| Navigator.Extensions.Store | [![package.nav.ext.sto](https://img.shields.io/nuget/v/Navigator.Extensions.Actions?style=flat-square)](https://www.nuget.org/packages/Navigator.Extensions.Store) | [![package.nav.ext.sto.pre](https://img.shields.io/nuget/vpre/Navigator.Extensions.Store?style=flat-square)](https://www.nuget.org/packages/Navigator.Extensions.Store) |
| Navigator.Extensions.Shipyard | [![package.nav.ext.ship](https://img.shields.io/nuget/v/Navigator.Extensions.Shipyard?style=flat-square)](https://www.nuget.org/packages/Navigator.Extensions.Shipyard) | [![package.nav.ext.ship.pre](https://img.shields.io/nuget/vpre/Navigator.Extensions.Shipyard?style=flat-square)](https://www.nuget.org/packages/Navigator.Extensions.Shipyard) |
builder.Services.AddNavigator(options =>
{
options.SetWebHookBaseUrl(builder.Configuration["BASE_WEBHOOK_URL"]!);
options.SetTelegramToken(builder.Configuration["TELEGRAM_TOKEN"]!);
options.EnableTypingNotification();
});

# Requirements
- ASP.NET (>= net5.0)
- MediatR (>= 9.0.0)
var app = builder.Build();

# Examples
Some examples can be found in the [samples](https://github.com/navigatorframework/navigator/src/) repository.
var bot = app.GetBot();

Also checkout some bots made with `Navigator`:
- [@ThankiesBot](https://t.me/thankiesbot), check out it's [source code](https://github.com/elementh/thankies).
- [@FOSCBot](https://t.me/foscbot), check out it's [source code](https://github.com/elementh/foscbot).
// This action will be triggered if the user sends a message in the style of `/join <text>`.
bot.OnCommand("join", async (INavigatorClient client, Chat chat, string[] parameters) =>
{
var result = string.Join(',', parameters);

# Basic Usage
## Configuration
Including Navigator in your project is simple:
await client.SendTextMessageAsync(chat, result);
});

```csharp
public class Startup
{
// ...

public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddControllers().AddNewtonsoftJson();

services.AddMediatR(typeof(Startup).Assembly); // And any other assembly that may be needed.

services.AddNavigator(options =>
{
options.SetTelegramToken(Configuration["BOT_TOKEN"]); // Your telegram bot token.
options.SetWebHookBaseUrl(Configuration["BASE_WEBHOOK_URL"]); // The base url where you are going to receive the updates from teelgram.
options.RegisterActionsFromAssemblies(typeof(Startup).Assembly); // All your actions.
});

/// ...
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
/// ...

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapNavigator(); // In order to receive updates from telegram.
});

/// ...
}
}
app.MapNavigator();

app.Run();
```

More options are available, check out the wiki.
# Examples

## Bot Actions
Example of a basic echo action using the base package + the actions extension.
Some examples can be found in the [samples](https://github.com/navigatorframework/navigator/src/) repository.

```csharp
public class EchoAction : MessageAction
{
public string MessageToEcho { get; set; } = string.Empty;

public override IAction Init(INavigatorContext ctx)
{
if (string.IsNullOrWhiteSpace(ctx.Update.Message.Text))
{
MessageToEcho = ctx.Update.Message.Text;
}
return this;
}

public override bool CanHandle(INavigatorContext ctx)
{
return !string.IsNullOrWhiteSpace(MessageToEcho);
}
}

/// ...

public class EchoActionHandler : ActionHandler<EchoAction>
{
public EchoActionHandler(INavigatorContext ctx) : base(ctx)
{
}

public override async Task<Unit> Handle(EchoAction request, CancellationToken cancellationToken)
{
await Ctx.Client.SendTextMessageAsync(Ctx.GetTelegramChat(), request.MessageToEcho,
cancellationToken: cancellationToken);

return Unit.Value;
}
}
```
Also checkout some bots made with `Navigator`:

- [@ThankiesBot](https://t.me/thankiesbot), check out it's [source code](https://github.com/elementh/thankies).
- [@FOSCBot](https://t.me/foscbot), check out it's [source code](https://github.com/elementh/foscbot).

# License

Navigator Framework
Copyright (C) 2019-2021 Lucas Maximiliano Marino
Copyright (C) 2019-2024 Lucas Maximiliano Marino

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
it under the terms of the GNU General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Loading
Loading