Initial commit
This commit is contained in:
commit
50ea5ee632
5 changed files with 2374 additions and 0 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
/target
|
||||
.idea
|
||||
config.toml
|
2230
Cargo.lock
generated
Normal file
2230
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
20
Cargo.toml
Normal file
20
Cargo.toml
Normal file
|
@ -0,0 +1,20 @@
|
|||
[package]
|
||||
name = "momb-notifier-rs"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0"
|
||||
figment = {version = "0.10", features = ["toml"]}
|
||||
bytes = "1"
|
||||
prost = "0.13"
|
||||
tokio = { version = "1.38", features = ["full"] }
|
||||
tokio-stream = "0.1"
|
||||
tokio-util = { version = "0.7", features = ["codec"] }
|
||||
tokio-rustls = { version = "0.26" }
|
||||
webpki-roots = "0.26"
|
||||
rustls-pki-types = { version = "1.7.0" , features = ["alloc", "std"]}
|
||||
futures = "0.3.30"
|
||||
mumble-rs = { path = "/home/dhalucario/workspace/mumble-rs" }
|
||||
teloxide = { version = "0.13", features = ["macros"] }
|
||||
serde = { version = "1.0", features = ["derive"] }
|
20
src/config.rs
Normal file
20
src/config.rs
Normal file
|
@ -0,0 +1,20 @@
|
|||
use serde::{Serialize, Deserialize};
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct MumbleConfig {
|
||||
pub host: String,
|
||||
pub username: String,
|
||||
pub channel_id: u32
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct TelegramConfig {
|
||||
pub token: String,
|
||||
pub chat_id: i64
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct Config {
|
||||
pub mumble: MumbleConfig,
|
||||
pub telegram: TelegramConfig
|
||||
}
|
101
src/main.rs
Normal file
101
src/main.rs
Normal file
|
@ -0,0 +1,101 @@
|
|||
mod config;
|
||||
|
||||
use std::sync::Arc;
|
||||
use std::time::{Duration, SystemTime};
|
||||
use figment::{Figment, providers::{Toml, Format}};
|
||||
use futures::{SinkExt, StreamExt};
|
||||
use mumble_rs::{MumbleClient, MumbleMessage};
|
||||
use mumble_rs::proto::Ping;
|
||||
use tokio::task::JoinHandle;
|
||||
use teloxide::prelude::*;
|
||||
use tokio::sync::Mutex;
|
||||
use crate::config::Config;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> anyhow::Result<()> {
|
||||
let config: Config = Figment::new()
|
||||
.merge(Toml::file("config.toml"))
|
||||
.extract()?;
|
||||
|
||||
let joined_users = Arc::new(Mutex::new(Vec::new()));
|
||||
let telegram_bot = Arc::new(Mutex::new(Bot::new(config.telegram.token)));
|
||||
let mut client = MumbleClient::new(config.mumble.host, None, config.mumble.username, None);
|
||||
let (mut mumble_send, mut mumble_recv) = client.connect().await?.split();
|
||||
let mut server_synced = false;
|
||||
let (conn_send_channel_send, mut conn_send_channel_recv) = tokio::sync::mpsc::channel::<MumbleMessage>(10);
|
||||
|
||||
/*
|
||||
let udp_connection = client.create_udp_connection().await?;
|
||||
let _: JoinHandle<anyhow::Result<()>> = tokio::spawn(async move {
|
||||
loop {
|
||||
let mut _data: [u8; 1024] = [0; 1024];
|
||||
let len = udp_connection.recv(&mut _data).await?;
|
||||
println!("UDP Data: {len}");
|
||||
}
|
||||
Ok(())
|
||||
});*/
|
||||
|
||||
let _: JoinHandle<anyhow::Result<()>> = tokio::spawn(async move {
|
||||
while !conn_send_channel_send.is_closed() {
|
||||
conn_send_channel_send.send(MumbleMessage::Ping {data: Ping {
|
||||
good: None,
|
||||
late: None,
|
||||
lost: None,
|
||||
resync: None,
|
||||
tcp_packets: None,
|
||||
tcp_ping_avg: None,
|
||||
tcp_ping_var: None,
|
||||
timestamp: Some(SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)?.as_secs()),
|
||||
udp_packets: None,
|
||||
udp_ping_avg: None,
|
||||
udp_ping_var: None
|
||||
}}).await?;
|
||||
tokio::time::sleep(Duration::from_secs(10)).await;
|
||||
}
|
||||
Ok(())
|
||||
});
|
||||
|
||||
let _: JoinHandle<anyhow::Result<()>> = tokio::spawn(async move {
|
||||
while let Some(message) = conn_send_channel_recv.recv().await {
|
||||
mumble_send.send(message).await?;
|
||||
}
|
||||
Ok(())
|
||||
});
|
||||
|
||||
while let Some(frame_result) = mumble_recv.next().await {
|
||||
if let Ok(message) = frame_result {
|
||||
match message {
|
||||
MumbleMessage::UserState {data} => {
|
||||
if !server_synced { continue }
|
||||
if let (Some(mumble_user_id), Some(name)) = (data.user_id, data.name) {
|
||||
let message;
|
||||
{
|
||||
let telegram_bot = telegram_bot.lock().await;
|
||||
let mut joined_users = joined_users.lock().await;
|
||||
message = telegram_bot.send_message(ChatId(config.telegram.chat_id), format!("A momber just joined: {name}")).await?;
|
||||
joined_users.push(mumble_user_id);
|
||||
}
|
||||
|
||||
let telegram_bot = telegram_bot.clone();
|
||||
let joined_users = joined_users.clone();
|
||||
let _: JoinHandle<anyhow::Result<()>> = tokio::spawn(async move {
|
||||
tokio::time::sleep(Duration::from_secs(60*60)).await;
|
||||
{
|
||||
let telegram_bot = telegram_bot.lock().await;
|
||||
let mut joined_users = joined_users.lock().await;
|
||||
joined_users.retain(|user| user != &mumble_user_id);
|
||||
telegram_bot.delete_message(message.chat.id, message.id).await?;
|
||||
}
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
}
|
||||
MumbleMessage::ServerSync { data: _ } => {
|
||||
server_synced = true;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in a new issue