예제 #1
0
        /// <summary>
        ///     Start connecting to Steam
        /// </summary>
        private void StartSteamConnection()
        {
            ReleaseSteamConnection();

            var c = SteamClient = new SteamClient();

            DotaGCHandler.Bootstrap(c, Games.DOTA2);

            SteamUser    = c.GetHandler <SteamUser>();
            SteamFriends = c.GetHandler <SteamFriends>();

            var cb = _cbManager = new CallbackManager(c);

            SetupSteamCallbacks(cb);
            SetupDotaGcCallbacks(cb);

            c.Connect();
            _cbThreadCtr++;
            _procThread = new Thread(SteamThread);
            _procThread.Start(this);
        }
예제 #2
0
        private async Task Run()
        {
            try
            {
                if (File.Exists("config.json"))
                {
                    using (var sr = new StreamReader("config.json"))
                    {
                        string jsonString = string.Empty;
                        string line;
                        while ((line = sr.ReadLine()) != null)
                        {
                            jsonString += line;
                        }
                        botConfig = JsonConvert.DeserializeObject <ConfigModel>(jsonString);
                        if (string.IsNullOrEmpty(botConfig.login))
                        {
                            Console.WriteLine("ERROR: Steam login is empty");
                            await Task.Delay(3000);

                            return;
                        }
                        if (string.IsNullOrEmpty(botConfig.password))
                        {
                            Console.WriteLine("ERROR: Steam password is empty");
                            await Task.Delay(3000);

                            return;
                        }
                        if (string.IsNullOrEmpty(botConfig.msgText))
                        {
                            Console.WriteLine("ERROR: Message content is empty");
                            await Task.Delay(3000);

                            return;
                        }
                    }
                }
                else
                {
                    Console.WriteLine("ERROR: config.json file is not found");
                    await Task.Delay(3000);

                    return;
                }
                if (File.Exists("chat_regions.txt"))
                {
                    chatRegions = File.ReadAllLines("chat_regions.txt");
                }

                //DebugLog.AddListener(new DebugListener());
                //DebugLog.Enabled = true;
                //create our steamclient instance
                var cellid = 0u;

                // if we've previously connected and saved our cellid, load it.
                if (File.Exists("cellid.txt"))
                {
                    if (!uint.TryParse(File.ReadAllText("cellid.txt"), out cellid))
                    {
                        Console.WriteLine("Error parsing cellid from cellid.txt. Continuing with cellid 0.");
                        cellid = 0;
                    }
                    else
                    {
                        Console.WriteLine($"Using persisted cell ID {cellid}");
                    }
                }
                var configuration = SteamConfiguration.Create((config) =>
                {
                    config.WithServerListProvider(new FileStorageServerListProvider("servers_list.bin"));
                    config.WithCellID(cellid);
                });

                steamClient = new SteamClient(configuration);
                DotaGCHandler.Bootstrap(steamClient);
                dota = steamClient.GetHandler <DotaGCHandler>();

                // create the callback manager which will route callbacks to function calls
                manager = new CallbackManager(steamClient);

                // get the steamuser handler, which is used for logging on after successfully connecting
                steamUser = steamClient.GetHandler <SteamUser>();

                // register a few callbacks we're interested in
                // these are registered upon creation to a callback manager, which will then route the callbacks
                // to the functions specified
                manager.Subscribe <SteamClient.ConnectedCallback>(OnConnected);
                manager.Subscribe <SteamClient.DisconnectedCallback>(OnDisconnected);

                manager.Subscribe <SteamUser.LoggedOnCallback>(OnLoggedOn);
                manager.Subscribe <SteamUser.LoggedOffCallback>(OnLoggedOff);
                manager.Subscribe <SteamUser.UpdateMachineAuthCallback>(OnMachineAuth);
                manager.Subscribe <DotaGCHandler.BeginSessionResponse>(OnBeginSession);
                manager.Subscribe <DotaGCHandler.ConnectionStatus>(OnConnectionStatus);
                manager.Subscribe <DotaGCHandler.JoinChatChannelResponse>(OnJoinChatChannel);
                manager.Subscribe <DotaGCHandler.ChatChannelListResponse>(OnChatChannelList);
                manager.Subscribe <DotaGCHandler.GCWelcomeCallback>(OnDotaWelcome);

                isRunning = true;
                Console.WriteLine("Connecting to Steam...");

                // initiate the connection
                steamClient.Connect();
                while (isRunning)
                {
                    manager.RunWaitCallbacks(TimeSpan.FromSeconds(1));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception occured: {ex.GetType()}: {ex.Message}");
                dotaIsReady = false;
                steamClient.Disconnect();
            }
            await Task.Delay(-1);
        }
예제 #3
0
        /// <summary>
        /// Connects to steam & logs in the bot account.
        /// This is SYNCHRONOUS.
        /// </summary>
        public void Connect()
        {
            client.Connect();
            doLoop = true;
            messageLoop.Start();

            // wait for successful connection
            while (true)
            {
                if (Connected)
                {
                    break;
                }
            }

            user.LogOn(new SteamUser.LogOnDetails {
                Username = username,
                Password = password,
            });

            //wait for successful login
            while (true)
            {
                if (LoggedIn)
                {
                    break;
                }
            }

            DotaGCHandler.Bootstrap(client, Dota2.Base.Data.Games.DOTA2);
            dota = client.GetHandler <DotaGCHandler>();

            //wait for successful dota connection
            bool retry = false;

            do
            {
                retry = false;
                if (ConnectToDota())
                {
                    UpdateStatus(DotaClientStatus.Normal, "Dota: Connected.");
                }
                else
                {
                    retry = this.parameters.dota_reconnect;
                    if (retry)
                    {
                        UpdateStatus(DotaClientStatus.Warning, "Dota: Connection Failed. Retrying...");
                        continue;
                    }
                    else
                    {
                        UpdateStatus(DotaClientStatus.Fatal, "Dota: Connection Failed.");
                        return;
                    }
                }

                if (dota.Lobby != null)
                {
                    UpdateStatus(DotaClientStatus.Warning, "Lobby: Already in a lobby. Leaving...");
                    dota.LeaveLobby();
                    while (dota.Lobby == null)
                    {
                        Thread.Sleep(10);
                    }
                    UpdateStatus(DotaClientStatus.Warning, "Dota: Reconnecting...");
                    dota.Stop();
                    Thread.Sleep(7000);
                    retry = true;
                }
            } while (retry);
        }