Создание пользовательского обработчика уведомлений для TSLab. Часть 1

В TSLab, хотя это не отражено в документации, возможна установка дополнительных пользовательских обработчиков уведомлений. Я попробую восполнить этот пробел, на примере создания обработчика, посылающего SMS.

Для этого воспользуемся одним из онлайн-сервисов, позволяющих посылать SMS. Я выбрал http://smsc.ru , так как у него уже есть API для C# и примеры использования. Чтобы воспользоваться сервисом, необходимо в нем зарегистрироваться, причем, если указать номер телефона, то на счет добавят 15 рублей, что удобно для отладки. В секции API приводится исходный код библиотеки, но в оригинальном виде его неудобно использовать, так как там жестко прописаны логин и пароль, а также есть ссылки на классы HttpUtility и System.Windows.Forms.MessageBox, которые нам не нужны.

Я буду делать проект обработчика в среде Visual Studio 2012, но также возможно создание в SharpDevelop. Начинаем с создания нового проекта, выбирая в качестве шаблона Visual C# – Windows – Class Library. Не забудьте выставить версию .NET Framework не ниже 4.0.

Я назвал проект SmsNotificationPlugin. Сразу подключим необходимые библиотеки к проекту. Для этого в контекстном меню для папки References выбрать путь Add Reference и нажать внизу кнопку Browse. В окне выбора файлов надо перейти на каталог где установлен TSLab 1.2 и выбрать файлы TSLab.AddinsCommon.dll и TSLab.Utility.dll. Далее надо перейти на вкладку Assemblies – Framework и в списке выбрать System.ComponentModel.Composition.

img1

В результате список References должен выглядеть так

img2

Далее переходим непосредственно к созданию обработчика уведомлений. После создания в проекте создался класс Class1. Его можно переименовать или удалить и создать новый класс SmsNotifier. В начале файла добавляем ссылки

using TSLab.Addins.Notification;
using TSLab.Notification;

наследуем класс от NotificationHandler и реализуем требуемые методы. Получилась заготовка обработчика. Чтобы она “подхватилась” программой необходимо “подсветить” класс, указать атрибут NotificationHandlerAttribute . В результате заготовка обработчика выглядит так

using TSLab.Addins.Notification;
using TSLab.Notification;

namespace SmsNotificationPlugin
{
    [NotificationHandler(Name = "SMS", AllowMultiple = true)]
    public class SmsNotifier : NotificationHandler
    {
        public override void Notify(NotifyEvent notifyEvent)
        {
        }

        public override object Settings { get; set; }
    }
}

Параметр Name должен иметь уникальное имя среди всех подключенных обработчиков, параметр AllowMultiple указывает на то, что можно создавать больше одного экземпляра обработчика.

На данный момент это уже работоспособный обработчик. Если его подключить в программу, то, в зависимости от фильтров, в какие-то моменты будет вызываться метод Notify. Но так как он пустой, то никакой полезной работы он делать не будет. К свойству Settings перейдем попозже, пока, на первом этапе будем использовать жестко заданные параметры обработчика, такие как логин, пароль.

Давайте научим обработчик посылать SMS. Из взятого на сайте текста библиотеки я взял только нужное для посылки SMS. Во-первых это константы (потом превратим их в настраиваемые свойства)

// Константы с параметрами отправки
    const string SMSC_LOGIN = "<login>";        // логин клиента
    const string SMSC_PASSWORD = "<password>";    // пароль или MD5-хеш пароля в нижнем регистре
    const bool SMSC_POST = false;                // использовать метод POST
    const bool SMSC_HTTPS = false;                // использовать HTTPS протокол
    const string SMSC_CHARSET = "utf-8";        // кодировка сообщения (windows-1251 или koi8-r), по умолчанию используется utf-8

Вам необходимо прописать в константах SMSC_LOGIN и SMSC_PASSWORD свои логин/пароль, полученные при регистрации на сайте.

Во-вторых берем методы send_sms, _smsc_send_cmd и _urlencode с модификациями. В метод Notify добавляем вызов

            send_sms("79161234567", notifyEvent.Message);

где 79161234567 номер телефона, на который будет посылаться SMS, его нужно заменить на реальный номер. Собственно это весь код обработчика! Полностью весь код, с жестко прописанными константами выглядит так

using System;
using System.IO;
using System.Net;
using System.Text;
using TSLab.Addins.Notification;
using TSLab.Notification;
using TSLab.Utils;

namespace SmsNotificationPlugin
{

    [NotificationHandler(Name = "SMS", AllowMultiple = true)]
    public class SmsNotifier : NotificationHandler
    {
        // Константы с параметрами отправки
        const string SMSC_LOGIN = "<login>";        // логин клиента
        const string SMSC_PASSWORD = "<password>";    // пароль или MD5-хеш пароля в нижнем регистре
        const bool SMSC_POST = false;                // использовать метод POST
        const bool SMSC_HTTPS = false;                // использовать HTTPS протокол
        const string SMSC_CHARSET = "utf-8";        // кодировка сообщения (windows-1251 или koi8-r), по умолчанию используется utf-8

