diff --git a/Bot/Handler/ChatCommand/ChatHandler.cs b/Bot/Handler/ChatCommand/ChatHandler.cs index 583769c..d208ee2 100644 --- a/Bot/Handler/ChatCommand/ChatHandler.cs +++ b/Bot/Handler/ChatCommand/ChatHandler.cs @@ -1,4 +1,4 @@ -using Discord; +using System.Text; using Discord.WebSocket; using Lunaris2.Handler.MusicPlayer; using Lunaris2.SlashCommand; @@ -6,39 +6,59 @@ using MediatR; using OllamaSharp; using OllamaSharp.Models; -namespace Lunaris2.Handler.ChatCommand; +namespace Lunaris2.Handler.ChatCommand +{ + public record ChatCommand(SocketSlashCommand Message) : IRequest; -public record ChatCommand(SocketSlashCommand Message) : IRequest; - -public class ChatHandler : IRequestHandler -{ - private readonly Uri _uri = new("http://192.168.50.54:11434"); - private OllamaApiClient _ollama; - private SocketSlashCommand _context; - - public ChatHandler() - { - _ollama = new OllamaApiClient(_uri); - _ollama.SelectedModel = "lunaris"; - } - - public async Task Handle(ChatCommand command, CancellationToken cancellationToken) - { - _context = command.Message; - var userMessage = _context.GetOptionValueByName(Option.Input); - var setTyping = command.Message.Channel.EnterTypingState(); - await command.Message.DeferAsync(); + public class ChatHandler : IRequestHandler + { + private readonly Uri _uri = new("http://192.168.50.54:11434"); + private readonly OllamaApiClient _ollama; + private SocketSlashCommand _context; - var response = ""; - ConversationContext chatContext = null; - - async void Streamer(GenerateCompletionResponseStream stream) + public ChatHandler() { - response += stream.Response; + _ollama = new OllamaApiClient(_uri) + { + SelectedModel = "lunaris" + }; + } + + public async Task Handle(ChatCommand command, CancellationToken cancellationToken) + { + _context = command.Message; + + var userMessage = _context.GetOptionValueByName(Option.Input); + + using var setTyping = command.Message.Channel.EnterTypingState(); + await command.Message.DeferAsync(); + + if (string.IsNullOrWhiteSpace(userMessage)) + { + await command.Message.ModifyOriginalResponseAsync(properties => properties.Content = "Am I expected to read your mind?"); + setTyping.Dispose(); + return; + } + + var response = await GenerateResponse(userMessage, cancellationToken); await command.Message.ModifyOriginalResponseAsync(properties => properties.Content = response); } - chatContext = await _ollama.StreamCompletion(userMessage, chatContext, Streamer, cancellationToken: cancellationToken); - setTyping.Dispose(); + private async Task GenerateResponse(string userMessage, CancellationToken cancellationToken) + { + var response = new StringBuilder(); + ConversationContext? chatContext = null; + + chatContext = await _ollama.StreamCompletion( + userMessage, + chatContext, + Streamer, + cancellationToken: cancellationToken); + + return response.ToString(); + + void Streamer(GenerateCompletionResponseStream stream) => + response.Append(stream.Response); + } } } \ No newline at end of file