diff --git a/src/main.rs b/src/main.rs index 1b9cb6b..259098b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,25 +1,109 @@ +mod models; + use std::env; use dotenv::dotenv; +use models::Notice; use serenity::{ - all::{Context, EventHandler, GatewayIntents, Message, GATEWAY_VERSION}, + all::{ + Colour, Context, CreateAttachment, CreateEmbed, CreateEmbedFooter, CreateMessage, + EventHandler, GatewayIntents, Message, Ready, Timestamp, + }, async_trait, Client, }; +use crate::models::get_line_color; + struct Handler; #[async_trait] impl EventHandler for Handler { async fn message(&self, ctx: Context, msg: Message) { - if msg.content == "!ping" { - println!("found PING!"); - if let Err(why) = msg.channel_id.say(&ctx.http, "Pong!").await { + let new = Notice { + affected_lines: vec!(String::from("10")), + dest_1: String::from("Hannover/Wettbergen"), + dest_2: String::from("Hannover/Misburg"), + 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."), + from: 12, + to: 30, + last_modified: String::from("2026-07-24T13:37:00Z"), + }; + if msg.content == "!hello" { + // The create message builder allows you to easily create embeds and messages using a + // builder syntax. + // This example will create a message that says "Hello, World!", with an embed that has + // a title, description, an image, three fields, and a footer. + let footer = CreateEmbedFooter::new("").text(format!( + "Betroffene Linien: {}", + new.affected_lines + .iter() + .fold(String::new(), |acc, a| acc + &format!("{}", a.to_string())) + )); + + let timestamp: Timestamp = new.last_modified.parse().expect("Invalid timestamp!"); + let color = + get_line_color(new.affected_lines.first().expect("No single line affected")); + + let embed = CreateEmbed::new() + .title(new.headline) + .description(new.detail) + .color(Colour::from_rgb(color.0, color.1, color.2)) + .timestamp(timestamp) + .fields(vec![ + ("Start", new.from.to_string(), true), + ("Ende", new.to.to_string(), true), + ]) + .field( + "Fahrtrichtungen", + format!("{} & {}", new.dest_1, new.dest_2), + false, + ) + .footer(footer); + + // let embed = CreateEmbed::new() + // .title("This is a title") + // .description("This is a description") + // .image("attachment://ferris_eyes.png") + // .fields(vec![ + // ("This is the first field", "This is a field body", true), + // ("This is the second field", "Both fields are inline", true), + // ]) + // .field( + // "This is the third field", + // "This is not an inline field", + // false, + // ) + // .footer(footer) + // // Add a timestamp for the current time + // // This also accepts a rfc3339 Timestamp + // .timestamp(Timestamp::now()); + let builder = CreateMessage::new().content("").embed(embed); + let msg = msg.channel_id.send_message(&ctx.http, builder).await; + + if let Err(why) = msg { println!("Error sending message: {why:?}"); } } } + + async fn ready(&self, _: Context, ready: Ready) { + println!("{} is connected!", ready.user.name); + } } +// #[async_trait] +// impl EventHandler for Handler { +// async fn message(&self, ctx: Context, msg: Message) { +// if msg.content == "!ping" { +// println!("found PING!"); +// if let Err(why) = msg.channel_id.say(&ctx.http, "Pong!").await { +// println!("Error sending message: {why:?}"); +// } +// } +// } +// } + #[tokio::main] async fn main() { println!("Hello, world!");