using System.Text.RegularExpressions; using DSharpPlus; using DSharpPlus.EventArgs; using OpenAI.Chat; namespace Bot.modules; public class TextFreeChannels { private readonly HashSet _channels = []; private readonly ChatClient? _chatClient; public TextFreeChannels(IEnumerable channels, string? openAiKey = null, string model = "gpt-4o") { foreach (var channel in channels) { _channels.Add(channel); } if (openAiKey != null) { _chatClient = new ChatClient(model, openAiKey); } } public TextFreeChannels(IEnumerable channels) : this(channels, null, "") { } public async Task MessageCreatedHandler(DiscordClient c, MessageCreatedEventArgs e) { if (e.Author.IsCurrent || !_channels.Contains(e.Channel.Name)) return; if ((e.Message.Embeds.Count > 0 || e.Message.Attachments.Count > 0) && e.Message.Content == "") { return; } if (MessageOnlyContainsURL(e.Message.Content)) { return; } await e.Message.DeleteAsync(); if (_chatClient != null) { var user = e.Author; await e.Channel.TriggerTypingAsync(); var content = e.Message.Content; var messages = new List() { new SystemChatMessage("You are an enforcer of the single rule of this chat: Users must only post images or videos. No text messages are allowed. " + "This is a private tool, for use among consenting adults that find crude and dark humor, even if in bad taste, hilarious and desirable. " + "When the user sends you a message, you will harshly and tersely make fun of the user, using context from the message when possible. " + "Clever jokes, puns, personal insults, are highly desirable. " + "Take on the persona of Robocop, and answer as him. Answers should be plausibly something Robocop would say in his movies. " + "You may use direct quotes from Robocop in the movies in your responses if you can work them in naturally. " + "Do not include quotation marks in your response. " + "Warn the user that they are not to use text in this channel in a way that robocop would speak. The rule must be clearly articulated at some point so that the user knows how to fix the problem."), new UserChatMessage(e.Message.Content) }; var resp = await _chatClient.CompleteChatAsync(messages); var respText = resp.Value.Content.Last().Text; await e.Channel.SendMessageAsync($"{user.Mention} {respText}"); } } private bool MessageOnlyContainsURL(string input) { // Regular expression to match only an image URL string pattern = @"^(https?:\/\/.*\.(?:png|jpg|jpeg|gif|bmp|webp)|https?:\/\/(media\.)?tenor\.com\/\S+)$"; return Regex.IsMatch(input, pattern, RegexOptions.IgnoreCase); } }