diff --git a/bots/MysteriousCube.cs b/bots/MysteriousCube.cs index 382a4d2..1112374 100644 --- a/bots/MysteriousCube.cs +++ b/bots/MysteriousCube.cs @@ -1,23 +1,23 @@ +using Microsoft.EntityFrameworkCore; +using System.Collections.Generic; using System.Data; using System.Text.Json; using riff; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; public class MysteriousCube : IRCBot { - private HttpClient RequestClient = new(); - private const string AllTriviaQuestionsPath = "data/TriviaQuestions.json"; - private const string UnaskedTriviaQuestionsPath = "data/UnaskedTriviaQuestions.json"; + // private HttpClient RequestClient = new(); private TriviaQuestion[] AllTriviaQuestions; - private List UnaskedTriviaQuestions; - private bool ListeningForAnswer = false; - private TriviaQuestion? CurrentQuestion = null; - private Random Rand = new(); + private const string AllTriviaQuestionsPath = "data/TriviaQuestions.json"; + private Dictionary CurrentQuestions = []; + private readonly Random Rand = new(); - public MysteriousCube(string host, int port, string nick, string realname, List permanentChannels) + public MysteriousCube(string host, int port, string nick, string realname, List permanentChannels) : base(host, port, nick, realname, permanentChannels) { AllTriviaQuestions = LoadAllQuestions(); - UnaskedTriviaQuestions = LoadUnaskedQuestions(); (string, Action)[] commands = [ ("echo", Echo), @@ -40,41 +40,65 @@ public class MysteriousCube : IRCBot private void PostQuestion(PRIVMSG privmsg) { var question = GetQuestion(); - CurrentQuestion = question; - ListeningForAnswer = true; + CurrentQuestions[privmsg.Sender] = question; SendPrivmsg(privmsg.Sender, $"Answer 'true' or 'false': {question.Question}"); } private void AnswerListener(PRIVMSG privmsg) { - if (!ListeningForAnswer || CurrentQuestion == null) + TriviaQuestion? currentQuestion = CurrentQuestions.GetValueOrDefault(privmsg.Sender); + if (currentQuestion == null) return; string line = privmsg.Body.ToLower().Trim(); - bool? answer = null; + bool? answer; if (line.StartsWith("true")) answer = true; else if (line.StartsWith("false")) answer = false; else return; - ListeningForAnswer = false; string response; - if (answer == CurrentQuestion.Answer) - response = $"{privmsg.Nick} is correct!"; - else - response = $"{privmsg.Nick} is wrong!"; - CurrentQuestion = null; + using (var db = new MysteriousCubeDatabaseContext()) + { + bool correct = answer == currentQuestion.Answer; + var user = db.Users.Find(privmsg.Nick); + if (user == null) + { + user = new User { Nick = privmsg.Nick, TriviaScore = 0 }; + db.Users.Add(user); + db.SaveChanges(); + user = db.Users.Find(privmsg.Nick)!; + } + if (correct) + user.TriviaScore += 1; + else + user.TriviaScore =- 1; + db.Users.Update(user); + db.SaveChanges(); + string phrasing = correct ? "correct" : "wrong"; + response = $"{privmsg.Nick} is {phrasing}! {privmsg.Nick} has a score of {user.TriviaScore}."; + CurrentQuestions[privmsg.Sender] = null; + } SendPrivmsg(privmsg.Sender, response); } 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; + using (var db = new MysteriousCubeDatabaseContext()) + { + var questions = db.UnaskedTriviaQuestions.ToList(); + Console.WriteLine($"{questions.Count}"); + if (db.UnaskedTriviaQuestions.Count() == 0) + { + foreach (var q in AllTriviaQuestions) + db.UnaskedTriviaQuestions.Add(q); + questions = db.UnaskedTriviaQuestions.ToList(); + } + TriviaQuestion question = questions[Rand.Next(questions.Count)]; + db.UnaskedTriviaQuestions.Remove(question); + db.SaveChanges(); + return question; + } } private TriviaQuestion[] LoadAllQuestions() @@ -83,7 +107,7 @@ public class MysteriousCube : IRCBot { using (FileStream stream = File.OpenRead(AllTriviaQuestionsPath)) { - TriviaQuestion[] questions = JsonSerializer.Deserialize(stream)!; + var questions = JsonSerializer.Deserialize(stream)!; if (questions == null) throw new NoNullAllowedException(); return questions; @@ -97,27 +121,34 @@ public class MysteriousCube : IRCBot } } - private List LoadUnaskedQuestions() + public class MysteriousCubeDatabaseContext : DbContext { - 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 DbSet UnaskedTriviaQuestions { get; set; } + public DbSet Users { get; set; } + public string DbPath = "data/mysterious_cube.sqlite"; -public class TriviaQuestion -{ - public required string Question { get; set; } - public required bool Answer { get; set; } + // public UnaskedTriviaQuestionsContext() + // { + // // + // } + + protected override void OnConfiguring(DbContextOptionsBuilder options) + => options.UseSqlite($"Data Source=data/mysterious_cube.sqlite"); + } + + [Table("UnaskedTriviaQuestions")] + public class TriviaQuestion + { + [Key] + public required string Question { get; set; } + public required bool Answer { get; set; } + } + + [Table("Users")] + public class User + { + [Key] + public required string Nick { get; set; } + public required int TriviaScore { get; set; } + } } \ No newline at end of file diff --git a/riff.csproj b/riff.csproj index 15cfa61..11f716e 100644 --- a/riff.csproj +++ b/riff.csproj @@ -8,6 +8,11 @@ + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + +