diff options
| author | Austin Hellyer <[email protected]> | 2016-11-10 20:25:32 -0700 |
|---|---|---|
| committer | Austin Hellyer <[email protected]> | 2016-12-29 11:55:10 -0800 |
| commit | 0359f512a8aada5ae0371049eb7c66ecd8d68d84 (patch) | |
| tree | f88dd9b362a2d349d0cdcd13b0859c4cc3329f46 /examples | |
| parent | Rework some event handles (diff) | |
| download | serenity-0359f512a8aada5ae0371049eb7c66ecd8d68d84.tar.xz serenity-0359f512a8aada5ae0371049eb7c66ecd8d68d84.zip | |
Add guild and channel search
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/08_search/Cargo.toml | 8 | ||||
| -rw-r--r-- | examples/08_search/src/main.rs | 115 |
2 files changed, 123 insertions, 0 deletions
diff --git a/examples/08_search/Cargo.toml b/examples/08_search/Cargo.toml new file mode 100644 index 0000000..5936ea5 --- /dev/null +++ b/examples/08_search/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "08_search" +version = "0.1.0" +authors = ["Austin Hellyer <[email protected]>"] + +[dependencies] +#serenity = "0.1" +serenity = { path = "../../" } diff --git a/examples/08_search/src/main.rs b/examples/08_search/src/main.rs new file mode 100644 index 0000000..53d194f --- /dev/null +++ b/examples/08_search/src/main.rs @@ -0,0 +1,115 @@ +//! Requires the "cache", "methods", and "voice" features be enabled in your +//! Cargo.toml, like so: +//! +//! ```toml +//! [dependencies.serenity] +//! version = "*" +//! features = ["cache", "framework", "methods"] +//! ``` +//! +//! Note that - due to bot users not being able to search - this example may +//! only be run under a user account. +//! +//! This particular example will automatically ensure that only the current user +//! may search; this acts as a "selfbot". + +extern crate serenity; + +use serenity::client::{CACHE, Client, Context}; +use serenity::model::Message; +use serenity::utils::builder::{SortingMode, SortingOrder}; +use std::env; + +fn main() { + let mut client = Client::login_user(&env::var("DISCORD_TOKEN").unwrap()); + + client.with_framework(|f| f + .configure(|c| c.prefix("~").on_mention(true)) + .on("search", search) + .set_check("search", self_check)); + + client.on_ready(|_context, ready| { + println!("{} is connected!", ready.user.name); + }); + + if let Err(why) = client.start() { + println!("Client error: {:?}", why); + } +} + +fn self_check(_context: &Context, message: &Message) -> bool { + message.author.id == CACHE.read().unwrap().user.id +} + +fn search(context: &Context, message: &Message, args: Vec<String>) { + let query = args.join(" "); + + if query.is_empty() { + let _ = context.say("You must provide a query"); + + return; + } + + let guild_id = match message.guild_id() { + Some(guild_id) => guild_id, + None => { + let _ = context.say("Only supports guilds"); + + return; + }, + }; + + let channel_ids = { + let cache = CACHE.read().unwrap(); + + let guild = match cache.get_guild(guild_id) { + Some(guild) => guild, + None => { + let _ = context.say("Guild data not found"); + + return; + }, + }; + + guild.channels + .values() + .filter(|c| c.name.starts_with("search-")) + .map(|c| c.id) + .collect() + }; + + let search = context.search_guild(guild_id, channel_ids, |s| s + .content(&query) + .context_size(0) + .has_attachment(true) + .has_embed(true) + .max_id(message.id.0 - 1) + .sort_by(SortingMode::Timestamp) + .sort_order(SortingOrder::Descending)); + + let messages = match search { + Ok(messages) => messages, + Err(why) => { + println!("Error performing search '{}': {:?}", query, why); + + let _ = context.say("Error occurred while searching"); + + return; + }, + }; + + let _ = context.send_message(message.channel_id, move |m| m + .content(&format!("Found {} total results", messages.total)) + .embed(move |mut e| { + for (i, mut messages) in messages.results.into_iter().enumerate() { + let ref mut message = messages[0]; + message.content.truncate(1000); + + e = e.field(|f| f + .name(&format!("Result {}", i)) + .value(&message.content)); + } + + e + })); +} |