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í.

11. diel - Trieda pre prácu s ICQ #, ICQ kontakt - isim

Pre ICQ používam ICQ #: http://icq-sharp.sourceforge.net/ Ja všetky tie zdrojové kódy knižníc dám k stiahnutiu. Odporúčam použiť tie moje, ja tam opravil niekoľko chýb, zvýšil výkon a pridal nejaké fce. Konkrétne v tejto knižnici bol problém s nekonečným cyklom, niekoľkými eventy, kódovaním (diakritikou) - ono sa to kóduje zakaždým inak. Ak niekto pošle správu s diakritikou je to ako UTF-16 s BE inak je to UTF-8 s LE a ešte taky záleží či je to správa z online alebo offline stavu. Dá sa to spoznať podľa 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 nepodarilo sa mi sprevádzkovať pridanie a mazanie kontaktov. Ono to posiela nejaké packety, ktoré by to mali urobiť. Niečo to pošle, niečo to urobí, ale vo výsledku to najni upe to čo chcem. Šialenosť to ICQ.

ICQ kontakt mám nasledovné:

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

 

Predchádzajúci článok
Trieda pre prácu s agsXMPP, Adaptee Wrapper pre XMPP - isim
Všetky články v sekcii
Programujeme vlastné Instant Messenger :: isim ::
Preskočiť článok
(neodporúčame)
Trieda pre prácu so SkypeKit, Skype kontakt - isim
Článok pre vás napísal David Jančík
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor je vášnivý programátor. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.
Aktivity