1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-08-24 19:49:22 +02:00

GAPI: Журналы

This commit is contained in:
Anton Titovets
2025-03-16 12:28:41 +03:00
parent e65082da19
commit 9b4743907f
20 changed files with 7636 additions and 6713 deletions

File diff suppressed because it is too large Load Diff

32
src/addins/rcon/Cargo.lock generated Normal file
View File

@@ -0,0 +1,32 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "OPI_TCPClient"
version = "0.1.0"
dependencies = [
"addin1c",
]
[[package]]
name = "addin1c"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef34e8b7ff4c43e87491a4cc30a4779a9f67c50db43378a36362c7a56246e05b"
dependencies = [
"smallvec",
"utf16_lit",
]
[[package]]
name = "smallvec"
version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
[[package]]
name = "utf16_lit"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14706d2a800ee8ff38c1d3edb873cd616971ea59eb7c0d046bb44ef59b06a1ae"

View File

@@ -0,0 +1,16 @@
[package]
name = "OPI_TCPClient"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[profile.release]
lto = true # Enable Link Time Optimization
codegen-units = 1 # Reduce number of codegen units to increase optimizations.
panic = "abort" # Abort on panic
strip = true # Automatically strip symbols from the binary.
[dependencies]
addin1c = "0.5.0"

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<bundle xmlns='http://v8.1c.ru/8.2/addin/bundle' name='OPIADDIN'>
<component os='Windows' path='AddIn_x86_windows.dll' type='native' arch='i386' />
<component os='Windows' path='AddIn_x64_windows.dll' type='native' arch='x86_64' />
<component os='Linux' path='AddIn_x86_linux.so' type='native' arch='i386' />
<component os='Linux' path='AddIn_x64_linux.so' type='native' arch='x86_64' />
</bundle>

68
src/addins/rcon/release.bat vendored Normal file
View File

@@ -0,0 +1,68 @@
@echo off
:: Установить переменную
set LIB_NAME=OPI_RCON
set OPENSSL_DIR=C:\msys64\mingw64
set OPENSSL_LIB_DIR=%OPENSSL_DIR%\lib
set OPENSSL_INCLUDE_DIR=%OPENSSL_DIR%\include
:: Перейти в директорию проекта
cd /d "%~dp0"
:: Создать папку для артефактов
set OUTPUT_DIR=artifacts
if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"
:: Сборка для x86_64-pc-windows-msvc
cargo build --release --target x86_64-pc-windows-msvc
if errorlevel 1 goto :error
:: Сборка для x86_64-unknown-linux-gnu
cargo zigbuild --release --target x86_64-unknown-linux-gnu
if errorlevel 1 goto :error
:: Сборка для i686-pc-windows-msvc
cargo build --release --target i686-pc-windows-msvc
if errorlevel 1 goto :error
:: Сборка для i686-unknown-linux-gnu
cargo zigbuild --release --target i686-unknown-linux-gnu
if errorlevel 1 goto :error
:: Копирование файлов .dll и .so
copy /y target\x86_64-pc-windows-msvc\release\%LIB_NAME%.dll "%OUTPUT_DIR%\AddIn_x64_windows.dll"
if errorlevel 1 goto :error
copy /y target\i686-pc-windows-msvc\release\%LIB_NAME%.dll "%OUTPUT_DIR%\AddIn_x86_windows.dll"
if errorlevel 1 goto :error
copy /y target\x86_64-unknown-linux-gnu\release\lib%LIB_NAME%.so "%OUTPUT_DIR%\AddIn_x64_linux.so"
if errorlevel 1 goto :error
copy /y target\i686-unknown-linux-gnu\release\lib%LIB_NAME%.so "%OUTPUT_DIR%\AddIn_x86_linux.so"
if errorlevel 1 goto :error
copy /y MANIFEST.XML "%OUTPUT_DIR%\MANIFEST.XML"
if errorlevel 1 goto :error
:: Архивация
powershell -Command "Compress-Archive -Path '%OUTPUT_DIR%\*' -Force -DestinationPath '%LIB_NAME%.zip'"
if errorlevel 1 goto :error
copy /y "%LIB_NAME%.zip" "../../ru/OInt/addins/%LIB_NAME%.zip"
copy /y "%LIB_NAME%.zip" "../../en/OInt/addins/%LIB_NAME%.zip"
copy /y "%LIB_NAME%.zip" "../../ru/OPI/src/CommonTemplates/%LIB_NAME%/Template.addin"
copy /y "%LIB_NAME%.zip" "../../en/OPI/src/CommonTemplates/%LIB_NAME%/Template.addin"
if exist "%OUTPUT_DIR%" (
rmdir /S /Q "%OUTPUT_DIR%"
)
@echo Build and packaging completed successfully.
exit /b 0
:error
@echo An error occurred during the build or packaging process.
exit /b 1

