From b320a12af2419086665f6686a336c1ad4334f043 Mon Sep 17 00:00:00 2001 From: SoniEx2 Date: Sun, 21 Apr 2019 20:03:35 -0300 Subject: [PATCH] Update metadata --- Cargo.toml | 8 +++++-- README.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 README.md diff --git a/Cargo.toml b/Cargo.toml index 0356cf6..767a8f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,14 @@ [package] name = "hexchat-plugin" -version = "0.2.11" +version = "0.2.12" authors = ["SoniEx2 "] description = "Lets you write HexChat plugins in Rust" license = "AGPL-3.0+" -repository = "https://cybre.tech/SoniEx2/rust.hexchat.hexchat-plugin/" +repository = "https://cybre.tech/SoniEx2/rust.hexchat.hexchat-plugin" +homepage = "https://ganarchy.autistic.space/hexchat-plugin.html" +keywords = ["hexchat", "plugin", "hexchat-plugin"] +categories = ["api-bindings"] +readme = "README.md" [dependencies] libc = "0.2" diff --git a/README.md b/README.md new file mode 100644 index 0000000..78bd3cd --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +Rust hexchat-plugin +=================== + +`hexchat-plugin` provides safe and rusty API bindings for developing native HexChat plugins. + +Example plugin: + +```rust +#[macro_use] +extern crate hexchat_plugin; + +use hexchat_plugin::{Plugin, PluginHandle, InfoId}; + +use std::sync::Mutex; +use std::sync::Arc; + +#[derive(Default)] +struct MyPlug { + // be careful with these: we don't want to move them into the hooks, as that would cause memory leaks! + // we can safely use Arc::downgrade on them, however! + cmutex: Arc>>, + smutex: Arc>>, + pmutex: Arc>>, + tmutex: Arc>>, +} + + +impl Plugin for MyPlug { + fn init(&self, ph: &mut PluginHandle, _arg: Option<&str>) -> bool { + ph.register("MyPlug", "Prints the old topic on topic change", "0.1.0"); + ph.print("Loaded MyPlug 0.1.0"); + + let enabled = Arc::new(Mutex::new(false)); + { + let flag = enabled.clone(); + self.pmutex.lock().unwrap().push(ph.hook_print("Topic Change", move |ph, _word| { + if *flag.lock().unwrap() { + if let Some(topic) = ph.get_info(&InfoId::Topic) { + ph.print(&format!("\x0322*\t\x0329Previous topic:\x03 {}", topic)); + } + } + hexchat_plugin::EAT_NONE + }, hexchat_plugin::PRI_NORM)); + } + + self.cmutex.lock().unwrap().push(ph.hook_command("PrintOldTopic", move |ph, _word, word_eol| { + match word_eol.get(1) { + Option::Some(&s) if s == "true" => { + ph.print("Set PrintOldTopic to true"); + *enabled.lock().unwrap() = true; + } + Option::Some(&s) if s == "false" => { + ph.print("Set PrintOldTopic to false"); + *enabled.lock().unwrap() = false; + } + Option::Some(_) => { + ph.print("Usage: /PrintOldTopic [true|false]"); + } + Option::None => { + ph.print(&format!("PrintOldTopic: {}", *enabled.lock().unwrap())); + } + } + hexchat_plugin::EAT_ALL + }, hexchat_plugin::PRI_NORM, Some("Usage: /PrintOldTopic [true|false]"))); + true // tells hexchat we have successfully initialized + } +} + +hexchat_plugin!(MyPlug); +```