tgbotlib/README.md

326 lines
9.6 KiB
Markdown
Raw Normal View History

2023-02-12 13:41:43 -05:00
# TgBotLib
2023-02-15 15:35:50 -05:00
TgBotLib is a library for creating Telegram Bots in PHP, based on the [Telegram Bot API](https://core.telegram.org/bots/api).
The approach taken by this library is to be as close as possible to the Telegram Bot API, while providing a simple and
easy to use interface that is easy to understand and out of your way, allowing you to use the library as a simple
2023-02-18 20:49:27 -05:00
native around the API.
2023-02-20 21:46:13 -05:00
## Table of contents
<!-- TOC -->
* [TgBotLib](#tgbotlib)
* [Table of contents](#table-of-contents)
* [Versioning](#versioning)
* [Installation](#installation)
* [Compile from source](#compile-from-source)
* [Requirements](#requirements)
* [Usage](#usage)
* [Documentation](#documentation)
* [Single-Threaded & Multi-Threaded Bots](#single-threaded--multi-threaded-bots)
* [Single-Threaded Bots](#single-threaded-bots)
* [Multi-Threaded Bots](#multi-threaded-bots)
* [Commands & Event Handlers](#commands--event-handlers)
* [Commands](#commands)
* [Event Handlers](#event-handlers)
* [License](#license)
<!-- TOC -->
2023-02-18 20:49:27 -05:00
## Versioning
The library's version is based on the version of the Telegram Bot API that it supports, for example, the version `6.5.0`
of the library supports the Telegram Bot API version `6.5` and patch version reflect the current patch version of the library.
To clarify, for example `6.5.4` means the library is based on the Telegram Bot API version `6.5` and the library's patch
version is `4`. Library patches are used to fix bugs or add improvements in the library, and are not related to the
Telegram Bot API version.
2023-02-15 15:35:50 -05:00
2023-02-20 21:46:13 -05:00
2023-02-15 15:35:50 -05:00
## Installation
The library can be installed using ncc:
```bash
ncc install -p "nosial/libs.tgbot=latest@n64"
```
or by adding the following to your project.json file under the `build.dependencies` section:
```json
{
"name": "net.nosial.tgbotlib",
"version": "latest",
"source_type": "remote",
"source": "nosial/libs.tgbot=latest@n64"
}
```
If you don't have the n64 source configured, you can add it by running the following command:
```bash
ncc source add --name n64 --type gitlab --host git.n64.cc
```
2023-02-20 21:46:13 -05:00
## Compile from source
To compile the library from source, you need to have [ncc](https://git.n64.cc/nosial/ncc) installed, then run the
following command:
```bash
ncc build
```
## Requirements
The library requires PHP 8.0 or higher.
2023-02-15 15:35:50 -05:00
## Usage
1. Import the library using `import('net.nosial.tgbotlib');`
2. Create a new instance of the `TgBotLib\Bot` class, passing the bot token as the first argument
3. Profit
```php
require 'ncc';
import('net.nosial.tgbotlib');
$bot = new TgBotLib\Bot('<BOT TOKEN>');
/** @var \TgBotLib\Objects\Telegram\Update $update */
foreach ($bot->getUpdates() as $update)
{
$bot->sendMessage($update->getMessage()->getChat()->getId(), 'Hello World!');
}
```
Each method of the `TgBotLib\Bot` class is named after the corresponding method of the Telegram Bot API, all methods
contains an optional `$parameters` argument that can be used to pass additional parameters to the API method.
But for methods that has required parameters, the library provides a more convenient way to pass them, by using
named parameters. For example, the `sendMessage` method requires the `chat_id` and `text` parameters, but instead
of passing them as an array, you can pass them as named parameters:
```php
2023-02-18 20:49:27 -05:00
$bot->sendMessage(
chat_id: '<CHAT ID>',
text: 'Hello World!',
options: [
'parse_mode' => 'Markdown',
'disable_web_page_preview' => true,
]
);
2023-02-15 15:35:50 -05:00
```
## Documentation
Almost everything in the library has PhpDoc documentation, so you can use your IDE to get documentation for the
library. For example, in PhpStorm, you can press `Ctrl+Q` on a method to get the documentation for it:
![PhpStorm Documentation](assets/documentation.png)
2023-02-12 13:41:43 -05:00
2023-02-20 21:46:13 -05:00
## Single-Threaded & Multi-Threaded Bots
This part will explain how to implement single-threaded and multi-threaded bots using the library.
For more examples see the [tests](tests) directory.
### Single-Threaded Bots
To implement a single-threaded bot, it's very self-explanatory, you just need to create a new instance of the
`TgBotLib\Bot` class and use it to handle the updates:
```php
<?php
2023-02-20 22:01:35 -05:00
// Import ncc
require 'ncc';
2023-02-20 21:46:13 -05:00
2023-02-20 22:01:35 -05:00
import('net.nosial.tgbotlib');
// Require commands & event handlers
require 'commands' . DIRECTORY_SEPARATOR . 'StartCommand.php';
require 'commands' . DIRECTORY_SEPARATOR . 'HashCommand.php';
// Create a new instance of the bot
2023-02-20 21:46:13 -05:00
$bot = new TgBotLib\Bot(getenv('BOT_TOKEN'));
2023-02-20 22:01:35 -05:00
// Loop forever
2023-02-20 21:46:13 -05:00
while(true)
{
/** @var \TgBotLib\Objects\Telegram\Update $update */
foreach ($bot->getUpdates() as $update)
{
$bot->sendMessage($update->getMessage()->getChat()->getId(), 'Hello World!');
}
}
```
This approach is very simple and allows for easier debugging, but it's not recommended for production use, because
it will block the script until the updates are handled, and if the bot receives a lot of updates, it will take a
long time to handle them. So it's recommended to use a multithreaded approach for production bots.
### Multi-Threaded Bots
To implement a multi-threaded bot, you need to install [TamerLib](https://git.n64.cc/nosial/libs/tamer) which will allow
you to run parallel operations using a Message Server
First create a worker process that will handle the updates:
```php
<?php
2023-02-20 22:01:35 -05:00
// Import ncc
require 'ncc';
// Import packages
import('net.nosial.tgbotlib');
2023-02-20 21:46:13 -05:00
import('net.nosial.tamerlib');
2023-02-20 22:01:35 -05:00
// Require commands
require 'commands' . DIRECTORY_SEPARATOR . 'StartCommand.php';
require 'commands' . DIRECTORY_SEPARATOR . 'HashCommand.php';
// Initialize the bot
2023-02-20 21:46:13 -05:00
$bot = new TgBotLib\Bot('bot_token');
2023-02-20 22:01:35 -05:00
// Set the command handlers
2023-02-20 21:46:13 -05:00
$bot->setCommandHandler('start', new \commands\StartCommand());
$bot->setCommandHandler('hash', new \commands\HashCommand());
2023-02-20 22:01:35 -05:00
// Initialize the worker & register the handle_update function
2023-02-20 21:46:13 -05:00
TamerLib\Tamer::initWorker();
TamerLib\Tamer::addFunction('handle_update', function (\TamerLib\Objects\Job $job) use ($bot)
{
$bot->handleUpdate(\TgBotLib\Objects\Telegram\Update::fromArray(json_decode($job->getData(), true)));
});
2023-02-20 22:01:35 -05:00
// Work forever
2023-02-20 21:46:13 -05:00
TamerLib\Tamer::work();
```
Then create a master process that will send the updates to the worker:
```php
<?php
2023-02-20 22:01:35 -05:00
// Import ncc
require 'ncc';
// Import packages
import('net.nosial.tgbotlib');
2023-02-20 21:46:13 -05:00
import('net.nosial.tamerlib');
2023-02-20 22:01:35 -05:00
// Require commands
require 'commands' . DIRECTORY_SEPARATOR . 'StartCommand.php';
require 'commands' . DIRECTORY_SEPARATOR . 'HashCommand.php';
// Initialize the bot
2023-02-20 21:46:13 -05:00
$bot = new TgBotLib\Bot('bot_token');
2023-02-20 22:01:35 -05:00
// Initialize the master & add the worker
TamerLib\Tamer::init(\TamerLib\Abstracts\ProtocolType::Gearman, [
'127.0.0.1:4730'
]);
2023-02-20 21:46:13 -05:00
TamerLib\Tamer::addWorker('handle_update', 4);
2023-02-20 22:01:35 -05:00
// Start the workers
TamerLib\Tamer::startWorkers();
2023-02-20 21:46:13 -05:00
2023-02-20 22:01:35 -05:00
// Handle updates forever
2023-02-20 21:46:13 -05:00
while(true)
{
/** @var \TgBotLib\Objects\Telegram\Update $update */
foreach ($bot->getUpdates() as $update)
{
2023-02-20 22:01:35 -05:00
TamerLib\Tamer::do('handle_update', json_encode($update->toArray()));
2023-02-20 21:46:13 -05:00
}
}
```
## Commands & Event Handlers
Commands and event handlers are a way to handle commands and events sent by the user, for example, when the user
sends the `/start` command, you can send a welcome message to the user.
### Commands
The library provides a way to handle commands and events using the `TgBotLib\Bot` class, for example, to handle
the `/start` command, you can use the `setCommandHandler` method:
```php
<?php
2023-02-20 22:01:35 -05:00
require 'ncc';
import('net.nosial.tgbotlib');
2023-02-20 21:46:13 -05:00
$bot = new TgBotLib\Bot(getenv('BOT_TOKEN'));
$bot->setCommandHandler('start', new \commands\StartCommand());
```
The `setCommandHandler` method takes two arguments, the first being the command name (without the `/` prefix), and
the second being a class that implements the `TgBotLib\Interfaces\CommandInterface` interface.
The interface has only one method, `handle`, which takes two arguments, the first being an instance of the
`TgBotLib\Bot` class which is used to invoke the API without having to recreate the instance, and the second being
the update object. The update object is an instance of the `TgBotLib\Objects\Telegram\Update` class, which contains
all the information about the update.
```php
<?php
namespace commands;
use TgBotLib\Bot;
use TgBotLib\Interfaces\CommandInterface;
use TgBotLib\Objects\Telegram\Update;
class StartCommand extends CommandInterface
{
public function handle(Bot $bot, Update $update): void
{
$bot->sendMessage($update->getMessage()->getChat()->getId(), 'Hello World!');
}
}
```
### Event Handlers
Event handles are similarly implemented, but instead of using the `setCommandHandler` method, you use the
`setEventHandler` method:
```php
<?php
require __DIR__ . DIRECTORY_SEPARATOR . 'autoload.php';
$bot = new TgBotLib\Bot(getenv('BOT_TOKEN'));
$bot->setEventHandler('message', new \events\MessageEvent());
```
And the interface EventInterface is used instead of CommandInterface:
```php
<?php
namespace events;
use TgBotLib\Bot;
use TgBotLib\Interfaces\EventInterface;
use TgBotLib\Objects\Telegram\Update;
class MessageEvent implements EventInterface
{
public function handle(Bot $bot, Update $update): void
{
$bot->sendMessage($update->getMessage()->getChat()->getId(), 'Hello World!');
}
}
```
2023-02-12 13:41:43 -05:00
# License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details