# bot.sendMessage()

### Отправить сообщение в мессенджер

```
bot.sendMessage(string|null|mixed $messageText, array|object|null $buttons = null, array|object|null $attachments = null, array|object|null $apiAdditionalParams = null, bool $isDisableBuffer = true, bool $isUpdateMessageButtons = false)
```

#### Описание:

Отправить сообщение в мессенджер, сообщение может содержать текст, кнопки меню и вложения. Если мессенджер поддерживает, то все это будет отправлено в едином сообщении, иначе по отдельности, в порядке: сначала вложение, затем текст и кнопки меню.

#### Атрибуты:

<table border="1" id="bkmrk-%D0%98%D0%BC%D1%8F-%D0%A2%D0%B8%D0%BF-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5-key-0" style="border-collapse: collapse; width: 100%; height: 177.731px;"><tbody><tr style="height: 29.7917px; background-color: #ced4d9;"><td style="width: 33.2909%; height: 29.7917px;">Имя</td><td style="width: 33.2909%; height: 29.7917px;">Тип</td><td style="width: 33.2948%; height: 29.7917px;">Описание</td></tr><tr style="height: 29.7917px;"><td style="width: 33.2909%; height: 29.7917px;">messageText</td><td style="width: 33.2909%; height: 29.7917px;">string|null|mixed</td><td style="width: 33.2948%; height: 29.7917px;">Текст сообщения</td></tr><tr style="height: 29.537px;"><td style="width: 33.2909%; height: 29.537px;">buttons </td><td style="width: 33.2909%; height: 29.537px;">array|object|null </td><td style="width: 33.2948%; height: 29.537px;">Кнопки</td></tr><tr style="height: 29.537px;"><td style="width: 33.2909%; height: 29.537px;">attachments </td><td style="width: 33.2909%; height: 29.537px;">array|object|null </td><td style="width: 33.2948%; height: 29.537px;">Вложения</td></tr><tr style="height: 29.537px;"><td style="width: 33.2909%; height: 29.537px;">apiAdditionalParams </td><td style="width: 33.2909%; height: 29.537px;">array|object|null </td><td style="width: 33.2948%; height: 29.537px;">Дополнительные параметры, которые будут отправлены по REST API в мессенджер. Работают только для Telegram</td></tr><tr style="height: 29.537px;"><td style="width: 33.2909%; height: 29.537px;">isDisableBuffer </td><td style="width: 33.2909%; height: 29.537px;">bool </td><td style="width: 33.2948%; height: 29.537px;">Принудительное отключение буффера исходящих сообщений</td></tr><tr><td style="width: 33.2909%;">isUpdateMessageButtons</td><td style="width: 33.2909%;">bool </td><td style="width: 33.2948%;">true, для обновления последнего отправленного сообщения в логе,  
чтобы не писать в лог повторы сообщений от GPT при апдейте</td></tr></tbody></table>

#### Возвращает:

**bool** - подтверждение успешной отправки сообщения.

#### Пример для Telegram:

##### Кнопки:

Пример Array of Array of Button без параметра line\_num:

```JavaScript
let inlineKeyboard = [[{
  "text": "🌳 Программа курса",           //Заголовок кнопки
  "callback_data": "btn_static_program",  //Данные которые отправляются в Telegram и прилетают во входящем вебхуке при нажатии кнопки
  "text_button_label": "1"                //Доп. заголовок, который клеится к тексту кнопки при выключеном inline режиме
}],
[{
  "text": "Открыть главное меню", 
  "callback_data": "btn_static_menu", 
  "text_button_label": "2"
}]];
```

Пример Array of Array of Button с параметром line\_num:

```JavaScript
let inlineKeyboard = [{
  "text": "🌳 Программа курса", 
  "callback_data": "btn_static_program", 
  "text_button_label": "1",
  "line_num": 0                           //Номер строки для группировки кнопок
},
{
  "text": "Открыть главное меню", 
  "callback_data": "btn_static_menu", 
  "text_button_label": "2",
  "line_num": 1
}];
```

<p class="callout warning">Если в значении параметра содержится строка \_static\_ то платформа Метабот не будет автоматически удалять inline кнопки после принятия входящего вебхука.</p>

##### Вложения:

```JavaScript
let attachments = [{
        				"type": "image", 
        				"url": "https://image.png"
      			   },
                   {
        				"type": "file", 
        				"url": "https://file.pdf"
      			   }]
```

Типы вложений: **'image' 'video' 'audio' 'file'**.

