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