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