private void HandleEnterChat(ParseData data) { DataReader dr = new DataReader(data.Data); EnteredChatEventArgs e = new EnteredChatEventArgs(dr.ReadCString(), dr.ReadCString(), dr.ReadCString()); m_uniqueUN = e.UniqueUsername; e.EventData = data; OnEnteredChat(e); if (m_settings.Client.Equals("WAR3", StringComparison.Ordinal) || m_settings.Client.Equals("W3XP", StringComparison.Ordinal)) { BncsPacket pck = new BncsPacket((byte)BncsPacketId.WarcraftGeneral); pck.InsertByte((byte)WarcraftCommands.IconListRequest); pck.InsertInt32(1); Send(pck); pck = new BncsPacket((byte)BncsPacketId.NewsInfo); pck.InsertInt32(0); Send(pck); RequestChannelList(); } }
public void Send(string text) { if (IsConnected) { BncsPacket pck = new BncsPacket(BncsPacketId.ChatCommand, _storage.Acquire()); pck.InsertCString(text, Encoding.UTF8); pck.SendAsync(_connection); if (text.StartsWith(EMOTE_1, StringComparison.OrdinalIgnoreCase) || text.StartsWith(EMOTE_2, StringComparison.OrdinalIgnoreCase)) { // do nothing, but we need this case first so that command sent doesn't fire for emotes. } else if (text.StartsWith(COMMAND_START, StringComparison.Ordinal)) { //OnCommandSent(new InformationEventArgs(text)); } else { ChatMessageEventArgs <UserFlags> cme = new ChatMessageEventArgs <UserFlags>(ChatEventType.Talk, UserFlags.None, "(me)", text); _channel.HandleChatMessageEvent(cme); //ChatMessageEventArgs<UserFlags> cme = new ChatMessageEventArgs<UserFlags>(ChatEventType.Talk, UserFlags.None, this._uniqueUN, text); OnMessageSent(text); } } }
private void RequestChannelList() { BncsPacket pckChanReq = new BncsPacket((byte)BncsPacketId.GetChannelList); pckChanReq.InsertDwordString(m_settings.Client); Send(pckChanReq); }
private void LoginAccountOld() { switch (m_settings.Client) { case "W2BN": BncsPacket pck0x29 = new BncsPacket((byte)BncsPacketId.LogonResponse); pck0x29.Insert(m_clientToken); pck0x29.Insert(m_srvToken); pck0x29.InsertByteArray(OldAuth.DoubleHashPassword(m_settings.Password, m_clientToken, m_srvToken)); pck0x29.InsertCString(m_settings.Username); Send(pck0x29); break; case "STAR": case "SEXP": case "D2DV": case "D2XP": BncsPacket pck0x3a = new BncsPacket((byte)BncsPacketId.LogonResponse2); pck0x3a.Insert(m_clientToken); pck0x3a.Insert(m_srvToken); pck0x3a.InsertByteArray(OldAuth.DoubleHashPassword( m_settings.Password, m_clientToken, m_srvToken)); pck0x3a.InsertCString(m_settings.Username); Send(pck0x3a); break; default: throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, Strings.BnetClient_LoginAccountOld_ClientNotSupported_fmt, m_settings.Client)); } }
private async void HandleLogonResponse2(BncsReader dr) { int success = dr.ReadInt32(); if (success == 0) { OnLoginSucceeded(); ClassicProduct product = _settings.Client; if (product.UsesUdpPing) { BncsPacket pck = new BncsPacket(BncsPacketId.UdpPingResponse, _storage.Acquire()); pck.InsertDwordString("bnet"); await pck.SendAsync(_connection); } EnterChat(); } else { LoginFailureReason reason = LoginFailureReason.Unknown; switch (success) { case 1: // account DNE reason = LoginFailureReason.AccountDoesNotExist; break; case 2: // invalid password reason = LoginFailureReason.InvalidAccountOrPassword; break; case 6: // account closed reason = LoginFailureReason.AccountClosed; break; } LoginFailedEventArgs args = new LoginFailedEventArgs(reason, success, dr.ReadCString()); OnLoginFailed(args); } }
private async void RequestChannelList() { BncsPacket pckChanReq = new BncsPacket(BncsPacketId.GetChannelList, _storage.Acquire()); pckChanReq.InsertDwordString(_settings.Client.ProductCode); await pckChanReq.SendAsync(_connection); }
private void HandleLogonResponse(ParseData data) { DataReader dr = new DataReader(data.Data); int status = dr.ReadInt32(); if (status == 1) { OnLoginSucceeded(BaseEventArgs.GetEmpty(data)); Product product = Product.GetByProductCode(m_settings.Client); if (product.UsesUdpPing) { BncsPacket pck = new BncsPacket((byte)BncsPacketId.UdpPingResponse); pck.InsertDwordString("bnet"); Send(pck); } EnterChat(); } else { LoginFailedEventArgs args = new LoginFailedEventArgs(LoginFailureReason.InvalidAccountOrPassword, status) { EventData = data }; OnLoginFailed(args); } }
private async void LoginAccountOld() { switch (_settings.Client.ProductCode) { case "W2BN": BncsPacket pck0x29 = new BncsPacket(BncsPacketId.LogonResponse, _storage.Acquire()); pck0x29.InsertInt32(_clientToken); pck0x29.InsertInt32(_srvToken); pck0x29.InsertByteArray(OldAuth.DoubleHashPassword(_settings.Password, _clientToken, _srvToken)); pck0x29.InsertCString(_settings.Username); await pck0x29.SendAsync(_connection); break; case "STAR": case "SEXP": case "D2DV": case "D2XP": BncsPacket pck0x3a = new BncsPacket(BncsPacketId.LogonResponse2, _storage.Acquire()); pck0x3a.InsertInt32(_clientToken); pck0x3a.InsertInt32(_srvToken); pck0x3a.InsertByteArray(OldAuth.DoubleHashPassword(_settings.Password, _clientToken, _srvToken)); pck0x3a.InsertCString(_settings.Username); await pck0x3a.SendAsync(_connection); break; default: throw new NotSupportedException(string.Format("Client '{0}' is not supported with old-style account login.", _settings.Client.ProductCode)); } }
private static void HandleChatEvent(BncsPacket obj) { var packet = new ChatEventPacket(obj.Raw); if (packet.Eid != Eid.SHOWUSER) { Log.Information(packet.RenderText()); } }
/// <summary> /// Informs the server that an ad has been clicked. /// </summary> /// <param name="adID">The ID of the ad assigned by the server.</param> public virtual void ClickAd(int adID) { BncsPacket pck = new BncsPacket((byte)BncsPacketId.ClickAd); pck.InsertInt32(adID); pck.InsertInt32(1); // non-SID_QUERYADURL request Send(pck); }
private async void LoginAccountNLS() { _nls = new NLS(_settings.Username, _settings.Password); BncsPacket pck0x53 = new BncsPacket(BncsPacketId.AuthAccountLogon, _storage.Acquire()); _nls.LoginAccount(pck0x53); await pck0x53.SendAsync(_connection); }
private async void CreateAccountNLS() { BncsPacket pck = new BncsPacket(BncsPacketId.AuthAccountCreate, _storage.Acquire()); _nls = new NLS(_settings.Username, _settings.Password); _nls.CreateAccount(pck); await pck.SendAsync(_connection); }
private void LoginAccountNLS() { m_nls = new NLS(m_settings.Username, m_settings.Password); BncsPacket pck0x53 = new BncsPacket((byte)BncsPacketId.AuthAccountLogon); m_nls.LoginAccount(pck0x53); Send(pck0x53); }
private void CreateAccountNLS() { BncsPacket pck = new BncsPacket((byte)BncsPacketId.AuthAccountCreate); m_nls = new NLS(m_settings.Username, m_settings.Password); m_nls.CreateAccount(pck); Send(pck); }
/// <summary> /// If the client is logged on as a clan Chieftan or Shaman, sets the clan message-of-the-day. /// </summary> /// <param name="motd">The new message-of-the-day.</param> public void SetClanMessageOfTheDay(string motd) { BncsPacket pck = new BncsPacket((byte)BncsPacketId.ClanSetMOTD); pck.InsertInt32(Interlocked.Increment(ref m_clanCookie)); pck.InsertCString(motd); Send(pck); }
private void HandleGetChannelList(ParseData data) { DataReader dr = new DataReader(data.Data); List <string> channelList = new List <string>(); string channel; do { channel = dr.ReadCString(); if (!string.IsNullOrEmpty(channel)) { channelList.Add(channel); } } while (!string.IsNullOrEmpty(channel)); ChannelListEventArgs e = new ChannelListEventArgs(channelList.ToArray()); e.EventData = data; OnChannelListReceived(e); if (!m_firstChannelList) { m_firstChannelList = true; BncsPacket pckJoinChan = new BncsPacket((byte)BncsPacketId.JoinChannel); if (m_settings.Client.Equals("D2DV", StringComparison.Ordinal) || m_settings.Client.Equals("D2XP", StringComparison.Ordinal)) { pckJoinChan.InsertInt32((int)ChannelJoinFlags.Diablo2FirstJoin); } else { pckJoinChan.InsertInt32((int)ChannelJoinFlags.FirstJoin); } switch (m_settings.Client) { case "STAR": case "SEXP": case "W2BN": case "D2DV": case "D2XP": case "JSTR": pckJoinChan.InsertCString(m_settings.Client); break; case "WAR3": case "W3XP": pckJoinChan.InsertCString("W3"); break; } Send(pckJoinChan); } }
private async void CreateAccountOld() { byte[] passwordHash = OldAuth.HashPassword(_settings.Password); BncsPacket pck = new BncsPacket(BncsPacketId.CreateAccount2, _storage.Acquire()); pck.InsertByteArray(passwordHash); pck.InsertCString(_settings.Username); await pck.SendAsync(_connection); }
private void CreateAccountOld() { byte[] passwordHash = OldAuth.HashPassword(m_settings.Password); BncsPacket pck = new BncsPacket((byte)BncsPacketId.CreateAccount2); pck.InsertByteArray(passwordHash); pck.InsertCString(m_settings.Username); Send(pck); }
/// <summary> /// Disbands the clan to which the client belongs. /// </summary> /// <returns>The request ID assigned to the request.</returns> /// <remarks> /// <para>The client must be the leader of the clan in order to send this command.</para> /// </remarks> public int DisbandClan() { int result = Interlocked.Increment(ref m_clanCookie); BncsPacket pck = new BncsPacket((byte)BncsPacketId.ClanDisband); pck.InsertInt32(result); Send(pck); return(result); }
private void Send_SID_LOGONREALMEX(string a_sRealmTitle) { BncsPacket bncsPacket = new BncsPacket(62); byte[] b = OldAuth.DoubleHashPassword("password", this.g_iClientToken, this.g_iServerToken); bncsPacket.InsertInt32(this.g_iClientToken); bncsPacket.InsertByteArray(b); bncsPacket.InsertCString(a_sRealmTitle); this.SendPacket(bncsPacket.UnderlyingBuffer); }
/// <summary> /// Responds to a clan invitation received via the <see>ClanInvitationReceived</see> event. /// </summary> /// <param name="invitation">The arguments that accompanied the invitation.</param> /// <param name="accept"><see langword="true" /> to accept the invitation and join the clan; otherwise <see langword="false" />.</param> /// <remarks> /// <para>Following the acceptance of an invitation, the client should receive <see>ClanMembershipReceived</see> and automatically respond by requesting clan /// membership information.</para> /// </remarks> public void RespondToClanInvitation(ClanInvitationEventArgs invitation, bool accept) { BncsPacket pck = new BncsPacket((byte)BncsPacketId.ClanInvitationResponse); pck.InsertInt32(invitation.RequestID); pck.InsertDwordString(invitation.ClanTag); pck.InsertCString(invitation.Inviter); pck.InsertByte(accept ? (byte)6 : (byte)4); Send(pck); }
private async void HandlePing(BncsReader packet) { int ping = packet.ReadInt32(); NetworkBuffer buffer = _storage.Acquire(); BncsPacket response = new BncsPacket(BncsPacketId.Ping, buffer); response.InsertInt32(ping); await response.SendAsync(_connection); }
/// <summary> /// Responds to the invitation to form a new clan. /// </summary> /// <param name="requestID">The request ID, provided by the <see cref="ClanFormationInvitationEventArgs.RequestID">ClanFormationInvitationEventArgs</see>.</param> /// <param name="clanTag">The clan tag.</param> /// <param name="inviter">The user who invited the client to the clan.</param> /// <param name="accept">Whether to accept the invitation.</param> public void RespondToNewClanInvitation(int requestID, string clanTag, string inviter, bool accept) { BncsPacket pck = new BncsPacket((byte)BncsPacketId.ClanCreationInvitation); pck.InsertInt32(requestID); pck.InsertDwordString(clanTag, 0); pck.InsertCString(inviter); pck.InsertByte((byte)(accept ? ClanResponseCode.Accept : ClanResponseCode.Decline)); Send(pck); }
/// <summary> /// Informs the server that an ad has been displayed. This should be sent whenever an ad /// is updated on the client. /// </summary> /// <param name="adID">The ID of the ad assigned by the server.</param> public virtual void DisplayAd(int adID) { BncsPacket pck = new BncsPacket((byte)BncsPacketId.DisplayAd); pck.InsertDwordString(PLATFORM_TYPE); pck.InsertDwordString(Settings.Client); pck.InsertInt32(adID); pck.InsertInt16(0); // NULL strings for filename and URL. Send(pck); }
void SendAdCheck(object sender, System.Timers.ElapsedEventArgs e) { BncsPacket pck = new BncsPacket((byte)BncsPacketId.CheckAd); pck.InsertDwordString("IX86"); pck.InsertDwordString(Settings.Client); pck.InsertInt32(m_lastAd); pck.InsertInt32(m_lastAd + 1); Send(pck); }
private void HandleProfile(ParseData pd) { DataReader dr = new DataReader(pd.Data); int cookie = dr.ReadInt32(); if (!m_warcraftProfileRequests.ContainsKey(cookie)) { Debug.WriteLine(string.Format(CultureInfo.InvariantCulture, "Unable to locate profile request with cookie {0:x2}", cookie)); return; } WarcraftProfileEventArgs args = m_warcraftProfileRequests[cookie]; byte success = dr.ReadByte(); if (success != 0) { m_warcraftProfileRequests.Remove(cookie); ProfileLookupFailedEventArgs profileFailed = new ProfileLookupFailedEventArgs(args.Username, args.Product) { EventData = pd }; OnProfileLookupFailed(profileFailed); return; } string desc = dr.ReadCString(); string location = dr.ReadCString(); string tag = dr.ReadDwordString(0); WarcraftProfile profile = new WarcraftProfile(desc, location, tag); args.Profile = profile; if (!string.IsNullOrEmpty(tag)) { BncsPacket pck = new BncsPacket((byte)BncsPacketId.ClanMemberInformation); pck.InsertInt32(cookie); pck.InsertDwordString(tag, 0); pck.InsertCString(args.Username); Send(pck); } else { BncsPacket pck = new BncsPacket((byte)BncsPacketId.WarcraftGeneral); pck.InsertByte((byte)WarcraftCommands.UserInfoRequest); pck.InsertInt32(cookie); pck.InsertCString(args.Username); pck.InsertDwordString(args.Product.ProductCode); Send(pck); } BattleNetClientResources.IncomingBufferPool.FreeBuffer(pd.Data); }
private void Send_SID_LOGONRESPONSE() { byte[] b = new byte[0]; b = OldAuth.DoubleHashPassword(this.BnetInfo.BnetPassword, this.g_iClientToken, this.g_iServerToken); BncsPacket bncsPacket = new BncsPacket(58); bncsPacket.InsertInt32(this.g_iClientToken); bncsPacket.InsertInt32(this.g_iServerToken); bncsPacket.InsertByteArray(b); bncsPacket.InsertCString(this.BnetInfo.BnetUserName); this.SendPacket(bncsPacket.UnderlyingBuffer); }
private async void HandleGetChannelList(BncsReader dr) { List <string> channelList = new List <string>(); string channel; do { channel = dr.ReadCString(); if (!string.IsNullOrEmpty(channel)) { channelList.Add(channel); } } while (!string.IsNullOrEmpty(channel)); ChannelListEventArgs e = new ChannelListEventArgs(channelList.ToArray()); ((IChatConnectionEventSource)this).OnChannelListReceived(e); if (!_firstChannelList) { _firstChannelList = true; BncsPacket pckJoinChan = CreatePacket(BncsPacketId.JoinChannel); if (_settings.Client == ClassicProduct.Diablo2Retail || _settings.Client == ClassicProduct.Diablo2Expansion) { pckJoinChan.InsertInt32((int)ChannelJoinFlags.Diablo2FirstJoin); } else { pckJoinChan.InsertInt32((int)ChannelJoinFlags.FirstJoin); } switch (_settings.Client.ProductCode) { case "STAR": case "SEXP": case "W2BN": case "D2DV": case "D2XP": case "JSTR": pckJoinChan.InsertCString(_settings.Client.ProductCode); break; case "WAR3": case "W3XP": pckJoinChan.InsertCString("W3"); break; } await pckJoinChan.SendAsync(_connection); } }
private void HandleChatEvent(Client client, BncsPacket obj) { var packet = new ChatEventPacket(obj.Raw); if (packet.Eid != Eid.SHOWUSER && packet.Eid != Eid.USERFLAGS && !packet.Username.Contains(client.LoggedInUserName())) { Log.Debug(packet.RenderText()); if (packet.Eid == Eid.WHISPER || packet.Eid == Eid.TALK) { SendMessage($"To {client.LoggedInUserName()} :" + packet.RenderText()).Wait(); } } }
private void HandleWarcraftClanInfoRequest(DataReader dr) { int cookie = dr.ReadInt32(); if (!m_warcraftProfileRequests.ContainsKey(cookie)) { Debug.WriteLine(string.Format(CultureInfo.InvariantCulture, "Unable to locate profile request with cookie {0:x2}", cookie)); return; } WarcraftProfileEventArgs args = m_warcraftProfileRequests[cookie]; int recordCount = dr.ReadByte(); WarcraftClanLadderRecord[] ladderRecords = new WarcraftClanLadderRecord[recordCount]; for (int i = 0; i < recordCount; i++) { WarcraftClanLadderType ladderType = (WarcraftClanLadderType)dr.ReadInt32(); int wins = dr.ReadInt16(); int losses = dr.ReadInt16(); int level = dr.ReadByte(); int hrs = dr.ReadByte(); int xp = dr.ReadInt16(); int rank = dr.ReadInt32(); WarcraftClanLadderRecord record = new WarcraftClanLadderRecord(ladderType, wins, losses, level, hrs, xp, rank); ladderRecords[i] = record; } int raceRecordCount = dr.ReadByte(); Warcraft3IconRace[] raceOrder = new Warcraft3IconRace[] { Warcraft3IconRace.Random, Warcraft3IconRace.Human, Warcraft3IconRace.Orc, Warcraft3IconRace.Undead, Warcraft3IconRace.NightElf, Warcraft3IconRace.Tournament }; WarcraftRaceRecord[] raceRecords = new WarcraftRaceRecord[raceRecordCount]; for (int i = 0; i < raceRecordCount; i++) { int wins = dr.ReadInt16(); int losses = dr.ReadInt16(); WarcraftRaceRecord record = new WarcraftRaceRecord(raceOrder[i], wins, losses); raceRecords[i] = record; } args.Clan.SetStats(ladderRecords, raceRecords); BncsPacket pck = new BncsPacket((byte)BncsPacketId.WarcraftGeneral); pck.InsertByte((byte)WarcraftCommands.UserInfoRequest); pck.InsertInt32(cookie); pck.InsertCString(args.Username); pck.InsertDwordString(args.Product.ProductCode); Send(pck); }