aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorAustin Hellyer <[email protected]>2016-11-10 20:25:32 -0700
committerAustin Hellyer <[email protected]>2016-12-29 11:55:10 -0800
commit0359f512a8aada5ae0371049eb7c66ecd8d68d84 (patch)
treef88dd9b362a2d349d0cdcd13b0859c4cc3329f46 /examples
parentRework some event handles (diff)
downloadserenity-0359f512a8aada5ae0371049eb7c66ecd8d68d84.tar.xz
serenity-0359f512a8aada5ae0371049eb7c66ecd8d68d84.zip
Add guild and channel search
Diffstat (limited to 'examples')
-rw-r--r--examples/08_search/Cargo.toml8
-rw-r--r--examples/08_search/src/main.rs115
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
+ }));
+}