private async void Bot_OnMessageReceived(object?sender, IMessage message) { if (!message.Conversation.IsChannel) { return; } const string prefix = "!nmm "; if (message.Text.StartsWith(prefix)) { var command = message.Text.Remove(0, prefix.Length); const string subscribe = "subscribe "; if (command.StartsWith("subscribe ")) { var argsText = command.Remove(0, subscribe.Length); var args = argsText.Split(' ', StringSplitOptions.RemoveEmptyEntries); if (args.Length == 2 && uint.TryParse(args[0], out var gameId) && uint.TryParse(args[1], out var modId)) { if (await _mediator.Send(new SubscribeCommand(message.Conversation.Id, gameId, modId))) { await message.ReplyWith("Successful!", true); return; } else { await message.ReplyWith("Failed!", true); return; } } if (args.Length == 1) { if (await _mediator.Send(new Subscribe2Command(message.Conversation.Id, args[0]))) { await message.ReplyWith("Successful!", true); return; } else { await message.ReplyWith("Failed!", true); return; } } else { await message.ReplyWith("Failed!", true); return; } } const string unsubscribe = "unsubscribe "; if (command.StartsWith(unsubscribe)) { var argsText = command.Remove(0, unsubscribe.Length); var args = argsText.Split(' ', StringSplitOptions.RemoveEmptyEntries); if (args.Length == 2 && uint.TryParse(args[0], out var gameId) && uint.TryParse(args[1], out var modId)) { if (await _mediator.Send(new UnsubscribeCommand(message.Conversation.Id, gameId, modId))) { await message.ReplyWith("Successful!", true); return; } else { await message.ReplyWith("Failed!", true); return; } } if (args.Length == 1) { if (await _mediator.Send(new Unsubscribe2Command(message.Conversation.Id, args[0]))) { await message.ReplyWith("Successful!", true); return; } else { await message.ReplyWith("Failed!", true); return; } } else { await message.ReplyWith("Failed!", true); return; } } const string about = "about"; if (command.StartsWith(about)) { var uptime = _clock.GetCurrentInstant() - Process.GetCurrentProcess().StartTime.ToUniversalTime().ToInstant(); var subscriptionCount = await _subscriptionQueries.GetAllAsync().CountAsync(); var embed = AttachmentHelper.About(subscriptionCount, uptime); await message.ReplyWith(new BotMessage { Attachments = { embed } }, true); } const string subscriptions = "subscriptions"; if (command.StartsWith(subscriptions)) { var subscriptionList = await _subscriptionQueries.GetAllAsync().Where(s => s.ChannelId == message.Conversation.Id).ToImmutableArrayAsync(); if (subscriptionList.Length > 0) { await message.ReplyWith($@"Subscriptions: ``` {string.Join('\n', subscriptionList.Select(s => $"Game: {s.NexusModsGameId}; Mod: {s.NexusModsModId}"))} ```", true); } else { await message.ReplyWith("No subscriptions found!", true); } } const string ratelimits = "ratelimits"; if (command.StartsWith(ratelimits)) { var rateLimit = await _rateLimitQueries.GetAsync(); if (rateLimit is null) { await message.ReplyWith("Failed to get Rate Limits!", true); return; } var embed = AttachmentHelper.RateLimits(rateLimit); await message.ReplyWith(new BotMessage { Attachments = { embed } }); } const string authorize = "authorize"; if (command.StartsWith(authorize)) { var isAuthorized = await _authorizationQueries.IsAuthorizedAsync(); if (isAuthorized) { await message.ReplyWith("Already authorized!", true); return; } var uuid = Guid.NewGuid(); await using var ssoAuthorizationHandler = await _mediator.Send(new SSOAuthorizeCommand (uuid)); ssoAuthorizationHandler.OnReadyAsync += async() => { var applicationSlug = "vortex"; await message.ReplyWith($"https://www.nexusmods.com/sso?id={uuid}&application={applicationSlug}", true); }; ssoAuthorizationHandler.OnErrorAsync += async() => { await message.ReplyWith("Failed!", true); }; ssoAuthorizationHandler.OnAuthorizedAsync += async() => { await message.ReplyWith("Successful!", true); }; await ssoAuthorizationHandler; } const string help = "help"; if (command.StartsWith(help)) { await message.ReplyWith(@"help about subscriptions subscribe [Game Id] [Mod Id] unsubscribe [Game Id] [Mod Id] subscribe [Mod Url] unsubscribe [Mod Url] ratelimits authorize", true); } } }