Initial commit
This commit is contained in:
commit
dc7239f9c2
|
@ -0,0 +1 @@
|
||||||
|
flake-profile-2-link
|
|
@ -0,0 +1 @@
|
||||||
|
/nix/store/2accvk3hns9h9zhmv1l8jjskrgxqpa5c-nix-shell-env
|
|
@ -0,0 +1 @@
|
||||||
|
/nix/store/hfppccc1m8j06yxqql77lg6s8cb8i51z-nix-shell-env
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,20 @@
|
||||||
|
[package]
|
||||||
|
name = "mbdirnotify"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
anyhow = "1.0.80"
|
||||||
|
clap = {version = "4.5.1", features = ["derive"] }
|
||||||
|
mailparse = "0.14.1"
|
||||||
|
notify = "6.1.1"
|
||||||
|
notify-rust = "4.10.0"
|
||||||
|
serde = {version = "1.0.197", features = ["derive"] }
|
||||||
|
|
||||||
|
[profile.release]
|
||||||
|
strip = true
|
||||||
|
opt-level = "z"
|
||||||
|
lto = true
|
||||||
|
codegen-units = 1
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1709237383,
|
||||||
|
"narHash": "sha256-cy6ArO4k5qTx+l5o+0mL9f5fa86tYUX3ozE1S+Txlds=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "1536926ef5621b09bba54035ae2bb6d806d72ac8",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
description = "Sends notifications for emails stored in maildir";
|
||||||
|
inputs = { nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; };
|
||||||
|
outputs = { self, nixpkgs }:
|
||||||
|
let
|
||||||
|
system = "x86_64-linux";
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
in {
|
||||||
|
devShells.${system}.default = pkgs.mkShell {
|
||||||
|
packages = [ pkgs.rustc pkgs.cargo pkgs.rust-analyzer pkgs.rustfmt ];
|
||||||
|
};
|
||||||
|
packages.${system}.default = pkgs.rustPlatform.buildRustPackage {
|
||||||
|
pname = "mbdirnotify";
|
||||||
|
version = "0.4.3";
|
||||||
|
cargoLock.lockFile = ./Cargo.lock;
|
||||||
|
src = pkgs.lib.cleanSource ./.;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
use std::{fs::File, io::Read, path::PathBuf};
|
||||||
|
|
||||||
|
use anyhow::Result;
|
||||||
|
use clap::{
|
||||||
|
builder::{
|
||||||
|
styling::{AnsiColor, Effects},
|
||||||
|
Styles,
|
||||||
|
},
|
||||||
|
Parser,
|
||||||
|
};
|
||||||
|
use mailparse::MailHeaderMap;
|
||||||
|
use notify::{Event, EventKind, RecursiveMode, Watcher};
|
||||||
|
use notify_rust::Notification;
|
||||||
|
|
||||||
|
fn styles() -> Styles {
|
||||||
|
Styles::styled()
|
||||||
|
.header(AnsiColor::Red.on_default() | Effects::BOLD)
|
||||||
|
.usage(AnsiColor::Red.on_default() | Effects::BOLD)
|
||||||
|
.literal(AnsiColor::Blue.on_default() | Effects::BOLD)
|
||||||
|
.placeholder(AnsiColor::Green.on_default())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Parser, Debug)]
|
||||||
|
#[command(author, version, about, long_about = None, styles=styles())]
|
||||||
|
pub struct Args {
|
||||||
|
maildir: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let args = Args::parse();
|
||||||
|
|
||||||
|
let mut watcher = notify::recommended_watcher(watch).unwrap();
|
||||||
|
|
||||||
|
watcher
|
||||||
|
.watch(&PathBuf::from(args.maildir), RecursiveMode::NonRecursive)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
std::thread::sleep(std::time::Duration::from_millis(500));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn watch(event: notify::Result<Event>) {
|
||||||
|
if let Err(e) = parse_event(event) {
|
||||||
|
eprintln!("{}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_event(event: notify::Result<Event>) -> Result<()> {
|
||||||
|
let event = event?;
|
||||||
|
if let EventKind::Create(_kind) = event.kind {
|
||||||
|
if let Some(p) = event.paths.first() {
|
||||||
|
let mut f = File::open(&p)?;
|
||||||
|
let mut buf = vec![];
|
||||||
|
f.read_to_end(&mut buf)?;
|
||||||
|
let mail_data = mailparse::parse_mail(&buf)?;
|
||||||
|
let subject = mail_data
|
||||||
|
.headers
|
||||||
|
.get_first_value("Subject")
|
||||||
|
.unwrap_or_default();
|
||||||
|
let from_raw = mail_data
|
||||||
|
.headers
|
||||||
|
.get_first_value("From")
|
||||||
|
.unwrap_or_default();
|
||||||
|
let from = parse_name(&from_raw);
|
||||||
|
|
||||||
|
Notification::new()
|
||||||
|
.summary(&from)
|
||||||
|
.body(&subject)
|
||||||
|
.icon("email")
|
||||||
|
.show()
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_name(s: &str) -> &str {
|
||||||
|
s.split("\"").nth(1).unwrap_or(s)
|
||||||
|
}
|
Loading…
Reference in New Issue