Esempio n. 1
0
 public static BotState Initialize(string version, string filePath)
 {
     try
     {
         var state = JsonConvert.DeserializeObject <BotState>(File.ReadAllText(filePath));
         state.FilePath = filePath;
         if (state.AdminList == null)
         {
             state.AdminList = new HashSet <ulong>();
         }
         Task.WaitAll(state.PersistState());
         state.Version = version;
         return(state);
     }
     catch (Exception)
     {
         var state = new BotState
         {
             FilePath  = filePath,
             AdminList = new HashSet <ulong>()
         };
         Task.WaitAll(state.PersistState());
         state.Version = version;
         return(state);
     }
 }
Esempio n. 2
0
        private async Task MessageReceived(SocketMessage messageParam)
        {
            // Don't process the command if it was a System Message
            var message = messageParam as SocketUserMessage;

            if (message == null)
            {
                return;
            }
            // Create a number to track where the prefix ends and the command begins
            var argPos = 0;

            // Determine if the message is a command, based on if it starts with '!' or a mention prefix
            if (!(message.HasStringPrefix(_state.Prefix, ref argPos) || message.HasMentionPrefix(_client.CurrentUser, ref argPos)))
            {
                return;
            }
            // Create a Command Context
            var context = new CommandContext(_client, message);
            // Execute the command. (result does not indicate a return value,
            // rather an object stating if the command executed successfully)
            var result = await _commands.ExecuteAsync(context, argPos, _services.BuildServiceProvider());

            /*
             * if (!result.IsSuccess)
             *  await context.Channel.SendMessageAsync(result.ErrorReason);
             */
            if (!result.IsSuccess)
            {
                switch (result.Error)
                {
                case CommandError.Exception:
                    if (result is ExecuteResult execResult)
                    {
                        //Debugger.Break();
                        await Console.Error.WriteLineAsync($"Error encountered when handling command {message}:");

                        await Console.Error.WriteLineAsync(execResult.Exception.Message);

                        await Console.Error.WriteLineAsync(execResult.Exception.StackTrace);
                    }

                    break;

                default:
                    break;
                }
            }

            await UpdateDiscordStatus();

            await _state.PersistState();
        }
Esempio n. 3
0
        private async Task MessageReceived(SocketMessage messageParam)
        {
            // Don't process the command if it was a System Message
            var message = messageParam as SocketUserMessage;

            if (message == null)
            {
                return;
            }
            // Create a number to track where the prefix ends and the command begins
            var argPos = 0;

            // Determine if the message is a command, based on if it starts with '!' or a mention prefix
            if (!(message.HasStringPrefix(_state.Prefix, ref argPos) || message.HasMentionPrefix(_client.CurrentUser, ref argPos)))
            {
                return;
            }
            // Create a Command Context
            var context = new CommandContext(_client, message);

            // TODO: This only handles messages from servers, not DMs. Need to implement support for DMs.
            if (context.User is SocketGuildUser user)
            {
                // Other bots shouldn't be able to trigger commands
                if (user.IsBot)
                {
                    return;
                }

                foreach (var role in user.Roles)
                {
                    if (_state.BannedRoles.Contains(role.Name.ToLower()))
                    {
                        await context.Channel.SendMessageAsync($"Role \"{role.Name}\" is banned from using bot commands.");

                        return;
                    }
                }
            }
            else
            {
                return;
            }
            SentrySdk.WithScope(async sentryScope =>
            {
                sentryScope.User = new User
                {
                    Id       = user.Id.ToString(),
                    Username = $"{user.Username}#{user.DiscriminatorValue}"
                };
                sentryScope.SetExtra("command", message.Content);
                sentryScope.SetExtra("message_channel", $"#{message.Channel.Name} ({message.Channel.Id})");

                // Execute the command. (result does not indicate a return value,
                // rather an object stating if the command executed successfully)
                using (var serviceScope = _services.CreateScope())
                {
                    var result = await _commands.ExecuteAsync(context, argPos, serviceScope.ServiceProvider);
                    if (result.IsSuccess)
                    {
                        return;
                    }

                    switch (result.Error)
                    {
                    case CommandError.Exception:
                        if (result is ExecuteResult execResult)
                        {
                            await Console.Error.WriteLineAsync($"Error encountered when handling command {message}:");
                            await Console.Error.WriteLineAsync(execResult.Exception.ToString());
                            SentrySdk.CaptureException(execResult.Exception);
                        }
                        break;

                    case CommandError.UnknownCommand:
                        break;

                    case CommandError.ParseFailed:
                        await context.Channel.SendMessageAsync(result.ErrorReason);
                        await Console.Error.WriteLineAsync($"Error: {result.ErrorReason}");
                        break;

                    case CommandError.BadArgCount:
                        await context.Channel.SendMessageAsync(result.ErrorReason);
                        await Console.Error.WriteLineAsync($"Error: {result.ErrorReason}");
                        break;

                    case CommandError.ObjectNotFound:
                        await context.Channel.SendMessageAsync(result.ErrorReason);
                        await Console.Error.WriteLineAsync($"Error: {result.ErrorReason}");
                        break;

                    case CommandError.MultipleMatches:
                        await context.Channel.SendMessageAsync(result.ErrorReason);
                        await Console.Error.WriteLineAsync($"Error: {result.ErrorReason}");
                        break;

                    case CommandError.UnmetPrecondition:
                        await context.Channel.SendMessageAsync($"<@{message.Author.Id}>: {result.ErrorReason}");
                        break;

                    case CommandError.Unsuccessful:
                        await context.Channel.SendMessageAsync(result.ErrorReason);
                        await Console.Error.WriteLineAsync($"Error: {result.ErrorReason}");
                        break;

                    default:
                        await Console.Error.WriteLineAsync($"Unknown result type: {result.Error}");
                        await Console.Error.WriteLineAsync($"Error: {result.ErrorReason}");
                        break;
                    }
                    if (Debugger.IsAttached)
                    {
                        Debugger.Break();
                    }
                }
            });

            await _state.PersistState();
        }