From dc41aeac144cce55c0e1c1f8d5a58055cb5961b8 Mon Sep 17 00:00:00 2001 From: "Brian J. Tarricone" Date: Wed, 20 Sep 2023 18:16:30 -0700 Subject: [PATCH] Add support for reading mail-archive.com RSS feeds --- Cargo.lock | 205 ++++++++ Cargo.toml | 7 +- src/config.rs | 23 +- src/{gitlab.rs => gitlab_webhook.rs} | 17 +- src/mail_archive.rs | 262 ++++++++++ src/main.rs | 43 +- test-data/maillist.xml | 722 +++++++++++++++++++++++++++ 7 files changed, 1252 insertions(+), 27 deletions(-) rename src/{gitlab.rs => gitlab_webhook.rs} (90%) create mode 100644 src/mail_archive.rs create mode 100644 test-data/maillist.xml diff --git a/Cargo.lock b/Cargo.lock index 16c2649..30775b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -37,6 +37,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.75" @@ -55,6 +70,19 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f093eed78becd229346bf859eec0aa4dd7ddde0757287b2b4107a1f09c80002" +[[package]] +name = "async-compression" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb42b2197bf15ccb092b62c74515dbd8b86d0effd934795f6687c93b6e679a2c" +dependencies = [ + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + [[package]] name = "async-lock" version = "2.8.0" @@ -155,12 +183,17 @@ name = "bebot" version = "0.1.3-alpha.1" dependencies = [ "anyhow", + "chrono", "constant_time_eq", + "dateparser", "env_logger", + "futures", "http", "log", "matrix-sdk", + "quick-xml", "regex", + "reqwest", "serde", "serde_json", "serde_regex", @@ -223,12 +256,43 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets", +] + [[package]] name = "constant_time_eq" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + [[package]] name = "cpufeatures" version = "0.2.9" @@ -238,6 +302,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -296,6 +369,18 @@ dependencies = [ "parking_lot_core 0.9.8", ] +[[package]] +name = "dateparser" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e537db44ee4822af930a9a2c9eedfcde9d47e01c6731fbf34ea01b5a7ccf7d" +dependencies = [ + "anyhow", + "chrono", + "lazy_static", + "regex", +] + [[package]] name = "derive_builder" version = "0.11.2" @@ -398,6 +483,16 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -697,6 +792,29 @@ dependencies = [ "tokio-rustls", ] +[[package]] +name = "iana-time-zone" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -793,6 +911,12 @@ dependencies = [ "serde", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.148" @@ -971,6 +1095,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "num-traits" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.16.0" @@ -996,6 +1129,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + [[package]] name = "parking_lot" version = "0.11.2" @@ -1108,6 +1247,16 @@ dependencies = [ "unicase", ] +[[package]] +name = "quick-xml" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "quote" version = "1.0.33" @@ -1200,6 +1349,7 @@ version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" dependencies = [ + "async-compression", "base64 0.21.4", "bytes", "encoding_rs", @@ -1218,12 +1368,14 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls", + "rustls-native-certs", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "tokio", "tokio-rustls", + "tokio-util", "tower-service", "url", "wasm-bindgen", @@ -1377,6 +1529,18 @@ dependencies = [ "sct", ] +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "1.0.3" @@ -1402,6 +1566,15 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +[[package]] +name = "schannel" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +dependencies = [ + "windows-sys", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -1424,6 +1597,29 @@ dependencies = [ "untrusted", ] +[[package]] +name = "security-framework" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" version = "1.0.188" @@ -2045,6 +2241,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets", +] + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/Cargo.toml b/Cargo.toml index c931e6a..0c17b38 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,15 +24,20 @@ exclude = [ [dependencies] anyhow = "1" +chrono = { version = "0.4", features = ["serde"] } constant_time_eq = "0.3" +dateparser = "0.2" env_logger = "0.10" +futures = "0.3" http = "0.2" log = { version = "0.4", features = ["std"] } matrix-sdk = { version = "0.6", features = ["anyhow", "markdown", "rustls-tls"], default-features = false } +quick-xml = { version = "0.30", features = ["serialize"] } regex = "1" +reqwest = { version = "0.11", default-features = false, features = ["tokio-rustls", "rustls-tls-native-roots", "gzip"] } serde = { version = "1", features = ["derive"] } serde_json = "1" serde_regex = "1" serde_yaml = "0.9" -tokio = { version = "1", default-features = false, features = ["rt-multi-thread", "macros"] } +tokio = { version = "1", default-features = false, features = ["rt-multi-thread", "macros", "time"] } warp = "0.3" diff --git a/src/config.rs b/src/config.rs index 60512c9..f2b2686 100644 --- a/src/config.rs +++ b/src/config.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use std::{collections::HashMap, fs::File, io::BufReader}; +use std::{collections::HashMap, fs::File, io::BufReader, path::PathBuf}; use anyhow::Context; use matrix_sdk::ruma::{OwnedRoomOrAliasId, OwnedUserId}; @@ -52,7 +52,7 @@ pub struct RepoConfig { } #[derive(Deserialize)] -pub struct GitlabConfig { +pub struct GitlabWebhookConfig { pub url_prefix: Option, #[serde(default)] #[serde(deserialize_with = "crate::matrix::deser_optional_room_or_alias_id")] @@ -62,6 +62,22 @@ pub struct GitlabConfig { // gitlab.xfce.org/xfce/xfdesktop } +#[derive(Clone, Deserialize)] +pub struct MailListConfig { + pub name: String, + #[serde(default)] + pub rooms: Vec, +} + +#[derive(Deserialize)] +pub struct MailArchiveConfig { + #[serde(default)] + pub default_rooms: Vec, + pub update_interval: u64, // seconds + pub state_dir: PathBuf, + pub lists: Vec, +} + #[derive(Deserialize)] pub struct Config { pub bind_address: Option, @@ -69,7 +85,8 @@ pub struct Config { #[serde(deserialize_with = "crate::matrix::deser_user_id")] pub user_id: OwnedUserId, pub password: String, - pub gitlab: GitlabConfig, + pub gitlab_webhook: Option, + pub mail_archive: Option, } fn load_blocking(path: &String) -> anyhow::Result { diff --git a/src/gitlab.rs b/src/gitlab_webhook.rs similarity index 90% rename from src/gitlab.rs rename to src/gitlab_webhook.rs index fedf1d9..d3056d7 100644 --- a/src/gitlab.rs +++ b/src/gitlab_webhook.rs @@ -26,7 +26,7 @@ use tokio::sync::mpsc; use warp::{filters::BoxedFilter, reply::Reply, Filter}; use crate::{ - config::Config, + config::GitlabWebhookConfig, gitlab_event::{parse_ref, GitlabEvent, GitlabEventExt}, matrix, }; @@ -66,7 +66,7 @@ pub async fn handle_gitlab_event( Ok(()) } -pub fn build_webhook_route(config: Arc, matrix_client: Client) -> anyhow::Result> { +pub fn build_route(config: GitlabWebhookConfig, matrix_client: Client) -> anyhow::Result> { let (event_tx, mut event_rx) = mpsc::channel::<(GitlabEvent, OwnedRoomOrAliasId)>(100); tokio::spawn(async move { while let Some((event, room)) = event_rx.recv().await { @@ -76,7 +76,7 @@ pub fn build_webhook_route(config: Arc, matrix_client: Client) -> anyhow } }); - let gitlab_root_path = if let Some(url_prefix) = config.gitlab.url_prefix.as_ref() { + let gitlab_root_path = if let Some(url_prefix) = config.url_prefix.as_ref() { url_prefix.split('/').fold(warp::any().boxed(), |last, segment| { if segment.is_empty() { last @@ -88,14 +88,15 @@ pub fn build_webhook_route(config: Arc, matrix_client: Client) -> anyhow warp::any().boxed() }; + let config = Arc::new(config); let gitlab = gitlab_root_path .and(warp::path!("hooks" / "gitlab")) .and(warp::post()) .and(warp::header::("x-gitlab-token")) .and(warp::body::json()) .then(move |token: String, event: GitlabEvent| { - let config = Arc::clone(&config); let event_tx = event_tx.clone(); + let config = Arc::clone(&config); async move { match event { @@ -105,19 +106,19 @@ pub fn build_webhook_route(config: Arc, matrix_client: Client) -> anyhow _ => { let project = event.project(); let config_key = project.web_url.replace("http://", "").replace("https://", ""); - if let Some(repo_config) = config.gitlab.repo_configs.get(&config_key) { + if let Some(repo_config) = config.repo_configs.get(&config_key) { if !constant_time_eq(token.as_bytes(), repo_config.token.as_bytes()) { warn!("Invalid token for repo '{}'", config_key); warp::reply::with_status("Invalid token", StatusCode::FORBIDDEN) } else { debug!("payload: {:?}", event); - if let Some(room) = repo_config.room.as_ref().or(config.gitlab.default_room.as_ref()) { + if let Some(room) = &repo_config.room.as_ref().or(config.default_room.as_ref()) { let publish_events = repo_config .publish_events .as_ref() - .or(config.gitlab.default_publish_events.as_ref()); + .or(config.default_publish_events.as_ref()); if publish_events.map(|ecs| event.should_publish(ecs)).unwrap_or(true) { - if let Err(err) = event_tx.send((event, room.clone())).await { + if let Err(err) = event_tx.send((event, (*room).clone())).await { warn!("Failed to enqueue payload: {}", err); } } diff --git a/src/mail_archive.rs b/src/mail_archive.rs new file mode 100644 index 0000000..bf19929 --- /dev/null +++ b/src/mail_archive.rs @@ -0,0 +1,262 @@ +// bebot +// Copyright (C) 2023 Brian Tarricone +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use std::{ + fmt, + io::{BufReader, BufWriter, ErrorKind}, + path::PathBuf, + time::{Duration, SystemTime}, +}; + +use anyhow::Context; +use chrono::{DateTime, Utc}; +use futures::{future::join_all, FutureExt}; +use matrix_sdk::{ + ruma::{events::room::message::RoomMessageEventContent, OwnedRoomOrAliasId}, + Client, +}; +use reqwest::redirect; +use serde::de; +use tokio::{fs::File, task::JoinHandle, time::sleep}; + +use crate::{ + config::{MailArchiveConfig, MailListConfig}, + matrix, +}; + +#[derive(Clone, Copy, Serialize, Deserialize)] +struct ListState { + last_pub_date: DateTime, +} + +#[derive(Debug, Deserialize)] +struct RssPubDate { + #[serde(rename = "$text", deserialize_with = "deser_rfc2616")] + value: DateTime, +} + +#[derive(Debug, Deserialize)] +struct RssItem { + title: String, + link: String, + #[serde(rename = "pubDate")] + pub_date: RssPubDate, +} + +#[derive(Debug, Deserialize)] +struct RssChannel { + #[serde(rename = "item")] + items: Vec, +} + +#[derive(Debug, Deserialize)] +struct MailRss { + channel: RssChannel, +} + +async fn load_list_state(state_file: &PathBuf) -> anyhow::Result { + match File::open(state_file).await { + Err(err) if err.kind() == ErrorKind::NotFound => { + // If we have no state, we probably don't want to blast out events + // for every single item in the RSS feed, so pretend the last time + // we published was right now. + let list_state = ListState { + last_pub_date: SystemTime::now().into(), + }; + save_list_state(list_state, state_file).await?; + Ok(list_state) + } + Err(err) => Err(err)?, + Ok(f) => { + let r = BufReader::new(f.into_std().await); + Ok(tokio::task::spawn_blocking(move || serde_yaml::from_reader(r)).await??) + } + } +} + +async fn save_list_state(list_state: ListState, state_file: &PathBuf) -> anyhow::Result<()> { + let f = File::options() + .write(true) + .truncate(true) + .create(true) + .open(state_file) + .await?; + let w = BufWriter::new(f.into_std().await); + tokio::task::spawn_blocking(move || serde_yaml::to_writer(w, &list_state)).await??; + Ok(()) +} + +async fn handle_list( + list: &MailListConfig, + state_file: &PathBuf, + http_client: &reqwest::Client, + url: &String, + matrix_client: &Client, + room_ids: &[OwnedRoomOrAliasId], +) -> anyhow::Result<()> { + let list_state = load_list_state(state_file).await?; + + let rooms_f = room_ids.iter().map(|room_id| { + matrix::ensure_room_joined(matrix_client, room_id) + .map(move |res| res.with_context(|| format!("Failed to join Matrix room '{}'", room_id))) + }); + let rooms = join_all(rooms_f) + .await + .into_iter() + .flat_map(|room_res| match room_res { + Err(err) => { + warn!("{:#}", err); + vec![] + } + Ok(room) => vec![room], + }) + .collect::>(); + if rooms.is_empty() { + return Err(anyhow!("Failed to join all rooms for list '{}'; skipping", list.name)); + } + + let response = http_client + .get(url) + .send() + .await + .with_context(|| format!("Failed to fetch mail RSS feed from '{}'", url)) + .and_then(|response| { + if !response.status().is_success() { + Err(anyhow!( + "Failed to fetch mail RSS feed from '{}': server returned status {}", + url, + response.status().as_u16() + )) + } else { + Ok(response) + } + })?; + let body = response + .text() + .await + .with_context(|| format!("Failed to decode RSS response body for '{}'", url))?; + let mail_rss = tokio::task::spawn_blocking(move || quick_xml::de::from_str::(&body)) + .await? + .with_context(|| format!("Failed to parse RSS feed for '{}'", url))?; + let items = mail_rss + .channel + .items + .into_iter() + .rev() + .skip_while(|item| item.pub_date.value <= list_state.last_pub_date) + .collect::>(); + + for room in rooms { + for item in &items { + let msg = + RoomMessageEventContent::text_markdown(format!("\\[{}\\] [{}]({}]", list.name, item.title, item.link)); + room.send(msg, None) + .await + .with_context(|| format!("Failed to send message to room '{}'", room.room_id()))?; + save_list_state( + ListState { + last_pub_date: item.pub_date.value, + }, + state_file, + ) + .await?; + } + } + + Ok(()) +} + +pub fn start_polling(config: MailArchiveConfig, matrix_client: Client) -> anyhow::Result>> { + let http_client = reqwest::Client::builder() + .user_agent(format!("{}/{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"))) + .gzip(true) + .redirect(redirect::Policy::default()) + .timeout(Duration::from_secs(8)) + .build()?; + + Ok(config + .lists + .into_iter() + .map(|list| { + let room_ids = if list.rooms.is_empty() { + &config.default_rooms + } else { + &list.rooms + } + .clone(); + let list = list.clone(); + let http_client = http_client.clone(); + let matrix_client = matrix_client.clone(); + let url = format!("https://www.mail-archive.com/{}/maillist.xml", list.name); + let state_file = config.state_dir.join(format!("{}.state", list.name)); + let update_interval = Duration::from_secs(config.update_interval); + + tokio::spawn(async move { + if !room_ids.is_empty() { + loop { + if let Err(err) = + handle_list(&list, &state_file, &http_client, &url, &matrix_client, &room_ids).await + { + warn!("{:#}", err); + } + + sleep(update_interval).await; + } + } + }) + }) + .collect()) +} + +fn deser_rfc2616<'de, D>(deserializer: D) -> Result, D::Error> +where + D: de::Deserializer<'de>, +{ + struct Rfc2616Visitor; + + impl<'de> de::Visitor<'de> for Rfc2616Visitor { + type Value = DateTime; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("an RFC2616-formatted datetime") + } + + fn visit_str(self, v: &str) -> Result + where + E: de::Error, + { + dateparser::parse(v).map_err(E::custom) + } + } + + deserializer.deserialize_any(Rfc2616Visitor) +} + +#[cfg(test)] +mod test { + use std::{fs::File, io::BufReader}; + + use super::MailRss; + + #[test] + pub fn test_feed_deser() -> anyhow::Result<()> { + let f = File::open(format!("{}/test-data/maillist.xml", env!("CARGO_MANIFEST_DIR")))?; + let r = BufReader::new(f); + let mail_rss = quick_xml::de::from_reader::<_, MailRss>(r)?; + println!("{:#?}", mail_rss); + Ok(()) + } +} diff --git a/src/main.rs b/src/main.rs index c540ef4..f304104 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,37 +22,50 @@ extern crate log; extern crate serde; mod config; -mod gitlab; mod gitlab_event; +mod gitlab_webhook; +mod mail_archive; mod matrix; -use std::{env, net::IpAddr, process::exit, sync::Arc}; +use std::{env, net::IpAddr, process::exit}; use anyhow::Context; +use futures::future::join_all; use warp::Filter; async fn run() -> anyhow::Result<()> { let config_path = env::args() .nth(1) .ok_or_else(|| anyhow!("Config file should be passed as only parameter"))?; - let config = Arc::new(config::load(config_path).await?); + let mut config = config::load(config_path).await?; let matrix_client = matrix::connect(&config).await.context("Failed to connect to Matrix")?; - let gitlab = gitlab::build_webhook_route(Arc::clone(&config), matrix_client)?; - let routes = gitlab.with(warp::log("bebot")); + let handles = if let Some(mail_archive) = config.mail_archive.take() { + mail_archive::start_polling(mail_archive, matrix_client.clone())? + } else { + vec![] + }; - let addr = config - .bind_address - .as_ref() - .cloned() - .unwrap_or_else(|| "127.0.0.1".to_string()) - .parse::() - .context("Failed to parse bind_address")?; - let port = config.bind_port.unwrap_or(3000); - warp::serve(routes).run((addr, port)).await; + if let Some(gitlab_webhook) = config.gitlab_webhook.take() { + let gitlab = gitlab_webhook::build_route(gitlab_webhook, matrix_client.clone())?; + let routes = gitlab.with(warp::log("bebot")); - Ok(()) + let addr = config + .bind_address + .as_ref() + .cloned() + .unwrap_or_else(|| "127.0.0.1".to_string()) + .parse::() + .context("Failed to parse bind_address")?; + let port = config.bind_port.unwrap_or(3000); + warp::serve(routes).run((addr, port)).await; + } + + join_all(handles).await; + + error!("No functionality is configured; exiting"); + exit(1); } #[tokio::main] diff --git a/test-data/maillist.xml b/test-data/maillist.xml new file mode 100644 index 0000000..772a856 --- /dev/null +++ b/test-data/maillist.xml @@ -0,0 +1,722 @@ + + + + + xfce-announce + http://www.mail-archive.com/xfce-announce@xfce.org + xfce-announce @ xfce + Wed, 20 Sep 2023 00:05:30 GMT + Wed, 20 Sep 2023 00:05:30 GMT + http://blogs.law.harvard.edu/tech/rss + MHonArc RSS 2.0 RCFile + themailarchive@gmail.com (The Mail Archive) + + The Mail Archive + http://www.mail-archive.com/nanologo.png + http://www.mail-archive.com/xfce-announce@xfce.org + + + + ANNOUNCE: xfce4-notifyd 0.9.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00875.html + <font color=#6f6f6f> 2023/09/20</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Brian Tarricone%22">Brian Tarricone</a> + Wed, 20 Sep 2023 00:05:29 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00875.html + + + ANNOUNCE: xfce4-notifyd 0.9.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00874.html + <font color=#6f6f6f> 2023/09/18</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Brian Tarricone%22">Brian Tarricone</a> + Mon, 18 Sep 2023 21:21:54 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00874.html + + + ANNOUNCE: xfce4-appfinder 4.19.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00873.html + <font color=#6f6f6f> 2023/09/08</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Andre Miranda%22">Andre Miranda</a> + Fri, 08 Sep 2023 21:21:14 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00873.html + + + ANNOUNCE: thunar 4.18.7 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00872.html + <font color=#6f6f6f> 2023/09/01</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Alexander Schwinn%22">Alexander Schwinn</a> + Fri, 01 Sep 2023 22:48:46 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00872.html + + + ANNOUNCE: xfce4-whiskermenu-plugin 2.8.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00871.html + <font color=#6f6f6f> 2023/08/29</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Graeme Gott%22">Graeme Gott</a> + Tue, 29 Aug 2023 14:34:06 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00871.html + + + ANNOUNCE: xfce4-appfinder 4.18.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00870.html + <font color=#6f6f6f> 2023/08/22</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Andre Miranda%22">Andre Miranda</a> + Tue, 22 Aug 2023 19:37:53 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00870.html + + + ANNOUNCE: xfce4-terminal 1.1.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00869.html + <font color=#6f6f6f> 2023/08/22</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 22 Aug 2023 09:33:15 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00869.html + + + ANNOUNCE: catfish 4.18.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00868.html + <font color=#6f6f6f> 2023/08/06</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sun, 06 Aug 2023 09:01:49 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00868.html + + + ANNOUNCE: xfce4-clipman-plugin 1.6.4 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00867.html + <font color=#6f6f6f> 2023/07/31</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 31 Jul 2023 13:56:43 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00867.html + + + ANNOUNCE: xfce4-volumed-pulse 0.2.4 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00866.html + <font color=#6f6f6f> 2023/07/25</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 25 Jul 2023 11:10:24 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00866.html + + + ANNOUNCE: xfce4-cpugraph-plugin 1.2.8 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00865.html + <font color=#6f6f6f> 2023/07/22</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Błażej Szczygieł%22">Błażej Szczygieł</a> + Sat, 22 Jul 2023 20:59:22 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00865.html + + + ANNOUNCE: xfce4-verve-plugin 2.0.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00864.html + <font color=#6f6f6f> 2023/07/15</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sat, 15 Jul 2023 18:29:04 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00864.html + + + ANNOUNCE: xfce4-settings 4.18.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00863.html + <font color=#6f6f6f> 2023/07/04</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 04 Jul 2023 08:10:25 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00863.html + + + ANNOUNCE: xfce4-panel-profiles 1.0.14 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00862.html + <font color=#6f6f6f> 2023/06/05</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 05 Jun 2023 07:06:36 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00862.html + + + ANNOUNCE: xfce4-pulseaudio-plugin 0.4.7 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00861.html + <font color=#6f6f6f> 2023/06/01</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Błażej Szczygieł%22">Błażej Szczygieł</a> + Thu, 01 Jun 2023 11:41:25 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00861.html + + + ANNOUNCE: xfce4-screensaver 4.18.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00860.html + <font color=#6f6f6f> 2023/05/30</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 30 May 2023 08:01:59 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00860.html + + + ANNOUNCE: xfce4-power-manager 4.19.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00859.html + <font color=#6f6f6f> 2023/05/30</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 30 May 2023 07:56:50 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00859.html + + + ANNOUNCE: xfce4-power-manager 4.18.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00858.html + <font color=#6f6f6f> 2023/05/30</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 30 May 2023 07:47:19 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00858.html + + + ANNOUNCE: xfce4-session 4.19.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00857.html + <font color=#6f6f6f> 2023/05/29</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 29 May 2023 16:08:10 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00857.html + + + ANNOUNCE: libxfce4ui 4.19.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00856.html + <font color=#6f6f6f> 2023/05/29</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 29 May 2023 15:56:04 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00856.html + + + ANNOUNCE: xfce4-session 4.18.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00855.html + <font color=#6f6f6f> 2023/05/29</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 29 May 2023 15:49:40 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00855.html + + + ANNOUNCE: xfce4-generic-slider 1.0.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00854.html + <font color=#6f6f6f> 2023/05/26</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Fri, 26 May 2023 17:06:57 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00854.html + + + ANNOUNCE: xfce4-panel 4.18.4 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00853.html + <font color=#6f6f6f> 2023/05/22</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 22 May 2023 17:45:02 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00853.html + + + ANNOUNCE: libxfce4ui 4.18.4 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00852.html + <font color=#6f6f6f> 2023/05/22</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 22 May 2023 17:06:08 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00852.html + + + ANNOUNCE: xfce4-screenshooter 1.10.4 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00851.html + <font color=#6f6f6f> 2023/05/14</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Andre Miranda%22">Andre Miranda</a> + Sun, 14 May 2023 11:31:56 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00851.html + + + ANNOUNCE: ristretto 0.13.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00850.html + <font color=#6f6f6f> 2023/05/13</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sat, 13 May 2023 15:59:23 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00850.html + + + ANNOUNCE: mousepad 0.6.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00849.html + <font color=#6f6f6f> 2023/05/13</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sat, 13 May 2023 15:45:22 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00849.html + + + ANNOUNCE: libxfce4util 4.19.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00848.html + <font color=#6f6f6f> 2023/05/11</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Thu, 11 May 2023 14:14:17 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00848.html + + + ANNOUNCE: libxfce4util 4.19.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00847.html + <font color=#6f6f6f> 2023/05/07</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sun, 07 May 2023 08:39:15 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00847.html + + + ANNOUNCE: xfce4-mixer 4.18.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00846.html + <font color=#6f6f6f> 2023/05/01</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 01 May 2023 18:21:54 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00846.html + + + ANNOUNCE: thunar 4.18.6 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00845.html + <font color=#6f6f6f> 2023/04/30</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Alexander Schwinn%22">Alexander Schwinn</a> + Sun, 30 Apr 2023 09:34:07 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00845.html + + + ANNOUNCE: xfce4-netload-plugin 1.4.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00844.html + <font color=#6f6f6f> 2023/04/29</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sat, 29 Apr 2023 06:28:16 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00844.html + + + ANNOUNCE: xfce4-mpc-plugin 0.5.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00843.html + <font color=#6f6f6f> 2023/04/29</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sat, 29 Apr 2023 06:24:59 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00843.html + + + ANNOUNCE: xfce4-mixer 4.18.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00842.html + <font color=#6f6f6f> 2023/04/29</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sat, 29 Apr 2023 06:16:57 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00842.html + + + ANNOUNCE: thunar 4.18.5 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00841.html + <font color=#6f6f6f> 2023/04/28</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Alexander Schwinn%22">Alexander Schwinn</a> + Fri, 28 Apr 2023 20:50:14 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00841.html + + + ANNOUNCE: xfce4-whiskermenu-plugin 2.7.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00840.html + <font color=#6f6f6f> 2023/04/26</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Graeme Gott%22">Graeme Gott</a> + Wed, 26 Apr 2023 11:25:21 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00840.html + + + ANNOUNCE: xfce4-dict 0.8.5 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00839.html + <font color=#6f6f6f> 2023/04/22</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sat, 22 Apr 2023 14:59:42 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00839.html + + + ANNOUNCE: xfmpc 0.3.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00838.html + <font color=#6f6f6f> 2023/04/22</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sat, 22 Apr 2023 14:54:03 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00838.html + + + ANNOUNCE: xfce4-weather-plugin 0.11.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00837.html + <font color=#6f6f6f> 2023/04/21</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Fri, 21 Apr 2023 18:51:58 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00837.html + + + ANNOUNCE: xfce4-time-out-plugin 1.1.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00836.html + <font color=#6f6f6f> 2023/04/21</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Fri, 21 Apr 2023 17:27:47 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00836.html + + + ANNOUNCE: xfce4-indicator-plugin 2.4.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00835.html + <font color=#6f6f6f> 2023/04/21</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Fri, 21 Apr 2023 09:51:53 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00835.html + + + ANNOUNCE: xfce4-mount-plugin 1.1.6 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00834.html + <font color=#6f6f6f> 2023/04/20</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Thu, 20 Apr 2023 21:19:57 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00834.html + + + ANNOUNCE: libxfce4ui 4.19.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00833.html + <font color=#6f6f6f> 2023/04/20</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Thu, 20 Apr 2023 20:17:14 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00833.html + + + ANNOUNCE: xfce4-mailwatch-plugin 1.3.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00832.html + <font color=#6f6f6f> 2023/04/20</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Thu, 20 Apr 2023 18:43:40 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00832.html + + + ANNOUNCE: xfce4-fsguard-plugin 1.1.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00831.html + <font color=#6f6f6f> 2023/04/19</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Wed, 19 Apr 2023 17:30:01 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00831.html + + + ANNOUNCE: xfce4-calculator-plugin 0.7.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00830.html + <font color=#6f6f6f> 2023/04/19</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Wed, 19 Apr 2023 17:23:59 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00830.html + + + ANNOUNCE: xfce4-battery-plugin 1.1.5 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00829.html + <font color=#6f6f6f> 2023/04/19</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Wed, 19 Apr 2023 16:55:39 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00829.html + + + ANNOUNCE: xfce4-appfinder 4.19.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00828.html + <font color=#6f6f6f> 2023/04/19</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Andre Miranda%22">Andre Miranda</a> + Wed, 19 Apr 2023 16:34:38 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00828.html + + + ANNOUNCE: xfce4-timer-plugin 1.7.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00827.html + <font color=#6f6f6f> 2023/04/18</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 18 Apr 2023 16:03:44 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00827.html + + + ANNOUNCE: xfce4-power-manager 4.19.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00826.html + <font color=#6f6f6f> 2023/04/18</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 18 Apr 2023 15:08:59 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00826.html + + + ANNOUNCE: xfce4-session 4.19.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00825.html + <font color=#6f6f6f> 2023/04/18</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 18 Apr 2023 14:52:59 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00825.html + + + ANNOUNCE: xfce4-settings 4.19.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00824.html + <font color=#6f6f6f> 2023/04/18</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 18 Apr 2023 11:30:02 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00824.html + + + ANNOUNCE: garcon 4.19.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00823.html + <font color=#6f6f6f> 2023/04/18</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 18 Apr 2023 11:18:13 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00823.html + + + ANNOUNCE: libxfce4ui 4.19.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00822.html + <font color=#6f6f6f> 2023/04/17</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 17 Apr 2023 14:22:29 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00822.html + + + ANNOUNCE: libxfce4util 4.19.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00821.html + <font color=#6f6f6f> 2023/04/17</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 17 Apr 2023 11:25:12 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00821.html + + + ANNOUNCE: tumbler 4.19.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00820.html + <font color=#6f6f6f> 2023/04/17</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 17 Apr 2023 11:10:57 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00820.html + + + ANNOUNCE: xfconf 4.19.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00819.html + <font color=#6f6f6f> 2023/04/17</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 17 Apr 2023 11:06:03 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00819.html + + + ANNOUNCE: tumbler 4.18.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00818.html + <font color=#6f6f6f> 2023/04/17</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 17 Apr 2023 10:56:58 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00818.html + + + ANNOUNCE: xfconf 4.18.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00817.html + <font color=#6f6f6f> 2023/04/17</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 17 Apr 2023 10:38:46 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00817.html + + + ANNOUNCE: xfce4-genmon-plugin 4.2.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00816.html + <font color=#6f6f6f> 2023/04/16</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Tony Paulic%22">Tony Paulic</a> + Sun, 16 Apr 2023 23:34:56 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00816.html + + + ANNOUNCE: xfdesktop 4.19.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00815.html + <font color=#6f6f6f> 2023/04/14</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Brian Tarricone%22">Brian Tarricone</a> + Fri, 14 Apr 2023 22:55:25 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00815.html + + + ANNOUNCE: thunar-archive-plugin 0.5.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00814.html + <font color=#6f6f6f> 2023/03/31</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Alexander Schwinn%22">Alexander Schwinn</a> + Fri, 31 Mar 2023 21:18:14 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00814.html + + + ANNOUNCE: xfce4-panel 4.19.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00813.html + <font color=#6f6f6f> 2023/03/28</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 28 Mar 2023 19:08:27 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00813.html + + + ANNOUNCE: xfce4-pulseaudio-plugin 0.4.6 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00812.html + <font color=#6f6f6f> 2023/03/28</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 28 Mar 2023 19:05:50 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00812.html + + + ANNOUNCE: xfce4-panel 4.18.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00811.html + <font color=#6f6f6f> 2023/03/28</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 28 Mar 2023 17:57:50 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00811.html + + + ANNOUNCE: garcon 4.18.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00810.html + <font color=#6f6f6f> 2023/03/28</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 28 Mar 2023 17:41:11 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00810.html + + + ANNOUNCE: libxfce4ui 4.18.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00809.html + <font color=#6f6f6f> 2023/03/28</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 28 Mar 2023 17:21:43 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00809.html + + + ANNOUNCE: xfce4-session 4.18.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00808.html + <font color=#6f6f6f> 2023/03/28</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 28 Mar 2023 17:13:19 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00808.html + + + ANNOUNCE: xfce4-screensaver 4.18.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00807.html + <font color=#6f6f6f> 2023/03/26</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sun, 26 Mar 2023 20:36:45 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00807.html + + + Re: ANNOUNCE: xfce4-docklike-plugin 0.4.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00806.html + <font color=#6f6f6f> 2023/03/21</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Luna Jernberg%22">Luna Jernberg</a> + Tue, 21 Mar 2023 07:53:23 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00806.html + + + ANNOUNCE: xfce4-clipman-plugin 1.6.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00805.html + <font color=#6f6f6f> 2023/03/20</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Mon, 20 Mar 2023 20:07:46 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00805.html + + + ANNOUNCE: xfce4-docklike-plugin 0.4.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00804.html + <font color=#6f6f6f> 2023/03/19</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sun, 19 Mar 2023 16:41:45 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00804.html + + + ANNOUNCE: xfce4-screensaver 4.18.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00803.html + <font color=#6f6f6f> 2023/03/18</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sat, 18 Mar 2023 10:47:52 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00803.html + + + ANNOUNCE: xfce4-notes-plugin 1.10.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00802.html + <font color=#6f6f6f> 2023/03/18</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sat, 18 Mar 2023 10:12:20 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00802.html + + + ANNOUNCE: xfce4-dev-tools 4.19.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00801.html + <font color=#6f6f6f> 2023/03/05</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Brian Tarricone%22">Brian Tarricone</a> + Sun, 05 Mar 2023 08:52:26 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00801.html + + + ANNOUNCE: xfburn 0.7.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00800.html + <font color=#6f6f6f> 2023/03/04</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Hunter Turcin%22">Hunter Turcin</a> + Sat, 04 Mar 2023 07:40:15 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00800.html + + + ANNOUNCE: xfce4-notifyd 0.8.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00799.html + <font color=#6f6f6f> 2023/02/28</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Brian Tarricone%22">Brian Tarricone</a> + Tue, 28 Feb 2023 06:39:12 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00799.html + + + ANNOUNCE: thunar 4.18.4 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00798.html + <font color=#6f6f6f> 2023/02/22</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Alexander Schwinn%22">Alexander Schwinn</a> + Wed, 22 Feb 2023 21:57:16 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00798.html + + + ANNOUNCE: parole 4.18.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00797.html + <font color=#6f6f6f> 2023/02/18</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sat, 18 Feb 2023 19:39:06 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00797.html + + + ANNOUNCE: xfce4-notifyd 0.8.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00796.html + <font color=#6f6f6f> 2023/02/17</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Brian Tarricone%22">Brian Tarricone</a> + Fri, 17 Feb 2023 03:26:47 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00796.html + + + ANNOUNCE: xfce4-settings 4.18.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00795.html + <font color=#6f6f6f> 2023/02/11</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Sat, 11 Feb 2023 09:36:19 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00795.html + + + ANNOUNCE: xfce4-notifyd 0.8.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00794.html + <font color=#6f6f6f> 2023/02/11</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Brian Tarricone%22">Brian Tarricone</a> + Sat, 11 Feb 2023 07:51:19 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00794.html + + + ANNOUNCE: xfce4-power-manager 4.18.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00793.html + <font color=#6f6f6f> 2023/02/10</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Fri, 10 Feb 2023 10:23:06 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00793.html + + + ANNOUNCE: xfce4-session 4.18.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00792.html + <font color=#6f6f6f> 2023/02/10</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Fri, 10 Feb 2023 10:14:48 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00792.html + + + ANNOUNCE: ristretto 0.13.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00791.html + <font color=#6f6f6f> 2023/02/09</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Thu, 09 Feb 2023 17:41:13 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00791.html + + + ANNOUNCE: mousepad 0.6.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00790.html + <font color=#6f6f6f> 2023/02/09</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Thu, 09 Feb 2023 17:21:04 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00790.html + + + ANNOUNCE: xfce4-panel 4.18.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00789.html + <font color=#6f6f6f> 2023/02/09</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Thu, 09 Feb 2023 17:01:36 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00789.html + + + ANNOUNCE: libxfce4ui 4.18.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00788.html + <font color=#6f6f6f> 2023/02/09</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Thu, 09 Feb 2023 11:06:57 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00788.html + + + ANNOUNCE: orage 4.18.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00787.html + <font color=#6f6f6f> 2023/02/08</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Wed, 08 Feb 2023 16:21:58 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00787.html + + + ANNOUNCE: thunar-media-tags-plugin 0.4.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00786.html + <font color=#6f6f6f> 2023/02/06</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Alexander Schwinn%22">Alexander Schwinn</a> + Mon, 06 Feb 2023 16:10:00 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00786.html + + + ANNOUNCE: xfce4-notifyd 0.7.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00785.html + <font color=#6f6f6f> 2023/02/02</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Brian Tarricone%22">Brian Tarricone</a> + Thu, 02 Feb 2023 03:07:52 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00785.html + + + ANNOUNCE: xfce4-notifyd 0.7.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00784.html + <font color=#6f6f6f> 2023/01/22</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Brian Tarricone%22">Brian Tarricone</a> + Sun, 22 Jan 2023 08:59:46 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00784.html + + + ANNOUNCE: xfdesktop 4.18.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00783.html + <font color=#6f6f6f> 2023/01/21</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Brian Tarricone%22">Brian Tarricone</a> + Sat, 21 Jan 2023 12:04:24 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00783.html + + + ANNOUNCE: xfce4-notifyd 0.7.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00782.html + <font color=#6f6f6f> 2023/01/21</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Brian Tarricone%22">Brian Tarricone</a> + Sat, 21 Jan 2023 11:50:36 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00782.html + + + ANNOUNCE: xfce4-notifyd 0.7.0 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00781.html + <font color=#6f6f6f> 2023/01/21</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Brian Tarricone%22">Brian Tarricone</a> + Sat, 21 Jan 2023 11:26:06 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00781.html + + + ANNOUNCE: thunar 4.18.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00780.html + <font color=#6f6f6f> 2023/01/20</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Alexander Schwinn%22">Alexander Schwinn</a> + Fri, 20 Jan 2023 22:43:03 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00780.html + + + ANNOUNCE: xfce4-whiskermenu-plugin 2.7.2 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00779.html + <font color=#6f6f6f> 2023/01/17</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Graeme Gott%22">Graeme Gott</a> + Tue, 17 Jan 2023 18:24:47 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00779.html + + + ANNOUNCE: xfce4-datetime-plugin 0.8.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00778.html + <font color=#6f6f6f> 2023/01/16</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Andre Miranda%22">Andre Miranda</a> + Mon, 16 Jan 2023 21:21:48 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00778.html + + + ANNOUNCE: xfce4-screenshooter 1.10.3 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00777.html + <font color=#6f6f6f> 2023/01/12</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Andre Miranda%22">Andre Miranda</a> + Thu, 12 Jan 2023 23:19:39 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00777.html + + + ANNOUNCE: xfce4-panel 4.18.1 released + http://www.mail-archive.com/xfce-announce@xfce.org/msg00776.html + <font color=#6f6f6f> 2023/01/10</font> -- <a href="http://www.mail-archive.com/search?l=xfce-announce@xfce.org&q=from:%22Gaël Bonithon%22">Gaël Bonithon</a> + Tue, 10 Jan 2023 21:04:35 GMT + http://www.mail-archive.com/xfce-announce@xfce.org/msg00776.html + + + + + \ No newline at end of file