Example #1
0
        /// <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);
                }
            }
        }
Example #2
0
 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);
     }
 }
Example #3
0
        /// <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;
        }