/// <summary>
        /// Подключение к серверу с помощью полученнх значений ключа, имени сервера и ещё чего-то
        /// </summary>
        /// <param name="par">Словарь значений</param>
        /// <returns></returns>
        public bool LongPoll(Dictionary<string, string> par)
        {
            string s = "";
            string uri = "";
            string value = "";
            Hashtable jsonResp = new Hashtable();

            do
            {
                uri = "http://" + par["server"] + "?act=a_check&key=" + par["key"] + "&ts=" + par["ts"] + "&wait=25";
                try
                {
                    HttpWebRequest req = (HttpWebRequest)
                        WebRequest.Create(uri); // Создаём запрос

                    HttpWebResponse resp = (HttpWebResponse)
                        req.GetResponse(); // Запрашиваем ответ

                    Stream jstr = resp.GetResponseStream(); // Получаем ответный поток
                    TextReader reader = new StreamReader(jstr, true); // Читаем поток
                    s = reader.ReadToEnd(); // Переводим к строке

                    if (!flagConnect)
                    {
                        try
                        {
                            start.getOnline();
                            flagConnect = true;
                        }
                        catch
                        {
                            // Ошибка при обновлении контактов
                        }
                    }

                    if (!(s.IndexOf("failed") == -1)) // Если ошибка, то пробуем перезапросить ключ
                        return true;

                    if (s != "" && s.IndexOf("error") == -1)
                    {
                        jsonResp = (Hashtable)JSON.JsonDecode(s); // Парсим
                        value = jsonResp["ts"].ToString();
                        par.Remove("ts");
                        par.Add("ts", value); // Добавляем новый уник

                        ArrayList updates = (ArrayList)jsonResp["updates"];
                        if (updates.Count == 0) continue;
                        foreach (ArrayList item in updates) // Обработка сообщений
                        {
                            switch (Convert.ToUInt32(item[0]))
                            {
                                case 4:
                                    {
                                        IncomingMessageArgs info = new IncomingMessageArgs(
                                            Convert.ToUInt32(item[1]),
                                            Convert.ToUInt32(item[2]),
                                            Convert.ToUInt32(item[3]),
                                            Convert.ToUInt64(item[4]),
                                            item[5].ToString(),
                                            item[6].ToString()
                                        );
                                        NewMessage(info);
                                    } break; // Новое сообщение [4,message_id,flags,from_id,timestamp,subject,text]

                                case 8:
                                    {
                                        ChangeStatusArgs info = new ChangeStatusArgs((UInt32)(0 - Convert.ToInt32(item[1])), (ushort)1);
                                        NewStatus(info);
                                    } break; // Пользователь вышел в онлайн [8, -userid]

                                case 9:
                                    {
                                        ChangeStatusArgs info = new ChangeStatusArgs((UInt32)(0 - Convert.ToInt32(item[1])), (ushort)0);
                                        NewStatus(info);
                                    } break; // Статус пользователя изменился на оффлайн ( у второго параметра есть 2 флага! ДОРАБОТАТЬ! (2 * Convert.ToUInt16(item[2])) )
                            }
                        }
                    }
                }

                catch (WebException exe)
                {
                    GeneralMethods.WriteError(exe.Source, exe.Message, exe.TargetSite);

                    if (flagConnect)
                    {
                        if (MessageBox.Show("Сервер сообщений перестал отвечать!\nНажмите OK, если хотите, чтобы программа попыталась исправить ошибку\nНажмите Отмена, если хотите выйти из программы", "Ошибка", MessageBoxButtons.OKCancel, MessageBoxIcon.Error) == DialogResult.OK)
                        {
                            flagConnect = false;
                            continue;
                        }
                        else
                            Application.Exit();
                    }
                    else
                        Application.Restart();
                }
            } while (s.IndexOf("error") == -1);

            return false;
        }
Exemple #2
0
        void serv_NewMessage(IncomingMessageArgs info)
        {
            if ((info.flag & 32) == 32 && (info.flag & 2) != 2)
            {
                if (vars.VARS.Visual_notify && vars.VARS.Notify_income)
                {
                    string txt; // текст, который будет отображаться в окошке
                    if (info.text.Length > 20)
                    {
                        txt = info.text.Substring(0, 20);
                        txt += "...";
                    }
                    else
                        txt = info.text;

                    NotifyEvent ShowNotify = new NotifyEvent(ShowNotifyWindow);
                    this.Invoke(ShowNotify, vars.VARS.Contact[info.outID].UserName, txt, info.outID); // инвочим для того, чтобы окно оповещения всплывало
                }
            }
        }
        /// <summary>
        /// Метод, обрабатывающий получение сообщения
        /// </summary>
        /// <param name="msgId">ID сообщения</param>
        /// <param name="flag">Флаг сообщения (суммирование определённых флажков)</param>
        /// <param name="outId">ID отправителя</param>
        /// <param name="date">Дата в UNIX формате</param>
        /// <param name="subj">Тема сообщения</param>
        /// <param name="text">Текст сообщения</param>
        void server_NewMessage(IncomingMessageArgs info)
        {
            uint msgId = info.MessageID;
            uint flag = info.flag;
            uint outId = info.outID;
            double date = info.date;
            string subj = info.subj;
            string text = info.text;
            vk start = new vk();

            AccessChat NewAccess = new AccessChat(Processing);
            vars.VARS.Chat.Invoke(NewAccess, msgId, flag, outId, date, subj, text, start);
        }