no real commit messages

This commit is contained in:
nebula 2025-07-01 23:02:36 +00:00
parent 66b307276f
commit 493c290e9b
7 changed files with 121 additions and 10 deletions

View File

@ -11,7 +11,7 @@ public abstract class IRCBot
public int Port;
public string Nick;
public string RealName;
public List<string>? Channels;
public List<string> Channels = new();
public List<Action<PRIVMSG>> Listeners = new();
private List<CommandRunner> CommandRunners = new();
private List<PollRunner> PollRunners = new();
@ -60,15 +60,16 @@ public abstract class IRCBot
Stream.Write(bytes, 0, bytes.Length);
}
public void SendPrivmsg(string channel, string message)
public void SendPrivmsg(string destination, string message)
{
if (message != string.Empty)
SendLine($"PRIVMSG {channel} :{message}");
SendLine($"PRIVMSG {destination} :{message}");
}
public void JoinChannel(string channel)
{
SendLine($"JOIN {channel}");
Channels.Add(channel);
}
public void JoinChannels(string[] channels)
@ -80,14 +81,13 @@ public abstract class IRCBot
public void PartChannel(string channel)
{
SendLine($"PART {channel}");
Channels.Remove(channel);
}
public void MainLoop()
{
foreach (PollRunner runner in PollRunners)
{
runner.Run();
}
using var reader = new StreamReader(Stream, Encoding.UTF8);
while (true)
{

View File

@ -4,7 +4,7 @@ class Program
{
static void Main(string[] args)
{
var cube = new Cube("localhost", 6667, "testbot", "~nebula");
var cube = new Cube("localhost", 6667, "mysterious_cube", "~nebula https://git.tilde.town/nebula/riff");
new Thread(new ThreadStart(cube.MainLoop)).Start();
}
}

View File

@ -45,9 +45,11 @@ public class PRIVMSG
{
if (message.Source == null || message.Arguments == null)
throw new NoNullAllowedException();
Nick = message.Source.Substring(0, message.Source.IndexOf("!") - 1);
Sender = message.Arguments[0];
Nick = message.Source.Substring(0, message.Source.IndexOf("!"));
Body = message.Arguments[1].Trim();
Sender = message.Arguments[0];
if (Sender[0] != '#')
Sender = Nick;
}
}

View File

@ -1,16 +1,28 @@
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 = [
"#bots",
"#testbot",
];
(string, Action<PRIVMSG>)[] commands = [
("echo", Echo)
("echo", Echo),
("trivia", PostQuestion)
];
HookCommands(commands);
@ -21,4 +33,64 @@ public class Cube : IRCBot
{
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; }
}

File diff suppressed because one or more lines are too long

32
download_trivia.py Normal file
View File

@ -0,0 +1,32 @@
from json import dump
from time import sleep
from base64 import b64decode
import requests
api_url = "https://opentdb.com/api.php"
token_url = "https://opentdb.com/api_token.php?command=request"
file_path = "TriviaQuestions.json"
questions = []
token = requests.get(token_url).json()["token"]
params = {
"amount": 50,
"type": "boolean",
"encode": "base64",
"token": token
}
while True:
r = requests.get(api_url, params=params).json()
if r["response_code"] != 0:
print(r)
break
for question in r["results"]:
question_text = b64decode(question["question"]).decode("utf-8")
question_answer = b64decode(question["correct_answer"]).decode("utf-8") == "True"
questions.append({"Question": question_text, "Answer": question_answer})
print(len(questions))
sleep(6)
with open(file_path, "w") as f:
dump(questions, f)

View File

@ -7,4 +7,8 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Net.Http.Json" Version="9.0.6" />
</ItemGroup>
</Project>