Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 11 - Třída pro práci s ICQ#, ICQ kontakt - ISIM

Pro ICQ používám ICQ#: http://icq-sharp.sourceforge.net/ Já všechny ty zdrojové kódy knihoven dám ke stažení. Doporučuji použít ty moje, já tam opravil několik chyb, zvýšil výkon a přidal nějaké fce. Konkrétně v této knihovně byl problém s nekonečným cyklem, několika eventy, kódováním (diakritikou) - ono se to kóduje pokaždé jinak. Pokud někdo pošle zprávu s diakritikou je to jako UTF-16 s BE jinak je to UTF-8 s LE a ještě taky záleží jestli je to zpráva z online nebo offline stavu. Dá se to poznat podle tuším 5tého bitu v socketu.

public class IcqClass
{
    public Session session;

    public IcqClass(string uin, string password)
    {
        IcqSharp.Util.Log.Enable = true;

        session = new Session(uin, password);

        session.Connected += new EventHandler(session_Connected);
        session.LoginFailed += session_LoginFailed;

        session.Messaging.TypingNotification += new IcqSharp.Base.TypingNotificationDelegate(Messaging_TypingNotification);
        session.Messaging.MessageReceived += new IcqSharp.Base.MessageEventDelegate(messaging_MessageReceived);
        session.ContactList.ContactAdded += new IcqSharp.Base.ContactEventDelegate(ContactList_ContactAdded);
        session.ContactList.ContactStatusChanged += new IcqSharp.Base.ContactEventDelegate(ContactList_ContactStatusChanged);
    }

    void session_LoginFailed(object sender, EventArgs e)
    {
        System.Windows.Forms.MessageBox.Show("Selhalo připojení. Zkontroluj přihlašovací údaje.");
    }


    void ContactList_ContactStatusChanged(IcqSharp.Base.Contact contact)
    {
        Global.ISIMFunctions.EditContactAvailability(contact.Uin, Global.Converter.GetContactAvailability(contact.Status));
    }

    void Messaging_TypingNotification(IcqSharp.Base.Contact c, IcqSharp.Base.TypingNotification n)
    {
        // kontakt píše zprávu
    }

    void ContactList_ContactAdded(IcqSharp.Base.Contact contact)
    {
        Console.WriteLine("icq adding: " + contact.Uin + ":" + contact.Nickname);

        Global.OpenForms.mainForm.contactListView.BeginInvoke(new System.Windows.Forms.MethodInvoker(() =>
        {
            if (!Global.OpenForms.mainForm.contactListView.Items.ContainsKey(contact.Uin))
            {
                Global.ISIMFunctions.AddContact(new IcqContact(contact));
            }
        }));
    }

    void messaging_MessageReceived(IcqSharp.Base.Message message)
    {
        Console.WriteLine(message.Text);
        if ((message.Text != null) && (message.Text.Replace(" ", "").Length > 0))
        {
            Global.OpenForms.mainForm.Invoke(new System.Windows.Forms.MethodInvoker(() =>
            {
                ISIMContact contact;
                if (Global.OpenForms.mainForm.contactListView.Items.ContainsKey(message.Contact.Uin))
                    contact = (Global.OpenForms.mainForm.contactListView.Items[message.Contact.Uin] as ContactListViewItem).contact;
                else
                    contact = new IcqContact(message.Contact);

                Global.ISIMFunctions.AddChatMessage(contact, message.Text, message.Timestamp, contact.name);
            }));
        }
    }

    void session_Connected(object sender, EventArgs e)
    {
        Console.WriteLine("connected to ICQ");
    }

    public void AddContact(string uin)
    {
        session.ContactList.Add(new IcqSharp.Base.Contact(uin));
    }

    public void connect()
    {
        session.Connect();
        session.Status = IcqSharp.Base.Status.Online;
    }

    public void disconnect()
    {
        try
        {
            session.Status = IcqSharp.Base.Status.Offline;
        }
        catch
        {
            Console.WriteLine("icq cannot set status to offline");
        }
        session.Disconnect();
    }
}

Ale nepodařilo se mi zprovoznit přidání a mazání kontaktů. Ono to posílá nějaké packety, které by to měli udělat. Něco to pošle, něco to udělá, ale ve výsledku to nejni upe to co chci. Šílenost to ICQ.

ICQ kontakt mám následující:

public class IcqContact : ISIMContact
{
    ContactObject contactObj;

    public IcqContact(IcqSharp.Base.Contact contact)
    {
        contactObj = new ContactObject(contact);
        availability = Global.Converter.GetContactAvailability(contact.Status);
    }

    public string id
    {
        get { return contactObj.contact.Uin; }
    }

    public string name
    {
        get
        {
            if (contactObj.contact.Nickname != null)
                return contactObj.contact.Nickname;
            else
                return contactObj.contact.Uin;
        }
        set { }
    }

    public Global.Availability availability
    {
        get;
        set;
    }

    public object contactObject
    {
        get { return contactObj; }
    }

    public string protocol
    {
        get { return "ICQ"; }
    }

    public bool unreadedMessage { get; set; }


    public class ContactObject
    {
        private IcqSharp.Session _session;
        private IcqSharp.Base.Contact _contact;

        public ContactObject(IcqSharp.Base.Contact contact)
        {
            if (contact.Nickname == null)
                contact.Nickname = contact.Uin;

            _contact = contact;
        }

        public IcqSharp.Session session
        {
            get
            {
                Global.OpenForms.mainForm.Invoke(new System.Windows.Forms.MethodInvoker(() =>
                {
                    _session = Global.OpenForms.mainForm.icq.session;
                }));

                return _session;
            }
        }

        public IcqSharp.Base.Contact contact
        {
            get { return _contact; }
        }
    }
}

 

Předchozí článek
Třída pro práci s agsXMPP, Adaptee Wrapper pro XMPP - ISIM
Všechny články v sekci
Programujeme vlastní Instant Messenger ::ISIM::
Přeskočit článek
(nedoporučujeme)
Třída pro práci se SkypeKit, Skype kontakt - ISIM
Článek pro vás napsal David Jančík
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity