/// <summary>
        /// Determines what command the user requested and executes that command.
        /// If the command is unknown then prints help text instead
        /// </summary>
        /// <param name="message"></param>
        private async Task HandleCommand(SocketMessage message)
        {
            _logger.Debug($"Received command: {message.Content}");

            var args    = message.Content.Split(" ");
            var command = args[0].Substring(1);

            if (_commandDict.ContainsKey(command))
            {
                await _commandDict[command].ExecuteCommand(_discordInterface, args, message);
            }
            else if (command == "help")
            {
                // Expected help command:
                // !help -> prints summary help text for each command
                // !help command -> prints the full help text for that command
                if (args.Length >= 2 && _commandDict.ContainsKey(args[1]))
                {
                    await _discordInterface.SendMessageAsync(message.Channel, _commandDict[args[1]].PrintFullHelpText());
                }
                else
                {
                    await _discordInterface.SendMessageAsync(message.Channel, String.Join('\n', _commandDict.Values.Select(x => x.PrintSummaryHelpText())));
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Runs a game of trivia with the provided trivia source.
        /// Expected args:
        ///    1. Trivia source name that matches a provider in _questionProviders
        ///    2. (Optional) The number of rounds to play, default is 10
        /// </summary>
        /// <param name="discordInterface"></param>
        /// <param name="args"></param>
        /// <param name="rawMessage"></param>
        protected override async Task Execute(IDiscordInterface discordInterface, string[] args, SocketMessage rawMessage)
        {
            if (!TryExtractArgs(args, out var questionProvider, out var gameLength))
            {
                // Command was used wrong, print usage info and exit
                await discordInterface.SendMessageAsync(rawMessage.Channel, FullHelpText);

                return;
            }

            Subject <DiscordMessage> subject = new Subject <DiscordMessage>();

            discordInterface.MessageReceived.ObserveOn(_scheduler)
            .Where(message => message.Channel.Id == rawMessage.Channel.Id)
            .Subscribe(message =>
            {
                subject.OnNext(new DiscordMessage(message.Channel, message.Author.Username, message.Content));
            });

            var gameResult = new GameResults();

            // Start asking questions
            var questions = await questionProvider.GetQuestions(gameLength); //TODO this might need to be async

            for (int i = 0; i < questions.Count; i++)
            {
                await discordInterface.SendMessageAsync(rawMessage.Channel, $"Question {i + 1}:\n{questions[i].Question}");

                var result = await questions[i].ExecuteQuestion(subject.AsObservable(), questionProvider.QuestionDuration);

                if (result.Scores.Count == 0)
                {
                    // No one was correct
                    await discordInterface.SendMessageAsync(rawMessage.Channel, $"No one was correct! Answer:\n{questions[i].Answer}");
                }
                else
                {
                    gameResult.CombineWith(result);
                    //Someone was correct
                    await discordInterface.SendMessageAsync(rawMessage.Channel, $"{String.Join(", ", result.Scores.Where(score => score.Value > 0).Select(score => score.Key))} was correct!\n" +
                                                            $"{gameResult.PrintScores()}");
                }
            }

            // Game is over, inform everyone of the winner
            await discordInterface.SendMessageAsync(rawMessage.Channel,
                                                    $"Game over, winner was {gameResult.GetWinner()}\n" +
                                                    $"{gameResult.PrintScores()}");
        }
Esempio n. 3
0
        protected override async Task Execute(IDiscordInterface discordInterface, string[] args, SocketMessage rawMessage)
        {
            var response = new StringBuilder();

            response.AppendLine("Test command:");
            response.AppendLine($"From User: {rawMessage.Author.Username}");
            response.AppendLine($"Channel: {rawMessage.Channel.Name}");

            for (int i = 0; i < args.Length; i++)
            {
                response.AppendLine($"Arg{i}: {args[i]}");
            }

            await discordInterface.SendMessageAsync(rawMessage.Channel, response.ToString());
        }
        protected override async Task Execute(IDiscordInterface discordInterface, string[] args, SocketMessage rawMessage)
        {
            // Get the current username. This can be either the current nickname, or the discord username, or the discord user id (if it is an integer)
            // Can also be surround in quotes f**k my life

            args = Utils.ArgumentParseUtils.ParseArgsWithQuotes(args);

            if (args.Length < 3)
            {
                await SendMessage("Read how to use this command you peppeg");

                _logger.Debug($"Received invalid Rename user: {String.Join(',', args)}");
                return;
            }

            var currentName = args[1];
            var newName     = args[2];

            SocketGuildUser user = null;

            // Try with user ID
            if (long.TryParse(currentName, out long userId))
            {
                try
                {
                    user = discordInterface.RawClient.GetUser((ulong)userId) as SocketGuildUser;
                }
                catch (Exception e)
                {
                    _logger.Error(e, $"Cannot find user with id {userId}: {e.Message}");
                }
            }

            // Try with nickname or username
            if (user == null)
            {
                foreach (var guild in discordInterface.RawClient.Guilds)
                {
                    user = guild.Users.FirstOrDefault(p => p.Username == currentName || p.Nickname == currentName);
                    if (user != null)
                    {
                        break;
                    }
                }
            }

            if (user != null)
            {
                try
                {
                    await user?.ModifyAsync(x => x.Nickname = newName);
                    await SendMessage($"Changed {currentName} to {newName}");

                    await ActivityMonitor.LogActivity(new Activity()
                    {
                        CommandName = CommandString,
                        Author      = rawMessage.Author.Username,
                        Channel     = rawMessage.Channel.Name,
                        Succeeded   = true,
                        Result      = $"Changed user {user.Username} nickname from {currentName} to {newName}"
                    });
                }
                catch (Exception e)
                {
                    await SendMessage($"ERROR: {e.Message}");

                    await ActivityMonitor.LogActivity(new Activity()
                    {
                        CommandName = CommandString,
                        Author      = rawMessage.Author.Username,
                        Channel     = rawMessage.Channel.Name,
                        Succeeded   = false,
                        Result      = $"Failed to change username for user {user.Username}: {e.Message}"
                    });
                }
            }
            else
            {
                await SendMessage($"Cannot find user with name {currentName}");

                await ActivityMonitor.LogActivity(new Activity()
                {
                    CommandName = CommandString,
                    Author      = rawMessage.Author.Username,
                    Channel     = rawMessage.Channel.Name,
                    Succeeded   = false,
                    Result      = $"Cannot find user with name {currentName}"
                });
            }

            async Task SendMessage(string message) => await discordInterface.SendMessageAsync(rawMessage.Channel, message);
        }