easy-keyboard/fluent-keyboard

为 MTProto 语法创建的流畅键盘

2.0.0 2024-09-17 17:36 UTC

README

fluent-keyboard

为 MTProto 语法创建的流畅键盘

目录
  1. 安装
  2. 使用
    1. 定义键盘
    2. 定义按钮
    3. 将按钮绑定到键盘
      1. 按行
      2. 按按钮
      3. 按坐标
      4. 作为堆栈
    4. KeyboardForceReply 和 KeyboardHide
    5. 键盘对等类型
    6. 将 Telegram 键盘转换为 Fluent 键盘

安装

使用 composer 安装包

composer require easy-keyboard/fluent-keyboard

(返回顶部)

使用

如果您需要创建键盘,可以使用此包中提供的类作为直接替换。

以下示例将最佳说明

$this->messages->sendMessage(
    chat_id:       12345,
    text:          'Keyboard Example',
    reply_markup:  KeyboardMarkup::new()
        ->singleUse()
        ->addButton(KeyboardButton::Text('Cancel'))
        ->addButton(KeyboardButton::Text('OK'))
        ->build()
);

通过调用 KeyboardMarkup 的静态 new() 方法创建 ReplyKeyboardMarkup。之后,每个字段(如 singleUse 等)添加一些额外内容。可以通过调用 addButton() 方法添加按钮。我们稍后会对这一点进行详细说明。(请注意,此键盘需要转换为数组以便您的机器人可读,因此最后您需要调用 init() 方法)

(返回顶部)

定义键盘

您可以通过调用其类的静态 new() 方法来创建键盘。

之后,您可以通过调用 placeholder() 方法来链式调用方法,设置 Bot API 中可用的其他字段。

KeyboardMarkup::new()
    ->placeholder('Placeholder')
    ->build();

(返回顶部)

定义按钮

按钮以不同的方式创建

KeyboardButton::Phone('Send my Contact');

这同样适用于 InlineButton

InlineButton::Url('hello', 'https://example.com');

(返回顶部)

将按钮绑定到键盘

键盘没有按钮将无法工作,因此您需要将按钮传递给键盘。有几种方法可以这样做。

按行

KeyboardMarkup::new()
    ->row(
        KeyboardButton::Text('Cancel'),
        KeyboardButton::Text('OK')
    )
    ->build();

如果您需要多于一行,多次调用 row()

KeyboardInline::new()
    ->row(
        InlineButton::Callback('1','page-1'),
        InlineButton::Callback('2','page-2'),
        InlineButton::Callback('3','page-3')
    )
    ->row(
        InlineButton::Callback('prev','page-prev'),
        InlineButton::Callback('next','page-next')
    )
    ->build();

您还可以通过其他方式添加回调数组或文本键盘

KeyboardInline::new()
    ->addCallbacks([
        '1' => 'page-1',
        '2' => 'page-2',
        '3' => 'page-3',
    ],[
        'prev' => 'page-prev',
        'next' => 'page-next'
    ])
    ->build();
KeyboardMarkup::new()
    ->addTexts([
       'Cancel',
       'Ok'
    ])
    ->build();

按按钮

KeyboardMarkup::new()
    ->addButton(KeyboardButton::Text('First Button'))
    ->addButton(KeyboardButton::Text('Second Button'))
    ->build();

如果您需要多于一行,只需不带参数调用 row 方法,然后继续调用 addButton()

KeyboardInline::new()
    ->addButton(InlineButton::Callback('A', 'answer-a'))
    ->addButton(InlineButton::Callback('B', 'answer-b'))
    ->row()
    ->addButton(InlineButton::Callback('C', 'answer-c'))
    ->addButton(InlineButton::Callback('D', 'answer-d'))
    ->build();

您可以根据自己的喜好,将按钮直接定义如这些示例所示,或者先生成整个行,然后将变量传递给 row() 方法。

您可以通过调用 remove 方法删除最后一个按钮,以下是一个示例

KeyboardInline::new()
    ->addButton(InlineButton::Callback('A', 'answer-a'))
    ->addButton(InlineButton::Callback('B', 'answer-b'))
    ->row()
    ->addButton(InlineButton::Callback('C', 'answer-c'))
    ->addButton(InlineButton::Callback('D', 'answer-d'))
    ->remove()
    ->build();

