diff --git a/packagedef b/packagedef index 610c9f9..394da13 100644 --- a/packagedef +++ b/packagedef @@ -1,8 +1,9 @@  Описание.Имя("messenger") - .Версия("1.0.2") - .ВключитьФайл("readme.md") - .ВключитьФайл("src") - .ВключитьФайл("lib.config") - .ИсполняемыйФайл("src/Мессенджер.os"); + .Версия("1.1.0") + .ЗависитОт("json") + .ВключитьФайл("readme.md") + .ВключитьФайл("src") + .ВключитьФайл("lib.config") + .ИсполняемыйФайл("src/Мессенджер.os"); \ No newline at end of file diff --git a/readme.md b/readme.md index 13d5fac..ab30377 100644 --- a/readme.md +++ b/readme.md @@ -1,9 +1,9 @@ -#Отправка сообщений используя разные транспорты +# Отправка сообщений используя разные транспорты ## Введение ## Установка -Для использования необходимо выполнить инициализацию параметров транспорта. +Для использования необходимо выполнить инициализацию параметров транспорта, используя соответствующий метод класса и параметры авторизации (см. ниже). ## Использование @@ -13,9 +13,25 @@ Перед отправкой сообщений необходимо у созданного объекта вызвать метод 'ИнициализацияSLACK' куда передать данные авторизации. ### Для SMS -На данный момент поддерживается отправка сообщений через операторов SMS-Bliss и Infobip. +На данный момент поддерживается отправка сообщений через операторов SMS-Bliss, Infobip и sms4b. Для использования необходимо заключить договор с соответствующим оператором. - SMS-Bliss: https://smsbliss.ru/ - Infobip: http://www.infobip.com.ru/ + - sms4b: https://www.sms4b.ru/ + +Перед отправкой сообщений необходимо у созданного объекта вызвать метод 'ИнициализацияSMS' куда передать код оператора "SMSBliss" ,"infobip" или "sms4b" и данные авторизации. + +### Для Gitter +Необходимо получить токен авторизации https://developer.gitter.im/apps +Имя комнаты указывается полностью ИмяОрганизации/ИмяРепозитория +например для `https://gitter.im/asosnoviy/Lobby` имя комнаты `asosnoviy/Lobby` +Перед отправкой сообщений необходимо у созданного объекта вызвать метод 'ИнициализацияGitter' куда передать токен. + +####№ Пример: +``` + ИмяКомнаты = "organization/repo"; + Мессенджер = Новый Мессенджер(); + Мессенджер.ИнициализацияGitter(ТокенПользователя); + Мессенджер.ОтправитьСообщение(Мессенджер.ДоступныеПротоколы().gitter, ИмяКомнаты, "Всем привет!" ); +``` -Перед отправкой сообщений необходимо у созданного объекта вызвать метод 'ИнициализацияSMS' куда передать код оператора "SMSBliss" или "infobip" и данные авторизации. diff --git "a/src/\320\234\320\265\321\201\321\201\320\265\320\275\320\264\320\266\320\265\321\200.os" "b/src/\320\234\320\265\321\201\321\201\320\265\320\275\320\264\320\266\320\265\321\200.os" index 3146068..c5718ec 100644 --- "a/src/\320\234\320\265\321\201\321\201\320\265\320\275\320\264\320\266\320\265\321\200.os" +++ "b/src/\320\234\320\265\321\201\321\201\320\265\320\275\320\264\320\266\320\265\321\200.os" @@ -9,9 +9,11 @@ // (с) BIA Technologies, LLC // /////////////////////////////////////////////////////////////////////////////////////////////// +#Использовать json Перем АвторизацияSLACK; Перем АвторизацияSMS; +Перем АвторизацияGitter Экспорт; Перем ПараметрыДоступныеОператорыSMS; Перем ПараметрыДоступныеПротоколы; @@ -30,6 +32,19 @@ КонецПроцедуры +Процедура ОтправитьСообщениеGitter(Комната, Сообщение) Экспорт + + IdКомнаты = АвторизацияGitter.Комнаты[Комната]; + Если IdКомнаты = Неопределено Тогда + + ВызватьИсключение "Комната не найдена в списке комнат пользователя"; + + Иначе + ОтправитьСообщениеВКомнатуGitter(IdКомнаты, Сообщение); + КонецЕсли; + +КонецПроцедуры + /////////////////////////////////////////////////////////////////////////////////////////////// Процедура ОтправитьСообщение(Протокол, Адресат, Сообщение, ТемаСообщения = "", ТипСообщения = "") Экспорт @@ -41,7 +56,11 @@ ИначеЕсли Протокол = ДоступныеПротоколы().sms Тогда ОтправитьСообщениеОператоруSMS(Адресат, Сообщение); + + ИначеЕсли Протокол = ДоступныеПротоколы().gitter Тогда + ОтправитьСообщениеGitter(Адресат, Сообщение); + Иначе ВызватьИсключение "Неизвестный протокол отправки: " + Протокол; @@ -67,10 +86,8 @@ Адресат, Сообщение, АвторизацияSMS.Подпись); - - HTTPЗапрос = Новый HTTPЗапрос; - HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json"); - HTTPЗапрос.АдресРесурса = АвторизацияSMS.URL; + + HTTPЗапрос = Новый HTTPЗапрос(АвторизацияSMS.URL, АвторизацияSMS.Заголовки); HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); HTTP = Новый HTTPСоединение(ИмяСервера); @@ -104,9 +121,48 @@ КонецПроцедуры +Процедура ОтправитьСообщениеВКомнатуGitter(IdКомнаты, ТекстСообщения) Экспорт + + Если АвторизацияGitter = Неопределено Тогда + + ВызватьИсключение "Необходимо выполнить инициализацию комнат Gitter"; + + КонецЕсли; + + ИмяСервера = "https://api.gitter.im"; + + Прокси = Новый ИнтернетПрокси(Истина); + + URL = "/v1/rooms/" + + IdКомнаты + + "/chatMessages"; + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Content-Type", "application/json"); + Заголовки.Вставить("Accept", "application/json"); + Заголовки.Вставить("Authorization", " Bearer " + АвторизацияGitter.Токен); + + HTTPЗапрос = Новый HTTPЗапрос(URL, Заголовки); + + ТекстТела = "{""text"":""%1""}"; + ТелоЗапроса = СтрШаблон(ТекстТела, ТекстСообщения); + + HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса); + + HTTP = Новый HTTPСоединение(ИмяСервера); + ОтветHTTP = HTTP.ОтправитьДляОбработки(HTTPЗапрос); + +КонецПроцедуры + /////////////////////////////////////////////////////////////////////////////////////////////// // Инициализация /////////////////////////////////////////////////////////////////////////////////////////////// +Процедура ИнициализацияGitter(Токен) Экспорт + + Комнаты = ПолучитьСписокКомнатGitter(Токен); + АвторизацияGitter = Новый Структура("Токен, Комнаты", Токен, Комнаты); + +КонецПроцедуры Процедура ИнициализацияSLACK(Логин, Ключ)Экспорт @@ -118,15 +174,35 @@ Если КодОператора = ДоступныеОператорыSMS().smsbliss Тогда + Заголовки = Новый Соответствие; + Заголовки.Вставить("Content-Type", "application/json"); + АвторизацияSMS = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаSMSBliss(), Логин, Пароль, Подпись); АвторизацияSMS.Вставить("ИмяСервера", "json.gate.smsbliss.ru"); АвторизацияSMS.Вставить("URL", "send"); + АвторизацияSMS.Вставить("Заголовки", Заголовки); ИначеЕсли КодОператора = ДоступныеОператорыSMS().infobip Тогда + Заголовки = Новый Соответствие; + Заголовки.Вставить("Content-Type", "application/json"); + АвторизацияSMS = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаInfobip(), Логин, Пароль, Подпись); АвторизацияSMS.Вставить("ИмяСервера", "api.infobip.com"); АвторизацияSMS.Вставить("URL", "api/v3/sendsms/json"); + АвторизацияSMS.Вставить("Заголовки", Заголовки); + + ИначеЕсли КодОператора = ДоступныеОператорыSMS().sms4b Тогда + + Заголовки = Новый Соответствие; + Заголовки.Вставить("Accept-Encoding", "gzip,deflate"); + Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8"); + Заголовки.Вставить("SOAPAction", "SMS4B/SendSMS"); + + АвторизацияSMS = Новый Структура("ШаблонТелаЗапроса, Логин, Пароль, Подпись", ПолучитьШаблонТелаЗапросаSms4b(), Логин, Пароль, Подпись); + АвторизацияSMS.Вставить("ИмяСервера", "https://sms4b.ru"); + АвторизацияSMS.Вставить("URL", "ws/sms.asmx"); + АвторизацияSMS.Вставить("Заголовки", Заголовки); Иначе @@ -208,13 +284,31 @@ КонецФункции +Функция ПолучитьШаблонТелаЗапросаSms4b() + + Возврат + " + | + | + | + |%1 + |%2 + |%5 + |%3 + |%4 + | + | + |"; + +КонецФункции + /////////////////////////////////////////////////////////////////////////////////////////////// Функция ДоступныеОператорыSMS()Экспорт Если ПараметрыДоступныеОператорыSMS = Неопределено Тогда - ПараметрыДоступныеОператорыSMS = Новый Структура("smsbliss, infobip", "smsbliss", "infobip"); + ПараметрыДоступныеОператорыSMS = Новый Структура("smsbliss, infobip, sms4b", "smsbliss", "infobip", "sms4b"); КонецЕсли; @@ -222,11 +316,11 @@ КонецФункции -Функция ДоступныеПротоколы()Экспорт +Функция ДоступныеПротоколы() Экспорт Если ПараметрыДоступныеПротоколы = Неопределено Тогда - ПараметрыДоступныеПротоколы = Новый Структура("slack, sms", "slack", "sms") + ПараметрыДоступныеПротоколы = Новый Структура("slack, sms, gitter", "slack", "sms", "gitter") КонецЕсли; @@ -236,7 +330,52 @@ /////////////////////////////////////////////////////////////////////////////////////////////// +Функция ПолучитьСписокКомнатGitter(Токен) + + СписокКомнат = Новый Соответствие(); + + ИмяСервера = "https://api.gitter.im"; + + Прокси = Новый ИнтернетПрокси(ИСТИНА); + + URL = "v1/rooms?access_token=" + + Токен ; + + HTTPЗапрос = Новый HTTPЗапрос; + HTTPЗапрос.АдресРесурса = URL; + + HTTP = Новый HTTPСоединение(ИмяСервера); + Ответ = HTTP.Получить(HTTPЗапрос); + + json = Новый ПарсерJSON(); + UnJason = json.ПрочитатьJSON(Ответ.ПолучитьТелоКакСтроку()); + + Если Ответ.КодСостояния = 200 И ТипЗнч(UnJason) = Тип("Массив") Тогда + + Для Каждого Комната Из UnJason Цикл + + СписокКомнат.Вставить(Комната.Получить("name"),Комната.Получить("id")); + + КонецЦикла; + + ИначеЕсли ТипЗнч(UnJason) = Тип("Соответствие") И UnJason["error"] = "Unauthorized" Тогда + + ВызватьИсключение "Ошибка авторизации"; + + Иначе + + ВызватьИсключение "Ошибка получения списка комнат"; + + КонецЕсли; + + Возврат СписокКомнат; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////// + АвторизацияSLACK = Неопределено; АвторизацияSMS = Неопределено; +АвторизацияGitter = Неопределено; ПараметрыДоступныеОператорыSMS = Неопределено; ПараметрыДоступныеПротоколы = Неопределено; diff --git a/tests/gitter-test.os b/tests/gitter-test.os new file mode 100644 index 0000000..6381ca9 --- /dev/null +++ b/tests/gitter-test.os @@ -0,0 +1,145 @@ +#Использовать asserts +#Использовать "../" + +Перем юТест; +Перем Мессенджер; + +Перем ИмяКомнаты; +Перем IdКомнаты; +Перем ТокенПользователя; +Перем ОшибкаВходящихПараметров; + +Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт + + // Мока нет, или задавть параметры тут или передвать через переменные окружения + // Переменные окружения: + // GitterToken + // GitterRoomId + // GitterRoomName + + ТокенПользователя = ""; // https://developer.gitter.im/apps + IdКомнаты = ""; // https://api.gitter.im/v1/rooms?access_token=ТокенПользователя + ИмяКомнаты = ""; // для комнаты https://gitter.im/asosnoviy/Lobby имя будет asosnoviy/Lobby + + ЗаполнитьПарметрыИзПеременныхОкружения(); + + + юТест = ЮнитТестирование; + + ВсеТесты = Новый Массив; + + ВсеТесты.Добавить("ТестДолжен_ПроверитьАвторизацию"); + + Если ЗначениеЗаполнено(ТокенПользователя) И + ЗначениеЗаполнено(IdКомнаты) И + ЗначениеЗаполнено(ИмяКомнаты) Тогда + + ВсеТесты.Добавить("ТестДолжен_ПроверитьПолучениеСпискаКомнат"); + ВсеТесты.Добавить("ТестДолжен_ОтправитьСообщениеВGitterПоidКомнаты"); + ВсеТесты.Добавить("ТестДолжен_ОтправитьСообщениеВGitterПоИмениКомнаты"); + ВсеТесты.Добавить("ТестДолжен_НеНайтиКомнатуПоИмениКомнаты"); + ВсеТесты.Добавить("ТестДолжен_ОтправитьСообщениеМетодомОтправитьСообщение"); + Иначе + Сообщить("Не заполненны входящие параметры"); + Сообщить("Тест ТестДолжен_ПроверитьПолучениеСпискаКомнат будет пропущен"); + Сообщить("Тест ТестДолжен_ОтправитьСообщениеВGitterПоidКомнаты будет пропущен"); + Сообщить("Тест ТестДолжен_НеНайтиКомнатуПоИмениКомнаты будет пропущен"); + Сообщить("Тест ТестДолжен_ОтправитьСообщениеВGitterПоИмениКомнаты будет пропущен"); + Сообщить("Тест ТестДолжен_ОтправитьСообщениеМетодомОтправитьСообщение будет пропущен"); + + КонецЕсли; + + Возврат ВсеТесты; + +КонецФункции + +Процедура ПередЗапускомТеста() Экспорт + + Мессенджер = Новый Мессенджер(); + +КонецПроцедуры + +Процедура ПослеЗапускаТеста() Экспорт + + Мессенджер = Неопределено; + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьАвторизацию() Экспорт + + НеверныйТокенПользователя = "123"; + + Попытка + Мессенджер.ИнициализацияGitter(НеверныйТокенПользователя); + Исключение + Ожидаем.Что(ОписаниеОшибки(), "Должен Упасть С Ошибкой авторизации").Содержит("Ошибка авторизации"); + КонецПопытки + +КонецПроцедуры + +Процедура ТестДолжен_ПроверитьПолучениеСпискаКомнат() Экспорт + + Мессенджер.ИнициализацияGitter(ТокенПользователя); + + Ожидаем.Что(Мессенджер.ДоступныеПротоколы().Количество(), "Количество доступных протоколов 3").Равно(3); + Ожидаем.Что(Мессенджер.АвторизацияGitter.Токен, "Токен должен инициализироватся").Равно(ТокенПользователя) ; + Ожидаем.Что(Мессенджер.АвторизацияGitter.Комнаты.Количество(), "Комнаты Должны быть").Больше(0) ; + Ожидаем.Что(Мессенджер.АвторизацияGitter.Комнаты.Получить(ИмяКомнаты), "Комнаты Должны совпадать с id").Равно(IdКомнаты) ; + +КонецПроцедуры + +Процедура ТестДолжен_ОтправитьСообщениеВGitterПоidКомнаты() Экспорт + + Мессенджер.ИнициализацияGitter(ТокенПользователя); + + Мессенджер.ОтправитьСообщениеВКомнатуGitter(IdКомнаты,"Тестовое сообщение по IdКомнаты " + Строка(ТекущаяДата())); + +КонецПроцедуры + +Процедура ТестДолжен_ОтправитьСообщениеВGitterПоИмениКомнаты() Экспорт + + Мессенджер.ИнициализацияGitter(ТокенПользователя); + Мессенджер.ОтправитьСообщениеGitter(ИмяКомнаты, "Тестовое сообщение по имени комнаты " + Строка(ТекущаяДата())); + +КонецПроцедуры + +Процедура ТестДолжен_НеНайтиКомнатуПоИмениКомнаты() Экспорт + + НевернаяИмяКомнаты = "КомнатаКоторойНет"; + + Мессенджер.ИнициализацияGitter(ТокенПользователя); + + Попытка + Мессенджер.ОтправитьСообщениеGitter(НевернаяИмяКомнаты, "Тестовое сообщение по имени комнаты " + Строка(ТекущаяДата())); + Исключение + Ожидаем.Что(ОписаниеОшибки(), "Должен Упасть С Ошибкой комната не найдена").Содержит("Комната не найдена в списке"); + КонецПопытки + +КонецПроцедуры + +Процедура ТестДолжен_ОтправитьСообщениеМетодомОтправитьСообщение() Экспорт + + Мессенджер.ИнициализацияGitter(ТокенПользователя); + Мессенджер.ОтправитьСообщение(Мессенджер.ДоступныеПротоколы().gitter, ИмяКомнаты, "Тестовое сообщение Методом отправить сообщение " + Строка(ТекущаяДата())); + +КонецПроцедуры + +Процедура ЗаполнитьПарметрыИзПеременныхОкружения() + + + СИ = Новый СистемнаяИнформация(); + ПеременныеСреды = СИ.ПеременныеСреды(); + + Если НЕ ЗначениеЗаполнено(ТокенПользователя) И НЕ ПеременныеСреды["GitterToken"] = Неопределено Тогда + ТокенПользователя = ПеременныеСреды["GitterToken"]; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(IdКомнаты) И НЕ ПеременныеСреды["GitterRoomId"] = Неопределено Тогда + IdКомнаты = ПеременныеСреды["GitterRoomId"]; + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(ИмяКомнаты) И НЕ ПеременныеСреды["GitterRoomName"] = Неопределено Тогда + ИмяКомнаты = ПеременныеСреды["GitterRoomName"]; + КонецЕсли; + +КонецПроцедуры