/// <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; }
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); }