morny-book/sp/slash.md

123 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# /$slash Bot
[@RongSlashBot]: https://github.com/Rongronggg9/SlashBot
[@hasutestbot]: https://t.me/hasutestbot
这个功能可以让你...唔,就像 [@RongSlashBot] 一样,能够有一个 *“响应诸如 /抱’、‘/摸摸’ 之类消息”* 的功能。
## 基础用法
<style>
.slb {
/* background-color: #f8f8f8; */
}
.slash {
color: palevioletred;
font-weight: bold;
}
.u1 {
color: lightcoral;
text-decoration: underline;
}
.u2 {
color: sandybrown;
text-decoration: underline;
}
.act { color: dodgerblue; }
.obj { color: mediumseagreen; }
.i { color: gray; background-color: gainsboro;}
.tq {
color: gray;
font-style: italic;
}
</style>
很简单,只需要像以下一样输入 斜杠<code class=slash>/</code> 加上 **一个单词**,就可以实现基础的 **slash** 响应。
<pre><code class=nohighlight><span class=slash>/</span><span class=act>摸摸</span></code></pre>
这样子,**bot** 就会回应一句话以“描述你刚刚做了什么”。
<pre><code class=nohighlight><small class=tq>&gt; <u>Morny Cono</u></small>
<small class=tq>&gt; in reply to <u>安妮</u></small>
<span class=u1>安妮</span> <span class=act>摸摸</span><span class=u2>自己</span> !</code></pre>
**bot** 的**回应**中,带有<b><u>下划线</u></b>的部分会带有一个指向**某个人**的链接。一个**回应**会永远包括两个**人**。<code class="slb u1">第一个</code> 用户永远是发送斜杠消息的**你自己**。而**第二个人**:如果你在发送消息的时候**回复**了某个人,那么**第二个人**就是 <code class="slb u2">你回复的人</code>;如果你**没有**回复任何人,那么**第二个人**将会是 <code class="slb u2">自己</code> —— 字面值的“自己”(当然指向的链接也是你的用户链接)。
> 每个人的**将会显示的名字**只会是它们的 **<ruby>名字<rt>First Name</rt></ruby>**,或者它们的 ***频道名***
>
> 在 Telegram 新版,用户将可以在群组内使用频道身份发言;当然,也有群组可以链接频道,这时频道里的消息也会自动转发到群组内。不论是任何情况,有时候,**发言者**会是一个**频道**而非一个标准用户。**Morny** 实现了针对**频道发送的消息**,获取它的**发送者名称**和**发送者身份的链接**的功能。这时,这个人显示的**名字**将会是它的**频道的名字**~~,而指向它的**链接**将会是指向它的**频道的链接**~~。
>
> 然而,出于一些问题,指向频道的链接目前是损坏的。
>
> **指向一个用户的链接**使用的是用户的 **id** 而非 username <small>因此,只要是用户没有注销账号的情况下,链接将会长期有效</small>。这个链接也会产生 **@ 提醒**。
>
> <small id="todo-1">这一部分以后应该会单独拿出来写个页面的,虽然,写出来会挺“内部实现”相关的,谁知道呢。</small>
### 添加更多内容
也可以在**后面**再添加一个**空格**,通过以下的句式为动作和回应**添加更多的内容**。
<pre><code class=nohighlight><small class=tq>&lt; in reply to <u>qwq</u></small>
<span class=slash>/</span><span class=act>摸摸</span> <span class=obj></span>
<small class=tq>&gt; <u>Morny Cono</u></small>
<small class=tq>&gt; in reply to <u>安妮</u></small>
<span class=u1>安妮</span> <span class=act>摸摸</span><span class=u2>qwq</span> <span class=obj></span> !</code></pre>
只要 **bot** 在句式中找到了**第一个空格****其后**的内容都会被认为是 <code class="slb obj">附加信息</code> ,而只有**第一个空格**之**前**的内容将会被认为是 <code class="slb act">动作</code>。为了在 <code class="slb act">动作</code> 部分添加**空格**,你可以使用**单引号** <code class="slb i">'</code> 或**双引号** <code class="slb i">"</code> 包围住**动作部分**,这可以使得 **bot** 忽略掉引号内部的**空格**的断句功能,让空格可以被**包含**进 <code class="slb act">动作</code> 部分当中。
<pre><code class=nohighlight><small class=tq>&lt; in reply to <u>Lapis Apple | ナイトコードで</u></small>
<span class=slash>/</span><span class=i>"<span class=act>greatly thanks</span>"</span> <span class=obj>for supporting the Workshop</span>
<small class=tq>&gt; <u>Morny Cono</u></small>
<small class=tq>&gt; in reply to <u>安妮</u></small>
<span class=u1>安妮</span> <span class=act>greatly thanks</span><span class=u2>Lapis Apple | ナイトコードで</span> <span class=obj>for supporting the Workshop</span> !</code></pre>
## special: 特殊句式的忽略
为了规避一些很可能发生的意外触发<small>因为斜杠 `/` 开头的句子还是会很常见很常见的</small>bot 会忽略一些特定的句式。
目前bot 会忽略 <code class="slb act">动作</code> 部分符合 Telegram 命令格式,或者看起来很像是一个文件路径的句子。
> 关于 Telegram 命令格式:
>
> bot 判断一个命令是否是 telegram 命令,是通过判断这一部分是只有大小写字母,数字,以及下划线的格式,后面还可以有 `@` 加上一个用户名,也可以没有这一部分。简单来说,这个格式就是 telegram 客户端会自动高亮出的命令格式。如果这一部分完全符合这个格式,那么 bot 就认为这是一个命令,进而不进行 slash 回应。
>
> 对于那些想要更多细节的人,这是 bot 内部用于判断 `动作` 部分是否符合 Telegram 命令格式的 RegEx 表达式:
> <code class=regex>^\\w+(@\\w+)?$</code>
> 关于文件路径格式的判定:
>
> bot 用了相当偷懒的方案。只要 bot 在 `动作` 部分检测出了一个或多个正斜杠 `/`(排除掉 slash 开头本身就要求的一个),就会认为这是一个文件路径,就会不进行 slash 回应。
### 强制执行 slash 回应
很多时候,即使满足了上述的特殊句式,但其实还是想要 slash bot 进行回应。Morny 设计了一个方式,使得 bot 能够完全忽略特殊句式的情况执行 slash 回应。这个方式甚至能规避想要发送的<code class="slb act">动作</code>和 Morny 本身的命令产生冲突的情况,能使得两个功能都可以正常执行。
使用方式很简单:在最开始的斜杠 <code class="slb slash">/</code><code class="slb act">动作</code> 中间加一个 空格 就好了。
<pre><code class=nohighlight><small class=tq>&lt; in reply to <u>qwq</u></small>
<span class=slash>/</span><span class=act>pia</span>
<small class=tq>&gt; nothing will happens.</small>
<small class=tq>&lt; in reply to <u>qwq</u></small>
<span class=slash>/</span> <span class=act>pia</span>
<small class=tq>&gt; <u>Morny Cono</u></small>
<small class=tq>&gt; in reply to <u>安妮</u></small>
<span class=u1>安妮</span> <span class=act>pia</span><span class=u2>qwq</span></code></pre>
---
## 你知道吗
<!-- > 这一部分先等等,写完再发。 -->
这个功能现在的版本,细节方面是模仿 [@hasutestbot] 的实现形式的。旧版还有着更好玩的各种特殊处理和更加 *可能人性化/更智能* 的设计,不过后来感觉,弄得太复杂反而太失败了就还是研究成功的前辈的做法好了,所以有了现在的版本。
虽然其实模仿 [@hasutestbot] 模仿的相当糟糕,它的很多特殊处理其实都没有抄到。
~~然而最后,[@hasutestbot] 死<small>于服务器忘记续费</small>了。~~