Я знаю это из-за точек останова здесь код:
using DSharpPlus;
using DSharpPlus.CommandsNext;
using DSharpPlus.CommandsNext.Attributes;
using DSharpPlus.Entities;
using DSharpPlus.EventArgs;
using DSharpPlus.Interactivity;
using DSharpPlus.Interactivity.Extensions;
using Newtonsoft.Json;
using System.Text;
interface IPermsLevel
{
PermissionsLevel Suspended { get; set; }
PermissionsLevel Unverified { get; set; }
PermissionsLevel Member { get; set; }
PermissionsLevel VIP { get; set; }
PermissionsLevel Administrator { get; set; }
}
internal struct PermissionsLevel
{
internal enum Permslvl : sbyte
{
Awaiting = -127,
Suspended = -2,
Unverified = -1,
Member = 0,
VIP = 1,
Administrator = 2,
}
internal async Task<bool> UserAccessControl(Permslvl AccessLvl, Permslvl MinimumAccessLvl, Permslvl[]? BlockedAccessLvls = null)
{
PermissionsLevel.Permslvl permslvl = AccessLvl;
PermissionsLevel.Permslvl RequestedPermLvl = MinimumAccessLvl;
PermissionsLevel.Permslvl[] Blocked = BlockedAccessLvls ?? new PermissionsLevel.Permslvl[] { PermissionsLevel.Permslvl.Suspended };
List<PermissionsLevel.Permslvl> Bypass = new() { PermissionsLevel.Permslvl.Administrator };
if (Blocked.Length == 0)
{
Blocked = new PermissionsLevel.Permslvl[] { PermissionsLevel.Permslvl.Suspended };
}
if (Bypass.Contains(permslvl) || permslvl == RequestedPermLvl)
{
if (!Blocked.Contains(permslvl) || Bypass.Contains(permslvl))
{
await Console.Out.WriteLineAsync("Access Granted");
return true;
}
else
{
await Console.Out.WriteLineAsync("Access Denied");
return false;
}
}
else
{
await Console.Out.WriteLineAsync("Acess Denied");
return false;
}
}
}
internal class AccessException : Exception
{
AccessException(string message, Exception? innerException) : base()
{
if (User.AccessExceptionFlagged == true && User.user.AccessLvl != PermissionsLevel.Permslvl.Suspended)
{
throw new AccessException("User did not have a role with high enough permissions to access this method!", null);
}
else
{
throw new AccessException("YOU ARE SUSPENDED", null);
}
}
}
internal class User
{
internal string Name { get; set; } = "Deciding";
internal PermissionsLevel.Permslvl AccessLvl { get; set; } = PermissionsLevel.Permslvl.Awaiting;
internal static bool AccessExceptionFlagged = false;
internal static User user = new();
internal async static void UserGetInfo()
{
Console.Write("ENTER NAME:");
string Name = Console.ReadLine() ?? "Unknown";
Console.WriteLine("Verify with discord");
Console.ReadKey();
Discord discord = new();
PermissionsLevel permissions = new();
discord.RunAsync().GetAwaiter();
bool Continue = true;
while (user.AccessLvl == PermissionsLevel.Permslvl.Awaiting && Continue == true)
{
await Task.Delay(1000);
if (user.AccessLvl != PermissionsLevel.Permslvl.Awaiting)
{
Continue = false;
}
}
try
{
if (Continue == false)
{
bool V = await permissions.UserAccessControl(user.AccessLvl, PermissionsLevel.Permslvl.Unverified);
AccessExceptionFlagged = V;
await Console.Out.WriteLineAsync("Hello");
}
}
catch (AccessException ex)
{
await Console.Out.WriteLineAsync($"Error You didn't meet requirements to access User method sorry ERROR: {ex}");
await Console.Out.WriteLineAsync("Cheater");
}
finally
{
UserGetInfo();
}
}
}
internal class Discord
{
internal DiscordClient Client { get; private set; }
internal InteractivityExtension Interactivity { get; private set; }
internal CommandsNextExtension Commands { get; private set; }
internal async Task RunAsync()
{
var json = string.Empty;
using (var fs = File.OpenRead(@"C:\Program Files (x86)\AFLLiveCoLTD\config.json"))
using (var sr = new StreamReader(fs, new UTF8Encoding(false)))
json = await sr.ReadToEndAsync();
var ConfigJson = JsonConvert.DeserializeObject<ConfigJSON>(json);
var config = new DiscordConfiguration()
{
Intents = DiscordIntents.All,
Token = ConfigJson.Token,
TokenType = TokenType.Bot,
AutoReconnect = true,
};
Client = new DiscordClient(config);
Client.UseInteractivity(new InteractivityConfiguration()
{
Timeout = TimeSpan.FromMinutes(1)
});
var commandsConfig = new CommandsNextConfiguration()
{
StringPrefixes = new string[] { ConfigJson.Prefix },
EnableMentionPrefix = true,
EnableDms = true,
};
Commands = Client.UseCommandsNext(commandsConfig);
Commands.RegisterCommands<PermCommands>();
await Client.ConnectAsync();
await Task.Delay(-1);
}
private Task OnClientReady(ReadyEventArgs e)
{
return Task.CompletedTask;
}
internal struct ConfigJSON
{
[JsonProperty("token")]
internal string Token { get; private set; }
[JsonProperty("prefix")]
internal string Prefix { get; private set; }
}
}
internal class PermCommands : BaseCommandModule
{
[Command("verifyplvl")]
internal async Task Permlvl(CommandContext ctx)
{
var oermissions = new User();
IEnumerable<DiscordRole>? role = ctx.Member.Roles;
if (role.Any() == false)
{
User.user.AccessLvl = PermissionsLevel.Permslvl.Unverified;
}
else
{
if (role.Any(r => r.Id == 894527137250422795))
{
User.user.AccessLvl = PermissionsLevel.Permslvl.Administrator;
}
else if (role.Any(r => r.Id == 894526951119802368))
{
User.user.AccessLvl = PermissionsLevel.Permslvl.Administrator;
}
else if (role.Any(r => r.Id == 894525017780551691))
{
User.user.AccessLvl = PermissionsLevel.Permslvl.VIP;
}
else if (role.Any(r => r.Id == 894522335640580196))
{
User.user.AccessLvl = PermissionsLevel.Permslvl.Member;
}
else if (role.Any(r => r.Id == 895258073239785472))
{
User.user.AccessLvl = PermissionsLevel.Permslvl.Suspended;
}
}
await Console.Out.WriteLineAsync(User.user.AccessLvl.ToString());
await ctx.Channel.SendMessageAsync($"Your Permission Level is {User.user.AccessLvl}");
}
}
class Program
{
public static void Main()
{
User.UserGetInfo();
}
}
Я пытался найти способ заставить его ждать, пока бот Discord завершит команду, потому что он меняет значение, необходимое для того, чтобы метод выдавал информацию, которую хотел бы метод, но теперь у меня есть странная проблема: нет ошибки, но он существует именно тогда, когда он делает то, что я сказал ранее. в конце концов, он должен продолжать работать, это бот для разногласий, а также он должен выполнять метод UserAccessConstrol();
после запроса команды на сервере разногласий. Извините за беспорядочный код, это был тест, чтобы увидеть, как все работает. Он заканчивается на json = await sr.ReadToEndAsync();
, когда я запускаю программу, не возникает нулевого исключения, но я буду отлаживать ее в будущем для проверки исключений, но это не проблема, проблема в том, что программа завершается в json = await sr.ReadToEndAsync();
и хочет, чтобы остальная часть discord.RunAsync();
для запуска также, как это стало так плохо и перешло от работы к неработоспособности, заключается в том, что я хотел дождаться значения: internal PermissionsLevel.Permslvl AccessLvl { get; set; } = PermissionsLevel.Permslvl.Awaiting;
изменил форму ожидания на любое значение, поэтому метод: internal async Task<bool> UserAccessControl(Permslvl AccessLvl, Permslvl MinimumAccessLvl, Permslvl[]? BlockedAccessLvls = null)
имеет значение, которое на самом деле есть у пользователя, потому что, если он запускается раньше это будет работать, но не будет соответствовать роли/уровню доступа пользователя на самом деле.
хорошо, мой ввод для имени - это что угодно, потому что это не имеет значения, но я всегда предоставляю значение, затем я просто нажимаю ввод из-за метода Console.ReadKey(), последний ввод получает онлайн на сервере разногласий, но он даже не доберитесь туда, программа существует еще до того, как она туда попадет, поэтому она не становится онлайн. он заканчивается на json = await sr.ReadToEndAsync(); Я знаю это, потому что использовал точки останова.
internal async static void UserGetInfo()
Вы не можете дождаться завершения этого метода, потому что он не возвращает Task
... Это ваш вопрос?
нет, мой вопрос в том, что программа существует до загрузки бота разногласий, а также я хочу дождаться завершения выполнения одной из команд бота разногласий, потому что она изменяет значение, необходимое для другого метода, называемого UserAccessControl()
также, когда я закончу исправлять все ошибки и завершать методы, я могу превратить это в сборку
также, если это поможет, вот каждое предупреждение, которое у меня есть CS8602 Deference возможной нулевой ссылочной строки 173 col 42, CS8618 Ненулевое свойство «Клиент» должно содержать ненулевое значение при выходе из конструктора. Рассмотрите возможность объявления свойства как обнуляемого, CS8618 Необнуляемое свойство «Интерактивность» должно содержать ненулевое значение при выходе из конструктора. Рассмотрите возможность объявления свойства как обнуляемого
Эти предупреждения означают, что вы не проверяете null
, когда должны, поэтому это очень безопасная ставка, почти уверенность, что у вас есть необработанный NullReferenceException
.
Отвечает ли это на ваш вопрос? Что такое NullReferenceException и как его исправить?
вот в чем проблема, ничего не возвращает ноль, поэтому даже если бы по этой причине произошел сбой, в этом случае, когда я запускал, каждый путь имел значение, так что это что-то еще, также если там, где ноль, он все равно собирался получить значение, и, к сожалению, это не доходит до той части программы, из которой он вышел до того, как в json = await sr.ReadToEndAsync();
но я постараюсь исправить эти предупреждения
Отредактированный пост для уточнения
internal async static Task UserGetInfo()
static void Main(string[] args)
{
Task.Run(async () =>
{
await User.UserGetInfo();
}).GetAwaiter().GetResult();
}
Наконец, добавьте await в блок finally:
finally
{
await UserGetInfo();
}
Редактировать :
Вы также можете использовать async main, чтобы сделать код намного чище:
public static async Task Main()
{
await User.UserGetInfo();
}
Или просто static async Task Main
, чтобы не использовать Task.Run
. Не нужно слишком усложнять вещи.
В C# 7.1 или ниже это static async Task Main
не разрешено: stackoverflow.com/questions/9208921 @madreflection
Не проблема: C# 11 помечен. Кроме того, вы можете использовать определенные функции, подобные этой, в более старых средах выполнения, потому что в среду выполнения не добавлено ничего для их поддержки. Вам просто нужно явно указать языковую версию.
Это работает, но теперь мне нужно решить другие проблемы, которые я сделал, спасибо за помощь.
@YesalterYesaltLastersonal, пожалуйста, не стесняйтесь делиться другими проблемами, если вам нужна помощь 👌🏻
Добро пожаловать в Stack Overflow. Пожалуйста, четко объясните, что вы делаете и каковы ваши входные данные, а также ожидаемые и фактические результаты. Где он останавливается?