/// <summary> /// Обновление онлайн/оффлайн списка /// </summary> /// <param name="name">ID пользователя</param> /// <param name="stat">Статус пользователя (онлайн/оффлайн)</param> public void OnOffStatus(ChangeStatusArgs info) { uint name = info.id; ushort stat = info.flag; vk.profile temp; int last, now; if (stat == 1) // Из оффлайна в онлайн { try { temp = vars.VARS.Contact[name]; temp.online = true; vars.VARS.Contact.Remove(name); vars.VARS.Contact.Add(name, temp); last = myContactList.ContactList.Items.IndexOf(name); myContactList.ContactList.Sort(); now = myContactList.ContactList.Items.IndexOf(name); if ((now < (myContactList.ContactList.Offset / HEIGHT_ITEM + myContactList.ContactList.Height / HEIGHT_ITEM)) || ((last < (myContactList.ContactList.Offset / HEIGHT_ITEM + myContactList.ContactList.Height / HEIGHT_ITEM)))) // Проверяем видим ли элемент, если да, перерисовываем { refresh UpdateContact = new refresh(myContactList.ContactList.Refresh); myContactList.ContactList.Invoke(UpdateContact); } if (vars.VARS.User_online_on && vars.VARS.Sound) GeneralMethods.NotifySound("UserOnline"); } catch (ArgumentNullException exe) { GeneralMethods.WriteError(exe.Source, exe.Message, exe.TargetSite); } } else // Из онлайна в оффлайн { try { temp = vars.VARS.Contact[name]; temp.online = false; vars.VARS.Contact.Remove(name); vars.VARS.Contact.Add(name, temp); last = myContactList.ContactList.Items.IndexOf(name); myContactList.ContactList.Sort(); now = myContactList.ContactList.Items.IndexOf(name); if ((last > myContactList.ContactList.Offset / HEIGHT_ITEM) & (last < (myContactList.ContactList.Offset / HEIGHT_ITEM + myContactList.ContactList.Height / HEIGHT_ITEM)) || (now > myContactList.ContactList.Offset / HEIGHT_ITEM) & (now < (myContactList.ContactList.Offset / HEIGHT_ITEM + myContactList.ContactList.Height / HEIGHT_ITEM))) { refresh UpdateContact = new refresh(myContactList.ContactList.Refresh); myContactList.ContactList.Invoke(UpdateContact); } if (vars.VARS.User_offline_on && vars.VARS.Sound) GeneralMethods.NotifySound("UserOffline"); } catch (ArgumentNullException exe) { GeneralMethods.WriteError(exe.Source, exe.Message, exe.TargetSite); } } }
void serv_NewStatus(ChangeStatusArgs info) { if (vars.VARS.Visual_notify && vars.VARS.Notify_online && info.flag == 1) // если визуальные оповещения включены и пользователь онлайн { NotifyEvent ShowNotify = new NotifyEvent(ShowNotifyWindow); this.Invoke(ShowNotify, vars.VARS.Contact[info.id].UserName, "В сети", info.id); // инвочим для того, чтобы она всплывала } if (vars.VARS.Visual_notify && vars.VARS.Notify_offline && info.flag == 0) // если визуальные оповещения включены и пользователь оффлайн { NotifyEvent ShowNotify = new NotifyEvent(ShowNotifyWindow); this.Invoke(ShowNotify, vars.VARS.Contact[info.id].UserName, "Не в сети", info.id); } }
/// <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; }