feat: discord rpc setting is working, just updates are left

This commit is contained in:
Virt 2025-07-16 03:07:23 +02:00
commit 9c9287c5ff
9 changed files with 1481 additions and 2 deletions

1
.gitignore vendored
View file

@ -1 +1,2 @@
/target /target
.zed

828
Cargo.lock generated Normal file
View file

@ -0,0 +1,828 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "addr2line"
version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
dependencies = [
"gimli",
]
[[package]]
name = "adler2"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "ahash"
version = "0.8.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
dependencies = [
"cfg-if",
"once_cell",
"serde",
"version_check",
"zerocopy",
]
[[package]]
name = "aho-corasick"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]]
name = "anstream"
version = "0.6.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
"is_terminal_polyfill",
"utf8parse",
]
[[package]]
name = "anstyle"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd"
[[package]]
name = "anstyle-parse"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9"
dependencies = [
"windows-sys 0.59.0",
]
[[package]]
name = "anstyle-wincon"
version = "3.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882"
dependencies = [
"anstyle",
"once_cell_polyfill",
"windows-sys 0.59.0",
]
[[package]]
name = "anyhow"
version = "1.0.98"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
[[package]]
name = "async-stream"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476"
dependencies = [
"async-stream-impl",
"futures-core",
"pin-project-lite",
]
[[package]]
name = "async-stream-impl"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "autocfg"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "backtrace"
version = "0.3.75"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002"
dependencies = [
"addr2line",
"cfg-if",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
"windows-targets",
]
[[package]]
name = "bitflags"
version = "2.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
[[package]]
name = "bytes"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
[[package]]
name = "cfg-if"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
[[package]]
name = "colorchoice"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
[[package]]
name = "derive_more"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05"
dependencies = [
"derive_more-impl",
]
[[package]]
name = "derive_more-impl"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22"
dependencies = [
"proc-macro2",
"quote",
"syn",
"unicode-xid",
]
[[package]]
name = "discord-rich-presence"
version = "0.2.5"
source = "git+https://github.com/vionya/discord-rich-presence#9c6cabe04a70cfcc822affd1bf8be51321f8a821"
dependencies = [
"log",
"serde",
"serde_derive",
"serde_json",
"serde_repr",
"thiserror",
"uuid",
]
[[package]]
name = "either"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]]
name = "env_filter"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0"
dependencies = [
"log",
"regex",
]
[[package]]
name = "env_logger"
version = "0.11.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f"
dependencies = [
"anstream",
"anstyle",
"env_filter",
"jiff",
"log",
]
[[package]]
name = "futures-core"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
[[package]]
name = "futures-lite"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532"
dependencies = [
"futures-core",
"pin-project-lite",
]
[[package]]
name = "getrandom"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]]
name = "gimli"
version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
[[package]]
name = "hl-zed-dc-rpc"
version = "0.1.0"
dependencies = [
"anyhow",
"discord-rich-presence",
"env_logger",
"hyprland",
"log",
"regex",
"serde_json",
]
[[package]]
name = "hyprland"
version = "0.4.0-beta.2"
source = "git+https://github.com/hyprland-community/hyprland-rs#fce63060619422f52563514b474398e380e5fc51"
dependencies = [
"ahash",
"async-stream",
"derive_more",
"either",
"futures-lite",
"hyprland-macros",
"num-traits",
"once_cell",
"paste",
"phf",
"serde",
"serde_json",
"serde_repr",
"tokio",
]
[[package]]
name = "hyprland-macros"
version = "0.4.0-beta.2"
source = "git+https://github.com/hyprland-community/hyprland-rs#fce63060619422f52563514b474398e380e5fc51"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "io-uring"
version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013"
dependencies = [
"bitflags",
"cfg-if",
"libc",
]
[[package]]
name = "is_terminal_polyfill"
version = "1.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
[[package]]
name = "itoa"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]]
name = "jiff"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49"
dependencies = [
"jiff-static",
"log",
"portable-atomic",
"portable-atomic-util",
"serde",
]
[[package]]
name = "jiff-static"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "libc"
version = "0.2.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
[[package]]
name = "log"
version = "0.4.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
name = "memchr"
version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "miniz_oxide"
version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
dependencies = [
"adler2",
]
[[package]]
name = "mio"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
dependencies = [
"libc",
"wasi",
"windows-sys 0.59.0",
]
[[package]]
name = "num-traits"
version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
]
[[package]]
name = "object"
version = "0.36.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "once_cell_polyfill"
version = "1.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
[[package]]
name = "paste"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "phf"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
dependencies = [
"phf_macros",
"phf_shared",
]
[[package]]
name = "phf_generator"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
dependencies = [
"phf_shared",
"rand",
]
[[package]]
name = "phf_macros"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216"
dependencies = [
"phf_generator",
"phf_shared",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "phf_shared"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
dependencies = [
"siphasher",
]
[[package]]
name = "pin-project-lite"
version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
[[package]]
name = "portable-atomic"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
[[package]]
name = "portable-atomic-util"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507"
dependencies = [
"portable-atomic",
]
[[package]]
name = "proc-macro2"
version = "1.0.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
[[package]]
name = "regex"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "rustc-demangle"
version = "0.1.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f"
[[package]]
name = "ryu"
version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]]
name = "serde"
version = "1.0.219"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.219"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.140"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
dependencies = [
"itoa",
"memchr",
"ryu",
"serde",
]
[[package]]
name = "serde_repr"
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "siphasher"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
[[package]]
name = "slab"
version = "0.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d"
[[package]]
name = "socket2"
version = "0.5.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678"
dependencies = [
"libc",
"windows-sys 0.52.0",
]
[[package]]
name = "syn"
version = "2.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "thiserror"
version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tokio"
version = "1.46.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17"
dependencies = [
"backtrace",
"bytes",
"io-uring",
"libc",
"mio",
"pin-project-lite",
"slab",
"socket2",
"tokio-macros",
"windows-sys 0.52.0",
]
[[package]]
name = "tokio-macros"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "unicode-ident"
version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
[[package]]
name = "unicode-xid"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
[[package]]
name = "utf8parse"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
dependencies = [
"getrandom",
]
[[package]]
name = "version_check"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "wasi"
version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
name = "windows-sys"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
"windows-targets",
]
[[package]]
name = "windows-sys"
version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
"windows-targets",
]
[[package]]
name = "windows-targets"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_gnullvm",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "zerocopy"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
dependencies = [
"proc-macro2",
"quote",
"syn",
]

