Skip to content
This repository has been archived by the owner on Mar 4, 2024. It is now read-only.

Commit

Permalink
release: v0.7.0
Browse files Browse the repository at this point in the history
  • Loading branch information
bsdayo authored Nov 29, 2022
2 parents 535b229 + 9bd3e46 commit 90e25a4
Show file tree
Hide file tree
Showing 82 changed files with 936 additions and 1,427 deletions.
18 changes: 14 additions & 4 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

jobs:
publish:
Expand All @@ -27,7 +25,19 @@ jobs:
VERSION_FILE_PATH: src/Flandre.Core/Flandre.Core.csproj
VERSION_REGEX: ^\s*<PackageVersion>(.*)<\/PackageVersion>\s*$
TAG_COMMIT: true
TAG_FORMAT: v*
TAG_FORMAT: core_v*
NUGET_KEY: ${{secrets.NUGET_API_KEY}}

- name: Publish Framework
id: publish-fx
uses: alirezanet/publish-nuget@v3.0.4
with:
PROJECT_FILE_PATH: src/Flandre.Framework/Flandre.Framework.csproj
PACKAGE_NAME: Flandre.Framework
VERSION_FILE_PATH: src/Flandre.Framework/Flandre.Framework.csproj
VERSION_REGEX: ^\s*<PackageVersion>(.*)<\/PackageVersion>\s*$
TAG_COMMIT: true
TAG_FORMAT: fx_v*
NUGET_KEY: ${{secrets.NUGET_API_KEY}}

- name: Publish Adapters.Konata
Expand All @@ -51,7 +61,7 @@ jobs:
VERSION_REGEX: ^\s*<PackageVersion>(.*)<\/PackageVersion>\s*$
TAG_COMMIT: false
NUGET_KEY: ${{secrets.NUGET_API_KEY}}

- name: Publish Adapters.Mock
id: publish-adapter-mock
uses: alirezanet/publish-nuget@v3.0.4
Expand Down
14 changes: 9 additions & 5 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ on:
branches: [ dev ]
pull_request:
branches: [ dev ]

jobs:
unit-test:
name: Unit Test
Expand All @@ -17,14 +17,18 @@ jobs:
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.x.x

