96 lines
2.9 KiB
C#
96 lines
2.9 KiB
C#
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<TriviaQuestion> 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<PRIVMSG>)[] 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<TriviaQuestion[]>(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<TriviaQuestion>(); // Unreachable, but required for compiler
|
|
}
|
|
}
|
|
|
|
private List<TriviaQuestion> LoadUnaskedQuestions()
|
|
{
|
|
try
|
|
{
|
|
using (FileStream stream = File.OpenRead(UnaskedTriviaQuestionsPath))
|
|
{
|
|
List<TriviaQuestion> questions = JsonSerializer.Deserialize<List<TriviaQuestion>>(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; }
|
|
} |