View File

@@ -0,0 +1,78 @@
use std::io::{Read, Write};
use std::net::{Shutdown, TcpStream};
use std::time::{Duration, Instant};
/// Отправляет данные
pub fn send(connection: &mut TcpStream, data: Vec<u8>, timeout_ms: i32) -> bool {
if timeout_ms > 0 {
let timeout = Duration::from_millis(timeout_ms as u64);
connection.set_write_timeout(Some(timeout)).ok();
};
match connection.write(&data) {
Ok(_) => connection.flush().is_ok(),
Err(_) => false, // Ошибка при отправке данных
}
}
/// Считывает данные
pub fn receive(
connection: &mut TcpStream,
max_data_size: i32,
end_marker: Vec<u8>,
timeout_ms: i32
) -> Vec<u8> {
const BUFFER_SIZE: usize = 1024; // Размер временного буфера
const MIN_READ_TIMEOUT_MS: u64 = 200; // Минимальный таймаут для чтения
let mut result = Vec::new();
let mut buffer = vec![0u8; BUFFER_SIZE];
// Устанавливаем общее время ожидания
let total_timeout = Duration::from_millis(timeout_ms as u64);
let start_time = Instant::now(); // Время начала работы функции
let min_read_timeout = Duration::from_millis(MIN_READ_TIMEOUT_MS);
let marker_exists = !end_marker.is_empty();
connection.set_read_timeout(Some(min_read_timeout)).ok();
loop {
// Проверяем общее время выполнения
if start_time.elapsed() >= total_timeout {
break; // Прерываем, если общее время истекло
}
// Завершаем цикл, если превышен лимит данных
if max_data_size > 0 && result.len() >= max_data_size as usize {
break;
}
match connection.read(&mut buffer) {
Ok(0) => break, // EOF — конец данных
Ok(size) => {
result.extend_from_slice(&buffer[..size]);
// Завершаем цикл, если получен конец сообщения (если end_marker задан)
if marker_exists && result.ends_with(&end_marker) {
break;
}
}
Err(ref e) if e.kind() == std::io::ErrorKind::WouldBlock => continue,
Err(_) => break, // Любая другая ошибка завершает чтение
}
}
result
}
/// Закрывает соединение
pub fn disconnect(add_in: &mut crate::component::AddIn) -> bool {
add_in.connection = None;
true
}
/// Закрытие потока записи
pub fn close_output(connection: &mut TcpStream) -> bool {
connection.shutdown(Shutdown::Write).is_ok()
}

View File

