teamtalk 6.0.0

TeamTalk SDK for Rust
Documentation
#[cfg(feature = "bot")]
use std::time::Duration;
#[cfg(feature = "bot")]
use teamtalk::{
    Bot, BotConfig, DialogFlow, DialogState, DialogTimeoutPolicy, HandlerResult, Result, Router,
};

#[cfg(feature = "bot")]
fn main() -> Result<()> {
    let client = teamtalk::Client::new()?;
    let onboarding = DialogFlow::new("onboarding", "ask_name")
        .step("ask_email")
        .step("done");
    let onboarding_start = onboarding.clone();
    let onboarding_name = onboarding.clone();
    let onboarding_email = onboarding.clone();

    let router = Router::new()
        .on_command("start", move |ctx| {
            let state = DialogState::new(onboarding_start.name(), onboarding_start.start_step())
                .with_timeout(Duration::from_secs(300))
                .with_timeout_policy(DialogTimeoutPolicy::Pause)
                .with_metadata([("locale", "en"), ("mode", "guided")]);
            ctx.dialog_start_state(state);
            let _ = ctx.reply_private("Welcome! What is your name?");
            Ok(HandlerResult::Continue)
        })
        .on_dialog_step("onboarding", "ask_name", move |ctx| {
            let Some(name) = ctx.text() else {
                return Ok(HandlerResult::Continue);
            };
            ctx.user_state_set("name", &name);
            let _ = ctx.dialog_set_metadata("name", name);
            let _ = ctx.dialog_state_set("started", "true");
            ctx.dialog_advance_next(&onboarding_name)?;
            let _ = ctx.reply_private("Thanks. Now send your e-mail:");
            Ok(HandlerResult::Continue)
        })
        .on_dialog_step("onboarding", "ask_email", move |ctx| {
            let Some(email) = ctx.text() else {
                return Ok(HandlerResult::Continue);
            };
            ctx.user_state_set("email", &email);
            ctx.user_state_set_typed("completed_steps", 2_u32);
            let locale = ctx
                .dialog_metadata("locale")
                .unwrap_or_else(|| "en".to_owned());
            let _ = ctx.dialog_advance_next(&onboarding_email)?;
            let current_step = ctx.dialog_step().unwrap_or_else(|| "unknown".to_owned());
            let started = ctx.dialog_state_parse::<bool>("started")?.unwrap_or(false);
            let completed_steps = ctx.user_state_parse::<u32>("completed_steps")?.unwrap_or(0);
            let _ = ctx.reply_private("Onboarding complete.");
            let _ = ctx.reply_private(&format!(
                "Stored locale: {locale}; started: {started}; step: {current_step}; completed: {completed_steps}"
            ));
            let _ = ctx.dialog_finish();
            Ok(HandlerResult::Continue)
        });

    let mut bot = Bot::builder(client)
        .with_router(router)
        .with_config(BotConfig::new().poll_timeout_ms(100))
        .build();

    bot.run()
}

#[cfg(not(feature = "bot"))]
fn main() {
    eprintln!("Enable bot feature: cargo run --example bot_dialog --features bot");
}