<p class="callout info">При отправке файлов (документов, не медиа) в Telegram по URL, нужно понимать, что только 'gif', 'zip', 'pdf' для документов отправляются по URL, для других расширений файл скачивается на сервер платформы а затем его содержимое отправляется в Telegram.</p>

##### Дополнительные параметры:

```JavaScript
let apiAdditionalParams = {
  							"endpoint": "deleteMessage",
  							"message_id": bot.getTelegramLastMessageId(),
        					"parse_mode": 'HTML',
  							"item": "параметр"
      			  		  }
```

##### Общий пример:

```JavaScript
//Сообщение отправляемое методом--------------------------------
let messageText = "Текст сообщения";
//--------------------------------------------------------------

//Кнопки отправляемые методом--------------------------------
let msg = bot.getIncomingMessage().toLowerCase();
if (["btn_static_program", "1"].includes(msg)) {
  return {
    break: true,
    run_script_by_code: 'courseProgram',             //Код активируемого по кнопке скрипта
  };
} else if (["btn_static_menu", "2"].includes(msg)) {
  return {
    break: true,
    run_script_by_code: 'Menu',
  };
}

let inlineKeyboard = [[{
  "text": "🌳 Программа курса", 
  "callback_data": "btn_static_program", 
  "text_button_label": "1"
}],
[{
  "text": "Открыть главное меню", 
  "callback_data": "btn_static_menu", 
  "text_button_label": "2"
}]];
//--------------------------------------------------------------

bot.sendMessage(
      messageText, 
      inlineKeyboard, 
      [{
        "type": "image", 
        "url": "https://s3.objstor.cloud4u.com/unti-prod-people/file/project/ob87fkfvxa.png"
      }],
      {
        "parse_mode": 'HTML'
      }
);
```

Дополнительно доступен предопределенный параметр «endpoint» – для замены параметра конечной точки в URL, например чтобы направить сообщение Телеграм не по классическому пути sendMessage а «по пути» editMessageMedia для редактирования сообщения, также можно подменить «endpoint», чтобы удалить сообщение, но для данных действий необходимо запоминать и передавать дополнительно как минимум параметр message\_id.

```JavaScript
// Функции для работы с id последнего сообщения
let getLastTelegramMessageId = function() {
  return parseInt(lead.getAttr("last_telegram_message_id"))
}

let hasLastTelegramMessageId = function() {
  let messageId = getLastTelegramMessageId()
  return (!isNaN(messageId) && messageId > 0)
}

let saveLastTelegramMessageId = function() {
  lead.setAttr("last_telegram_message_id", bot.getTelegramLastMessageId())
}

// Задание apiAdditionalParams
if (hasLastTelegramMessageId()) {
  if (endpoint) {
    let apiAdditionalParams = {
  								"endpoint": "editMessageText",              //"deleteMessage"
  								"message_id": getLastTelegramMessageId(),
        						"parse_mode": 'HTML'
      			  		  	  }
  }
} else {
  let apiAdditionalParams = { "parse_mode": 'HTML' }
  saveLastTelegramMessageId();
}
```

#### Пример для остальных каналов:

<p class="callout warning">Для всех каналов кроме Telegram не работает параметр **apiAdditionalParams**.</p>

<p class="callout info">Также группировка кнопок меню по строкам с помощью **line\_num** работает только в Telegram. Даже если указать номера строк, кнопки будут отправлены по порядку их определения в массиве.</p>

```JavaScript
//Сообщение отправляемое методом--------------------------------
let messageText = "Текст сообщения";
//--------------------------------------------------------------

//Кнопки отправляемые методом--------------------------------
let msg = bot.getIncomingMessage().toLowerCase();
if (["btn_static_program", "1"].includes(msg)) {
  return {
    break: true,
    run_script_by_code: 'courseProgram',             //Код активируемого по кнопке скрипта
  };
} else if (["btn_static_menu", "2"].includes(msg)) {
  return {
    break: true,
    run_script_by_code: 'Menu',
  };
}

let inlineKeyboard = [[{
  "text": "🌳 Программа курса", 
  "callback_data": "btn_static_program", 
  "text_button_label": "1"
}],
[{
  "text": "Открыть главное меню", 
  "callback_data": "btn_static_menu", 
  "text_button_label": "2"
}]];
//--------------------------------------------------------------

bot.sendMessage(
      messageText, 
      inlineKeyboard, 
      [{
        "type": "image", 
        "url": "https://s3.objstor.cloud4u.com/unti-prod-people/file/project/ob87fkfvxa.png"
      }]
);
```

<p class="callout warning">Отправка файлов доступна для следующих каналов: **Telegram**, **Metabot Wiget**. Для остальных параметр **attachments** следует убрать из метода.</p>