@@ -0,0 +1,127 @@
mod methods;
use addin1c::{name, Variant};
use crate::core::getset;
use std::net::TcpStream;
use crate::component::methods::disconnect;
// МЕТОДЫ КОМПОНЕНТЫ -------------------------------------------------------------------------------
// Синонимы
pub const METHODS: &[&[u16]] = &[
name!("Connect"), // 0
name!("Disconnect"), // 1
name!("Read"), // 2
name!("Send"), // 3
name!("CloseOutput") // 4
];
// Число параметров функций компоненты
pub fn get_params_amount(num: usize) -> usize {
match num {
0 => 0,
1 => 0,
2 => 3,
3 => 2,
4 => 0,
_ => 0,
}
}
// Соответствие функций Rust функциям компоненты
// Вызовы должны быть обернуты в Box::new
pub fn cal_func(obj: &mut AddIn, num: usize, params: &mut [Variant]) -> Box<dyn getset::ValueType> {
let empty_array: [u8; 0] = [];
match num {
0 => Box::new(obj.connect()),
1 => {
disconnect(obj);
Box::new(true) // Возвращаем true для обозначения успешного выполнения
},
2 => {
let maxsize = params[0].get_i32().unwrap_or(0);
let marker = params[1].get_blob().unwrap_or(&empty_array);
let timeout = params[2].get_i32().unwrap_or(0);
if let Some(ref mut connection) = obj.connection {
Box::new(methods::receive(connection, maxsize, marker.to_vec(), timeout))
} else {
Box::new("OPI: Connection closed".as_bytes().to_vec())
}
},
3 => {
let data = params[0].get_blob().unwrap_or(&empty_array);
let timeout = params[1].get_i32().unwrap_or(0);
if let Some(ref mut connection) = obj.connection {
Box::new(methods::send(connection, data.to_vec(), timeout))
} else {
Box::new(false) // Если соединения нет, возвращаем false
}
},
4 =>{
if let Some(ref mut connection) = obj.connection {
Box::new(methods::close_output(connection))
} else {
Box::new(false)
}
}
_ => Box::new(false), // Неверный номер команды
}
}
// -------------------------------------------------------------------------------------------------
// ПОЛЯ КОМПОНЕНТЫ ---------------------------------------------------------------------------------
// Синонимы
pub const PROPS: &[&[u16]] = &[
name!("Address")
];
pub struct AddIn {
pub address: String,
connection: Option<TcpStream>,
}
impl AddIn {
/// Создает новый объект
pub fn new() -> Self {
AddIn {
address: String::new(),
connection: None,
}
}
/// Подключается к серверу
pub fn connect(&mut self) -> bool {
if self.address.is_empty() {
return false; // Ошибка: пустой адрес
}
match TcpStream::connect(&self.address) {
Ok(tcp_stream) => {
self.connection = Some(tcp_stream);
true
}
Err(_) => false, // Ошибка при подключении
}
}
pub fn get_field_ptr(&self, index: usize) -> *const dyn getset::ValueType {
match index {
0 => &self.address as &dyn getset::ValueType as *const _,
_ => panic!("Index out of bounds"),
}
}
pub fn get_field_ptr_mut(&mut self, index: usize) -> *mut dyn getset::ValueType { self.get_field_ptr(index) as *mut _ }
}
// -------------------------------------------------------------------------------------------------

View File

@@ -0,0 +1,78 @@
use addin1c::{Variant, Tm};
pub trait ValueType {
fn get_value(&self, val: &mut Variant) -> bool;
fn set_value(&mut self, val: &Variant);
}
// Реализация для i32
impl ValueType for i32 {
fn get_value(&self, val: &mut Variant) -> bool {
val.set_i32(*self);
true
}
fn set_value(&mut self, val: &Variant) {
*self = val.get_i32().unwrap_or(0);
}
}
// Реализация для f64
impl ValueType for f64 {
fn get_value(&self, val: &mut Variant) -> bool {
val.set_f64(*self);
true
}
fn set_value(&mut self, val: &Variant) {
*self = val.get_f64().unwrap_or(0.0);
}
}
// Реализация для bool
impl ValueType for bool {
fn get_value(&self, val: &mut Variant) -> bool {
val.set_bool(*self);
true
}
fn set_value(&mut self, val: &Variant) {
*self = val.get_bool().unwrap_or(false);
}
}
// Реализация для tm
impl ValueType for Tm {
fn get_value(&self, val: &mut Variant) -> bool {
val.set_date(*self);
true
}
fn set_value(&mut self, val: &Variant) {
*self = val.get_date().unwrap_or(Tm::default());
}
}
// Реализация для String
impl ValueType for String {
fn get_value(&self, val: &mut Variant) -> bool {
let s: Vec<u16> = self.encode_utf16().collect();
val.set_str1c(s.as_slice()).is_ok()
}
fn set_value(&mut self, val: &Variant) {
*self = val.get_string().unwrap_or("".to_string());
}
}
// Реализация для Vec<u8>
impl ValueType for Vec<u8> {
fn get_value(&self, val: &mut Variant) -> bool {
val.set_blob(self.as_slice()).is_ok()
}
fn set_value(&mut self, val: &Variant) {
*self = val.get_blob().unwrap_or(&[]).to_vec()
}
}

View File

