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

SHELBY

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

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

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

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

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

Код:
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("[email protected]"); //Кому отправляем, можно самому себе
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();
Вот так это выглядит при выполнении

 

Вложения

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Кто то еще сидит в жабе:?
 

kagorec

Client
Регистрация
24.08.2013
Сообщения
979
Благодарностей
525
Баллы
93
В Telegram такое можно повторить?*
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
  • Спасибо
Реакции: Sergodjan

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 436
Благодарностей
9 133
Баллы
113
Вещь! проверил - пашет..
а для аськи есть подобное?
 

DmitryAk

Client
Регистрация
14.12.2016
Сообщения
860
Благодарностей
824
Баллы
93
Прелесть. Теперь я знаю, как удаленное логирование/мониторинг сделаю)
 
  • Спасибо
Реакции: SHELBY и Sergodjan

DmitryAk

Client
Регистрация
14.12.2016
Сообщения
860
Благодарностей
824
Баллы
93

SHELBY

Client
Регистрация
09.09.2016
Сообщения
237
Благодарностей
291
Баллы
63
Вещь! проверил - пашет..
а для аськи есть подобное?
Протокол OSCAR Там внизу ссылки на С# либы.. надо пробовать.
Сейчас попробовал заюзать библиотеку NOscar - она не пашет. Авторизация по их примерам не проходит(
 
  • Спасибо
Реакции: Sergodjan

DmitryAk

Client
Регистрация
14.12.2016
Сообщения
860
Благодарностей
824
Баллы
93

SHELBY

Client
Регистрация
09.09.2016
Сообщения
237
Благодарностей
291
Баллы
63
Вещь! проверил - пашет..
а для аськи есть подобное?
Жаль.. значит старый оскар совсем убили..
Нашел рабочий исходник отправки сообщений в аську. Сейчас попробую разобраться и перенести все в зенку :-)
 
  • Спасибо
Реакции: Sergodjan

SHELBY

Client
Регистрация
09.09.2016
Сообщения
237
Благодарностей
291
Баллы
63

AloneSlamer

Client
Регистрация
29.01.2013
Сообщения
1 404
Благодарностей
362
Баллы
83

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с AloneSlamer какие-либо сделки.

  • Спасибо
Реакции: Sergodjan, deopl и SHELBY

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
При такой реализации шаблон будет подтормаживать при отправке и будут периодически недоходить сообщения, чтобы работало стабильно и без подтормаживаний, отправку лучше вынести в отдельный поток, и проверять в нем статус перед выходом, например так:
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 = "[email protected]";
            const string PASSWORD = "password";

           //Получатели по умолчанию 
            if (receivers == null) receivers = "[email protected], [email protected]";
            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();
            });
        }
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Можно делегат проще записать.
Код:
xmpp.OnLogin += (o) =>
{
     foreach (var receiver in arrReceivers)
     {
          xmpp.Send(new Message(new Jid(receiver), MessageType.chat, msg));
     }
     sended = true;
};
 

ffeniks

Client
Регистрация
03.06.2016
Сообщения
312
Благодарностей
410
Баллы
63
Поддерживаю про скайп.
 

AZANIR

Client
Регистрация
09.06.2014
Сообщения
405
Благодарностей
198
Баллы
43
джабер ниочем , и нафиг не нужен реально. а вот по скайп поддерживаю.
 

Enigma

Client
Регистрация
16.06.2017
Сообщения
187
Благодарностей
31
Баллы
28
На виртуальной машине работает отлично. Однако на сервере почему-то не желает, в чем может быть проблема?
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Что пишет
 

Enigma

Client
Регистрация
16.06.2017
Сообщения
187
Благодарностей
31
Баллы
28
Поразительно, но уже начало работать внезапно. Хотя совершенно ничего не менял, просто... наступил новый день :-) Очень удивлен.
Когда не работало, в логе вообще ничего не писало. Экшн просто успешно выполнялся и все (сообщение не доходило, хотя с виртуальной машины шло нормально). Буду наблюдать, т.к. любопытно от чего же так вышло.
 

lexandros

Новичок
Регистрация
05.10.2017
Сообщения
1
Благодарностей
0
Баллы
1

Evgeny76

Client
Регистрация
11.09.2015
Сообщения
192
Благодарностей
85
Баллы
28
По примеру ТС - работает через раз. Вот в этом посте 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
 

vlsdrmy

Client
Регистрация
20.12.2015
Сообщения
25
Благодарностей
1
Баллы
3
Код:
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("[email protected]"); //Кому отправляем, можно самому себе
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# не разбираюсь совсем.
 

DmitryAk

Client
Регистрация
14.12.2016
Сообщения
860
Благодарностей
824
Баллы
93
C#:
msg.Body = "Успешно "+project.Variables["var"].Value+" выполнено.";
 
  • Спасибо
Реакции: vlsdrmy

kalne

Client
Регистрация
28.02.2016
Сообщения
63
Благодарностей
3
Баллы
8
Последнее редактирование:

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
кстати, там лучше использовать "async Task" место "async void", так можно будет как минимум проконтролировать саму задачу и ошибки в ней
 

ChuckNorris

Client
Регистрация
10.01.2018
Сообщения
43
Благодарностей
7
Баллы
8
Подскажите как отправить запрос авторизации в jabber?
 
  • Спасибо
Реакции: Radzhab

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