在这个示例中,按钮 D 将从按钮中删除。

按坐标

您可以在您想要的任何坐标处添加按钮!(注意,坐标从 0 开始,就像数组索引一样。)例如,假设我们有一个这样的键盘

$keyboard = KeyboardInline::new()
    ->addButton(InlineButton::Callback('Numbers', 'Numbers'))
    ->addButton(InlineButton::Callback('Status', 'Status'))
    ->row()
    ->addButton(InlineButton::Callback('Add', 'Add'))
    ->addButton(InlineButton::Callback('Remove', 'Remove'));

我们可以通过调用 addToCoordinates 方法添加具有其坐标(行和列)的新按钮。此方法将在您传入的坐标处添加新按钮,并移动该坐标的下一个按钮。此图片显示了新按钮的位置

Screenshot_20230907_212829

$keyboard->addToCoordinates(0, 1, InlineButton::Callback('Middle','Middle'));

结果应如下所示

Screenshot_20230907_213111

您还可以在特定坐标处替换,与 addToCoordinates 不同,replaceIntoCoordinates 方法将您的按钮替换为传入的坐标。例如,如果我们想在这个例子中将“添加”替换如下所示

Screenshot_20230907_213957

我们应该使用此代码

$keyboard->replaceIntoCoordinates(1, 0, InlineButton::Callback('Replaced Add','Add'));

结果应如下所示

Screenshot_20230907_214232

您还可以通过坐标删除按钮。例如,如果我们想删除上一个示例中的“添加”按钮,我们应该运行此代码

$keyboard->removeFromCoordinates(1, 0);

作为堆栈

如果您想添加具有各自行的多个按钮,可以使用 Stack() 方法。

KeyboardInline::new()
    ->Stack(
        InlineButton::Login('Login', 'https://example.com/login'),
        InlineButton::Url('Visit Homepage', 'https://example.com')
    )
    ->build();

您可以根据需要混合使用row()Stack()addButton()方法。

(返回顶部)

KeyboardForceReply 和 KeyboardHide

KeyboardForceReply和KeyboardHide可以像普通键盘一样使用,但它们不会接收任何按钮。

#[FilterAnd(new FilterPrivate,new FilterIncoming)]
public function handleExit(Message $message){
    $message->reply('Thank you',
        reply_markup : KeyboardHide::new()->build()
    );
}
$data['reply_markup'] = KeyboardForceReply::new()
    ->addButton(KeyboardButton::Text('Hello please reply'))
    ->placeholder('must reply')
    ->build();

(返回顶部)

键盘对等类型

我们提供了三种类型的数据对等,可以通过机器人请求:RequestUser、RequestGroup和RequestChannel。

KeyboardMarkup::new()
    ->addButton(KeyboardButton::Peer('Request for user', 0, RequestUser::new()));
KeyboardMarkup::new()
    ->addButton(KeyboardButton::Peer('Request for chat', 1, RequestGroup::new()));
KeyboardMarkup::new()
    ->addButton(KeyboardButton::Peer('Request for broadcast', 2, RequestChannel::new()));

您还可以使用更简单的语法来创建更好的键盘。

KeyboardMarkup::new()
    ->requestUser('Request for user', 0);
KeyboardMarkup::new()
    ->requestGroup('Request for chat', 1);
KeyboardMarkup::new()
    ->requestChannel('Request for broadcast', 2);

(返回顶部)

将 Telegram 键盘转换为 Fluent 键盘

现在您可以使用fromRawReplyMarkup方法轻松地将mtproto的Telegram键盘转换为fluent键盘进行修改等操作!以下是一个示例。

$fluentKeyboard = Keyboard::fromRawReplyMarkup($replyMarkup);

如您所知,$fluentKeyboard是一个对象,您可以对其进行修改并添加更多按钮。以下是一个$fluentKeyboardKeyboardInline实例的示例。

$fluentKeyboard->addButton(InlineButton::Callback('End', 'End'));

最后,您可以在其中调用build方法并将其传递给某个Telegram方法。以下是一个MadelineProto的示例。

#[FilterAnd(new FilterPrivate,new FilterIncoming)]
public function modify(Message $message){
    $message->reply('That is new keyboard',
        reply_markup : $fluentKeyboard->build()
    );
}

(返回顶部)