- name: Test Flandre.Core
run: |
dotnet test tests/Flandre.Core.Tests/ --collect:"XPlat Code Coverage" -r code-coverage/
mv code-coverage/**/coverage.cobertura.xml code-coverage/core.xml
- name: Test Flandre.Framework
run: |
dotnet test tests/Flandre.Framework.Tests/ --collect:"XPlat Code Coverage" -r code-coverage/
mv code-coverage/**/coverage.cobertura.xml code-coverage/fx.xml
- name: Upload Code Coverage to Codecov
uses: codecov/codecov-action@v3
with:
files: code-coverage/core.xml
fail_ci_if_error: true
files: code-coverage/core.xml,code-coverage/fx.xml
24 changes: 18 additions & 6 deletions Flandre.sln
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flandre.Core", "src\Flandre
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flandre.Adapters.Konata", "src\Flandre.Adapters.Konata\Flandre.Adapters.Konata.csproj", "{723E8DD2-55F1-4095-93D7-E6AD600A63EE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flandre.Core.Tests", "tests\Flandre.Core.Tests\Flandre.Core.Tests.csproj", "{22726A9B-8E54-4513-AB04-61B4A34DDC2A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flandre.Adapters.Mock", "src\Flandre.Adapters.Mock\Flandre.Adapters.Mock.csproj", "{18C926FE-1F45-421C-A19B-BB914DBD7437}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flandre.Adapters.OneBot", "src\Flandre.Adapters.OneBot\Flandre.Adapters.OneBot.csproj", "{49047181-70A7-44F9-BC70-992BD0289C97}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flandre.Framework", "src\Flandre.Framework\Flandre.Framework.csproj", "{76195FF7-5683-451D-9D22-955CE0CA20EF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flandre.Framework.Tests", "tests\Flandre.Framework.Tests\Flandre.Framework.Tests.csproj", "{23B5856D-C230-4EC6-A3C0-A31E56AABFC9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Flandre.Core.Tests", "tests\Flandre.Core.Tests\Flandre.Core.Tests.csproj", "{99CA905D-7B6C-4615-BF50-F06CAB14941D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -24,10 +28,6 @@ Global
{723E8DD2-55F1-4095-93D7-E6AD600A63EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{723E8DD2-55F1-4095-93D7-E6AD600A63EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{723E8DD2-55F1-4095-93D7-E6AD600A63EE}.Release|Any CPU.Build.0 = Release|Any CPU
{22726A9B-8E54-4513-AB04-61B4A34DDC2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{22726A9B-8E54-4513-AB04-61B4A34DDC2A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{22726A9B-8E54-4513-AB04-61B4A34DDC2A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{22726A9B-8E54-4513-AB04-61B4A34DDC2A}.Release|Any CPU.Build.0 = Release|Any CPU
{18C926FE-1F45-421C-A19B-BB914DBD7437}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{18C926FE-1F45-421C-A19B-BB914DBD7437}.Debug|Any CPU.Build.0 = Debug|Any CPU
{18C926FE-1F45-421C-A19B-BB914DBD7437}.Release|Any CPU.ActiveCfg = Release|Any CPU
Expand All @@ -36,5 +36,17 @@ Global
{49047181-70A7-44F9-BC70-992BD0289C97}.Debug|Any CPU.Build.0 = Debug|Any CPU
{49047181-70A7-44F9-BC70-992BD0289C97}.Release|Any CPU.ActiveCfg = Release|Any CPU
{49047181-70A7-44F9-BC70-992BD0289C97}.Release|Any CPU.Build.0 = Release|Any CPU
{76195FF7-5683-451D-9D22-955CE0CA20EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76195FF7-5683-451D-9D22-955CE0CA20EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{76195FF7-5683-451D-9D22-955CE0CA20EF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{76195FF7-5683-451D-9D22-955CE0CA20EF}.Release|Any CPU.Build.0 = Release|Any CPU
{23B5856D-C230-4EC6-A3C0-A31E56AABFC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{23B5856D-C230-4EC6-A3C0-A31E56AABFC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{23B5856D-C230-4EC6-A3C0-A31E56AABFC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{23B5856D-C230-4EC6-A3C0-A31E56AABFC9}.Release|Any CPU.Build.0 = Release|Any CPU
{99CA905D-7B6C-4615-BF50-F06CAB14941D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{99CA905D-7B6C-4615-BF50-F06CAB14941D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{99CA905D-7B6C-4615-BF50-F06CAB14941D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{99CA905D-7B6C-4615-BF50-F06CAB14941D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
166 changes: 8 additions & 158 deletions README.NuGet.md
Original file line number Diff line number Diff line change
@@ -1,175 +1,25 @@
# Flandre

.NET 6 实现的跨平台,低耦合的聊天机器人框架
.NET 6 实现的跨平台,现代化聊天机器人框架
一次编写,多处运行

[![License](https://img.shields.io/github/license/FlandreDevs/Flandre?label=License&style=flat&color=42a5f5)](https://github.com/FlandreDevs/Flandre/blob/main/LICENSE)
[![Stars](https://img.shields.io/github/stars/FlandreDevs/Flandre?label=Stars&style=flat&color=1976d2)](https://github.com/FlandreDevs/Flandre/stargazers)
[![Contributors](https://img.shields.io/github/contributors/FlandreDevs/Flandre?label=Contributors&style=flat&color=ab47bc)](https://github.com/FlandreDevs/Flandre/graphs/contributors)
[![NuGet](https://img.shields.io/nuget/vpre/Flandre.Core?style=flat&label=NuGet&color=f06292)](https://www.nuget.org/packages/Flandre.Core/)
[![NuGet Downloads](https://img.shields.io/nuget/dt/Flandre.Core?style=flat&label=Downloads&color=ffb300)](https://www.nuget.org/packages/Flandre.Core/)
[![Contributors](https://img.shields.io/github/contributors/FlandreDevs/Flandre?label=Contributors&style=flat&color=9866ca)](https://github.com/FlandreDevs/Flandre/graphs/contributors)
[![.NET Version](https://img.shields.io/badge/.NET-6-ffe57f?style=flat)](https://www.nuget.org/packages/Flandre.Core/)
[![Codecov](https://img.shields.io/codecov/c/gh/FlandreDevs/Flandre/dev?style=flat&color=a5d6a7&label=Coverage)](https://app.codecov.io/gh/FlandreDevs/Flandre)

· [使用文档](https://flandredevs.github.io/) ·
\- **[使用文档](https://flandredevs.github.io/)** -

本项目的名称来源于东方 Project 中的角色芙兰朵露 · 斯卡雷特 (Flandre Scarlet) ~~(番茄炒蛋)~~

---

**项目仍在早期开发阶段,功能尚未完善,且处于快速迭代过程中。**
**如果您对项目的开发感兴趣,诚挚欢迎您的改进建议或 PR 贡献。**

**1.0 版本发布前随时可能发生 API 的非兼容性变更,不建议用于生产环境。**

## 特性

### 跨平台

Flandre 自设计之初就是为了跨平台,对聊天平台的结构进行抽象化,采用适配器模式兼容各大聊天平台,同时提供了良好的开发体验。

目前已经实现的适配器:

- [Flandre.Adapters.Konata](https://github.com/FlandreDevs/Flandre/blob/dev/src/Flandre.Adapters.Konata/README.md) - QQ
协议适配,基于 [Konata.Core](https://github.com/KonataDev/Konata.Core)

### 指令系统

得益于内置的指令解析系统,开发者可以方便地掌控指令的参数信息,包括但不限于参数数量检查,类型检查,参数默认值等等。而所有的定义可以在一个字符串内完成,例如:

```csharp
[Command("example <foo:string> [bar:double] [baz:int=114514]")]
```

### 事件驱动

Flandre 内部采用各类事件控制,开发者可以轻松地通过订阅事件/重写相关方法的方式控制应用的运行流程。
_注:事件系统仍在完善当中_

~~才发布没多久的项目再吹就吹过了~~

## 起步

遵循不知道哪里来的惯例,我们以一个复读小程序开始:

```csharp
using Flandre.Core;
using Flandre.Adapters.Konata;
using Konata.Core.Common;

var app = new FlandreApp();

var config = new KonataAdapterConfig();
config.Bots.Add(new KonataBotConfig
{
KeyStore = new BotKeyStore("<QQ 号>", "<密码>")
});

class ExamplePlugin : Plugin
{
public override void OnMessageReceived(MessageContext ctx)
=> ctx.Bot.SendMessage(ctx.Message);
}

app
.UseKonataAdapter(config)
.Use(new ExamplePlugin())
.Start();
```

运行程序,向我们 bot 的 QQ 号发送一条消息,bot 会将消息原封不动地发回来。 ~~复读不仅仅是人类的本质.jpg~~

### 基本指令解析

来个高级点的例子,我们定义一条指令:

```csharp
class ExamplePlugin2 : Plugin
{
[Command("example <foo> [bar]")]
public MessageContent OnExample(MessageContext ctx, ParsedArgs args)
{
var foo = args.GetArgument<string>("foo");
var bar = args.GetArgument<string>("bar");

if (string.IsNullOrWhiteSpace(bar))
bar = "(empty)";

var mb = new MessageBuilder();

mb.Text($"Foo: {foo}, ")
.Text($"Bar: {bar}");
**项目的完整 README 可[在 GitHub 上查看](https://github.com/FlandreDevs/Flandre/)**

return mb;
}
}
```

这个插件包含一条有两个参数的指令,类型都为 `string`,其中 `foo` 为必选参数,`bar`
为可选参数。如果调用指令时未提供可选参数,参数将被初始化为类型默认值;如果为提供必选参数,bot 将向其发送一条提示信息并停止执行指令。

向 bot 发送 `example qwq ovo`~~随便什么~~),bot 会将参数的值发送回来。

### 类型约束

如果我们不对指令的参数进行类型约束,那么参数的类型将默认为 `string`。如要添加参数,可以在参数名称后添加 `:` 号和类型名称。类型名称支持
C# 中绝大多数的基本类型,如 `int`, `double`, `long`, `bool` 等等,在解析过程中会自动进行类型检查和转换。

举个例子:

```csharp
[Command("example <foo:double> <bar:bool>")]
public MessageContent? OnExample(MessageContext ctx, ParsedArgs args)
{
var foo = args.GetArgument<double>("foo");
var bar = args.GetArgument<bool>("bar");

Logger.Info(foo.GetType().Name); // Double
Logger.Info(bar.GetType().Name); // Boolean
return null;
}
```

### 参数默认值

有时我们需要对参数指定默认值,可以在定义中使用 `=` 号:

```csharp
[Command("example [foo:int=1145] [bar:bool=true]")]
```

如果不人为指定默认值,参数将被初始化为 C# 中的类型默认值(即 `default(T)`)。`string`
比较特殊,在参数中它的默认值是空字符串,而不是 `null`

### 灵活的表现形式

Flandre 内置的指令解析器允许留下空格。如果你觉得参数的各种定义挤在一起乱糟糟的,可以适度空开:

```csharp
[Command("example [foo: int = 1145] [bar: bool = true]")]
```

这样写的缺点是可能导致指令定义过于冗长,可以结合实际情况选择。

## 分支说明

项目目前有两个主要分支:

- `main` 分支 - 包含上一个发布版本的源代码,`dev` 分支会在版本发布时合并过来
- `dev` 分支 - 开发分支,包含最新更改,但可能不稳定。

向仓库贡献代码时,请确保目前正处于 `dev` 分支上。

## 致谢

项目编写过程中参考了许多开源项目,没有它们就没有 Flandre 的诞生:

- [koishijs/koishi](https://github.com/koishijs/koishi)
- [KonataDev/Konata.Core](https://github.com/KonataDev/Konata.Core)

(按字母排序)
---

## License
**项目仍在早期开发阶段,功能尚未完善,且处于快速迭代过程中。**
**如果您对项目的开发感兴趣,诚挚欢迎您的改进建议或 PR 贡献。**

本项目以 [MIT 许可证](https://github.com/FlandreDevs/Flandre/blob/main/LICENSE) 开源 (′▽\`)╭(′▽\`)╯
**1.0 版本发布前随时可能发生 API 的非兼容性变更,不建议用于生产环境。**
38 changes: 29 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<div align="center">

<img src="https://raw.githubusercontent.com/FlandreDevs/Flandre/dev/assets/avatar.jpg" width="200" />
<img src="https://ghproxy.com/https://raw.githubusercontent.com/FlandreDevs/Flandre/dev/assets/avatar.jpg" width="200" />

# Flandre

Expand All @@ -9,9 +9,9 @@

[![License](https://img.shields.io/github/license/FlandreDevs/Flandre?label=License&style=flat&color=42a5f5)](https://github.com/FlandreDevs/Flandre/blob/main/LICENSE)
[![Stars](https://img.shields.io/github/stars/FlandreDevs/Flandre?label=Stars&style=flat&color=1976d2)](https://github.com/FlandreDevs/Flandre/stargazers)
[![Contributors](https://img.shields.io/github/contributors/FlandreDevs/Flandre?label=Contributors&style=flat&color=ab47bc)](https://github.com/FlandreDevs/Flandre/graphs/contributors)
[![NuGet](https://img.shields.io/nuget/vpre/Flandre.Core?style=flat&label=NuGet&color=f06292)](https://www.nuget.org/packages/Flandre.Core/)
[![NuGet Downloads](https://img.shields.io/nuget/dt/Flandre.Core?style=flat&label=Downloads&color=ffb300)](https://www.nuget.org/packages/Flandre.Core/)
[![Contributors](https://img.shields.io/github/contributors/FlandreDevs/Flandre?label=Contributors&style=flat&color=9866ca)](https://github.com/FlandreDevs/Flandre/graphs/contributors)
[![Flandre.Framework Version](https://img.shields.io/nuget/vpre/Flandre.Core?style=flat&label=Framework&color=f06292)](https://www.nuget.org/packages/Flandre.Core/)
[![Flandre.Core Version](https://img.shields.io/nuget/vpre/Flandre.Core?style=flat&label=Core&color=e65943)](https://www.nuget.org/packages/Flandre.Core/)
[![.NET Version](https://img.shields.io/badge/.NET-6-ffe57f?style=flat)](https://www.nuget.org/packages/Flandre.Core/)
[![Codecov](https://img.shields.io/codecov/c/gh/FlandreDevs/Flandre/dev?style=flat&color=a5d6a7&label=Coverage)](https://app.codecov.io/gh/FlandreDevs/Flandre)

Expand Down Expand Up @@ -44,9 +44,27 @@ Flandre 为跨平台而生,对聊天平台的结构进行抽象化,采用适
| Telegram | 计划中... |
| Discord | 计划中... |

### 🧩 灵活的开发方式
Flandre 提供两种开发方式,分别是完整的开发框架 `Framework`,以及易于嵌入已有程序的 `Core`
#### Flandre.Framework
[![NuGet](https://img.shields.io/nuget/vpre/Flandre.Framework?style=flat&label=NuGet&color=9866ca)](https://www.nuget.org/packages/Flandre.Framework/)
[![NuGet Downloads](https://img.shields.io/nuget/dt/Flandre.Framework?style=flat&label=Downloads&color=42a5f5)](https://www.nuget.org/packages/Flandre.Framework/)

`Flandre.Framework` 是一个使用方便、功能全面的 Bot 开发框架,在核心包 `Core` 的基础上集成了插件、指令、中间件等系统,并提供依赖注入、日志管理等等实用功能。对于一个全新的 Bot 项目,我们推荐您直接使用 `Framework` 进行开发。

#### Flandre.Core
[![NuGet](https://img.shields.io/nuget/vpre/Flandre.Core?style=flat&label=NuGet&color=9866ca)](https://www.nuget.org/packages/Flandre.Core/)
[![NuGet Downloads](https://img.shields.io/nuget/dt/Flandre.Core?style=flat&label=Downloads&color=42a5f5)](https://www.nuget.org/packages/Flandre.Core/)

`Flandre.Core` 是整个框架的核心组件,包含了适配器、机器人等重要内容,提供直接操作 Bot 进行平台交互的功能。相比 `Framework``Core` 作为一个轻量化的模块,能更容易地嵌入进已有项目中,成为功能的一部分。

> 不需要代入 .NET Framework / Core 命名方式的意义。在 Flandre 中,两者只意味着开发方式的不同,都处于积极维护中。
下文将主要介绍 `Flandre.Framework` 的各类特性。如果你需要关于 `Flandre.Core` 的详细说明,请~~参照这里的文档~~。(还没写x)

### 📦 开箱即用的指令系统

Flandre 实现了一套开箱即用的指令解析系统,而无需开发者自己造轮子。
Flandre.Framework 实现了一套开箱即用的指令解析系统,而无需开发者自己造轮子。
开发者可以方便地掌控指令的参数信息,包括但不限于参数数量检查,类型检查,参数默认值等等。而所有的定义可以在一个字符串内完成,例如:

```csharp
Expand All @@ -59,7 +77,9 @@ Flandre 内部采用各类事件控制,开发者可以轻松地通过订阅事

## 🚀 起步

遵循不知道哪里来的惯例,我们以一个复读小程序开始:
遵循不知道哪里来的惯例,我们以一个复读小程序开始。

首先通过 NuGet 包管理器引用 `Flandre.Framework``Flandre.Adapters.Konata` 包,然后:

```csharp
using Flandre.Core;
Expand All @@ -81,12 +101,12 @@ app

class ExamplePlugin : Plugin
{
public override void OnMessageReceived(MessageContext ctx)
=> ctx.Bot.SendMessage(ctx.Message);
public override async Task OnMessageReceived(MessageContext ctx)
=> await ctx.Bot.SendMessage(ctx.Message);
}
```

运行程序,向我们 bot 的 QQ 号发送一条消息,bot 会将消息原封不动地发回来。 ~~复读不仅仅是人类的本质.jpg~~
运行程序,向我们 Bot 的 QQ 号发送一条消息,bot 会将消息原封不动地发回来。 ~~复读不仅仅是人类的本质.jpg~~

### 基本指令解析

Expand Down
4 changes: 2 additions & 2 deletions src/Flandre.Adapters.Konata/Flandre.Adapters.Konata.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
<PropertyGroup>
<Title>Flandre.Adapters.Konata</Title>
<Product>$(Title)</Product>
<PackageVersion>1.0.0-alpha.2</PackageVersion>
<PackageVersion>2.0.0-alpha.1</PackageVersion>
<Version>$(PackageVersion)</Version>
<Authors>b1acksoil</Authors>
<Description>Konata.Core (QQ Protocol) adapter for Flandre project.</Description>
<PackageTags>bot</PackageTags>
<PackageTags>bot;chatbot;flandre;adapter</PackageTags>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageIcon>avatar.jpg</PackageIcon>
<PackageReadmeFile>README.md</PackageReadmeFile>
Expand Down
Loading

0 comments on commit 90e25a4

Please # to comment.