@@ -0,0 +1,59 @@
pub mod getset;
use addin1c::{name, RawAddin, Variant};
use crate::component::METHODS;
use crate::component::PROPS;
use crate::component::get_params_amount;
use crate::component::cal_func;
use crate::component::AddIn;
// Обработка удаления объекта
impl Drop for AddIn {
fn drop(&mut self) {}
}
// Определение класса
impl RawAddin for AddIn {
fn register_extension_as(&mut self) -> &'static [u16] {
name!("Main")
}
fn get_n_props(&mut self) -> usize {
PROPS.len()
}
fn find_prop(&mut self, name: &[u16]) -> Option<usize> {
PROPS.iter().position(|&x| x == name)
}
fn get_prop_name(&mut self, num: usize, _alias: usize) -> Option<&'static [u16]> { PROPS.get(num).copied() }
fn get_prop_val(&mut self, num: usize, val: &mut Variant) -> bool {let field: &dyn getset::ValueType = &self[num]; field.get_value(val) }
fn set_prop_val(&mut self, num: usize, val: &Variant) -> bool {let field: &mut dyn getset::ValueType = &mut self[num]; field.set_value(val); true }
fn is_prop_readable(&mut self, _num: usize) -> bool { true }
fn is_prop_writable(&mut self, num: usize) -> bool { true }
fn get_n_methods(&mut self) -> usize { METHODS.len() }
fn find_method(&mut self, name: &[u16]) -> Option<usize> { METHODS.iter().position(|&x| x == name) }
fn get_method_name(&mut self, num: usize, _alias: usize) -> Option<&'static [u16]> { METHODS.get(num).copied() }
fn get_n_params(&mut self, num: usize) -> usize { get_params_amount(num) }
fn get_param_def_value(&mut self, _method_num: usize, _param_num: usize, _value: Variant, ) -> bool { true }
fn has_ret_val(&mut self, num: usize) -> bool { true }
fn call_as_proc(&mut self, _num: usize, _params: &mut [Variant]) -> bool { false }
fn call_as_func(&mut self, num: usize, params: &mut [Variant], ret_value: &mut Variant, ) -> bool { cal_func(self, num, params).get_value(ret_value) }
}
impl std::ops::Index<usize> for AddIn {
type Output = dyn getset::ValueType;
fn index(&self, index: usize) -> &Self::Output {
unsafe { &*self.get_field_ptr(index) }
}
}
impl std::ops::IndexMut<usize> for AddIn {
fn index_mut(&mut self, index: usize) -> &mut Self::Output {
unsafe { &mut *self.get_field_ptr_mut(index) }
}
}

View File

@@ -0,0 +1,48 @@
pub mod component;
mod core;
use std::{
ffi::{c_int, c_long, c_void},
sync::atomic::{AtomicI32, Ordering},
};
use component::AddIn;
use addin1c::{create_component, destroy_component, name, AttachType};
pub static mut PLATFORM_CAPABILITIES: AtomicI32 = AtomicI32::new(-1);
#[allow(non_snake_case)]
#[no_mangle]
pub unsafe extern "C" fn GetClassObject(name: *const u16, component: *mut *mut c_void) -> c_long {
let addin = AddIn::new();
create_component(component, addin)
}
#[allow(non_snake_case)]
#[no_mangle]
pub unsafe extern "C" fn DestroyObject(component: *mut *mut c_void) -> c_long {
destroy_component(component)
}
#[allow(non_snake_case)]
#[no_mangle]
pub extern "C" fn GetClassNames() -> *const u16 {
// small strings for performance
name!("Main").as_ptr()
}
#[allow(non_snake_case)]
#[no_mangle]
pub unsafe extern "C" fn SetPlatformCapabilities(capabilities: c_int) -> c_int {
PLATFORM_CAPABILITIES.store(capabilities, Ordering::Relaxed);
3
}
#[allow(non_snake_case)]
#[no_mangle]
pub extern "C" fn GetAttachType() -> AttachType {
AttachType::Any
}

View File