View file

@ -4,3 +4,10 @@ version = "0.1.0"
edition = "2024" edition = "2024"
[dependencies] [dependencies]
anyhow = "1.0.98"
discord-rich-presence = { git = "https://github.com/vionya/discord-rich-presence" } # git cause errors
env_logger = "0.11.8"
hyprland = { git = "https://github.com/hyprland-community/hyprland-rs" }
log = "0.4.27"
regex = "1.11.1"
serde_json = "1.0.140"

23
assets/LICENSE Normal file
View file

@ -0,0 +1,23 @@
MIT License
Copyright (c) 2020-2022 iCrawl
Copyright (c) 2020-2022 Satoqz
Copyright (c) 2020-2023 Narcis B.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

410
assets/languages.json Normal file
View file

@ -0,0 +1,410 @@
{
"nodemon.json": "nodemon",
"package.json": "npm",
"turbo.json": "turbo",
"regex:(vercel|now)\\.json": "vercel",
"regex:\\.prettier((rc)|(\\.(toml|yml|yaml|json|js))?)$": "prettier",
"regex:\\.eslint((rc|ignore)|(\\.(json|js))?)$": "eslint",
"regex:\\.(now|vercel)ignore$": "vercel",
"regex:prettier\\.config\\.js$": "prettier",
"regex:vue\\.config\\.(js|ts)$": "vueconfig",
"regex:vite\\.config\\.(js|ts)$": "viteconfig",
"regex:vitest\\.config\\.(js|ts|mjs)$": "vitestconfig",
"regex:jest\\.config\\.(js|ts)$": "jest",
"regex:tailwind\\.config\\.(js|cjs|mjs|ts|cts|mts)$": "tailwind",
"regex:gatsby-(browser|node|ssr|config)\\.js$": "gatsbyjs",
"regex:webpack(\\.dev|\\.development|\\.prod|\\.production)?\\.config(\\.babel)?\\.(js|jsx|coffee|ts|json|json5|yaml|yml)$": "webpack",
"babel.config.js": "babel",
".ahk": "ahk",
".ahkl": "ahk",
".astro": "astro",
".astro.config.mjs": "astroconfig",
"androidmanifest.xml": "android",
".bp": "android",
"regex:^angular[^.]*\\.js$": "angular",
".ng": "angular",
".applescript": "applescript",
"regex:(\\.)?appveyor\\.yml$": "appveyor",
".ino": "arduino",
".swf": "as",
".as": "as",
".jsfl": "as",
".swc": "as",
".asp": "asp",
".asax": "asp",
".ascx": "asp",
".ashx": "asp",
".asmx": "asp",
".aspx": "asp",
".axd": "asp",
"regex:\\.(l?a|[ls]?o|out|s|a51|asm|axf|elf|prx|puff|z80)$": "assembly",
".agc": "assembly",
".ko": "assembly",
".kv": "kivy",
".ks": "kag-script",
".tjs": "kirikiri-tpv-javascript",
".lst": "assembly",
"regex:\\.((c([+px]{2}?)?-?)?objdump|bsdiff|bin|dat|pak|pdb)$": "assembly",
".d-objdump": "assembly",
"regex:\\.gcode|\\.gco$": "assembly",
"regex:\\.rpy[bc]$": "assembly",
"regex:\\.py[co]$": "assembly",
".swp": "assembly",
".DS_Store": "assembly",
".au3": "autoit",
"regex:\\.babelrc$": "babel",
".bat": "bat",
".batch": "bat",
".cmd": "bat",
"regex:\\.(exe|com|msi)$": "bat",
".reg": "bat",
"regex:^(BUILD|WORKSPACE|\\.bzl|\\.bazel(rc)?|\\.s(tar|ky))$": "bazel",
"regex:^(\\.bowerrc|bower\\.json|Bowerfile)$": "bower",
"regex:\\.bf?$": "brainfuck",
"regex:\\.c$": "c",
"regex:(cargo\\.toml|cargo\\.lock)$": "cargo",
".casc": "casc",
".cas": "casc",
".ces": "citrinescript",
".cfc": "coldfusion",
".cfm": "coldfusion",
"circle.yml": "circleci",
".clj": "clojure",
".cl2": "clojure",
".cljc": "clojure",
".cljx": "clojure",
".hic": "clojure",
"regex:\\.cljs(cm)?$": "clojure",
".cmake": "cmake",
"regex:^CMakeLists\\.txt$": "cmake",
"regex:\\.codeclimate\\.(yml|json)$": "codeclimate",
".cbl": "cobol",
".cob": "cobol",
".coffee": "coffee",
".cjsx": "coffee",
".coffee.ecr": "coffee",
"regex:contenthook\\.config\\.(ts|cjs|mjs|js)$": "contenthook",
".coffee.erb": "coffee",
".litcoffee": "coffee",
".iced": "coffee",
".cos": "cosmo",
".⭐": "cosmo",
"regex:\\.c[+px]{2}$|\\.cc$": "cpp",
"regex:\\.h[+px]{2}$": "cpp",
"regex:\\.[it]pp$": "cpp",
"regex:\\.(tcc|inl)$": "cpp",
".cats": "cpp",
".idc": "cpp",
".w": "cpp",
".nc": "cpp",
".upc": "cpp",
".xpm": "cpp",
"regex:\\.e?cr$": "crystal",
".cs": "csharp",
".csx": "csharp",
".cshtml": "razor",
".csproj": "csproj",
".css": "css",
".css.map": "cssmap",
".cu": "cuda",
".pyx": "cython",
"regex:\\.di?$": "d",
".dart": "dart",
".dfm": "delphi",
".dpr": "delphi",
".dsc": "denizen",
".dm": "dm",
".dme": "dm",
".dmm": "dm",
"regex:^(Dockerfile|docker-compose|\\.docker(file|ignore))$": "docker",
"regex:^docker-sync\\.yml$": "docker",
".edge": "edge",
".editorconfig": "editorconfig",
".ejs": "ejs",
".ex": "elixir",
"regex:\\.(exs|l?eex)$": "elixir",
"regex:^mix\\.(exs?|lock)$": "elixir",
".elm": "elm",
".env": "env",
".erl": "erlang",
"regex:\\.([fF])(03|08|18|90|95)$": "fortran",
".beam": "erlang",
".hrl": "erlang",
".xrl": "erlang",
".yrl": "erlang",
".app.src": "erlang",
"regex:^Emakefile$": "erlang",
"regex:^rebar(\\.config)?\\.lock$": "erlang",
"regex:(\\.firebaserc|firebase\\.json)$": "firebase",
".flowconfig": "flowconfig",
".fs": "fsharp",
".fsi": "fsharp",
".fsscript": "fsharp",
".fsx": "fsharp",
"regex:^Gemfile(\\.lock)?$": "gemfile",
"regex:^\\.git|^\\.keep$|\\.mailmap$": "git",
".gml": "gml",
".gleam": "gleam",
".go": "go",
".gd": "godot",
".gr": "grain",
".gradle": "gradle",
"gradlew": "gradle",
"regex:\\.(g|c)sc$": "gamescript",
".gql": "graphql",
".graphql": "graphql",
".groovy": "groovy",
"regex:\\.gv?y$": "groovy",
".gsh": "groovy",
"regex:[Gg]runtfile\\.(js|coffee)$": "gruntfile",
"gulpfile.js": "gulp",
"regex:\\.(hbs|handlebars|(mu)?stache)$": "handlebars",
".prg": "harbour",
".ha": "hare",
".hbp": "harbour",
".hbc": "harbour",
".rc": "harbour",
".fmg": "harbour",
".hs": "haskell",
".hsc": "haskell",
".c2hs": "haskell",
".c3": "c3",
".lhs": "haskell",
"regex:\\.(hlsl|cginc|cg|shader|fx)$": "hlsl",
"regex:\\.(glsl|vert|frag|geom|tesc|tese|comp)$": "glsl",
"regex:\\.hx(ml)?$": "haxe",
"^procfile$": "heroku",
".heex": "heex",
"heroku.yml": "heroku",
".hjson": "hjson",
".hc": "holyc",
"regex:\\.x?html?$": "html",
".http": "http",
".rest": "http",
".jar": "jar",
".java": "java",
".j2": "jinja",
".jinja": "jinja",
".js": "JavaScript",
".es6": "JavaScript",
".es": "JavaScript",
".mjs": "JavaScript",
".js.map": "jsmap",
".json": "json",
".jsonc": "json",
".jsx": "jsx",
".jule": "jule",
"regex:\\.(jil|jl)$": "julia",
".ipynb": "jupyter",
"regex:\\.kt[ms]?$": "kotlin",
".less": "less",
"regex:\\.l(i?sp)?$": "lisp",
"regex:\\.n[ly]$": "lisp",
".podsl": "lisp",
"regex:\\.s([s]|(cm)|(exp))$": "lisp",
".ls": "livescript",
".log": "log",
"regex:\\.([w]|(pd_))?lua$": "lua",
"regex:\\.luau$": "luau",
"regex:\\.rbx(?:lx|l|m|s)?$": "luau",
"^Makefile$": "makefile",
"^mk\\.config$": "makefile",
"regex:\\.(mk|mak|make)$": "makefile",
"regex:^BSDmakefile$": "makefile",
"regex:^GNUmakefile$": "makefile",
"regex:^makefile\\.sco$": "makefile",
"regex:^Kbuild$": "makefile",
"regex:^makefile$": "makefile",
"regex:^mkfile$": "makefile",
"regex:^\\.?qmake$": "makefile",
"regex:\\.(geo|topo)$": "manifest",
".cson": "manifest",
".json5": "manifest",
".ndjson": "manifest",
".fea": "manifest",
".json.eex": "manifest",
".pawn": "pawn",
".proto": "manifest",
".pytb": "manifest",
".pydeps": "manifest",
"regex:\\.pot?$": "manifest",
".ejson": "manifest",
".edn": "manifest",
".eam.fs": "manifest",
".qml": "manifest",
".qbs": "manifest",
".ston": "manifest",
".ttl": "manifest",
".rviz": "manifest",
".sol": "solidity",
".syntax": "manifest",
".webmanifest": "manifest",
"regex:^pkginfo$": "manifest",
".moon": "moonscript",
"regex:^mime\\.types$": "manifest",
"regex:^METADATA\\.pb$": "manifest",
"regex:/\\\\[/\\\\][-.\\w]+$": "manifest",
"lib/icons/.icondb.js": "manifest",
"regex:\\.git/\\\\?(HEAD|ORIG_HEAD|packed-refs|logs/\\\\?[^/\\\\]+)$": "manifest",
"regex:\\.(md|mdown|markdown|mkd|mkdown|mdwn|mkdn|rmd|ron|pmd)$": "markdown",
".mdx": "markdownx",
".marko": "marko",
"regex:\\.m$": "matlab",
".nim": "nim",
".nims": "nim",
".nimble": "nim",
".nix": "nix",
".npmrc": "npm",
".npmignore": "npm",
".nut": "squirrel",
"regex:\\.mm?$": "objective-c",
".pch": "objective-c",
".x": "objective-c",
"regex:\\.eliom[i]?$": "ocaml",
"regex:\\.ml[4lyi]?$": "ocaml",
".mt": "metal",
".odin": "odin",
".onyx": "onyx",
"regex:\\.pas(cal)?$": "pascal",
".lpr": "pascal",
".inc": "pawn",
".sma": "pawn",
"regex:\\.p(wn)?$": "pawn",
".sp": "sourcepawn",
"regex:\\.p(er)?l$": "perl",
".al": "perl",
"regex:\\.p([hm]|lx)$": "perl",
"regex:\\.(psgi|xs)$": "perl",
".pl6": "perl",
"regex:\\.[tp]6$|\\.6pl$": "perl",
"regex:\\.(pm6|p6m)$": "perl",
".6pm": "perl",
".nqp": "perl",
".p6l": "perl",
".pod6": "perl",
"regex:^Rexfile$": "perl",
"regex:\\.php([st\\d]|_cs)?$": "php",
"^Phakefile$": "php",
".pony": "ponylang",
".pcss": "postcss",
"regex:\\.ps[md]?1$": "powershell",
".ps1xml": "powershell",
".prettierignore": "prettier",
"prisma.yml": "prisma",
".pde": "processing",
".jade": "pug",
".pug": "pug",
".purs": "purescript",
".ipy": "python",
".isolate": "python",
".pep": "python",
"regex:\\.gypi?$": "python",
".pyde": "python",
"regex:\\.py([wi3tp]|de)?$": "python",
".tac": "python",
".wsgi": "python",
".xpy": "python",
".rpy": "python",
"regex:\\.?(pypirc|pythonrc|python-venv)$": "python",
"regex:^(SConstruct|SConscript)$": "python",
"regex:^(Snakefile|WATCHLISTS)$": "python",
"regex:^wscript$": "python",
"regex:\\.(r|Rprofile|rsx|rd)$": "r",
".razor": "razor",
"regex:\\.res?i?$": "reasonml",
".rst": "restructuredtext",
"regex:\\.(rb|ru|ruby|erb|gemspec|god|mspec|pluginspec|podspec|rabl|rake|opal)$": "ruby",
"regex:^\\.?(irbrc|gemrc|pryrc|ruby-(gemset|version))$": "ruby",
"regex:^(Appraisals|(Rake|[bB]uild|Cap|Danger|Deliver|Fast|Guard|Jar|Maven|Pod|Puppet|Snap)file(\\.lock)?)$": "ruby",
"regex:\\.(jbuilder|rbuild|rb[wx]|builder)$": "ruby",
"regex:^rails$": "ruby",
".watchr": "ruby",
".rs": "rust",
"regex:\\.(sc|scala)$": "scala",
"regex:\\.s[ac]ss$": "scss",
"regex:\\.(sh|rc|bats|bash|tool|install|command)$": "shell",
"regex:^(\\.?bash(rc|[-_]?(profile|login|logout|history|prompt))|_osc|config|install-sh|PKGBUILD)$": "shell",
"regex:\\.(ksh|mksh|pdksh)$": "shell",
".sh-session": "shell",
"regex:\\.zsh(-theme|_history)?$|^\\.?(antigen|zpreztorc|zlogin|zlogout|zprofile|zshenv|zshrc)$": "shell",
"regex:\\.fish$|^\\.fishrc$": "shell",
"regex:^\\.?(login|profile)$": "shell",
".inputrc": "shell",
".tmux": "shell",
"regex:^(configure|config\\.(guess|rpath|status|sub)|depcomp|libtool|compile)$": "shell",
"regex:^/(private/)?etc/([^/]+/)*(profile$|nanorc$|rc\\.|csh\\.)$": "shell",
"regex:^\\.?cshrc$": "shell",
".profile": "shell",
".tcsh": "shell",
".csh": "shell",
".sk": "skript",
".sqf": "sqf",
"regex:\\.(my)?sql$": "sql",
".ddl": "sql",
".udf": "sql",
".hql": "sql",
".rkt": "racket",
".viw": "sql",
".prc": "sql",
".cql": "sql",
".db2": "sql",
"regex:\\.(styl|stylus)$": "stylus",
".sln": "csproj",
"regex:\\.sv(h)?$": "systemverilog",
".svelte": "svelte",
".svg": "svg",
".swift": "swift",
"regex:\\.tex(i)?$": "tex",
".ltx": "tex",
".aux": "tex",
".sty": "tex",
".dtx": "tex",
".cls": "tex",
".ins": "tex",
".lbx": "tex",
".mkiv": "tex",
"regex:\\.mk[vi]i$": "tex",
"regex:^hyphen(ex)?\\.(cs|den|det|fr|sv|us)$": "tex",
"regex:\\.te?xt$": "text",
".rtf": "text",
"regex:\\.i?nfo$": "text",
".msg": "text",
"regex:\\.(utxt|utf8)$": "text",
".toml": "toml",
".travis.yml": "travis",
".ts.map": "tsmap",
"regex:.*\\.d\\.ts$": "typescript-def",
".ts": "TypeScript",
".tsx": "tsx",
".twig": "twig",
".umm": "umm",
".v": "v",
".vh": "v",
".vala": "vala",
".vapi": "vala",
".vb": "vb",
".vbs": "vb",
".vbhtml": "vb",
".vbproj": "vb",
".vba": "vba",
".vcxproj": "vcxproj",
".verse": "verse",
".vscodeignore": "vscodeignore",
".vue": "vue",
".zu": "zura",
".zura": "zura",
".wat": "wasm",
".wast": "wasm",
".wasm": "wasm",
".xml": "xml",
".xaml": "xaml",
"regex:\\.ya?ml$": "yaml",
"regex:^yarn(\\.lock)?$": "yarn",
".yarnrc": "yarn",
".zig": "zig",
".maeel": "maeel",
"regex:\\.(tfvars|tf)$": "terraform",
"regex:\\.mojo$": "mojo",
".🔥": "mojo",
".zs": "zs"
}

