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

C# .NET Pro pokročilé Instant Messenger 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; }
                }
        }
}

 

  Aktivity (1)

Článek pro vás napsal David Jančík [sczdavos]
Avatar
Autor je vášnivý programátor v .NET C# a PHP. Nezná slovo "nelze", nebojí se zkoušet nepoznané a pronikat do nových technologií.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 



 

 

Komentáře

Avatar
Ben Žour (Jeremy):

Hmm, dlouho jsem hledal nějakou knihovnu pro práci s ICQ pro C#, nic jsem tehdy nenašel a teď koukám že ICQ# je první co mě google vyhodí :D Každopádně moc děkuju! :)

 
Odpovědět 11.2.2013 22:07
Avatar
Odpovídá na Ben Žour (Jeremy)
David Jančík [sczdavos]:

Ahoj, doporučuji použít tu, co je přiložená u zdrojáků ISIMu. Trochu jsem ji modifikoval a optimalizoval. Byl tam jeden nekonečnej cyklus a nedořešené kódování ;)

Odpovědět 11.2.2013 22:09
Čím více času dostaneš, tím méně ho máš.
Avatar
Odpovídá na David Jančík [sczdavos]
Ben Žour (Jeremy):

Tím líp že jsem to tenkrát nenašel, určitě jí použiju. Takže ještě jednou díky :)

 
Odpovědět 11.2.2013 22:16
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.