using System.Data; using System.Text.Json; using riff; public class Cube : IRCBot { private HttpClient RequestClient = new(); private const string AllTriviaQuestionsPath = "data/TriviaQuestions.json"; private const string UnaskedTriviaQuestionsPath = "data/UnaskedTriviaQuestions.json"; private TriviaQuestion[] AllTriviaQuestions; private List UnaskedTriviaQuestions; private Random Rand = new(); public Cube(string host, int port, string nick, string realname) : base(host, port, nick, realname) { AllTriviaQuestions = LoadAllQuestions(); UnaskedTriviaQuestions = LoadUnaskedQuestions(); string[] channels = [ "#testbot", ]; (string, Action)[] commands = [ ("echo", Echo), ("trivia", PostQuestion) ]; HookCommands(commands); JoinChannels(channels); } private void Echo(PRIVMSG privmsg) { SendPrivmsg(privmsg.Sender, privmsg.Body); } private void PostQuestion(PRIVMSG privmsg) { var question = GetQuestion(); SendPrivmsg(privmsg.Sender, question.Question); } private TriviaQuestion GetQuestion() { if (UnaskedTriviaQuestions.Count == 0) UnaskedTriviaQuestions = AllTriviaQuestions.ToList(); TriviaQuestion question = UnaskedTriviaQuestions[Rand.Next(UnaskedTriviaQuestions.Count)]; UnaskedTriviaQuestions.Remove(question); File.WriteAllText(UnaskedTriviaQuestionsPath, JsonSerializer.Serialize(UnaskedTriviaQuestions)); return question; } private TriviaQuestion[] LoadAllQuestions() { try { using (FileStream stream = File.OpenRead(AllTriviaQuestionsPath)) { TriviaQuestion[] questions = JsonSerializer.Deserialize(stream)!; if (questions == null) throw new NoNullAllowedException(); return questions; } } catch (FileNotFoundException) { Console.WriteLine("Trivia questions not downloaded. Use download_trivia.py script."); Environment.Exit(1); return Array.Empty(); // Unreachable, but required for compiler } } private List LoadUnaskedQuestions() { try { using (FileStream stream = File.OpenRead(UnaskedTriviaQuestionsPath)) { List questions = JsonSerializer.Deserialize>(stream)!; if (questions == null) throw new NoNullAllowedException(); return questions; } } catch (FileNotFoundException) { return AllTriviaQuestions.ToList(); } } } public class TriviaQuestion { public required string Question { get; set; } public required bool Answer { get; set; } }