diff options
author | SoniEx2 <endermoneymod@gmail.com> | 2021-05-14 22:06:23 -0300 |
---|---|---|
committer | SoniEx2 <endermoneymod@gmail.com> | 2021-05-14 22:06:23 -0300 |
commit | b0dcbe6e3ee505009278826d0a9e651497c7182f (patch) | |
tree | 49f9090df843a6cd60cce3beb60018390efa83b4 /README.md | |
parent | a2a311bc91a76027a7efb6ade4ec29c018b33f1b (diff) |
Make print take ToString, so it's nicer to use
Diffstat (limited to 'README.md')
-rw-r--r-- | README.md | 84 |
1 files changed, 27 insertions, 57 deletions
diff --git a/README.md b/README.md index 78bd3cd..9effee2 100644 --- a/README.md +++ b/README.md @@ -1,70 +1,40 @@ Rust hexchat-plugin =================== -`hexchat-plugin` provides safe and rusty API bindings for developing native HexChat plugins. +`hexchat-plugin` provides safe and rusty API bindings for developing native +HexChat plugins. -Example plugin: +To get started, implement `hexchat_plugin::Plugin` on a struct and use the +`hexchat_plugin!(impl Plugin)` macro in your `lib.rs`. Do not provide a `main`, +as it will not work. Make sure to use the `cdylib` crate-type, or it will also +not work. -```rust -#[macro_use] -extern crate hexchat_plugin; +Also note that plugins may be loaded multiple times. It's recommended to avoid +using global state (statics, thread locals) so as to not cause issues with it. -use hexchat_plugin::{Plugin, PluginHandle, InfoId}; +Examples +-------- -use std::sync::Mutex; -use std::sync::Arc; +For a production-grade plugin using this crate, take a look at +<https://github.com/SoniEx2/cw2-hexchat>. -#[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<Mutex<Vec<hexchat_plugin::CommandHookHandle>>>, - smutex: Arc<Mutex<Vec<hexchat_plugin::ServerHookHandle>>>, - pmutex: Arc<Mutex<Vec<hexchat_plugin::PrintHookHandle>>>, - tmutex: Arc<Mutex<Vec<hexchat_plugin::TimerHookHandle>>>, -} +License +------- +```text +Hexchat Plugin API Bindings for Rust +Copyright (C) 2018, 2021 Soni L. -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"); +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. - 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)); - } +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 Affero General Public License for more details. - 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); +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see <https://www.gnu.org/licenses/>. ``` |