Skip to content

Commit

Permalink
Merge pull request #2 from yaleksandr89/bot/translation-bot
Browse files Browse the repository at this point in the history
Реализован бот переводчик v1
  • Loading branch information
yaleksandr89 authored Jul 13, 2023
2 parents b8178b0 + 775ee54 commit 5affb6d
Show file tree
Hide file tree
Showing 10 changed files with 662 additions and 42 deletions.
18 changes: 16 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
* Пример: если бот доступен по url `https://example.com/bot`, привязать его можно выполнив запрос: `https://api.telegram.org/bot{BOT_TOKEN}/setWebhook?url=https://example.com/bot` (наличие ssl - **обязательно**).
* Проверить статус бота можно, выполнив запрос: `https://api.telegram.org/bot{BOT_TOKEN}/getWebhook`

## Функционал ботов
## Реализованные боты

### simple-bot

Expand Down Expand Up @@ -53,7 +53,21 @@

> [Пример работающего TbaPhpSdkBot бота](https://t.me/TbaPhpSdkBot "Пример работающего TbaPhpSdkBot бота")
### translation-bot-v1

Бот переводчик, перевод фраз осуществляется с помощью `dejurin/php-google-translate-for-free`. Доступные переводы:

* С Английского на Русский
* С Русского на английский

Есть возможность переводить как слова, так и словосочетания и предложения. Реализована обработка ошибок, если в бот отправить
фото, видео, стикер или какой-то документ, пользователю вернется сообщение, что бот работает только с текстом.

> [Пример работающего ya_translation_bot бота](https://t.me/ya_translation_bot "Пример работающего ya_translation_bot бота")
---

### Для отладки в ботах реализован функционал записи в логи

* Возникающие исключения отлавливаются в `try/catch` и пишутся в файл `try_catch_logs.txt`, который находится в папке с ботом.
* Для записи ответов с телеграмм бота и запросов с вашей стороны реализован методы `addToLogs()` / `writeToLogs()`.
* Для записи ответов с телеграмм бота и запросов с вашей стороны реализован методы `addToLogs()` / `writeToLogs()`.
28 changes: 15 additions & 13 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
{
"require-dev": {
"symfony/var-dumper": "^6.0"
},
"require": {
"guzzlehttp/guzzle": "^7.4",
"irazasyed/telegram-bot-sdk": "^3.4"
},
"autoload": {
"psr-4": {
"SimpleBot\\": "simple-bot/",
"TbaPhpSdk\\": "tba-php-sdk/",
"YaTranslationBot\\": "translation-bot/"
}
"require-dev": {
"symfony/var-dumper": "^6.0"
},
"require": {
"guzzlehttp/guzzle": "^7.4",
"irazasyed/telegram-bot-sdk": "^3.4",
"dejurin/php-google-translate-for-free": "^1.0",
"ext-pdo": "*"
},
"autoload": {
"psr-4": {
"SimpleBot\\": "simple-bot/",
"TbaPhpSdk\\": "tba-php-sdk/",
"YaTranslationBot\\": "translation-bot-v1/"
}
}
}
44 changes: 43 additions & 1 deletion composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

44 changes: 27 additions & 17 deletions config.php.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php

/** RENAME THIS FILE TO config.php */
/** Переименовать в config.php */
/** Выполнить composer i */

require_once 'vendor/autoload.php';

Expand All @@ -11,26 +12,35 @@ require_once 'vendor/autoload.php';
*/
const BASE_URL = 'https://api.telegram.org/bot';


// >>> Token for local telegram bots
/**
* Токен используется для ботов из директории: local
*/
const FIRST_BOT_TOKEN = '...';
// Token for local telegram bots <<<


// >>> Token for remote telegram bots
/**
* Логин: ...
*
* Привязка URL к вебхуку:
* echo BASE_URL . EXAMPLE_TOKEN . '/setWebhook?url={{ URL YOUR SITE, https - required }}';
* Привязка URL к вебхука:
* https://api.telegram.org/bot{{EXAMPLE_TOKEN }}/setWebhook?url={{ URL YOUR SITE, https - required }}
*
* Проверка статуса вебхука:
* https://api.telegram.org/bot{{EXAMPLE_TOKEN }}/getWebhookInfo?url={{ URL YOUR SITE, https - required }}
* https://api.telegram.org/bot{{EXAMPLE_TOKEN }}/getWebhookInfo
*
* Удалить вебхук:
* https://api.telegram.org/bot{{EXAMPLE_TOKEN }}/setWebhook
*/
const SIMPLE_BOT_TOKEN = '...'; // Токен используется для ботов из директории: remote/echo-bot
const TBA_PHP_SDK_TOKEN = '...'; // Токен используется для ботов из директории: remote/tba-php-sdk
// Token for remote telegram bots <<<
const EXAMPLE_TOKEN = '...'; // Токен (создается в BotFather)

// Для подключения к БД (используется в некоторых ботах, например бот переводчик)
const PARAMS_DB = [
'type' => 'mysql',
'host' => 'localhost',
'name' => '{DB_NAME}',
'port' => '{DB_PORT}',
'user' => '{DB_USER}',
'password' => '{DB_PASSWORD}',
'options' => [
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
//PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION // формирование исключений для PHP < v.8
],
];

function db(): DB
{
return DB::getInstance()->getConnection(PARAMS_DB);
}
138 changes: 138 additions & 0 deletions translation-bot-v1/DB.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
<?php

namespace YaTranslationBot;

use PDO;
use PDOException;
use PDOStatement;

final class DB
{
private ?PDO $connection = null;

private PDOStatement $stmt;

private static ?DB $instance = null;

private function __construct()
{
}

private function __clone()
{
}

private function __wakeup()
{
}

public static function getInstance(): DB
{
return self::$instance ?? (self::$instance = new self());
}

public function getConnection(array $dbConfig): DB
{
if ($this->connection instanceof PDO) {
return $this;
}

$dsn = "{$dbConfig['type']}:host={$dbConfig['host']};port={$dbConfig['port']};dbname={$dbConfig['name']}";

try {
$this->connection = new PDO($dsn, $dbConfig['user'], $dbConfig['password'], $dbConfig['options']);
} catch (PDOException $exception) {
file_put_contents(
__DIR__ . '/try_catch_db_logs.txt',
date('d.m.Y H:i:s') . PHP_EOL . print_r($exception, true),
FILE_APPEND
);
die;
}

return $this;
}

public function query(string $query, array $params = []): false|DB
{
try {
$this->stmt = $this->connection->prepare($query);
$this->stmt->execute($params);
} catch (PDOException $exception) {
file_put_contents(
__DIR__ . '/try_catch_db_logs.txt',
date('d.m.Y H:i:s') . PHP_EOL . print_r($exception, true),
FILE_APPEND
);
die;
}

return $this;
}

public function findAll(): array
{
return $this
->stmt
->fetchAll();
}

public function find(): ?array
{
$result = $this
->stmt
->fetch();

if (!$result) {
return null;
}

return $result;
}

public function getChatId(int $chatId): ?array
{
return $this
->query('SELECT * FROM chat WHERE chat_id=:chatId', ['chatId' => $chatId])
->find();
}

public function setChat(
int $chatId,
string $firstName,
string $lastName,
string $username,
string $date,
string $lang
): void {
$this
->query(
'INSERT INTO chat
(chat_id, first_name, last_name, username, date, lang)
VALUES (:chatId, :firstName, :lastName, :username, :date, :lang)',
[
'chatId' => $chatId,
'firstName' => $firstName,
'lastName' => $lastName,
'username' => $username,
'date' => $date,
'lang' => $lang
]
);
}

public function updateChat(int $chatId, string $lang, string $date): void
{
$this
->query(
'UPDATE chat
SET lang=:lang, date=:date
WHERE chat_id=:chatId',
[
'chatId' => $chatId,
'lang' => $lang,
'date' => $date
]
);
}
}
18 changes: 18 additions & 0 deletions translation-bot-v1/FAQ/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
Создание таблицы `chat` в БД `telegram_bot_translation`:

```sql
CREATE TABLE `telegram_bot_translation`.`chat`
(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`chat_id` BIGINT UNSIGNED NOT NULL,
`first_name` VARCHAR(510) NOT NULL,
`last_name` VARCHAR(510) NOT NULL,
`username` VARCHAR(510) NOT NULL,
`date` DATETIME NOT NULL,
`lang` VARCHAR(50) NOT NULL,

PRIMARY KEY (`id`),
UNIQUE (`chat_id`)
)
ENGINE = InnoDB;
```
Loading

0 comments on commit 5affb6d

Please sign in to comment.