pub mod actions;
pub mod auth;
pub mod graphql;
#[cfg(feature = "http")]
pub mod http;
pub mod parsing;
pub mod search;
pub mod site;
pub mod timeline;
pub mod types;
pub mod util;
use tail_fin_common::BrowserSession;
use tail_fin_common::TailFinError;
pub use site::TwitterSite;
pub use types::{
AcceptResult, ActionResult, Article, DmResult, MediaItem, Notification, TimelineResponse,
TimelineType, Trend, Tweet, TwitterList, TwitterUser, UserProfile,
};
pub use util::extract_tweet_id;
#[cfg(feature = "http")]
pub use http::TwitterHttpClient;
pub trait TwitterApi {
fn timeline(
&self,
kind: TimelineType,
count: usize,
cursor: Option<&str>,
) -> impl std::future::Future<Output = Result<TimelineResponse, TailFinError>> + Send;
fn search(
&self,
query: &str,
count: usize,
cursor: Option<&str>,
) -> impl std::future::Future<Output = Result<TimelineResponse, TailFinError>> + Send;
}
pub struct TwitterClient {
session: BrowserSession,
}
impl TwitterClient {
pub fn new(session: BrowserSession) -> Self {
Self { session }
}
pub fn session(&self) -> &BrowserSession {
&self.session
}
pub async fn post(&self, text: &str) -> Result<ActionResult, TailFinError> {
actions::browser_post(&self.session, text).await
}
pub async fn like(&self, tweet_url: &str) -> Result<ActionResult, TailFinError> {
actions::browser_like(&self.session, tweet_url).await
}
pub async fn follow(&self, username: &str) -> Result<ActionResult, TailFinError> {
actions::browser_follow(&self.session, username, true).await
}
pub async fn unfollow(&self, username: &str) -> Result<ActionResult, TailFinError> {
actions::browser_follow(&self.session, username, false).await
}
pub async fn delete(&self, tweet_url: &str) -> Result<ActionResult, TailFinError> {
actions::browser_delete(&self.session, tweet_url).await
}
pub async fn block(&self, username: &str) -> Result<ActionResult, TailFinError> {
actions::browser_block(&self.session, username, true).await
}
pub async fn unblock(&self, username: &str) -> Result<ActionResult, TailFinError> {
actions::browser_block(&self.session, username, false).await
}
pub async fn reply(&self, tweet_url: &str, text: &str) -> Result<ActionResult, TailFinError> {
actions::browser_reply(&self.session, tweet_url, text).await
}
pub async fn bookmark(&self, tweet_url: &str) -> Result<ActionResult, TailFinError> {
actions::browser_bookmark(&self.session, tweet_url, true).await
}
pub async fn unbookmark(&self, tweet_url: &str) -> Result<ActionResult, TailFinError> {
actions::browser_bookmark(&self.session, tweet_url, false).await
}
pub async fn trending(&self, count: usize) -> Result<Vec<Trend>, TailFinError> {
actions::browser_trending(&self.session, count).await
}
pub async fn hide_reply(&self, tweet_url: &str) -> Result<ActionResult, TailFinError> {
actions::browser_hide_reply(&self.session, tweet_url).await
}
pub async fn download(
&self,
username: &str,
count: usize,
) -> Result<Vec<MediaItem>, TailFinError> {
actions::browser_download(&self.session, username, count).await
}
pub async fn lists(&self, count: usize) -> Result<Vec<TwitterList>, TailFinError> {
actions::browser_lists(&self.session, count).await
}
pub async fn reply_dm(&self, text: &str, count: usize) -> Result<Vec<DmResult>, TailFinError> {
actions::browser_reply_dm(&self.session, text, count).await
}
pub async fn accept(
&self,
filter: Option<&str>,
count: usize,
) -> Result<Vec<AcceptResult>, TailFinError> {
actions::browser_accept(&self.session, filter, count).await
}
}
impl TwitterApi for TwitterClient {
async fn timeline(
&self,
kind: TimelineType,
count: usize,
cursor: Option<&str>,
) -> Result<TimelineResponse, TailFinError> {
timeline::fetch_timeline(&self.session, kind, cursor, count).await
}
async fn search(
&self,
query: &str,
count: usize,
cursor: Option<&str>,
) -> Result<TimelineResponse, TailFinError> {
search::search_tweets(&self.session, query, count, cursor).await
}
}