4
rustfmt.toml Normal file
View file

@ -0,0 +1,4 @@
max_width = 100
use_small_heuristics = "Max"
wrap_comments = true

97
src/discord.rs Normal file
View file

@ -0,0 +1,97 @@
/*
* This file WAS ONCE is part of discord-presence. Extension for Zed that adds support for Discord Rich Presence using LSP. It is heavily modified to be used here.
*
* Copyright (c) 2025 Steinhübl, Virt
*/
use std::time::{Duration, SystemTime, UNIX_EPOCH};
use anyhow::{Context, Result};
use discord_rich_presence::{
DiscordIpc, DiscordIpcClient,
activity::{Activity, Assets, Button, Timestamps},
};
use log::{debug, error, info};
#[derive(Debug)]
pub struct Discord {
client: DiscordIpcClient,
start_timestamp: Duration,
}
impl Discord {
pub fn new(id: &str) -> Result<Self> {
let since_epoch =
SystemTime::now().duration_since(UNIX_EPOCH).expect("we are after 1970 right??");
Ok(Self { client: DiscordIpcClient::new(id), start_timestamp: since_epoch })
}
pub fn connect(&mut self) -> Result<()> {
debug!("connecting to discord");
self.client.connect().context("failed to connect to discord ipc")?;
info!("successfully connected to discord");
Ok(())
}
pub fn disconnect(&mut self) -> Result<()> {
debug!("disconnecting from discord");
self.client.close().context("failed to disconnect from discord")
}
pub fn clear(&mut self) -> Result<()> {
debug!("clearing discord activity");
self.client.clear_activity().context("failed to clear activity")
}
#[allow(clippy::too_many_arguments)]
pub fn set(
&mut self,
state: Option<String>,
details: Option<String>,
large_image: Option<String>,
large_text: Option<String>,
small_image: Option<String>,
small_text: Option<String>,
git_remote_url: Option<String>,
) -> Result<()> {
let activity = Activity::new()
.timestamps(Timestamps::new().start(self.start_timestamp.as_millis() as i64))
.buttons(
git_remote_url
.as_ref()
.map(|url| vec![Button::new("View Repository", url)])
.unwrap_or_default(),
);
let activity = set_optional_field(activity, state.as_deref(), Activity::state);
let activity = set_optional_field(activity, details.as_deref(), Activity::details);
let assets = Assets::new();
let assets = set_optional_field(assets, large_image.as_deref(), Assets::large_image);
let assets = set_optional_field(assets, large_text.as_deref(), Assets::large_text);
let assets = set_optional_field(assets, small_image.as_deref(), Assets::small_image);
let assets = set_optional_field(assets, small_text.as_deref(), Assets::small_text);
let activity = activity.assets(assets);
self.client.set_activity(activity).context("failed to update discord activity")?;
debug!("updated discord activity");
Ok(())
}
}
pub fn set_optional_field<'a, T, F>(mut obj: T, field: Option<&'a str>, setter: F) -> T
where
F: FnOnce(T, &'a str) -> T,
{
if let Some(value) = field {
obj = setter(obj, value);
}
obj
}

50
src/language.rs Normal file
View file

@ -0,0 +1,50 @@
use std::{collections::HashMap, sync::LazyLock};
use regex::{Regex, RegexBuilder};
static LANGUAGES: LazyLock<Vec<(LanguageQualifier, String)>> = LazyLock::new(|| {
let map: HashMap<String, String> =
serde_json::from_str(include_str!("../assets/languages.json"))
.expect("failed to deserialize language map");
map.into_iter().map(|(qualifier, lang)| (LanguageQualifier::create(qualifier), lang)).collect()
});
pub enum LanguageQualifier {
Name(String),
Ending(String),
Regex(Regex),
}
impl LanguageQualifier {
pub fn create(input: String) -> Self {
if let Some(input) = input.strip_prefix("regex:") {
Self::Regex(
RegexBuilder::new(input)
.case_insensitive(true)
.build()
.expect("could not compile regex in languages map"),
)
} else if input.starts_with('.') {
Self::Ending(input)
} else {
Self::Name(input)
}
}
pub fn matches(&self, filename: &str) -> bool {
match self {
LanguageQualifier::Name(name) => filename == name,
LanguageQualifier::Ending(ending) => filename.ends_with(ending),
LanguageQualifier::Regex(regex) => regex.is_match(filename),
}
}
}
pub fn get_language(filename: &str) -> String {
LANGUAGES
.iter()
.find(|(quali, _)| quali.matches(filename))
.map(|(_, lang)| lang.clone())
.unwrap_or_else(|| "text".to_string())
}

View file

@ -1,3 +1,62 @@
fn main() { use std::{thread::sleep, time::Duration};
println!("Hello, world!");
use anyhow::Result;
use discord::Discord;
use hyprland::{
data::{Client, Clients},
event_listener::EventListener,
shared::HyprData,
};
use language::get_language;
pub mod discord;
pub mod language;
const APP_ID: &str = "1263505205522337886";
const ICONS_URL: &str =
"https://raw.githubusercontent.com/xhyrom/zed-discord-presence/main/assets/icons";
fn main() -> Result<()> {
let mut discord = Discord::new(APP_ID)?;
discord.connect()?;
update_discord(&mut discord)?;
//set_activity(&mut discord, "main.rs", "a secret new rust project")?;
sleep(Duration::from_secs(10));
Ok(())
}
pub fn update_discord(discord: &mut Discord) -> Result<()> {
let mut clients =
Clients::get()?.into_iter().filter(|c| c.class == "dev.zed.Zed").collect::<Vec<_>>();
clients.sort_by(|c, d| c.focus_history_id.cmp(&d.focus_history_id));
if let Some(client) = clients.first() {
let split = client.title.split('—').collect::<Vec<_>>();
if split.len() == 1 {
set_activity(discord, "not-doing-anything-atm", split[0].trim())?;
} else if split.len() == 2 {
set_activity(discord, split[1].trim(), split[0].trim())?;
}
}
Ok(())
}
pub fn set_activity(discord: &mut Discord, file: &str, workspace: &str) -> Result<()> {
let language = get_language(file);
let language_upper: String = language.chars().take(1).chain(language.chars().skip(1)).collect();
discord.set(
Some(format!("Editing {file}")),
Some(format!("In {workspace}")),
Some(format!("{ICONS_URL}/{language}.png")),
Some(language_upper),
Some(format!("{ICONS_URL}/zed.png")),
Some("Zed".to_string()),
None,
)
} }