@@ -1062,6 +1062,56 @@
КонецФункции
// Получить журнал входящих сообщений
// Получает список входящих сообщений инстанса за указанный интервал
//
// Примечание:
// Метод в документации API: [LastIncomingMessages](@green-api.com/docs/api/journals/LastIncomingMessages/)
//
// Параметры:
// ПараметрыДоступа - Структура Из КлючИЗначение - Параметры доступа. См. СформироватьПараметрыДоступа - access
// Период - Число - Время в минутах, за которое требуется показать сообщения - period
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Green API
Функция ПолучитьЖурналВходящихСообщений(Знач ПараметрыДоступа, Знач Период = 1440) Экспорт
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("minutes", Период, "Число" , Параметры);
URL = СформироватьОсновнойURL(ПараметрыДоступа, "lastIncomingMessages");
Ответ = OPI_Инструменты.Get(URL, Параметры);
Возврат Ответ;
КонецФункции
// Получить журнал исходящих сообщений
// Получает список исходящих сообщений инстанса за указанный интервал
//
// Примечание:
// Метод в документации API: [LastOutgoingMessages](@green-api.com/docs/api/journals/LastOutgoingMessages/)
//
// Параметры:
// ПараметрыДоступа - Структура Из КлючИЗначение - Параметры доступа. См. СформироватьПараметрыДоступа - access
// Период - Число - Время в минутах, за которое требуется показать сообщения - period
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Green API
Функция ПолучитьЖурналИсходящихСообщений(Знач ПараметрыДоступа, Знач Период = 1440) Экспорт
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("minutes", Период, "Число" , Параметры);
URL = СформироватьОсновнойURL(ПараметрыДоступа, "lastOutgoingMessages");
Ответ = OPI_Инструменты.Get(URL, Параметры);
Возврат Ответ;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@@ -2498,6 +2498,8 @@
GreenAPI_ПолучитьИсториюЧата(ПараметрыТеста);
GreenAPI_ПолучитьСообщение(ПараметрыТеста);
GreenAPI_ПолучитьЖурналВходящихСообщений(ПараметрыТеста);
GreenAPI_ПолучитьЖурналИсходящихСообщений(ПараметрыТеста);
КонецПроцедуры
@@ -19257,6 +19259,40 @@
КонецПроцедуры
Процедура GreenAPI_ПолучитьЖурналВходящихСообщений(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
MediaUrl = ПараметрыФункции["GreenAPI_MediaURL"];
IdInstance = ПараметрыФункции["GreenAPI_IdInstance"];
ApiTokenInstance = ПараметрыФункции["GreenAPI_Token"];
ПараметрыДоступа = OPI_GreenAPI.СформироватьПараметрыДоступа(ApiUrl, MediaUrl, IdInstance, ApiTokenInstance);
Результат = OPI_GreenAPI.ПолучитьЖурналВходящихСообщений(ПараметрыДоступа);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЖурналВходящихСообщений", "GreenAPI");
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат);
КонецПроцедуры
Процедура GreenAPI_ПолучитьЖурналИсходящихСообщений(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
MediaUrl = ПараметрыФункции["GreenAPI_MediaURL"];
IdInstance = ПараметрыФункции["GreenAPI_IdInstance"];
ApiTokenInstance = ПараметрыФункции["GreenAPI_Token"];
ПараметрыДоступа = OPI_GreenAPI.СформироватьПараметрыДоступа(ApiUrl, MediaUrl, IdInstance, ApiTokenInstance);
Результат = OPI_GreenAPI.ПолучитьЖурналИсходящихСообщений(ПараметрыДоступа);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЖурналИсходящихСообщений", "GreenAPI");
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат);
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@@ -2428,6 +2428,19 @@
КонецПроцедуры
Процедура CLI_GAPI_ОчередьСообщений() Экспорт
ПараметрыТеста = Новый Структура;
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GreenAPI_ApiURL" , ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GreenAPI_MediaURL" , ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GreenAPI_IdInstance" , ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GreenAPI_Token" , ПараметрыТеста);
CLI_GreenAPI_ПолучитьОчередьСообщений(ПараметрыТеста);
CLI_GreenAPI_ОчиститьОчередьСообщений(ПараметрыТеста);
КонецПроцедуры
Процедура CLI_GAPI_ЖурналыСообщений() Экспорт
ПараметрыТеста = Новый Структура;
@@ -2440,6 +2453,8 @@
CLI_GreenAPI_ПолучитьИсториюЧата(ПараметрыТеста);
CLI_GreenAPI_ПолучитьСообщение(ПараметрыТеста);
CLI_GreenAPI_ПолучитьЖурналВходящихСообщений(ПараметрыТеста);
CLI_GreenAPI_ПолучитьЖурналИсходящихСообщений(ПараметрыТеста);
КонецПроцедуры
@@ -21521,6 +21536,56 @@
КонецПроцедуры
Процедура CLI_GreenAPI_ПолучитьОчередьСообщений(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
MediaUrl = ПараметрыФункции["GreenAPI_MediaURL"];
IdInstance = ПараметрыФункции["GreenAPI_IdInstance"];
ApiTokenInstance = ПараметрыФункции["GreenAPI_Token"];
Опции = Новый Структура;
Опции.Вставить("api" , ApiUrl);
Опции.Вставить("media", MediaUrl);
Опции.Вставить("id" , IdInstance);
Опции.Вставить("token", ApiTokenInstance);
ПараметрыДоступа = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "СформироватьПараметрыДоступа", Опции);
Опции = Новый Структура;
Опции.Вставить("access" , ПараметрыДоступа);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "ПолучитьОчередьСообщений", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПолучитьОчередьСообщений", "GreenAPI");
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат);
КонецПроцедуры
Процедура CLI_GreenAPI_ОчиститьОчередьСообщений(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
MediaUrl = ПараметрыФункции["GreenAPI_MediaURL"];
IdInstance = ПараметрыФункции["GreenAPI_IdInstance"];
ApiTokenInstance = ПараметрыФункции["GreenAPI_Token"];
Опции = Новый Структура;
Опции.Вставить("api" , ApiUrl);
Опции.Вставить("media", MediaUrl);
Опции.Вставить("id" , IdInstance);
Опции.Вставить("token", ApiTokenInstance);
ПараметрыДоступа = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "СформироватьПараметрыДоступа", Опции);
Опции = Новый Структура;
Опции.Вставить("access" , ПараметрыДоступа);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "ОчиститьОчередьСообщений", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ОчиститьОчередьСообщений", "GreenAPI");
OPI_ПолучениеДанныхТестов.Проверка_ГринОчисткаОчереди(Результат);
КонецПроцедуры
Процедура CLI_GreenAPI_ПолучитьИсториюЧата(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
@@ -21554,7 +21619,6 @@
КонецПроцедуры
Процедура CLI_GreenAPI_ПолучитьСообщение(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
@@ -21585,6 +21649,56 @@
КонецПроцедуры
Процедура CLI_GreenAPI_ПолучитьЖурналВходящихСообщений(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
MediaUrl = ПараметрыФункции["GreenAPI_MediaURL"];
IdInstance = ПараметрыФункции["GreenAPI_IdInstance"];
ApiTokenInstance = ПараметрыФункции["GreenAPI_Token"];
Опции = Новый Структура;
Опции.Вставить("api" , ApiUrl);
Опции.Вставить("media", MediaUrl);
Опции.Вставить("id" , IdInstance);
Опции.Вставить("token", ApiTokenInstance);
ПараметрыДоступа = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "СформироватьПараметрыДоступа", Опции);
Опции = Новый Структура;
Опции.Вставить("access" , ПараметрыДоступа);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "ПолучитьЖурналВходящихСообщений", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПолучитьЖурналВходящихСообщений", "GreenAPI");
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат);
КонецПроцедуры
Процедура CLI_GreenAPI_ПолучитьЖурналИсходящихСообщений(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
MediaUrl = ПараметрыФункции["GreenAPI_MediaURL"];
IdInstance = ПараметрыФункции["GreenAPI_IdInstance"];
ApiTokenInstance = ПараметрыФункции["GreenAPI_Token"];
Опции = Новый Структура;
Опции.Вставить("api" , ApiUrl);
Опции.Вставить("media", MediaUrl);
Опции.Вставить("id" , IdInstance);
Опции.Вставить("token", ApiTokenInstance);
ПараметрыДоступа = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "СформироватьПараметрыДоступа", Опции);
Опции = Новый Структура;
Опции.Вставить("access" , ПараметрыДоступа);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "ПолучитьЖурналИсходящихСообщений", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПолучитьЖурналИсходящихСообщений", "GreenAPI");
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат);
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@@ -2321,9 +2321,9 @@
КонецФункции
Функция ПолучитьОбщийМодуль(Знач Имя)
Модуль = Вычислить(Имя);
Возврат Модуль;
КонецФункции

