Compare commits

...

2 commits

Author SHA1 Message Date
Ash Vollmer
bb745c9595 adjusted for changes in model 2026-08-05 21:16:36 +02:00
Ash Vollmer
c2c83ff66f refactored into impl and added get validity function 2026-08-05 21:16:16 +02:00
2 changed files with 83 additions and 39 deletions

View file

@ -6,27 +6,25 @@ use dotenv::dotenv;
use models::Notice; use models::Notice;
use serenity::{ use serenity::{
all::{ all::{
Colour, Context, CreateAttachment, CreateEmbed, CreateEmbedFooter, CreateMessage, Colour, Context, CreateEmbed, CreateEmbedFooter, CreateMessage, EventHandler,
EventHandler, GatewayIntents, Message, Ready, Timestamp, GatewayIntents, Message, Ready, Timestamp,
}, },
async_trait, Client, async_trait, Client,
}; };
use crate::models::get_line_color;
struct Handler; struct Handler;
#[async_trait] #[async_trait]
impl EventHandler for Handler { impl EventHandler for Handler {
async fn message(&self, ctx: Context, msg: Message) { async fn message(&self, ctx: Context, msg: Message) {
let new = Notice { let mut new = Notice {
affected_lines: vec!(String::from("10")), affected_lines: vec!(String::from("10")),
dest_1: String::from("Hannover/Wettbergen"), dest_1: String::from("Hannover/Wettbergen"),
dest_2: String::from("Hannover/Misburg"), dest_2: String::from("Hannover/Misburg"),
headline: String::from("Linie 7 fährt erst bzw. bis Haltestelle In den Sieben Stücken"), headline: String::from("Linie 7 fährt erst bzw. bis Haltestelle In den Sieben Stücken"),
detail: String::from("Die Stadtbahnlinie 7 fährt während der Baumaßnahme erst ab beziehungsweise bis zur Haltestelle In den Sieben Stücken. Dort besteht die Umsteigemöglichkeit vom bzw. in den Schienenersatzverkehr (SEV) und die Stadtbahnlinien 3 und 13. An der Haltestelle Buchholz/Betriebshof ist kein Zustieg bzw. Ausstieg möglich."), detail: String::from("Die Stadtbahnlinie 7 fährt während der Baumaßnahme erst ab beziehungsweise bis zur Haltestelle In den Sieben Stücken. Dort besteht die Umsteigemöglichkeit vom bzw. in den Schienenersatzverkehr (SEV) und die Stadtbahnlinien 3 und 13. An der Haltestelle Buchholz/Betriebshof ist kein Zustieg bzw. Ausstieg möglich."),
from: 12, from: None,
to: 30, to: None,
last_modified: String::from("2026-07-24T13:37:00Z"), last_modified: String::from("2026-07-24T13:37:00Z"),
}; };
if msg.content == "!hello" { if msg.content == "!hello" {
@ -42,24 +40,37 @@ impl EventHandler for Handler {
)); ));
let timestamp: Timestamp = new.last_modified.parse().expect("Invalid timestamp!"); let timestamp: Timestamp = new.last_modified.parse().expect("Invalid timestamp!");
let color = let color = new.get_line_color();
get_line_color(new.affected_lines.first().expect("No single line affected")); new.get_validity_period();
let embed = if new.from.is_none() || new.to.is_none() {
let embed = CreateEmbed::new() CreateEmbed::new()
.title(new.headline) .title(new.headline)
.description(new.detail) .description(new.detail)
.color(Colour::from_rgb(color.0, color.1, color.2)) .color(Colour::from_rgb(color.0, color.1, color.2))
.timestamp(timestamp) .timestamp(timestamp)
.fields(vec![ .field(
("Start", new.from.to_string(), true), "Fahrtrichtungen",
("Ende", new.to.to_string(), true), format!("{} & {}", &new.dest_1, &new.dest_2),
]) false,
.field( )
"Fahrtrichtungen", .footer(footer)
format!("{} & {}", new.dest_1, new.dest_2), } else {
false, CreateEmbed::new()
) .title(new.headline)
.footer(footer); .description(new.detail)
.color(Colour::from_rgb(color.0, color.1, color.2))
.timestamp(timestamp)
.fields(vec![
("Start", new.from.unwrap().to_string(), true),
("Ende", new.to.unwrap().to_string(), true),
])
.field(
"Fahrtrichtungen",
format!("{} & {}", new.dest_1, new.dest_2),
false,
)
.footer(footer)
};
// let embed = CreateEmbed::new() // let embed = CreateEmbed::new()
// .title("This is a title") // .title("This is a title")

View file

@ -1,29 +1,62 @@
use chrono::NaiveDateTime;
use regex::Regex;
pub struct Notice { pub struct Notice {
pub affected_lines: Vec<String>, pub affected_lines: Vec<String>,
pub dest_1: String, pub dest_1: String,
pub dest_2: String, pub dest_2: String,
pub headline: String, pub headline: String,
pub detail: String, pub detail: String,
pub from: u32, pub from: Option<NaiveDateTime>,
pub to: u32, pub to: Option<NaiveDateTime>,
pub last_modified: String, pub last_modified: String,
} }
pub fn get_line_color(line_number: &str) -> (u8, u8, u8) { impl Notice {
match line_number { pub fn get_line_color(&self) -> (u8, u8, u8) {
// Rot: Linien 1, 2, 8 match self
"1" | "2" | "8" => (238, 66, 36), .affected_lines
.first()
.expect("Does not affect any line")
.as_str()
{
// Rot: Linien 1, 2, 8
"1" | "2" | "8" => (238, 66, 36),
// Gelb (Die besten Linien): Linien 4, 5, 6, 11 // Gelb (Die besten Linien): Linien 4, 5, 6, 11
"4" | "5" | "6" | "11" => (248, 166, 28), "4" | "5" | "6" | "11" => (248, 166, 28),
// Grün: Linien 9, 10, 12, 17 // Grün: Linien 9, 10, 12, 17
"10" | "12" | "17" => (110, 191, 69), "10" | "12" | "17" => (110, 191, 69),
// Blau: Linien 3, 7, 9, 13 // Blau: Linien 3, 7, 9, 13
"3" | "7" | "9" | "13" => (0, 114, 188), "3" | "7" | "9" | "13" => (0, 114, 188),
// Fallback (z.B. für das Standard-Blau aus deiner API) // Fallback (z.B. für das Standard-Blau aus deiner API)
_ => (55, 101, 174), _ => (55, 101, 174),
}
}
pub fn get_validity_period(&mut self) {
let re = Regex::new(
r"Gültig ab (\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}) bis (\d{2}\.\d{2}\.\d{4} \d{2}:\d{2})",
)
.unwrap();
if let Some(caps) = re.captures(&self.detail) {
let valid_from = caps.get(1).unwrap().as_str();
let valid_to = caps.get(1).unwrap().as_str();
let format = "%d.%m.%Y %H:%M";
if let (Ok(start_dt), Ok(end_dt)) = (
NaiveDateTime::parse_from_str(valid_from, format),
NaiveDateTime::parse_from_str(valid_to, format),
) {
self.from = Some(start_dt);
self.to = Some(end_dt);
}
} else {
println!("No validity period found in the text.");
}
} }
} }