Simple
This commit is contained in:
parent
003b48ed95
commit
a86c2676c1
|
@ -0,0 +1 @@
|
||||||
|
/target
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,11 @@
|
||||||
|
[package]
|
||||||
|
name = "ssbbot"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
golgi = { "path" = "../peachcloud/golgi" }
|
||||||
|
futures = "0.3.21"
|
||||||
|
async-std = "1.10.0"
|
|
@ -0,0 +1,24 @@
|
||||||
|
use std::process;
|
||||||
|
|
||||||
|
use ssbbot::{SsbBot, Keystore};
|
||||||
|
use ssbbot::error::SsbBotError;
|
||||||
|
|
||||||
|
|
||||||
|
async fn run() -> Result<(), SsbBotError> {
|
||||||
|
println!("helloooo world");
|
||||||
|
let mut sbot = SsbBot::init(Keystore::Patchwork, None, None).await?;
|
||||||
|
sbot.listen_for_message("hello").await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Enable an async main function and execute the `run()` function,
|
||||||
|
// catching any errors and printing them to `stderr` before exiting the
|
||||||
|
// process.
|
||||||
|
#[async_std::main]
|
||||||
|
async fn main() {
|
||||||
|
if let Err(e) = run().await {
|
||||||
|
eprintln!("Application error: {}", e);
|
||||||
|
process::exit(1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
//! Custom error type.
|
||||||
|
|
||||||
|
use std::io::Error as IoError;
|
||||||
|
use golgi::error::GolgiError;
|
||||||
|
use std::str::Utf8Error;
|
||||||
|
|
||||||
|
/// A custom error type encapsulating all possible errors for this library.
|
||||||
|
/// `From` implementations are provided for external error types, allowing
|
||||||
|
/// the `?` operator to be used on functions which return `Result<_, GolgiError>`.
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum SsbBotError {
|
||||||
|
/// IO error with context.
|
||||||
|
Io {
|
||||||
|
/// The underlying IO error.
|
||||||
|
source: IoError,
|
||||||
|
/// Description of the error context.
|
||||||
|
context: String,
|
||||||
|
},
|
||||||
|
/// Error within golgi library
|
||||||
|
Golgi {
|
||||||
|
/// The underlying error
|
||||||
|
source: GolgiError,
|
||||||
|
},
|
||||||
|
/// Error decoding UTF8 string from bytes
|
||||||
|
Utf8Parse {
|
||||||
|
/// The underlying parse error.
|
||||||
|
source: Utf8Error,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::error::Error for SsbBotError {
|
||||||
|
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
|
||||||
|
match *self {
|
||||||
|
SsbBotError::Io { ref source, .. } => Some(source),
|
||||||
|
SsbBotError::Golgi { ref source } => Some(source),
|
||||||
|
SsbBotError::Utf8Parse { ref source } => Some(source),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Display for SsbBotError {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
|
match &*self {
|
||||||
|
SsbBotError::Io { ref context, .. } => write!(f, "IO error: {}", context),
|
||||||
|
SsbBotError::Golgi { source } => write!(
|
||||||
|
f,
|
||||||
|
"Golgi encountered an error: {}",
|
||||||
|
source
|
||||||
|
),
|
||||||
|
SsbBotError::Utf8Parse { source } => {
|
||||||
|
write!(f, "Failed to deserialize UTF8 from bytes: {}", source)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Utf8Error> for SsbBotError {
|
||||||
|
fn from(err: Utf8Error) -> Self {
|
||||||
|
SsbBotError::Utf8Parse { source: err }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<GolgiError> for SsbBotError {
|
||||||
|
fn from(err: GolgiError) -> Self {
|
||||||
|
SsbBotError::Golgi { source: err }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
pub use golgi::sbot::{Sbot, Keystore};
|
||||||
|
use async_std::stream::StreamExt;
|
||||||
|
use futures::TryStreamExt;
|
||||||
|
|
||||||
|
use crate::error::SsbBotError;
|
||||||
|
|
||||||
|
pub mod error;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pub struct SsbBot {
|
||||||
|
sbot: Sbot
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SsbBot {
|
||||||
|
pub async fn init(
|
||||||
|
keystore: Keystore,
|
||||||
|
ip_port: Option<String>,
|
||||||
|
net_id: Option<String>,
|
||||||
|
) -> Result<SsbBot, SsbBotError> {
|
||||||
|
println!("init!");
|
||||||
|
let sbot = Sbot::init(keystore, ip_port, net_id).await?;
|
||||||
|
Ok(Self {
|
||||||
|
sbot,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn listen_for_message(&mut self, msg: &str) -> Result<(), SsbBotError> {
|
||||||
|
|
||||||
|
// Create an ordered stream of all messages authored by the `author`
|
||||||
|
// identity.
|
||||||
|
let author = "@L/z54cbc8V1kL1/MiBhpEKuN3QJkSoZYNaukny3ghIs=.ed25519";
|
||||||
|
let mut history_stream = self.sbot
|
||||||
|
.create_history_stream(author.to_string())
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
// Pin the stream to the stack to allow polling of the `future`.
|
||||||
|
futures::pin_mut!(history_stream);
|
||||||
|
|
||||||
|
println!("looping through stream");
|
||||||
|
|
||||||
|
// Iterate through each element in the stream and match on the `Result`.
|
||||||
|
// In this case, each element has type `Result<SsbMessageValue, GolgiError>`.
|
||||||
|
while let Some(res) = history_stream.next().await {
|
||||||
|
match res {
|
||||||
|
Ok(value) => {
|
||||||
|
// Print the `SsbMessageValue` of this element to `stdout`.
|
||||||
|
println!("value: {:?}", value);
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
// Print the `GolgiError` of this element to `stderr`.
|
||||||
|
eprintln!("err: {:?}", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue