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