[Решение] Уведомления в Jabber C#

SHELBY

Client
Регистрация
09.09.2016
Сообщения
237
Реакции
293
Баллы
63
Всем привет!

Я часто пользуюсь jabber'ом, понадобилась реализация уведомлений,
Например, при ошибке в шаблоне, мне мгновенно прилетает сообщение.
Jabber стоит как на компе, так и на мобиле :)

Приступим....

1. Регистрируем себе аккаунт (если его нет), например тут http://jabber.ru
2. Качаем библиотеку (будет во вложении к посту)
3. Подключаем библиотеку к шаблону
Добавить действие -> Свой код -> Ссылки из GAC
bd4e262c8cc9.png

4. Подключаем директивы using
Добавить действие -> Свой код -> Директивы using и общий код
428e37a10590.png

Код:
Развернуть Свернуть Копировать
using agsXMPP;
using agsXMPP.protocol.client;
5. Редактируем код c# под себя и кидаем в шаблон
Код:
Развернуть Свернуть Копировать
agsXMPP.XmppClientConnection xmpp = new XmppClientConnection();
xmpp.Status = "available";
xmpp.Show = ShowType.chat;
xmpp.Priority = 1;
xmpp.SendMyPresence();
xmpp.Port = 5222;
xmpp.Server = ""; //Сервер, н-р jabber.ru
xmpp.Username = ""; //Логин
xmpp.Password = ""; //Пароль
xmpp.Resource = "ZennoBot";
xmpp.Open();
agsXMPP.Jid JID = new Jid("zts@jabber.ru"); //Кому отправляем, можно самому себе
agsXMPP.protocol.client.Message msg = new agsXMPP.protocol.client.Message();
msg.Type = agsXMPP.protocol.client.MessageType.chat;
msg.To = JID;
msg.Body = "Уведомление из ZennoPoster!"; //Текст уведомления
xmpp.OnLogin += delegate(object o) { xmpp.Send(msg); };
agsXMPP.protocol.server.Presence presencia2 = new  agsXMPP.protocol.server.Presence();
presencia2.Type = new PresenceType();

Вот так это выглядит при выполнении
c5aad0e19a5b.png

4e4c6d5ac24541169f98034a7a5d4c73.png
 

Вложения

  • Спасибо
Реакции: Sergodjan
Вещь! проверил - пашет..
а для аськи есть подобное?
 
  • Спасибо
Реакции: Sergodjan
Вещь! проверил - пашет..
а для аськи есть подобное?
Протокол OSCAR Там внизу ссылки на С# либы.. надо пробовать.
Сейчас попробовал заюзать библиотеку NOscar - она не пашет. Авторизация по их примерам не проходит(
 
  • Спасибо
Реакции: Sergodjan
Вещь! проверил - пашет..
а для аськи есть подобное?
Жаль.. значит старый оскар совсем убили..
Нашел рабочий исходник отправки сообщений в аську. Сейчас попробую разобраться и перенести все в зенку :)
 
  • Спасибо
Реакции: Sergodjan
При такой реализации шаблон будет подтормаживать при отправке и будут периодически недоходить сообщения, чтобы работало стабильно и без подтормаживаний, отправку лучше вынести в отдельный поток, и проверять в нем статус перед выходом, например так:
C#:
Развернуть Свернуть Копировать
/// <summary>
        /// Отправить сообщение в жабер от зенноалерта
        /// </summary>
        /// <param name="msg">Сообщение</param>
        /// <param name="receivers">Получатели, если не заданы берутся по умолчанию</param>
        public static async void  SendJabberAlert (string msg, string receivers = null)
        {
            int waitMs = 3000; //Пауза после отправки, чтобы успело дойти сообщение
            int maxWaitMinutes = 2; // Максимальное время ожидания отправки в минутах

            //Данные отправителя 
            const string JID_SENDER = "ZennoAlert@jabber.ru";
            const string PASSWORD = "password";

           //Получатели по умолчанию 
            if (receivers == null) receivers = "coder@jabber.ru, client@jabber.ru";
            string[] arrReceivers = receivers.Split(',').Select(a => a.Trim()).ToArray();

            // Чтобы не ждать пока отправка произойдет дергаем ее в отдельном таске
            await Task.Run(() =>
            {
                   bool sended = false; // Отправили или нет
                   DateTime endTime = DateTime.Now.AddMinutes(maxWaitMinutes); // Время когда прекращаем ожидать отправки, даже если не отправили сообщение

                    Jid jidSender = new Jid(JID_SENDER);
                    XmppClientConnection xmpp =  new XmppClientConnection(jidSender.Server);
                    xmpp.Open(jidSender.User, PASSWORD);
                    xmpp.OnLogin += delegate (object o)
                    {
                        foreach (var receiver in arrReceivers)
                        {
                            xmpp.Send(new Message(new Jid(receiver), MessageType.chat, msg));
                        }
                        sended = true;
                    };
             
                    do
                        new System.Threading.ManualResetEvent(false).WaitOne(waitMs);
                    while (!sended && DateTime.Compare(DateTime.Now, endTime) < 0);
                    xmpp.Close();
            });
        }
 
