diff --git a/src/bot.rs b/src/bot.rs new file mode 100644 index 0000000..307ba93 --- /dev/null +++ b/src/bot.rs @@ -0,0 +1,59 @@ +use futures_util::{SinkExt, StreamExt}; +use serde_json::json; +use tokio::net::TcpStream; +use tokio_tungstenite::{MaybeTlsStream, WebSocketStream, connect_async}; + +use crate::types::NewToken; + +pub struct Bot { + pub ws: WebSocketStream>, +} + +impl Bot { + pub async fn on_new_coin(&mut self, token: NewToken) -> anyhow::Result<()> { + Ok(()) + } +} + +impl Bot { + pub async fn new() -> anyhow::Result { + Ok(Self { + ws: connect_async("wss://pumpdev.io/ws").await?.0, + }) + } + + pub async fn initialize_websocket_subscribe(&mut self) -> anyhow::Result<()> { + self.ws + .send(tokio_tungstenite::tungstenite::Message::Text( + json!({ "method": "subscribeNewToken" }).to_string().into(), + )) + .await?; + + Ok(()) + } + + pub async fn start(&mut self) -> anyhow::Result<()> { + self.initialize_websocket_subscribe().await?; + + while let Some(msg) = self.ws.next().await { + let msg = msg?; + if let tokio_tungstenite::tungstenite::Message::Text(text) = msg { + match serde_json::from_str::(&text) { + Ok(crate::types::PumpDevEvent::Create(token)) => { + self.on_new_coin(token).await?; + } + + Ok(event) => { + println!("{:?}", event); + } + + Err(err) => { + log::error!("{err}"); + } + } + } + } + + Ok(()) + } +} diff --git a/src/main.rs b/src/main.rs index b17ea58..d4ebe8d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,9 @@ pub mod account; +pub mod bot; pub mod executor; pub mod types; -use futures_util::{SinkExt, StreamExt}; -use serde_json::json; -use tokio_tungstenite::connect_async; +use crate::bot::Bot; #[tokio::main] async fn main() -> anyhow::Result<()> { @@ -12,26 +11,7 @@ async fn main() -> anyhow::Result<()> { builder.filter_level(log::LevelFilter::Info); builder.init(); - let (mut ws, _) = connect_async("wss://pumpdev.io/ws").await?; + let mut bot = Bot::new().await?; - ws.send(tokio_tungstenite::tungstenite::Message::Text( - json!({ "method": "subscribeNewToken" }).to_string().into(), - )) - .await?; - - while let Some(msg) = ws.next().await { - let msg = msg?; - if let tokio_tungstenite::tungstenite::Message::Text(text) = msg { - match serde_json::from_str::(&text) { - Ok(event) => { - println!("{:?}", event); - } - - Err(err) => { - log::error!("{err}"); - } - } - } - } - Ok(()) + bot.start().await }