use std::io;
use std::net::TcpStream;
use std::sync::Arc;
use twitchchat::irc::types::Message as IrcMessage;
use twitchchat::{commands::*, Client, Handler, Message, UserConfig, Writer};
fn main() -> Result<(), Box<std::error::Error>> {
let (read, write) = {
let stream = TcpStream::connect(twitchchat::TWITCH_IRC_ADDRESS)?;
(stream.try_clone()?, stream)
};
let read = twitchchat::SyncReadAdapter::new(read);
let conf = user_config();
let mut client = Client::new(read, write);
client.register(conf)?;
let local = client.wait_for_ready()?;
let mention = format!("@{}", local.display_name.unwrap());
struct Foo;
impl Handler for Foo {
fn on_message(&mut self, msg: Arc<Message>) {
eprintln!("parsed message: {:?}", msg)
}
fn on_irc_message(&mut self, msg: Arc<IrcMessage>) {
eprintln!("irc message: {:?}", msg)
}
}
struct Bar<W: io::Write> {
mention: String,
writer: Writer<W>,
}
impl<W: io::Write> Handler for Bar<W> {
fn on_priv_msg(&mut self, msg: Arc<PrivMsg>) {
if msg.message().contains(&self.mention) {
self.writer.send(&msg.channel, "VoHiYo").unwrap();
}
}
fn on_join(&mut self, msg: Arc<Join>) {
if msg.channel == "#museun" {
eprintln!("{:?} joined.", msg.user);
}
}
}
let _ = client.handler(Foo {});
let writer = client.writer();
let _ = client.handler(Bar { writer, mention });
let w = client.writer();
w.join("museun")?;
w.send("museun", "HeyGuys")?;
client.run()?;
Ok(())
}
fn user_config() -> UserConfig {
let (nick, pass) = (var("MY_TWITCH_NICK"), var("MY_TWITCH_PASS"));
let config = UserConfig::builder()
.nick(nick)
.token(pass)
.membership()
.commands()
.tags();
config.build().unwrap()
}
fn var(key: &str) -> String {
std::env::var(key).unwrap_or_else(|_| panic!("please set the env var `{}`", key))
}