Skip to content

Commit

Permalink
补充一些文档
Browse files Browse the repository at this point in the history
  • Loading branch information
super1207 committed Dec 21, 2023
1 parent dc2258d commit fcde051
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 20 deletions.
1 change: 1 addition & 0 deletions docs/_sidebar.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@

* [首页](/)
* [下载](/download/)
* [一些例子](/example/)
* [语法详细参考](/detailref/)
140 changes: 140 additions & 0 deletions docs/example/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
## 调试脚本的方法(重要)

> 红色问答倾向于使用真实的聊天平台环境来调试。
1. 创建如下图这样的一个脚本:

![Alt text](image.png)
```
【运行脚本【CQ反转义【子关键词】】】
```

2. 然后,在您的聊天平台,发送如下信息:

![Alt text](image-2.png)

```
run【循环@5@hello【空格】】
```

3. 然后,您会看到如下的效果:

![Alt text](image-1.png)

## 访问网络图片

#### 代码
```
【图片【取元素【json解析【访问@https://api.gumengya.com/Api/DmImg】】@data@url】】
```

#### 解释
* [【访问】](/detailref/?id=访问)命令访问了一个网站,得到了json格式的字节集

* [【json解析】](/detailref/?id=json解析)命令解析了字节集,得到了Redlang对象

* [【取元素】](/detailref/?id=取元素)命令取了Red对象中的data->url字段,即图片链接

* [【图片】](/detailref/?id=图片)命令,构造了一张图片。【图片】命令,其实是输出了平台支持的特殊格式的文本,您如果对此感到好奇,可以使用[【打印日志】](/detailref/?id=打印日志)命令查看。

## 如何向指定目标发送消息

消息来源决定回复目标。

在聊天事件中,回复会自动根据消息来源,发送到群聊或私聊中。

但是在定时任务、框架初始化事件中,没有消息来源。所以需要使用[【设置来源】](/detailref/?id=设置来源)命令。

#### 定时器中发送群聊消息

```
【设置来源@机器人平台@onebot11】
【设置来源@机器人ID@xxxxx】
【设置来源@群ID@920220179】
```

#### 定时器中发送私聊消息

```
【设置来源@机器人平台@onebot11】
【设置来源@机器人ID@xxxxx】
【设置来源@发送者ID@1875159423】
```

#### 在群聊中发送私聊消息
将群ID清空,就可以进行私聊回复了。
```
【设置来源@群ID@】
```

## 多条回复

如果希望对同一条消息进行多次回复,有两种办法。

#### 分页
使用[【分页】](/detailref/?id=分页)命令发送`你好``世界`两条消息。

```
你好【分页】世界
```

#### 输出流
使用[【输出流】](/detailref/?id=输出流)命令发送`你好``世界`两条消息。

```
【隐藏【输出流@你好】】
【隐藏【输出流@世界】】
```
【输出流】会返回消息ID,这里用不到,所以使用[【隐藏】](/detailref/?id=隐藏)命令将返回的消息ID隐藏起来。

## 获取事件内容

如果需要获取消息事件中的消息,最方便的方法是使用[【子关键词】](/detailref/?id=子关键词)

如果要获取一个事件中的所有内容,比如您希望获得事件产生的时间,您可以使用【取元素【事件内容】@time】,如果您不了解【事件内容】的结构,您可以使用【转文本【事件内容】】,将其输出出来观察。

## 数据类型转换

红色问答中支持`文本``字节集``数组``对象`这四种数据类型,然而可以输出的只有`文本`类型,所以,您需要使用[【转文本】](/detailref/?id=转文本)命令。

#### 文本转文本

```
【转文本@你好】
```
输出```"你好"```,其实就是输出了json形式的文本,这在您需要手拼json的时候非常管用。

#### 字节集转文本

