From f08f97f2674ad1df4292e6dafc08b392af79ab91 Mon Sep 17 00:00:00 2001 From: MeexReay Date: Sat, 19 Apr 2025 23:54:45 +0300 Subject: [PATCH] notifications --- .gitignore | 3 ++- Makefile | 5 ++++ bRAC.desktop | 12 +++++++++ bRAC.png | Bin 0 -> 30985 bytes src/chat/gui.rs | 65 ++++++++++++++++++++++++++++++++++-------------- 5 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 bRAC.desktop create mode 100644 bRAC.png diff --git a/.gitignore b/.gitignore index 59779f4..a42863f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /target /result /build -/config.yml \ No newline at end of file +/config.yml +/bRAC \ No newline at end of file diff --git a/Makefile b/Makefile index fbf27c4..a393033 100644 --- a/Makefile +++ b/Makefile @@ -16,12 +16,17 @@ build/windows-x86_64: mv $@/bin/* $@/ cp target/x86_64-pc-windows-gnu/release/bRAC.exe $@ rm -r $@/bin + # TODO: disable console + # TODO: set icon build/linux-x86_64: mkdir -p build mkdir -p $@ cargo build -r --target x86_64-unknown-linux-gnu + # patchbin target/x86_64-unknown-linux-gnu/release/bRAC cp target/x86_64-unknown-linux-gnu/release/bRAC $@ + cp bRAC.png $@ + cp bRAC.desktop $@ clean: rm -r build \ No newline at end of file diff --git a/bRAC.desktop b/bRAC.desktop new file mode 100644 index 0000000..80f4ad5 --- /dev/null +++ b/bRAC.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=bRAC +Version=0.1.4 +Type=Application +Comment=better RAC client +Icon=bRAC.png +Exec=bRAC +Categories=Network; +StartupNotify=true +DBusActivatable=true +Terminal=false +X-GNOME-UsesNotifications=true \ No newline at end of file diff --git a/bRAC.png b/bRAC.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1fd4e57a6893a1fb76b937cab0ccf5ab3bd6cd GIT binary patch literal 30985 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%0DXAv3cwF5P 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 IM6N<$f?275LI3~& literal 0 HcmV?d00001 diff --git a/src/chat/gui.rs b/src/chat/gui.rs index 01e4541..aaa303f 100644 --- a/src/chat/gui.rs +++ b/src/chat/gui.rs @@ -5,7 +5,7 @@ use std::thread; use chrono::Local; -use gtk4::{self as gtk, glib::timeout_add_once}; +use gtk4::{self as gtk, gio::Notification, glib::timeout_add_once}; use gtk::prelude::*; use gtk::gdk::{Cursor, Display, Texture}; @@ -30,7 +30,8 @@ ctx::Context, on_send_message, parse_message, print_message, recv_tick, sanitize struct UiModel { chat_box: GtkBox, - chat_scrolled: ScrolledWindow + chat_scrolled: ScrolledWindow, + app: Application } thread_local!( @@ -583,11 +584,12 @@ fn build_ui(ctx: Arc, app: &Application) -> UiModel { UiModel { chat_scrolled, - chat_box + chat_box, + app: app.clone() } } -fn setup(ctx: Arc, ui: UiModel) { +fn setup(app: &Application, ctx: Arc, ui: UiModel) { let (sender, receiver) = channel(); *ctx.sender.write().unwrap() = Some(Arc::new(sender)); @@ -652,6 +654,8 @@ fn load_css() { } fn on_add_message(ctx: Arc, ui: &UiModel, message: String) { + let app = ui.app.clone(); + let Some(message) = sanitize_message(message) else { return; }; if message.is_empty() { @@ -663,8 +667,8 @@ fn on_add_message(ctx: Arc, ui: &UiModel, message: String) { if let Some((date, ip, content, nick)) = parse_message(message.clone()) { if let Some(ip) = ip { if ctx.config(|o| o.show_other_ip) { - let ip = Label::builder() - .label(ip) + let ip_label = Label::builder() + .label(&ip) .margin_end(10) .halign(Align::Start) .valign(Align::Start) @@ -672,11 +676,11 @@ fn on_add_message(ctx: Arc, ui: &UiModel, message: String) { .selectable(true) .build(); - hbox.append(&ip); + hbox.append(&ip_label); } } - let date = Label::builder() + let date_label = Label::builder() .label(format!("[{date}]")) .halign(Align::Start) .valign(Align::Start) @@ -684,10 +688,10 @@ fn on_add_message(ctx: Arc, ui: &UiModel, message: String) { .selectable(true) .build(); - hbox.append(&date); + hbox.append(&date_label); if let Some((name, color)) = nick { - let name = Label::builder() + let name_label = Label::builder() .label(format!("<{name}>")) .halign(Align::Start) .valign(Align::Start) @@ -695,11 +699,27 @@ fn on_add_message(ctx: Arc, ui: &UiModel, message: String) { .selectable(true) .build(); - hbox.append(&name); + hbox.append(&name_label); + + if !app.windows()[0].is_active() { + if ctx.config(|o| o.chunked_enabled) { + let notif = Notification::new(&format!("{}'s Message", &name)); + notif.set_body(Some(&content)); + app.send_notification(Some("user-message"), ¬if); + } + } + } else { + if !app.windows()[0].is_active() { + if ctx.config(|o| o.chunked_enabled) { + let notif = Notification::new("System Message"); + notif.set_body(Some(&content)); + app.send_notification(Some("system-message"), ¬if); + } + } } - let content = Label::builder() - .label(content) + let content_label = Label::builder() + .label(&content) .halign(Align::Start) .valign(Align::Start) .css_classes(["message-content"]) @@ -708,10 +728,11 @@ fn on_add_message(ctx: Arc, ui: &UiModel, message: String) { .wrap_mode(WrapMode::Char) .build(); - hbox.append(&content); + hbox.append(&content_label); + } else { - let content = Label::builder() - .label(message) + let content_label = Label::builder() + .label(&message) .halign(Align::Start) .valign(Align::Start) .css_classes(["message-content"]) @@ -720,7 +741,15 @@ fn on_add_message(ctx: Arc, ui: &UiModel, message: String) { .wrap_mode(WrapMode::Char) .build(); - hbox.append(&content); + hbox.append(&content_label); + + if !app.windows()[0].is_active() { + if ctx.config(|o| o.chunked_enabled) { + let notif = Notification::new("Chat Message"); + notif.set_body(Some(&message)); + app.send_notification(Some("chat-message"), ¬if); + } + } } ui.chat_box.append(&hbox); @@ -757,7 +786,7 @@ pub fn run_main_loop(ctx: Arc) { move |app| { let ui = build_ui(ctx.clone(), app); - setup(ctx.clone(), ui); + setup(app, ctx.clone(), ui); load_css(); } });