Как изменить игровую активность ботов дискорда случайным образом через определенный интервал

Я пытаюсь заставить своего бота время от времени менять свой игровой статус.

Вот что я пробовал: сделать это командой, которая работает, но я не могу ее использовать из-за того, что команда всегда выполняется из-за цикла, из-за которого другие команды не могут быть запущены.

[Command("randomplaying")]
        [RequireUserPermission(GuildPermission.MentionEveryone)]
        private async Task randomPlaying()
        {
            const int delay = 3000;

            Random rand = new Random();

            string[] serverActivity = File.ReadAllLines(Server.GameActivity.servergameactivitypath);

            for (; ; )
            {
                int randomIndex = rand.Next(serverActivity.Length);
                string gameActityText = serverActivity[randomIndex];
                await Task.Delay(delay);
                await Context.Client.SetGameAsync(gameActityText, "", ActivityType.Playing);
            }
        }

Попытка сделать это внутри Program.cs

private async Task randomPlaying()
        {
            const int delay = 3000;

            Random rand = new Random();

            string[] serverActivity = File.ReadAllLines(Commands.Server.GameActivity.servergameactivitypath);

            for (; ; )
            {
                int randomIndex = rand.Next(serverActivity.Length);
                string gameActityText = serverActivity[randomIndex];
                await Task.Delay(delay);
                await Context.Client.SetGameAsync(gameActityText, "", ActivityType.Playing);
            }
        }

И называя это с

await randomPlaying();

Этот метод ничего не делает и даже не показывает свою работу.

код servergameactivitypath

public static string servergameactivitypath = AppDomain.CurrentDomain.BaseDirectory + "/config/gameactivity.txt";


        public static void createGameActivityTXT()
        {
            File.WriteAllText(servergameactivitypath, "Hello There\nTest1\nTest2\nTest3");
        }

    }

person XxModZxXWiiPlaza    schedule 16.05.2020    source источник
comment
Контекст существует только внутри командных модулей. Просто использовал экземпляр клиента, с которым вы вошли в Program.cs   -  person Anu6is    schedule 16.05.2020
comment
@ Anu6is Хорошо, спасибо, я исправил это.   -  person XxModZxXWiiPlaza    schedule 16.05.2020


Ответы (1)


Использовать:


    private async Task randomPlaying()
        {
            const int delay = 3000;

            Random rand = new Random();

            string[] serverActivity = File.ReadAllLines(Commands.Server.GameActivity.servergameactivitypath);

            for (; ; )
            {
                int randomIndex = rand.Next(serverActivity.Length);
                string gameActityText = serverActivity[randomIndex];
                await Task.Delay(delay);
                await _client.SetGameAsync(gameActityText, "", ActivityType.Playing);
            }
        } 

Вызовите MainAsync(), используя вышеуказанный Task.Delay

await randomPlaying()
person XxModZxXWiiPlaza    schedule 16.05.2020