View File

@@ -1062,6 +1062,56 @@
КонецФункции
// Получить журнал входящих сообщений
// Получает список входящих сообщений инстанса за указанный интервал
//
// Примечание:
// Метод в документации API: [LastIncomingMessages](@green-api.com/docs/api/journals/LastIncomingMessages/)
//
// Параметры:
// ПараметрыДоступа - Структура Из КлючИЗначение - Параметры доступа. См. СформироватьПараметрыДоступа - access
// Период - Число - Время в минутах, за которое требуется показать сообщения - period
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Green API
Функция ПолучитьЖурналВходящихСообщений(Знач ПараметрыДоступа, Знач Период = 1440) Экспорт
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("minutes", Период, "Число" , Параметры);
URL = СформироватьОсновнойURL(ПараметрыДоступа, "lastIncomingMessages");
Ответ = OPI_Инструменты.Get(URL, Параметры);
Возврат Ответ;
КонецФункции
// Получить журнал исходящих сообщений
// Получает список исходящих сообщений инстанса за указанный интервал
//
// Примечание:
// Метод в документации API: [LastOutgoingMessages](@green-api.com/docs/api/journals/LastOutgoingMessages/)
//
// Параметры:
// ПараметрыДоступа - Структура Из КлючИЗначение - Параметры доступа. См. СформироватьПараметрыДоступа - access
// Период - Число - Время в минутах, за которое требуется показать сообщения - period
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Green API
Функция ПолучитьЖурналИсходящихСообщений(Знач ПараметрыДоступа, Знач Период = 1440) Экспорт
Параметры = Новый Структура;
OPI_Инструменты.ДобавитьПоле("minutes", Период, "Число" , Параметры);
URL = СформироватьОсновнойURL(ПараметрыДоступа, "lastOutgoingMessages");
Ответ = OPI_Инструменты.Get(URL, Параметры);
Возврат Ответ;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@@ -2498,6 +2498,8 @@
GreenAPI_ПолучитьИсториюЧата(ПараметрыТеста);
GreenAPI_ПолучитьСообщение(ПараметрыТеста);
GreenAPI_ПолучитьЖурналВходящихСообщений(ПараметрыТеста);
GreenAPI_ПолучитьЖурналИсходящихСообщений(ПараметрыТеста);
КонецПроцедуры
@@ -19257,6 +19259,40 @@
КонецПроцедуры
Процедура GreenAPI_ПолучитьЖурналВходящихСообщений(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
MediaUrl = ПараметрыФункции["GreenAPI_MediaURL"];
IdInstance = ПараметрыФункции["GreenAPI_IdInstance"];
ApiTokenInstance = ПараметрыФункции["GreenAPI_Token"];
ПараметрыДоступа = OPI_GreenAPI.СформироватьПараметрыДоступа(ApiUrl, MediaUrl, IdInstance, ApiTokenInstance);
Результат = OPI_GreenAPI.ПолучитьЖурналВходящихСообщений(ПараметрыДоступа);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЖурналВходящихСообщений", "GreenAPI");
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат);
КонецПроцедуры
Процедура GreenAPI_ПолучитьЖурналИсходящихСообщений(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
MediaUrl = ПараметрыФункции["GreenAPI_MediaURL"];
IdInstance = ПараметрыФункции["GreenAPI_IdInstance"];
ApiTokenInstance = ПараметрыФункции["GreenAPI_Token"];
ПараметрыДоступа = OPI_GreenAPI.СформироватьПараметрыДоступа(ApiUrl, MediaUrl, IdInstance, ApiTokenInstance);
Результат = OPI_GreenAPI.ПолучитьЖурналИсходящихСообщений(ПараметрыДоступа);
// END
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЖурналИсходящихСообщений", "GreenAPI");
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат);
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@@ -2428,6 +2428,19 @@
КонецПроцедуры
Процедура CLI_GAPI_ОчередьСообщений() Экспорт
ПараметрыТеста = Новый Структура;
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GreenAPI_ApiURL" , ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GreenAPI_MediaURL" , ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GreenAPI_IdInstance" , ПараметрыТеста);
OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GreenAPI_Token" , ПараметрыТеста);
CLI_GreenAPI_ПолучитьОчередьСообщений(ПараметрыТеста);
CLI_GreenAPI_ОчиститьОчередьСообщений(ПараметрыТеста);
КонецПроцедуры
Процедура CLI_GAPI_ЖурналыСообщений() Экспорт
ПараметрыТеста = Новый Структура;
@@ -2440,6 +2453,8 @@
CLI_GreenAPI_ПолучитьИсториюЧата(ПараметрыТеста);
CLI_GreenAPI_ПолучитьСообщение(ПараметрыТеста);
CLI_GreenAPI_ПолучитьЖурналВходящихСообщений(ПараметрыТеста);
CLI_GreenAPI_ПолучитьЖурналИсходящихСообщений(ПараметрыТеста);
КонецПроцедуры
@@ -21521,6 +21536,56 @@
КонецПроцедуры
Процедура CLI_GreenAPI_ПолучитьОчередьСообщений(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
MediaUrl = ПараметрыФункции["GreenAPI_MediaURL"];
IdInstance = ПараметрыФункции["GreenAPI_IdInstance"];
ApiTokenInstance = ПараметрыФункции["GreenAPI_Token"];
Опции = Новый Структура;
Опции.Вставить("api" , ApiUrl);
Опции.Вставить("media", MediaUrl);
Опции.Вставить("id" , IdInstance);
Опции.Вставить("token", ApiTokenInstance);
ПараметрыДоступа = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "СформироватьПараметрыДоступа", Опции);
Опции = Новый Структура;
Опции.Вставить("access" , ПараметрыДоступа);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "ПолучитьОчередьСообщений", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПолучитьОчередьСообщений", "GreenAPI");
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат);
КонецПроцедуры
Процедура CLI_GreenAPI_ОчиститьОчередьСообщений(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
MediaUrl = ПараметрыФункции["GreenAPI_MediaURL"];
IdInstance = ПараметрыФункции["GreenAPI_IdInstance"];
ApiTokenInstance = ПараметрыФункции["GreenAPI_Token"];
Опции = Новый Структура;
Опции.Вставить("api" , ApiUrl);
Опции.Вставить("media", MediaUrl);
Опции.Вставить("id" , IdInstance);
Опции.Вставить("token", ApiTokenInstance);
ПараметрыДоступа = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "СформироватьПараметрыДоступа", Опции);
Опции = Новый Структура;
Опции.Вставить("access" , ПараметрыДоступа);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "ОчиститьОчередьСообщений", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ОчиститьОчередьСообщений", "GreenAPI");
OPI_ПолучениеДанныхТестов.Проверка_ГринОчисткаОчереди(Результат);
КонецПроцедуры
Процедура CLI_GreenAPI_ПолучитьИсториюЧата(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
@@ -21554,7 +21619,6 @@
КонецПроцедуры
Процедура CLI_GreenAPI_ПолучитьСообщение(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
@@ -21585,6 +21649,56 @@
КонецПроцедуры
Процедура CLI_GreenAPI_ПолучитьЖурналВходящихСообщений(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
MediaUrl = ПараметрыФункции["GreenAPI_MediaURL"];
IdInstance = ПараметрыФункции["GreenAPI_IdInstance"];
ApiTokenInstance = ПараметрыФункции["GreenAPI_Token"];
Опции = Новый Структура;
Опции.Вставить("api" , ApiUrl);
Опции.Вставить("media", MediaUrl);
Опции.Вставить("id" , IdInstance);
Опции.Вставить("token", ApiTokenInstance);
ПараметрыДоступа = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "СформироватьПараметрыДоступа", Опции);
Опции = Новый Структура;
Опции.Вставить("access" , ПараметрыДоступа);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "ПолучитьЖурналВходящихСообщений", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПолучитьЖурналВходящихСообщений", "GreenAPI");
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат);
КонецПроцедуры
Процедура CLI_GreenAPI_ПолучитьЖурналИсходящихСообщений(ПараметрыФункции)
ApiUrl = ПараметрыФункции["GreenAPI_ApiURL"];
MediaUrl = ПараметрыФункции["GreenAPI_MediaURL"];
IdInstance = ПараметрыФункции["GreenAPI_IdInstance"];
ApiTokenInstance = ПараметрыФункции["GreenAPI_Token"];
Опции = Новый Структура;
Опции.Вставить("api" , ApiUrl);
Опции.Вставить("media", MediaUrl);
Опции.Вставить("id" , IdInstance);
Опции.Вставить("token", ApiTokenInstance);
ПараметрыДоступа = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "СформироватьПараметрыДоступа", Опции);
Опции = Новый Структура;
Опции.Вставить("access" , ПараметрыДоступа);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("greenapi", "ПолучитьЖурналИсходящихСообщений", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПолучитьЖурналИсходящихСообщений", "GreenAPI");
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат);
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c1c646c9-fb98-4cc6-bb51-237c9107e2ea">
<name>OPI_RCON</name>
<synonym>
<key>ru</key>
<value>RCON</value>
</synonym>
<templateType>AddIn</templateType>
</mdclass:CommonTemplate>

Binary file not shown.

View File

@@ -42,6 +42,7 @@
<commonTemplates>CommonTemplate.OPI_TCPClient</commonTemplates>
<commonTemplates>CommonTemplate.OPI_SQLite</commonTemplates>
<commonTemplates>CommonTemplate.OPI_PostgreSQL</commonTemplates>
<commonTemplates>CommonTemplate.OPI_RCON</commonTemplates>
<commonModules>CommonModule.OPI_Airtable</commonModules>
<commonModules>CommonModule.OPI_Bitrix24</commonModules>
<commonModules>CommonModule.OPI_CDEK</commonModules>