Ejemplo n.º 1
0
        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();
            }
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }
Ejemplo n.º 3
0
        private void RequestChannelList()
        {
            BncsPacket pckChanReq = new BncsPacket((byte)BncsPacketId.GetChannelList);

            pckChanReq.InsertDwordString(m_settings.Client);
            Send(pckChanReq);
        }
Ejemplo n.º 4
0
        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));
            }
        }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        private async void RequestChannelList()
        {
            BncsPacket pckChanReq = new BncsPacket(BncsPacketId.GetChannelList, _storage.Acquire());

            pckChanReq.InsertDwordString(_settings.Client.ProductCode);
            await pckChanReq.SendAsync(_connection);
        }
Ejemplo n.º 7
0
        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);
            }
        }
Ejemplo n.º 8
0
        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));
            }
        }
Ejemplo n.º 9
0
        private static void HandleChatEvent(BncsPacket obj)
        {
            var packet = new ChatEventPacket(obj.Raw);

            if (packet.Eid != Eid.SHOWUSER)
            {
                Log.Information(packet.RenderText());
            }
        }
Ejemplo n.º 10
0
        /// <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);
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
        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);
        }
Ejemplo n.º 15
0
        /// <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);
        }
Ejemplo n.º 16
0
        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);
            }
        }
Ejemplo n.º 17
0
        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);
        }
Ejemplo n.º 18
0
        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);
        }
Ejemplo n.º 19
0
        /// <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);
        }
Ejemplo n.º 20
0
        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);
        }
Ejemplo n.º 21
0
        /// <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);
        }
Ejemplo n.º 22
0
        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);
        }
Ejemplo n.º 23
0
        /// <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);
        }
Ejemplo n.º 24
0
        /// <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);
        }
Ejemplo n.º 25
0
        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);
        }
Ejemplo n.º 26
0
        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);
        }
Ejemplo n.º 27
0
        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);
        }
Ejemplo n.º 28
0
        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);
            }
        }
Ejemplo n.º 29
0
        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();
                }
            }
        }
Ejemplo n.º 30
0
        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);
        }