discord_webhooks/
lib.rs

1use anyhow::{anyhow, Error, Result};
2use serde::{Deserialize, Serialize};
3mod tests;
4#[derive(Debug, Serialize, Deserialize)]
5pub struct Webhook {
6    //r#type: i8,
7    id: String,
8    name: String,
9    token: String,
10    avatar: Option<String>,
11    channel_id: String,
12    guild_id: String,
13}
14pub struct Client {
15    reqwest: reqwest::blocking::Client,
16    endpoint: String,
17    id: String,
18    token: String,
19}
20
21impl Webhook {
22    // Can't get w/o token since we're not authenticating against Discord Bot API
23    pub fn get_webhook(hook: Client) -> Result<Webhook, Error> {
24        let client = hook.reqwest;
25        let id = hook.id;
26        let token = hook.token;
27        // Sets url for reqwest to get
28        let endpoint: &str =
29            &("https://discord.com/api/webhooks/".to_owned() + &id.to_string() + "/" + &token);
30        let resp = client.get(endpoint).send()?;
31        let respmod = resp.text().unwrap().to_string();
32        let webhook: Webhook = serde_json::from_str(&respmod)?;
33
34        Ok(webhook)
35    }
36    //
37    pub fn delete_webhook(hook: Client) -> Result<reqwest::blocking::Response, Error> {
38        let client = hook.reqwest;
39        let endpoint: &str =
40            &("https://discord.com/api/webhooks/".to_owned() + &hook.id + "/" + &hook.token);
41        let resp = client.delete(endpoint).send()?;
42        if resp.status() != 204 {
43            return Err(anyhow!("{}", resp.status()));
44        }
45        Ok(resp)
46    }
47    pub fn execute_webhook(
48        hookclient: Client,
49        body: &'static str,
50    ) -> Result<reqwest::blocking::Response, Error> {
51        let client = hookclient.reqwest;
52
53        let res = client
54            .post(hookclient.endpoint)
55            .body(body)
56            .header("Content-Type", "application/json")
57            .send()?;
58
59        Ok(res)
60    }
61    pub fn edit_message(
62        hookclient: Client,
63        body: &'static str,
64        message_id: &str,
65    ) -> Result<reqwest::blocking::Response, Error> {
66        let client = hookclient.reqwest;
67        let endpoint: &str = &(hookclient.endpoint + "/messages/" + message_id);
68        let res = client
69            .patch(endpoint)
70            .body(body)
71            .header("Content-Type", "application/json")
72            .send();
73        Ok(res.unwrap())
74    }
75    pub fn new(id: &str, token: &str) -> Result<Client, Error> {
76        Ok(Client {
77            id: id.to_string(),
78            token: token.to_string(),
79            reqwest: reqwest::blocking::Client::new(),
80            endpoint: "https://discord.com/api/webhooks/".to_owned()
81                + &id.to_string()
82                + "/"
83                + &token,
84        })
85    }
86}