public async Task ReceiveMessageAsync(ILazySocketMessage message, ulong botCurrentUserId) { if (message == null) { throw new ArgumentNullException(nameof(message)); } //var content = await message.GetContentAsync(); //ConsoleEx.WriteReceivedMessage(content); await _basicMachines.Scan.TryUpdateScansAsync(); var author = await message.GetAuthorAsync(); if (await author.GetIsBotAsync()) { return; } var(nonCommandResponse, executesCommand) = await ProcessNonCommandAsync(message, botCurrentUserId); if (nonCommandResponse.Type != ResponseType.None) { _manualResponseSent.OnNext(nonCommandResponse); } if (!executesCommand) { return; } var rawCommand = await RawCommand.CreateFromSocketMessageOrDefaultAsync(message, botCurrentUserId); if (rawCommand == null || rawCommand.Body == null) { return; } if (rawCommand.HasMentions && !rawCommand.IsMentioned) { return; } var channel = await message.GetChannelAsync(); var allCommands = CreateAllCommands(); if (allCommands.TryGetValue(rawCommand.Body, out var command)) { _manualResponseSent.OnNext(await command.InvokeAsync(rawCommand, _client, await channel.GetIdAsync(), await author.GetIdAsync())); return; } //{ // var response = await Response.TryCreateCautionAsync(_client, Texts.Error.Commands.NotFound(rawCommand.Value.Body), await channel.GetIdAsync(), await author.GetIdAsync()) ?? Response.None; // _manualResponseSent.OnNext(response); //} }
async Task Scan_NoRollTestCore(ILazySocketMessage message0, ILazySocketMessage message1) { ulong botCurrentUserId = TestLazySocketUser.MyBot.Id; var(allCommands, testObserver, _) = Init(); await allCommands.ReceiveMessageAsync(message0, botCurrentUserId); AssertEx.ExactlyOneSay(testObserver.Messages); testObserver.Messages.Clear(); await allCommands.ReceiveMessageAsync(message1, botCurrentUserId); AssertEx.ExactlyOneSay(testObserver.Messages); }
async Task ScanEnd_DuplicateTestCore(ILazySocketMessage message0, ILazySocketMessage message1, ILazySocketMessage message2) { ulong botCurrentUserId = TestLazySocketUser.MyBot.Id; var(allCommands, testObserver, _) = Init(); await allCommands.ReceiveMessageAsync(message0, botCurrentUserId); await allCommands.ReceiveMessageAsync(message1, botCurrentUserId); testObserver.Messages.Clear(); await allCommands.ReceiveMessageAsync(message2, botCurrentUserId); AssertEx.ExactlyOneCaution(testObserver.Messages); }
// 例えば 1d100 などといった、コマンドを用いない特別な処理。 private async Task <(Response result, bool executesCommand)> ProcessNonCommandAsync(ILazySocketMessage message, ulong botCurrentUserId) { var expr = await Expr.Main.InterpretFromLazySocketMessageAsync(message, botCurrentUserId); if (!expr.HasValue) { var author = await message.GetAuthorAsync(); return(Response.TryCreateCaution(expr.Error, await message.GetChannelAsync(), author), false); } var executed = expr.Value.ExecuteOrDefault(); if (executed == null || expr.Value.IsConstant) { return(Response.None, true); } { var channel = await message.GetChannelAsync(); var author = await message.GetAuthorAsync(); await _basicMachines.Scan.SetDiceAsync(await channel.GetIdAsync(), await author.GetIdAsync(), await author.GetUsernameAsync(), executed); var result = await Response.TryCreateSayAsync(_client, $"{await author.GetMentionAsync()} {executed.Message}", await channel.GetIdAsync()) ?? Response.None; return(result, false); } }
public static async Task <Result <Main, string> > InterpretFromLazySocketMessageAsync(ILazySocketMessage message, ulong botCurrentUserId) { var content = await message.GetContentAsync(); var nonMentionedCode = Interpret(content); if (!nonMentionedCode.HasValue) { return(nonMentionedCode); } if (nonMentionedCode.Value.IsValid) { return(nonMentionedCode); } var regex = CreateRegex(botCurrentUserId); var m = regex.Match(content); if (!m.Success) { return(Result <Main, string> .CreateValue(Invalid)); } var body = m.Groups["body"].Value; return(Interpret(body)); }