use std::collections::HashMap;
use async_trait::async_trait;
use rivescript_core::macros;
use crate::RiveScript;
pub struct Proxy<'a> {
rs: &'a RiveScript,
username: String,
staged_user_vars: HashMap<String, String>,
staged_bot_vars: HashMap<String, String>,
}
impl<'a> Proxy<'a> {
pub fn new(rs: &'a RiveScript, username: String) -> Self {
Self {
rs: rs,
username: username,
staged_user_vars: HashMap::new(),
staged_bot_vars: HashMap::new(),
}
}
}
#[async_trait]
impl<'a> macros::Proxy for Proxy<'a> {
fn current_username(&self) -> String {
self.username.clone()
}
async fn set_uservar(&mut self, username: &str, name: &str, value: &str) -> Result<bool, String> {
if username != self.username {
return Err("New user variables can only be set for the current_username()".to_string());
}
self.staged_user_vars.insert(name.to_string(), value.to_string());
Ok(true)
}
async fn get_uservar(&self, username: &str, name: &str) -> String {
if let Some(value) = self.staged_user_vars.get(name) {
return value.clone();
}
self.rs.sessions.get(&username, name).await
}
async fn get_uservars(&self, _username: &str) -> HashMap<String, String> {
self.rs.sessions.get_any(&self.rs.current_username().unwrap()).await
}
fn set_variable(&mut self, name: &str, value: &str) {
self.staged_bot_vars.insert(name.to_string(), value.to_string());
}
fn get_variable(&self, name: &str) -> String {
if let Some(value) = self.staged_bot_vars.get(name) {
return value.clone();
}
self.rs.brain.get_bot_var(name)
}
fn finish(&mut self, output: String) -> Result<macros::SubroutineResult, String> {
Ok(macros::SubroutineResult {
output,
staged_user_vars: std::mem::take(&mut self.staged_user_vars),
staged_bot_vars: std::mem::take(&mut self.staged_bot_vars),
})
}
}