Initial commit
This commit is contained in:
commit
92cedda692
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/target
|
||||||
|
result
|
||||||
|
|
||||||
|
|
||||||
|
# Added by cargo
|
||||||
|
#
|
||||||
|
# already existing elements were commented out
|
||||||
|
|
||||||
|
#/target
|
1282
Cargo.lock
generated
Normal file
1282
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
12
Cargo.toml
Normal file
12
Cargo.toml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[package]
|
||||||
|
name = "lightcontroll-discord"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
pipewire = "0.6.0"
|
||||||
|
libspa = "0.6.0"
|
||||||
|
regex = "1.7.1"
|
||||||
|
reqwest = { version = "0.11", features = ["blocking", "json"] }
|
81
flake.lock
Normal file
81
flake.lock
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681202837,
|
||||||
|
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1683741689,
|
||||||
|
"narHash": "sha256-VY6gjqAFQe0Xyz+olc979zbsW9dC4VG+mINGffFKVEw=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "f431ee4a85cb985075b4ed27596913e8087f4264",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"rust-overlay": "rust-overlay"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rust-overlay": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1683708507,
|
||||||
|
"narHash": "sha256-i5zgWcuyZcNBnlrzVjhpAFQdJWr4OyhvQ1owAEHFFKw=",
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"rev": "ed55dc022aa23ed3c42f383cf1782290b3b939d5",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
59
flake.nix
Normal file
59
flake.nix
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
{
|
||||||
|
description = "monitors discord to controll lights";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs";
|
||||||
|
rust-overlay.url = "github:oxalica/rust-overlay";
|
||||||
|
rust-overlay.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, rust-overlay }:
|
||||||
|
let
|
||||||
|
# Systems supported
|
||||||
|
allSystems = [
|
||||||
|
"x86_64-linux" # 64-bit Intel/AMD Linux
|
||||||
|
"aarch64-linux" # 64-bit ARM Linux
|
||||||
|
"x86_64-darwin" # 64-bit Intel macOS
|
||||||
|
"aarch64-darwin" # 64-bit ARM macOS
|
||||||
|
];
|
||||||
|
|
||||||
|
# Helper to provide system-specific attributes
|
||||||
|
forAllSystems = f: nixpkgs.lib.genAttrs allSystems (system: f {
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
});
|
||||||
|
in
|
||||||
|
{
|
||||||
|
packages = forAllSystems ({ pkgs }: {
|
||||||
|
default = let
|
||||||
|
stdenv = pkgs.stdenv;
|
||||||
|
lib = pkgs.lib;
|
||||||
|
in
|
||||||
|
pkgs.rustPlatform.buildRustPackage {
|
||||||
|
pname = "lightcontroll-discord";
|
||||||
|
version = "0.1";
|
||||||
|
src = ./.;
|
||||||
|
LIBCLANG_PATH="${pkgs.llvmPackages.libclang.lib}/lib";
|
||||||
|
# doCheck = false;
|
||||||
|
# RUST_BACKTRACE=1;
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
pipewire
|
||||||
|
libspatialaudio
|
||||||
|
openssl
|
||||||
|
];
|
||||||
|
nativeBuildInputs = with pkgs; [
|
||||||
|
pkg-config
|
||||||
|
clang
|
||||||
|
llvmPackages.libclang
|
||||||
|
];
|
||||||
|
cargoLock = {
|
||||||
|
lockFile = ./Cargo.lock;
|
||||||
|
};
|
||||||
|
#installPhase = ''
|
||||||
|
# mkdir -p $out/bin
|
||||||
|
# #cp ./target/release/pipewire-autoconnect $out/bin
|
||||||
|
#'';
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
82
src/main.rs
Normal file
82
src/main.rs
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
use std::{rc::Rc, sync::{Mutex, Arc}};
|
||||||
|
|
||||||
|
use libspa::ReadableDict;
|
||||||
|
use pipewire::{MainLoop, Context};
|
||||||
|
use regex::Regex;
|
||||||
|
|
||||||
|
|
||||||
|
fn deal_with_node(
|
||||||
|
port: &pipewire::registry::GlobalObject<libspa::ForeignDict>,
|
||||||
|
ids: AVec
|
||||||
|
) {
|
||||||
|
|
||||||
|
let re = Regex::new(r"WEBRTC VoiceEngine").unwrap();
|
||||||
|
|
||||||
|
if let Some(props) = &port.props {
|
||||||
|
if let (Some(alias), Some(id)) = (props.get("port.alias"), props.get("node.id")) {
|
||||||
|
if re.is_match(alias) {
|
||||||
|
let mut a = ids.lock().ok().unwrap();
|
||||||
|
a.push(id.to_string().parse::<u32>().unwrap());
|
||||||
|
drop(a);
|
||||||
|
change(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type AVec = Arc<Mutex<Vec<u32>>>;
|
||||||
|
|
||||||
|
fn deal_remove_node(
|
||||||
|
id: u32,
|
||||||
|
ids: AVec
|
||||||
|
) {
|
||||||
|
|
||||||
|
if ids.lock().ok().unwrap().len() == 0 {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let ids_clone_c = ids.lock().ok().unwrap().clone();
|
||||||
|
let idsa: Vec<u32> = ids_clone_c.into_iter().filter(|&f| f != id).collect::<Vec<u32>>();
|
||||||
|
|
||||||
|
if idsa.len() == 0 {
|
||||||
|
change(false);
|
||||||
|
}
|
||||||
|
let mut ids_clone = ids.lock().ok().unwrap();
|
||||||
|
*ids_clone = idsa;
|
||||||
|
drop(ids_clone);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn change(on: bool) {
|
||||||
|
println!("change status {}", on);
|
||||||
|
if on {
|
||||||
|
let _resp = reqwest::blocking::get("http://aether:3000/start/stop");
|
||||||
|
} else {
|
||||||
|
let _resp = reqwest::blocking::get("http://aether:3000/stop/stop");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
println!("Hello, world!");
|
||||||
|
|
||||||
|
let main_loop = MainLoop::new()?;
|
||||||
|
let context = Context::new(&main_loop)?;
|
||||||
|
let core = Rc::new(context.connect(None)?);
|
||||||
|
|
||||||
|
let ids: AVec = Arc::new(Mutex::new(Vec::new()));
|
||||||
|
let cpy = ids.clone();
|
||||||
|
let registry = core.get_registry()?;
|
||||||
|
|
||||||
|
let _listener = registry
|
||||||
|
.add_listener_local()
|
||||||
|
.global(move |global| match global.type_ {
|
||||||
|
pipewire::types::ObjectType::Port => deal_with_node(global, cpy.clone()),
|
||||||
|
_ => ()
|
||||||
|
})
|
||||||
|
.global_remove(move |id| deal_remove_node(id, ids.clone()))
|
||||||
|
.register();
|
||||||
|
|
||||||
|
main_loop.run();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user