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); } }
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(); }
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(); }