/// <summary> /// Requests a full set of information about an ICQ account /// </summary> /// <param name="sess">A <see cref="ISession"/> object</param> /// <param name="screenname">The account for which to retrieve information</param> public static void GetAllICQInfo(ISession sess, string screenname) { if (!ScreennameVerifier.IsValidICQ(screenname)) { throw new ArgumentException(screenname + " is not a valid ICQ screenname", "screenname"); } SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.ICQExtensionsService; sh.FamilySubtypeID = (ushort)ICQExtensionsService.MetaInformationRequest; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); stream.WriteUshort(0x0001); stream.WriteUshort(0x000A); stream.WriteUshort(0x0008); stream.WriteUint(uint.Parse(sess.ScreenName)); stream.WriteUshortLE(0x07D0); stream.WriteUshortLE((ushort)sh.RequestID); stream.WriteUshort(0x04B2); stream.WriteUint(uint.Parse(screenname)); SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Sends service versions request -- SNAC(01,17) /// </summary> /// <param name="dp">A <see cref="DataPacket"/> object</param> public static void RequestServiceVersions(DataPacket dp) { Session sess = dp.ParentSession; // Construct SNAC (01,17) SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.BasicOscarService; sh.FamilySubtypeID = (ushort)GenericServiceControls.ServerServicesVersionRequest; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); // Pack the family IDs and version numbers into a stream ushort[] families = sess.Connections.GetFamilies(dp.ParentConnection); Array.Sort(families); Array.Reverse(families); ByteStream stream = new ByteStream(); foreach (ushort id in families) { ushort version = sess.Families.GetFamilyVersion(id); stream.WriteUshort(id); stream.WriteUshort(version); } DataPacket dp2 = Marshal.BuildDataPacket(sess, sh, stream); dp2.ParentConnection = dp.ParentConnection; SNACFunctions.BuildFLAP(dp2); }
/// <summary> /// Sets the user's directory information -- SNAC(02,09) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> /// <param name="allow"><c>true</c> if other users may search this information, <c>false</c> if not</param> /// <param name="firstname">A first name</param> /// <param name="middlename">A middle name</param> /// <param name="lastname">A last name</param> /// <param name="maidenname">A maiden name</param> /// <param name="nickname">A nickname</param> /// <param name="city">A city</param> /// <param name="state">A state</param> /// <param name="country">A country (two-letter code)</param> /// <param name="zip">A ZIP code</param> /// <param name="address">An address</param> public static void SetDirectoryInformation( Session sess, bool allow, string firstname, string middlename, string lastname, string maidenname, string nickname, string city, string state, string country, string zip, string address) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.LocationService; sh.FamilySubtypeID = (ushort)LocationServices.UpdateDirectoryInfoRequest; ByteStream stream = new ByteStream(); using (TlvBlock tlvs = new TlvBlock()) { tlvs.WriteUshort(0x001A, (ushort)((allow) ? 0x0001 : 0x0000)); tlvs.WriteString(DIRECTORY_FIRSTNAME, firstname, Encoding.ASCII); tlvs.WriteString(DIRECTORY_MIDDLENAME, middlename, Encoding.ASCII); tlvs.WriteString(DIRECTORY_LASTNAME, lastname, Encoding.ASCII); tlvs.WriteString(DIRECTORY_MAIDENNAME, maidenname, Encoding.ASCII); tlvs.WriteString(DIRECTORY_COUNTRY, country, Encoding.ASCII); tlvs.WriteString(DIRECTORY_STATE, state, Encoding.ASCII); tlvs.WriteString(DIRECTORY_CITY, city, Encoding.ASCII); tlvs.WriteString(DIRECTORY_NICKNAME, nickname, Encoding.ASCII); tlvs.WriteString(DIRECTORY_ZIPCODE, zip, Encoding.ASCII); tlvs.WriteString(DIRECTORY_ADDRESS, address, Encoding.ASCII); stream.WriteByteArray(tlvs.GetBytes()); } SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Sets the client's extended status -- SNAC(01,1E) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> /// <param name="availablemessage">The available message to set</param> /// <param name="flags">The ICQ flags to set</param> /// <param name="status">The ICQ status to set</param> /// <remarks>Either the available message or the flags/status can be set in one call to SetExtendedStatus</remarks> private static void SetExtendedStatus(Session sess, string availablemessage, ICQFlags flags, ICQStatus status) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.BasicOscarService; sh.FamilySubtypeID = (ushort)GenericServiceControls.SetExtendedStatus; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); if (availablemessage != null) { stream.WriteUshort(0x001D); stream.WriteUshort((ushort)(availablemessage.Length + 8)); stream.WriteUshort(0x0002); stream.WriteByte(0x04); stream.WriteByte((byte)(Encoding.ASCII.GetByteCount(availablemessage) + 4)); stream.WriteUshort((ushort)Encoding.ASCII.GetByteCount(availablemessage)); stream.WriteString(availablemessage, Encoding.ASCII); stream.WriteUshort(0x0000); } else { uint stat = (uint)((ushort)flags << 16); stat |= (ushort)status; stream.WriteUint(0x00060004); stream.WriteUint(stat); } DataPacket dp = Marshal.BuildDataPacket(sess, sh, stream); dp.ParentConnection = sess.Connections.BOSConnection; SNACFunctions.BuildFLAP(dp); }
/// <summary> /// Finishes an SSI modification transaction -- SNAC(13,12) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> public static void SendEditComplete(Session sess) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.SSIService; sh.FamilySubtypeID = (ushort)SSIService.ContactsEditEnd; SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, new ByteStream())); }
/// <summary> /// Requests a list of known interests -- SNAC(0F,04) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> public static void RequestInterestList(Session sess) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.DirectoryUserSearch; sh.FamilySubtypeID = (ushort)DirectorySearch.InterestsListRequest; SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, new ByteStream())); }
/// <summary> /// Sends a request for the original SSI contact list -- SNAC(13,04) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> public static void RequestInitialContactList(Session sess) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.SSIService; sh.FamilySubtypeID = (ushort)SSIService.ContactListInitialRequest; SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, new ByteStream())); }
/// <summary> /// (Obsolete) Sends a keepalive no-op -- SNAC(01,16) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> /// <remarks> /// This SNAC is not used anymore. Channel 5 FLAPs should be used /// for keepalive, and are sent automatically by the <see cref="Connection"/> /// objects. /// </remarks> public static void SendNoOp(Session sess) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.BasicOscarService; sh.FamilySubtypeID = (ushort)GenericServiceControls.NoOp; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, new ByteStream())); }
/// <summary> /// Removes a series of SSI items from the server-side list -- SNAC(13,0A) /// </summary> /// <param name="sess"></param> /// <param name="items">An array of <see cref="SSIItem"/> objects</param> public static void RemoveSSIItems(Session sess, SSIItem[] items) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.SSIService; sh.FamilySubtypeID = (ushort)SSIService.SSIEditRemoveItem; ByteStream stream = new ByteStream(); stream.WriteSSIItems(items); sess.SSI.OutstandingRequests++; SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Delete yourself from another client server-side contact list. /// </summary> /// <param name="sess"></param> /// <param name="screenname">The contacts icq-number.</param> public static void RemoveMySSIItem(Session sess, string screenname) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.SSIService; sh.FamilySubtypeID = (ushort)SSIService.RemoveSelfFromContact; ByteStream stream = new ByteStream(); stream.WriteByte((byte)screenname.Length); stream.WriteString(screenname, Encoding.ASCII); SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Sends an out-of-the-country text message /// </summary> /// <param name="sess">A <see cref="ISession"/> object</param> /// <param name="number">The number to which to send the message</param> /// <param name="message">The message to send</param> /// <param name="alias">The sender's alias</param> /// <remarks><paramref name="message"/> must be in codepage 1252. A delivery receipt /// is automatically requested by this method.</remarks> public static void SendSMSMessage(ISession sess, string number, string message, string alias) { string xmlformat = "<icq_sms_message>\n" + "\t<destination>{0}</destination>\n" + "\t<text>{1}</text>\n" + "\t<codepage>1252</codepage>\n" + "\t<senders_UIN>{2}</senders_UIN>\n" + "\t<senders_name>{3}</senders_name>\n" + "\t<delivery_receipt>Yes</delivery_receipt>\n" + "\t<time>{4}</time>\n" + "</icq_sms_message>\n"; string xml = String.Format(xmlformat, number, message, sess.ScreenName, alias, DateTime.Now.ToString("r")); SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.ICQExtensionsService; sh.FamilySubtypeID = (ushort)ICQExtensionsService.MetaInformationRequest; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); stream.WriteUshort(0x0001); stream.WriteUshort(0x000A); stream.WriteUshort(0x0008); stream.WriteUint(uint.Parse(sess.ScreenName)); stream.WriteUshortLE(0x07D0); stream.WriteUshortLE((ushort)sh.RequestID); stream.WriteUshort(0x8214); stream.WriteUshort(0x0001); stream.WriteUshort(0x0016); stream.WriteUint(0x00000000); stream.WriteUint(0x00000000); stream.WriteUint(0x00000000); stream.WriteUint(0x00000000); stream.WriteUshort(0x0000); stream.WriteUshort((ushort)Encoding.ASCII.GetByteCount(xml)); stream.WriteString(xml, Encoding.ASCII); stream.WriteByte(0x00); SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Sends an acknowledgement of the server's rate limitations -- SNAC(01,08) /// </summary> /// <param name="dp">A <see cref="DataPacket"/> object</param> /// <param name="classes">The known rate classes to acknowledge</param> public static void AcknowledgeRateLimitations(DataPacket dp, ushort[] classes) { Session sess = dp.ParentSession; SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.BasicOscarService; sh.FamilySubtypeID = (ushort)GenericServiceControls.AcknowledgeRateLimits; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); for (int i = 0; i < classes.Length; i++) { stream.WriteUshort(classes[i]); } DataPacket dp2 = Marshal.BuildDataPacket(sess, sh, stream); dp2.ParentConnection = dp.ParentConnection; SNACFunctions.BuildFLAP(dp2); sess.OnLoginStatusUpdate("Protocol negotiation complete", 0.66); /* * If this is the initial services connection, we call the remaining SNACs * in the login sequence. * Otherwise, this is the last step in setting up a new service connection, * and we send SNAC(01,02) here. */ if (!sess.LoggedIn) { // Start stage 3, services setup RequestOwnInformation(sess); SNAC13.RequestParametersList(sess); SNAC13.RequestInitialContactList(sess); sess.Statuses.RequestParameters(); sess.Messages.RequestParametersList(); SNAC09.RequestParametersList(sess); sess.Statuses.ReportClientCapabilities(); sess.Statuses.SetProfile(sess.Statuses.Profile); } else { SendReadyNotification(dp); } }
/// <summary> /// Sends a request for rate information -- SNAC(01,06) /// </summary> /// <param name="dp">A <see cref="DataPacket"/> object</param> public static void RequestRateInformation(DataPacket dp) { Session sess = dp.ParentSession; // Construct SNAC (01,06) SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (byte)SNACFamily.BasicOscarService; sh.FamilySubtypeID = (byte)GenericServiceControls.RateLimitRequest; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); DataPacket dp2 = Marshal.BuildDataPacket(sess, sh, new ByteStream()); dp2.ParentConnection = dp.ParentConnection; SNACFunctions.BuildFLAP(dp2); }
/// <summary> /// Requests for the server side contact list. /// </summary> /// <param name="sess">the session object</param> /// <param name="modificationDate">the last client side modification date</param> /// <param name="isLocalTime">Determines if the given modification time is in the local or universal time format</param> /// <param name="itemCount">the total item count at the client side</param> public static void SendContactListCheckout(Session sess, DateTime modificationDate, bool isLocalTime, ushort itemCount) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.SSIService; sh.FamilySubtypeID = (ushort)SSIService.ContactListCheckout; ByteStream stream = new ByteStream(); uint modDateValue = ByteStream.ConvertDateTimeToUint(modificationDate, isLocalTime); stream.WriteUint(modDateValue); stream.WriteUshort(itemCount); SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Requests the client's own online information -- SNAC(01,0E) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> public static void RequestOwnInformation(Session sess) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.BasicOscarService; sh.FamilySubtypeID = (ushort)GenericServiceControls.OwnInformationRequest; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); // This SNAC expects a response in SNAC(01,0F) sess.StoreRequestID(sh.RequestID, null); DataPacket dp = Marshal.BuildDataPacket(sess, sh, new ByteStream()); // Always gets sent on BOS dp.ParentConnection = sess.Connections.BOSConnection; SNACFunctions.BuildFLAP(dp); }
/// <summary> /// Registers the user's screenname with the Location service -- SNAC(02,0B) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> /// <remarks> /// The function of this SNAC is unknown, but the official AIM client (5.9.3861) sends it sometime /// after SNAC(01,02) is sent. /// </remarks> public static void SetSelfLocation(Session sess) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.LocationService; sh.FamilySubtypeID = (ushort)0x000B; ByteStream stream = new ByteStream(); stream.WriteByte((byte)Encoding.ASCII.GetByteCount(sess.ScreenName)); stream.WriteString(sess.ScreenName, Encoding.ASCII); // This SNAC expects a response in SNAC(02,0C) sess.StoreRequestID(sh.RequestID, null); SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Sets the client's privacy settings -- SNAC(01,14) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> /// <param name="settings">The privacy flags to send to the server</param> public static void SetPrivacySettings(Session sess, uint settings) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.BasicOscarService; sh.FamilySubtypeID = (ushort)GenericServiceControls.SetPrivacyFlags; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); stream.WriteUint(settings); DataPacket dp = Marshal.BuildDataPacket(sess, sh, stream); // Always gets sent on BOS dp.ParentConnection = sess.Connections.BOSConnection; SNACFunctions.BuildFLAP(dp); }
/// <summary> /// Sends a request to find accounts by their associated email address -- SNAC(0A,02) /// </summary> /// <param name="sess">A <see cref="ISession"/> object</param> /// <param name="email">The email address to query</param> public static void FindUsersByEmail(ISession sess, string email) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.UserLookupService; sh.FamilySubtypeID = (ushort)UserLookupService.FindUserByEmailRequest; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); stream.WriteString(email, Encoding.ASCII); sess.StoreRequestID(sh.RequestID, email); DataPacket dp = Marshal.BuildDataPacket(sess, sh, stream); SNACFunctions.BuildFLAP(dp); }
/// <summary> /// Performs a directory search by interest -- SNAC(0F,02) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> /// <param name="interest">The interest to search for</param> public static void SearchByInterest(Session sess, string interest) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.DirectoryUserSearch; sh.FamilySubtypeID = (ushort)DirectorySearch.SearchUserRequest; ByteStream stream = new ByteStream(); using (TlvBlock tlvs = new TlvBlock()) { tlvs.WriteString(0x001C, "us-ascii", Encoding.ASCII); tlvs.WriteUshort(0x000A, 0x0001); tlvs.WriteString(0x0001, interest, Encoding.ASCII); stream.WriteTlvBlock(tlvs); } SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Allows the authorization to another client in the future /// </summary> /// <param name="sess">the session object</param> /// <param name="screenname">the destination screenname</param> /// <param name="reason">the reason for the future authorization</param> public static void SendFutureAuthorizationGrant(Session sess, string screenname, string reason) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.SSIService; sh.FamilySubtypeID = (ushort)SSIService.SendFutureAuthorizationGrant; ByteStream stream = new ByteStream(); stream.WriteByte((byte)Encoding.ASCII.GetByteCount(screenname)); stream.WriteString(screenname, Encoding.ASCII); stream.WriteUshort((ushort)sess.Encoding.GetByteCount(reason)); stream.WriteString(reason, sess.Encoding); stream.WriteUshort(0x0000); SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Sends an AIM invitation to a receipient -- SNAC(06,02) /// </summary> /// <param name="sess">A <see cref="ISession"/> object</param> /// <param name="email">The email address of the person to invite</param> /// <param name="text">The text of the invitation</param> public static void SendInvitiationRequest(ISession sess, string email, string text) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.PrivacyManagementService; sh.FamilySubtypeID = (ushort)PrivacyManagementService.ServiceParametersRequest; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); using (TlvBlock tlvs = new TlvBlock()) { tlvs.WriteString(0x0011, email, Encoding.ASCII); tlvs.WriteString(0x0015, text, Encoding.ASCII); stream.WriteTlvBlock(tlvs); } SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Sends a response to a client verification request -- SNAC(01,20) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> /// <remarks> /// SNAC(01,1F) and SNAC(01,20) are used to verify that the client connecting /// to the network was the official AOL Instant Messenger. The server sends /// two integers, an offset and a length, in SNAC(01,1F). These parameters are then used to /// get 16 bytes of data in the offical client's static memory region. However, after /// AOL begain using this authentication method, the servers never changed the requested /// offset and length. The expected response was the same 16 bytes every time, which made /// it a fairly ineffective deterrent to "unauthorized" clients. This SNAC pair not been /// reported as being used in years. /// </remarks> public static void SendVerificationResponse(Session sess) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.BasicOscarService; sh.FamilySubtypeID = (ushort)GenericServiceControls.ClientVertificationResponse; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); stream.WriteUint(0x44a95d26); stream.WriteUint(0xd2490423); stream.WriteUint(0x93b8821f); stream.WriteUint(0x51c54b01); DataPacket dp = Marshal.BuildDataPacket(sess, sh, stream); dp.ParentConnection = sess.Connections.BOSConnection; SNACFunctions.BuildFLAP(dp); }
/// <summary> /// Sends authorization request -- SNAC(17,02) /// </summary> /// <param name="dp">A <see cref="DataPacket"/> object containing SNAC(17,07)</param> public static void SendAuthorizationRequest(DataPacket dp) { // Pull apart SNAC(17,07) byte[] key = dp.Data.ReadByteArray(dp.Data.ReadUshort()); // Construct SNAC(17,02) SNACHeader header = new SNACHeader(); header.FamilyServiceID = (ushort)SNACFamily.AuthorizationRegistrationService; header.FamilySubtypeID = (ushort)AuthorizationRegistrationService.LoginRequest; header.Flags = 0; header.RequestID = Session.GetNextRequestID(); OSCARIdentification id = dp.ParentSession.ClientIdentification; ByteStream stream = new ByteStream(); using (TlvBlock tlvs = new TlvBlock()) { tlvs.WriteString(0x0001, dp.ParentSession.ScreenName, Encoding.ASCII); tlvs.WriteString(0x0003, id.ClientName, Encoding.ASCII); tlvs.WriteString(0x000F, "en", Encoding.ASCII); tlvs.WriteString(0x000E, "us", Encoding.ASCII); tlvs.WriteUint(0x0014, id.ClientDistribution); tlvs.WriteUshort(0x0016, id.ClientId); tlvs.WriteUshort(0x0017, id.ClientMajor); tlvs.WriteUshort(0x0018, id.ClientMinor); tlvs.WriteUshort(0x0019, id.ClientLesser); tlvs.WriteUshort(0x001A, id.ClientBuild); tlvs.WriteByteArray(0x0025, dp.ParentSession.HashPassword(key)); tlvs.WriteByte(0x004A, 0x01); tlvs.WriteEmpty(0x004C); stream.WriteTlvBlock(tlvs); } DataPacket newPacket = Marshal.BuildDataPacket(dp.ParentSession, header, stream); newPacket.ParentConnection = dp.ParentConnection; SNACFunctions.BuildFLAP(newPacket); }
/// <summary> /// Send MD5 key request -- SNAC(17,06) /// </summary> /// <param name="sess">A <see cref="ISession"/> object</param> public static void SendMD5Request(ISession sess) { /*** Send SNAC(17,06) to get the auth key ***/ SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.AuthorizationRegistrationService; sh.FamilySubtypeID = (ushort)AuthorizationRegistrationService.MD5AuthkeyRequest; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); using (TlvBlock tlvs = new TlvBlock()) { tlvs.WriteString(0x0001, sess.ScreenName, Encoding.ASCII); tlvs.WriteEmpty(0x004B); tlvs.WriteEmpty(0x005A); stream.WriteTlvBlock(tlvs); } SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Sends a request for a new service family -- SNAC(01,04) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> /// <param name="newfamily">The new family to request</param> public static void RequestNewService(Session sess, ushort newfamily) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.BasicOscarService; sh.FamilySubtypeID = (ushort)GenericServiceControls.NewServiceRequest; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); stream.WriteUshort(newfamily); // This SNAC expects a response in SNAC(01,05) sess.StoreRequestID(sh.RequestID, null); DataPacket dp = Marshal.BuildDataPacket(sess, sh, stream); // This one is always sent on BOS dp.ParentConnection = sess.Connections.BOSConnection; SNACFunctions.BuildFLAP(dp); }
/// <summary> /// Hides the client's IP address from view /// </summary> /// <param name="sess">A <see cref="ISession"/> object</param> public static void HidePublicIP(ISession sess) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.ICQExtensionsService; sh.FamilySubtypeID = (ushort)ICQExtensionsService.MetaInformationRequest; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); stream.WriteUshort(0x0001); stream.WriteUshort(0x000A); stream.WriteUshort(0x0008); stream.WriteUint(uint.Parse(sess.ScreenName)); stream.WriteUshortLE(0x07D0); stream.WriteUshortLE((ushort)sh.RequestID); stream.WriteUshort(0x0424); stream.WriteUshort(0x0001); stream.WriteUshort(0x0001); SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Sets the user's interests list -- SNAC(02,0F) /// </summary> /// <param name="sess">A <see cref="Session"/> object</param> /// <param name="allow"><c>true</c> if other users may search this information, <c>false</c> if not</param> /// <param name="interests">An array of interest names</param> /// <remarks> /// OSCAR allows a user to set up to five interests. If <paramref name="interests"/> contains /// more than five items, only the first five are used. /// </remarks> public static void SetInterestsInformation(Session sess, bool allow, string[] interests) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.LocationService; sh.FamilySubtypeID = (ushort)LocationServices.UpdateInterestsRequest; ByteStream stream = new ByteStream(); using (TlvBlock tlvs = new TlvBlock()) { tlvs.WriteUshort(INTERESTS_ALLOWSEARCH, (ushort)((allow) ? 0x0001 : 0x0000)); for (int i = 0; i < interests.Length && i < 5; i++) { tlvs.WriteString(INTERESTS_INTEREST, interests[i], Encoding.ASCII); } stream.WriteByteArray(tlvs.GetBytes()); } SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Sends an acknowledgement to the pause command -- SNAC(01,0C) /// </summary> /// <param name="dp">A <see cref="DataPacket"/> object to be paused</param> public static void SendPauseAcknowledgement(DataPacket dp) { Session sess = dp.ParentSession; SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.BasicOscarService; sh.FamilySubtypeID = (ushort)GenericServiceControls.PauseResponse; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); ushort[] families = sess.Connections.GetFamilies(dp.ParentConnection); for (int i = 0; i < families.Length; i++) { stream.WriteUshort(families[i]); } DataPacket dp2 = Marshal.BuildDataPacket(sess, sh, stream); dp2.ParentConnection = dp.ParentConnection; SNACFunctions.BuildFLAP(dp2); }
/// <summary> /// Changes the password on an ICQ account /// </summary> /// <param name="sess">A <see cref="ISession"/> object</param> /// <param name="newpassword">The new password</param> /// <remarks>If the new password is longer than 8 characters, it is automatically /// truncated to 8 characters by the server.</remarks> public static void ChangeICQPassword(ISession sess, string newpassword) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.ICQExtensionsService; sh.FamilySubtypeID = (ushort)ICQExtensionsService.MetaInformationRequest; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); stream.WriteUshort(0x0001); stream.WriteUshort(0x000A); stream.WriteUshort(0x0008); stream.WriteUint(uint.Parse(sess.ScreenName)); stream.WriteUshortLE(0x07D0); stream.WriteUshortLE((ushort)sh.RequestID); stream.WriteUshort(0x042E); stream.WriteUshort((ushort)(newpassword.Length + 1)); stream.WriteString(newpassword, Encoding.ASCII); stream.WriteByte(0x00); SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }
/// <summary> /// Sends an XML string /// </summary> /// <param name="sess">A <see cref="ISession"/> object</param> /// <param name="xml">The contents of an XML document</param> /// <remarks>I have no idea how to use this.</remarks> public static void SendXmlRequest(ISession sess, string xml) { SNACHeader sh = new SNACHeader(); sh.FamilyServiceID = (ushort)SNACFamily.ICQExtensionsService; sh.FamilySubtypeID = (ushort)ICQExtensionsService.MetaInformationRequest; sh.Flags = 0x0000; sh.RequestID = Session.GetNextRequestID(); ByteStream stream = new ByteStream(); stream.WriteUshort(0x0001); stream.WriteUshort(0x000A); stream.WriteUshort(0x0008); stream.WriteUint(uint.Parse(sess.ScreenName)); stream.WriteUshortLE(0x07D0); stream.WriteUshortLE((ushort)sh.RequestID); stream.WriteUshort(0x0998); stream.WriteUshort((ushort)Encoding.ASCII.GetByteCount(xml)); stream.WriteString(xml, Encoding.ASCII); stream.WriteByte(0x00); SNACFunctions.BuildFLAP(Marshal.BuildDataPacket(sess, sh, stream)); }