Можно делегат проще записать.
Код:
Развернуть Свернуть Копировать
xmpp.OnLogin += (o) =>
{
     foreach (var receiver in arrReceivers)
     {
          xmpp.Send(new Message(new Jid(receiver), MessageType.chat, msg));
     }
     sended = true;
};
 
Поддерживаю про скайп.
 
джабер ниочем , и нафиг не нужен реально. а вот по скайп поддерживаю.
 
На виртуальной машине работает отлично. Однако на сервере почему-то не желает, в чем может быть проблема?
 
Поразительно, но уже начало работать внезапно. Хотя совершенно ничего не менял, просто... наступил новый день :) Очень удивлен.
Когда не работало, в логе вообще ничего не писало. Экшн просто успешно выполнялся и все (сообщение не доходило, хотя с виртуальной машины шло нормально). Буду наблюдать, т.к. любопытно от чего же так вышло.
 
По примеру ТС - работает через раз. Вот в этом посте http://zennolab.com/discussion/threads/reshenie-uvedomlenija-v-jabber-c.34222/#post-252612 рабочее решение. Спасибо.

Не пойму, почему у меня не хочет работать. Вот что в логе:
21:33:06 Компиляция кода Ошибка в действии "CS1513" "ожидалась }". [Строка: -1; Cтолбец: 2]
21:33:06 Компиляция кода Ошибка в действии "CS1519" "Недопустимый токен "return" в объявлении класса, структуры или интерфейса". [Строка: 43; Cтолбец: 1]
21:33:06 Компиляция кода Ошибка в действии "CS1022" "Ожидалось определение типа или пространства имен, либо признак конца файла". [Строка: 46; Cтолбец: 1]

Версия зенки 5.11.3.0
 
Код:
Развернуть Свернуть Копировать
agsXMPP.XmppClientConnection xmpp = new XmppClientConnection();
xmpp.Status = "available";
xmpp.Show = ShowType.chat;
xmpp.Priority = 1;
xmpp.SendMyPresence();
xmpp.Port = 5222;
xmpp.Server = "jabber.ru"; //Сервер, н-р jabber.ru
xmpp.Username = "login"; //Логин
xmpp.Password = "pass"; //Пароль
xmpp.Resource = "ZBot";
xmpp.Open();
agsXMPP.Jid JID = new Jid("login@jabber.ru"); //Кому отправляем, можно самому себе
agsXMPP.protocol.client.Message msg = new agsXMPP.protocol.client.Message();
msg.Type = agsXMPP.protocol.client.MessageType.chat;
msg.To = JID;
msg.Body = "Успешно выполнено."; //Текст уведомления
xmpp.OnLogin += delegate(object o) { xmpp.Send(msg); };
agsXMPP.protocol.server.Presence presencia2 = new  agsXMPP.protocol.server.Presence();
presencia2.Type = new PresenceType();

Подскажите пожалуйста, как в этом коде в строчке
msg.Body = "Успешно выполнено.";
вставить переменную в самом сообщении. Например переменную project.Variables["var"].Value между словом "Успешно" и "выполнено". Если просто вставить переменную между ними, то выдает ошибку.
В C# не разбираюсь совсем.
 
кстати, там лучше использовать "async Task" место "async void", так можно будет как минимум проконтролировать саму задачу и ошибки в ней
 
Подскажите как отправить запрос авторизации в jabber?
 
  • Спасибо
Реакции: Radzhab

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)