From 4865c7453382c0ba4ba047efd14a27597581d68f Mon Sep 17 00:00:00 2001 From: asosnoviy Date: Sat, 18 Feb 2017 18:04:46 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=9E=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B2=20gitter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packagedef | 11 +- readme.md | 15 ++ ...20\275\320\264\320\266\320\265\321\200.os" | 107 ++++++++++++- tests/gitter-test.os | 145 ++++++++++++++++++ 4 files changed, 271 insertions(+), 7 deletions(-) create mode 100644 tests/gitter-test.os 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 08f6198..9d66fce 100644 --- a/readme.md +++ b/readme.md @@ -20,3 +20,18 @@ - 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, ИмяКомнаты, "Всем привет!" ); +``` + 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 d92b234..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(Адресат, Сообщение); + Иначе ВызватьИсключение "Неизвестный протокол отправки: " + Протокол; @@ -102,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(Логин, Ключ)Экспорт @@ -258,11 +316,11 @@ КонецФункции -Функция ДоступныеПротоколы()Экспорт +Функция ДоступныеПротоколы() Экспорт Если ПараметрыДоступныеПротоколы = Неопределено Тогда - ПараметрыДоступныеПротоколы = Новый Структура("slack, sms", "slack", "sms") + ПараметрыДоступныеПротоколы = Новый Структура("slack, sms, gitter", "slack", "sms", "gitter") КонецЕсли; @@ -272,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"]; + КонецЕсли; + +КонецПроцедуры From 83fc3c1668ec3aa1a1937fbaa79bd12286e81ea4 Mon Sep 17 00:00:00 2001 From: asosnoviy Date: Sat, 18 Feb 2017 20:41:17 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BA=D1=83=20?= =?UTF-8?q?=D0=B2=20readme.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 9d66fce..ab30377 100644 --- a/readme.md +++ b/readme.md @@ -29,7 +29,7 @@ ####№ Пример: ``` - ИмяКомнаты = organization/repo + ИмяКомнаты = "organization/repo"; Мессенджер = Новый Мессенджер(); Мессенджер.ИнициализацияGitter(ТокенПользователя); Мессенджер.ОтправитьСообщение(Мессенджер.ДоступныеПротоколы().gitter, ИмяКомнаты, "Всем привет!" ); From ea641429bb82e6faf497bc8a78283b68b9379c4f Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Sat, 18 Feb 2017 21:06:25 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=91=D0=B0=D0=B4=D0=B6=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readme.md b/readme.md index ab30377..385e186 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,7 @@ # Отправка сообщений используя разные транспорты +[![GitHub release](https://img.shields.io/github/release/oscript-library/messenger.svg)](https://github.com/oscript-library/messenger) + ## Введение ## Установка