aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorenz Leitner <lrnz.ltnr@gmail.com>2021-10-11 15:37:27 +0200
committerLorenz Leitner <lrnz.ltnr@gmail.com>2021-10-12 12:06:57 +0200
commit8f38658d1163359ae49a2b6f23d11bdec67731c8 (patch)
tree268b64dd6cf80032d9c2d2277d210cb3aa225d6a
parentAdd wa as hook (diff)
Add WA API key to config
Diffstat (limited to '')
-rw-r--r--Containerfile1
-rw-r--r--config.toml1
-rw-r--r--src/config.rs1
-rw-r--r--src/hooks/wa.rs28
-rw-r--r--src/lib.rs24
5 files changed, 42 insertions, 13 deletions
diff --git a/Containerfile b/Containerfile
index edeb48e..bb28164 100644
--- a/Containerfile
+++ b/Containerfile
@@ -26,5 +26,6 @@ COPY --from=builder /work/target/release/catinator /usr/local/bin
ENV CATINATOR_CONFIG="/config.toml"
ENV CATINATOR_PASSWORD=""
+ENV CATINATOR_WA_API_KEY=""
ENTRYPOINT ["/usr/local/bin/catinator"]
diff --git a/config.toml b/config.toml
index 93aa6e8..4ce6caf 100644
--- a/config.toml
+++ b/config.toml
@@ -13,3 +13,4 @@ channels = ["#redoxmasterrace", "#linuxmasterrace", "#gnulag"]
[settings]
prefix = ':'
+wa_api_key = ""
diff --git a/src/config.rs b/src/config.rs
index f7a0934..776d60c 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -43,4 +43,5 @@ pub struct Server {
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default, Deserialize)]
pub struct Settings {
pub prefix: char,
+ pub wa_api_key: String,
}
diff --git a/src/hooks/wa.rs b/src/hooks/wa.rs
index e51aa47..b518bf4 100644
--- a/src/hooks/wa.rs
+++ b/src/hooks/wa.rs
@@ -1,11 +1,11 @@
use crate::util::web::shorten_url;
-use anyhow::{Context, Error, Result};
+use anyhow::{bail, Context, Error, Result};
use futures::try_join;
use irc::client::prelude::*;
+use macros::privmsg;
use reqwest::{get, Url};
use serde::{Deserialize, Serialize};
use serde_json::Result as SerdeJsonResult;
-use macros::privmsg;
#[derive(Serialize, Deserialize, Debug)]
struct WaResponse {
@@ -57,14 +57,13 @@ fn to_single_string(wa_res: WaResponse) -> String {
.join(" - ")
}
-fn get_url(query_str: &str, base_url: Option<&str>) -> String {
- let app_id = "XXX"; // TODO: Get from env
+fn get_url(query_str: &str, api_key: Option<&str>, base_url: Option<&str>) -> String {
let wa_url = "http://api.wolframalpha.com";
let api_url = format!(
"{}/v2/query?input={}&appid={}&output=json",
base_url.unwrap_or(wa_url),
query_str,
- app_id
+ api_key.unwrap_or("XXX"), // Allow tests to run without a key
);
api_url
}
@@ -87,11 +86,15 @@ async fn handle_wa_req(url: &str) -> Result<WaResponse, Error> {
/// Sends a request to the Wolfram Alpha API, returns a plain text response.
#[tracing::instrument]
-async fn wa_query(query_str: &str, base_url: Option<&str>) -> Result<String, Error> {
+async fn wa_query(
+ query_str: &str,
+ api_key: Option<&str>,
+ base_url: Option<&str>,
+) -> Result<String, Error> {
let user_url = format!("http://www.wolframalpha.com/input/?i={}", query_str);
let user_url_shortened_fut = shorten_url(&user_url);
- let url = get_url(query_str, base_url);
+ let url = get_url(query_str, api_key, base_url);
let wa_res_fut = handle_wa_req(&url);
// Can't just (foo.await, bar.await), smh
@@ -112,9 +115,14 @@ pub async fn wa(bot: &crate::Bot, msg: Message) -> Result<()> {
chars.next_back();
let content = chars.as_str();
+ if content.is_empty() {
+ bail!("Empty input for WA query");
+ }
+
bot.send_privmsg(
- msg.response_target().context("failed to get response target")?,
- &wa_query(content, None).await?
+ msg.response_target()
+ .context("failed to get response target")?,
+ &wa_query(content, Some(&bot.config.settings.wa_api_key), None).await?,
)?;
})
}
@@ -135,7 +143,7 @@ mod tests {
.create();
mockito::start();
- let res = wa_query("5/10", Some(&mockito::server_url())).await?;
+ let res = wa_query("5/10", None, Some(&mockito::server_url())).await?;
let res_without_link = res.splitn(2, "-").collect::<Vec<&str>>()[1].trim();
assert_eq!(res_without_link, "Exact result: 1/2 - Decimal form: 0.5");
Ok(())
diff --git a/src/lib.rs b/src/lib.rs
index 0aba61c..ed6dcb6 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -26,6 +26,16 @@ pub struct Bot {
pub irc_client: irc::client::Client,
}
+fn get_env_var(var_name: &str) -> Option<String> {
+ match std::env::var(var_name) {
+ Ok(var) => {
+ info!("using {} from env", var_name);
+ Some(var)
+ }
+ Err(_) => None,
+ }
+}
+
impl Bot {
pub async fn new(config_path: &str) -> Result<Bot> {
use std::fs;
@@ -33,10 +43,18 @@ impl Bot {
let config_str = fs::read_to_string(config_path)?;
let mut config: config::Config = toml::from_str(&config_str)?;
- match std::env::var("CATINATOR_PASSWORD") {
+ if let Some(v) = get_env_var("CATINATOR_PASSWORD") {
+ config.user.password = v
+ };
+
+ if let Some(v) = get_env_var("CATINATOR_WA_API_KEY") {
+ config.settings.wa_api_key = v
+ };
+
+ match std::env::var("CATINATOR_WA_API_KEY") {
Ok(var) => {
- info!("using password from env var");
- config.user.password = var
+ info!("using wa api key from env var");
+ config.settings.wa_api_key = var
}
Err(_) => (),
}