```
【转文本【读文件@C://test.txt】@utf8】
```
读utf8格式的文本文件,得到的结果是字节集,然后转为文本。utf8是默认的,可以省略,如`【转文本【读文件@C://test.txt】】`,也可以是gbk,如`【转文本【读文件@C://test.txt】@gbk】`

#### 文本转字节集
[【转字节集】](/detailref/?id=转字节集)命令可以实现将文本转为字节集。

```
【转字节集@你好@utf8】
```
utf8是默认的,表示字节集类型,可以省略,如`【转字节集@你好】`,也可以是gbk,如`【转字节集@你好@gbk】`

#### 字节集转文本

```
【转文本@你好@utf8】
```

#### 数组转文本

```
【转文本【数组@1@2@3】】
```
输出`["1","2","3"]`,其实就是输出了json形式的文本。因为json中是不支持字节集的,所以你需要保证数组中没有字节集类型。

#### 数组转文本

```
【转文本【对象@1@a@2@b@3@c】】
```
输出`{"1":"a","2":"b","3":"c"}`,其实就是输出了json形式的文本。因为json中是不支持字节集的,所以你需要保证对象中没有字节集类型。
Binary file added docs/example/image-1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/example/image-2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/example/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@
<!-- Docsify v4 -->
<script src="//cdn.bootcdn.net/ajax/libs/docsify/4.13.1/docsify.min.js"></script>
<script src="//cdn.bootcdn.net/ajax/libs/docsify/4.13.1/plugins/emoji.min.js"></script>
<script src="//cdn.bootcdn.net/ajax/libs/docsify-copy-code/3.0.0/docsify-copy-code.min.js"></script>
</body>
</html>
41 changes: 21 additions & 20 deletions src/botconn/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,17 @@ lazy_static! {


pub async fn call_api(platform:&str,self_id:&str,json:&mut serde_json::Value) -> Result<serde_json::Value, Box<dyn std::error::Error + Send + Sync>> {
let mut bot_select = None;
// 挑选出对应的bot
for bot in &*G_BOT_MAP.read().await {
if bot.1.read().await.get_platform().contains(&platform.to_owned()) && bot.1.read().await.get_self_id().contains(&self_id.to_owned()) {
let bot_select = bot.1.clone();
let bot2 = bot_select.read().await;
return bot2.call_api(platform,self_id, json).await;
bot_select = Some(bot.1.clone());
}
}
// 使用挑选出来的bot发送消息
if bot_select.is_some() {
return bot_select.unwrap().read().await.call_api(platform, self_id, json).await;
}
cq_add_log_w(&format!("no such bot:{platform},{self_id}")).unwrap();
return Ok(serde_json::json!(""));
}
Expand All @@ -56,25 +60,22 @@ pub fn do_conn_event() -> Result<i32, Box<dyn std::error::Error>> {
RT_PTR.clone().block_on(async move {
// 删除所有不在列表中的url和死去的bot
{
let mut earse_vec = vec![];
let mut botmap_lk;
loop {
botmap_lk = G_BOT_MAP.try_write();
if botmap_lk.is_ok(){
break;
} else {
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
}
}
let mut bot_map = botmap_lk.unwrap();
for (url,bot) in &*bot_map {
if !config_urls.contains(url) || bot.read().await.get_alive() == false {
bot.write().await.disconnect().await;
earse_vec.push(url.clone());
let mut earse_urls = vec![];
let mut earse_bot = vec![];
// 找到这些bot
{
let bot_map = G_BOT_MAP.read().await;
for (url,bot) in &*bot_map {
if !config_urls.contains(url) || bot.read().await.get_alive() == false {
earse_bot.push(bot.clone());
earse_urls.push(url.clone());
}
}
}
for url in &earse_vec {
bot_map.remove(url);
// 移除这些bot
for index in 0..earse_urls.len() {
earse_bot[index].write().await.disconnect().await;
G_BOT_MAP.write().await.remove(&earse_urls[index]);
}
}
// 连接未在bot_map中的url
Expand Down

0 comments on commit fcde051

Please sign in to comment.