        public override void Notify(NotifyEvent notifyEvent)
        {
            send_sms("79161234567", notifyEvent.Message);
        }

        public override object Settings { get; set; }

        // Метод отправки SMS
        //
        // обязательные параметры:
        //
        // phones - список телефонов через запятую или точку с запятой
        // message - отправляемое сообщение
        //
        // необязательные параметры:
        //
        // translit - переводить или нет в транслит
        // time - необходимое время доставки в виде строки (DDMMYYhhmm, h1-h2, 0ts, +m)
        // id - идентификатор сообщения. Представляет собой 32-битное число в диапазоне от 1 до 2147483647.
        // format - формат сообщения (0 - обычное sms, 1 - flash-sms, 2 - wap-push, 3 - hlr, 4 - bin, 5 - bin-hex, 6 - ping-sms)
        // sender - имя отправителя (Sender ID). Для отключения Sender ID по умолчанию необходимо в качестве имени
        // передать пустую строку или точку.
        // query - строка дополнительных параметров, добавляемая в URL-запрос ("valid=01:00&maxsms=3")
        //
        // возвращает массив строк (<id>, <количество sms>, <стоимость>, <баланс>) в случае успешной отправки
        // либо массив строк (<id>, -<код ошибки>) в случае ошибки
        public string[] send_sms(string phones, string message, int translit = 0, string time = "", int id = 0, int format = 0, string sender = "", string query = "")
        {
            string[] formats = {"flash=1", "push=1", "hlr=1", "bin=1", "bin=2", "ping=1"};

            string[] m = _smsc_send_cmd("send", "cost=3&charset=" + SMSC_CHARSET + "&phones=" + _urlencode(phones)
                            + "&mes=" + _urlencode(message) + "&id=" + id.ToString() + "&translit=" + translit.ToString()
                            + (format > 0 ? "&" + formats[format-1] : "") + (sender != "" ? "&sender=" + _urlencode(sender) : "")
                            + (time != "" ? "&time=" + _urlencode(time) : "") + (query != "" ? "&" + query : ""));

            // (id, cnt, cost, balance) или (id, -error)

            return m;
        }

        // Метод вызова запроса. Формирует URL и делает 3 попытки чтения
        private string[] _smsc_send_cmd(string cmd, string arg)
        {
            arg = "login=" + _urlencode(SMSC_LOGIN) + "&psw=" + _urlencode(SMSC_PASSWORD) + "&fmt=1&" + arg;

            string url = (SMSC_HTTPS ? "https" : "http") + "://smsc.ru/sys/" + cmd + ".php" + (SMSC_POST ? "" : "?" + arg);

            WebRequest request = WebRequest.Create(url);
            StreamReader sr;

            if (SMSC_POST) {
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = arg.Length;
                Stream stream = request.GetRequestStream();
                stream.Write(Encoding.Default.GetBytes(arg), 0, arg.Length);
                stream.Close();
            }

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            string ret;
            int i = 0;

            do {
                if (i > 0)
                    System.Threading.Thread.Sleep(2000);

                sr = new StreamReader(response.GetResponseStream());
                ret = sr.ReadToEnd();
            }
            while (ret == "" && ++i < 3);

            if (ret == "") {
                    throw new Exception("Ошибка чтения адреса: " + url);

                ret = ","; // фиктивный ответ
            }

            return ret.Split(',');
        }

        // кодирование параметра в http-запросе
        private string _urlencode(string str)
        {
            return HttpUtils.UrlEncode(str);
        }
    }
}

Давайте проверим его в деле. После компиляции библиотеки получим файл SmsNotificationPlugin.dll. Далее его нужно поместить в нужный каталог, где его найдет TSLab. Перейдем в проводнике каталог данных программы TSLab. На Windows 7 это

c:\Users\<имя пользователя>\AppData\Local\TSLab\TSLab12

На него также можно выйти из TSLab, открым через меню папку логов и перейдя на уровень выше. В ней нужно создать папку Notification и скопировать туда наш файл обработчика SmsNotificationPlugin.dll. Теперь запускаем TSLab. Если программа уже запущена, то перезапускать не надо, обработчик подхватится “на лету”! Открываем окно Менеджера уведомлений и нажимаем кнопку Добавить. В списке доступных обработчиков должен появиться новый – SMS

img3

Добавим его и зададим ему фильтр “По номеру” с номером 1 – будет проходить уведомление при подключении любого поставщика данных. Также не забудем поставить галку в колонке Подключен. Попробуем подсоединиться любым поставщиком и при успешном подключении на телефон должна прийти SMS, например – “Вы подключились к поставщику данных  `Финам`”.

Все, у нас есть новый полезный обработчик! Но плохо что все данные установлены в коде и при изменении любого параметра, телефона например, необходимо перекомпилировать библиотеку. Давайте сделаем его “гибче”, чтобы параметры обработчика можно было устанавливать из программы TSLab.

SmsNotificationPlugin1.zip

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

%d такие блоггеры, как: