Added support for reactions

This commit is contained in:
p11 2023-07-19 20:05:23 +02:00
parent 7c1969fa0b
commit accd37204f

View File

@ -47,6 +47,8 @@ struct Comment {
struct SiteInfo { struct SiteInfo {
comments: Vec<Comment>, comments: Vec<Comment>,
visits: usize, visits: usize,
up: usize,
down: usize,
} }
#[derive(Default)] #[derive(Default)]
@ -137,45 +139,63 @@ impl Context {
Vacant(v) => v.insert(SiteInfo::default()), Vacant(v) => v.insert(SiteInfo::default()),
}; };
let mut entries = request.body.split('&'); let mut name = None;
if let (Some(name_entry), Some(text_entry), None) = let mut text = None;
(entries.next(), entries.next(), entries.next())
{
if let (Some(("name", input_name)), Some(("text", input_text))) =
(name_entry.split_once('='), text_entry.split_once('='))
{
let name_value = input_name.replace('+', " ");
let decoded_name = percent_decode_str(&name_value).decode_utf8_lossy();
eprintln!("Received comment by \"{decoded_name}\":");
let name = decoded_name
.replace('&', "&amp;")
.replace('<', "&lt;")
.replace('>', "&gt;")
.into();
let text_value = input_text.replace('+', " "); for entry in request.body.split('&') {
let decoded_text = percent_decode_str(&text_value).decode_utf8_lossy(); let Some((key, input)) = entry.split_once('=') else {
for line in decoded_text.lines() { continue;
eprintln!(" {line}"); };
match key {
"name" => {
let name_value = input.replace('+', " ");
let decoded_name = percent_decode_str(&name_value).decode_utf8_lossy();
eprintln!("Received comment by \"{decoded_name}\":");
name = Some(
decoded_name
.replace('&', "&amp;")
.replace('<', "&lt;")
.replace('>', "&gt;")
.into(),
);
} }
eprintln!(); "text" => {
let mut text_buf = Vec::new(); let text_value = input.replace('+', " ");
convert(decoded_text.lines(), &mut text_buf); let decoded_text = percent_decode_str(&text_value).decode_utf8_lossy();
let text = std::str::from_utf8(text_buf.as_slice()) for line in decoded_text.lines() {
.unwrap_or_default() eprintln!(" {line}");
.into(); }
eprintln!();
info.comments.push(Comment { name, text }); let mut text_buf = Vec::new();
convert(decoded_text.lines(), &mut text_buf);
text = Some(
std::str::from_utf8(text_buf.as_slice())
.unwrap_or_default()
.into(),
);
}
"up" => info.up += 1,
"down" => info.down += 1,
_ => (),
} }
} }
if let (Some(name), Some(text)) = (name, text) {
info.comments.push(Comment { name, text });
}
info.visits += 1; info.visits += 1;
let _ = write!(stream, "HTTP/1.1 200 OK\r\n\r\n"); let _ = write!(stream, "HTTP/1.1 200 OK\r\n\r\n");
let _ = writeln!(stream, "<meta charset=\"utf-8\">"); let _ = writeln!(stream, "<meta charset=\"utf-8\">");
let _ = writeln!(stream, "<p>👁️{}</p>", info.visits); let _ = writeln!(
stream,
"<p>👁️{} 💖️{} 💔️{}</p>",
info.visits, info.up, info.down
);
let title = relative_path let title = relative_path
.rsplit_once('/') .rsplit_once('/')
@ -261,6 +281,10 @@ impl Context {
br; br;
input type="submit" value="Send!"; input type="submit" value="Send!";
} }
form method="POST" {
input type="submit" value="💖️" name="up";
input type="submit" value="💔️" name="down";
}
}; };
let _ = stream.write_all(html.into_string().as_bytes()); let _ = stream.write_all(html.into_string().as_bytes());