.instance_url
.as_ref()
.expect("Should have set up an instance URL before calling")
- .clone()
- + "/api/";
+ .clone();
+ let base_url = if !base_url.ends_with("/") {
+ base_url + "/"
+ } else {
+ base_url
+ };
req.build(&base_url, client, self.auth.user_token.as_deref())
}
return Ok(inst.clone());
}
- let (url, rsp) = self.api_request(Req::get("v2/instance"))?;
+ let (url, rsp) = self.api_request(Req::get("api/v2/instance"))?;
let rspstatus = rsp.status();
let inst: Instance = if !rspstatus.is_success() {
Err(ClientError::UrlError(url, rspstatus.to_string()))
}
let req = if Some(id) == self.auth.account_id.as_deref() {
- Req::get(&format!("v1/accounts/verify_credentials"))
+ Req::get(&format!("api/v1/accounts/verify_credentials"))
} else {
- Req::get(&format!("v1/accounts/{id}"))
+ Req::get(&format!("api/v1/accounts/{id}"))
};
let (url, rsp) = self.api_request(req)?;
let rspstatus = rsp.status();
}
let (url, rsp) =
- self.api_request(Req::get(&("v1/polls/".to_owned() + id)))?;
+ self.api_request(Req::get(&("api/v1/polls/".to_owned() + id)))?;
let rspstatus = rsp.status();
let poll: Poll = if !rspstatus.is_success() {
Err(ClientError::UrlError(url.clone(), rspstatus.to_string()))
id: &str,
) -> Result<Relationship, ClientError> {
let (url, rsp) = self.api_request(
- Req::get("v1/accounts/relationships").param("id", id),
+ Req::get("api/v1/accounts/relationships").param("id", id),
)?;
let rspstatus = rsp.status();
let rels: Vec<Relationship> = if !rspstatus.is_success() {
}
let (url, rsp) =
- self.api_request(Req::get(&("v1/statuses/".to_owned() + id)))?;
+ self.api_request(Req::get(&("api/v1/statuses/".to_owned() + id)))?;
let rspstatus = rsp.status();
let st: Status = if !rspstatus.is_success() {
Err(ClientError::UrlError(url.clone(), rspstatus.to_string()))
return Ok(not);
}
- let (url, rsp) = self
- .api_request(Req::get(&("v1/notifications/".to_owned() + id)))?;
+ let (url, rsp) = self.api_request(Req::get(
+ &("api/v1/notifications/".to_owned() + id),
+ ))?;
let rspstatus = rsp.status();
let not: Notification = if !rspstatus.is_success() {
Err(ClientError::UrlError(url.clone(), rspstatus.to_string()))
}
let req = match id {
- FeedId::Home => Req::get("v1/timelines/home"),
+ FeedId::Home => Req::get("api/v1/timelines/home"),
FeedId::Local => {
- Req::get("v1/timelines/public").param("local", true)
+ Req::get("api/v1/timelines/public").param("local", true)
}
FeedId::Public => {
- Req::get("v1/timelines/public").param("local", false)
+ Req::get("api/v1/timelines/public").param("local", false)
}
FeedId::Hashtag(ref tag) => {
- Req::get(&format!("v1/timelines/tag/{}", &tag))
+ Req::get(&format!("api/v1/timelines/tag/{}", &tag))
}
FeedId::User(id, boosts, replies) => {
- Req::get(&format!("v1/accounts/{}/statuses", id))
+ Req::get(&format!("api/v1/accounts/{}/statuses", id))
.param("exclude_reblogs", *boosts == Boosts::Hide)
.param("exclude_replies", *replies == Replies::Hide)
}
FeedId::Mentions => {
- Req::get("v1/notifications").param("types[]", "mention")
+ Req::get("api/v1/notifications").param("types[]", "mention")
}
- FeedId::Ego => Req::get("v1/notifications")
+ FeedId::Ego => Req::get("api/v1/notifications")
.param("types[]", "reblog")
.param("types[]", "follow")
.param("types[]", "favourite"),
FeedId::Favouriters(id) => {
- Req::get(&format!("v1/statuses/{id}/favourited_by"))
+ Req::get(&format!("api/v1/statuses/{id}/favourited_by"))
}
FeedId::Boosters(id) => {
- Req::get(&format!("v1/statuses/{id}/reblogged_by"))
+ Req::get(&format!("api/v1/statuses/{id}/reblogged_by"))
}
FeedId::Followers(id) => {
- Req::get(&format!("v1/accounts/{id}/followers"))
+ Req::get(&format!("api/v1/accounts/{id}/followers"))
}
FeedId::Followees(id) => {
- Req::get(&format!("v1/accounts/{id}/following"))
+ Req::get(&format!("api/v1/accounts/{id}/following"))
}
};
receiver: Box<Recv>,
) -> Result<(), ClientError> {
let req = match id {
- StreamId::User => Req::get("v1/streaming/user"),
+ StreamId::User => Req::get("api/v1/streaming/user"),
};
let method = req.method.clone(); // to reuse for redirects below
&mut self,
name: &str,
) -> Result<Account, ClientError> {
- let (url, rsp) = self
- .api_request(Req::get("v1/accounts/lookup").param("acct", name))?;
+ let (url, rsp) = self.api_request(
+ Req::get("api/v1/accounts/lookup").param("acct", name),
+ )?;
let rspstatus = rsp.status();
let ac: Account = if !rspstatus.is_success() {
Err(ClientError::UrlError(url, rspstatus.to_string()))
pub fn post_status(&mut self, post: &Post) -> Result<(), ClientError> {
// FIXME: separate Post from a single status, so we can post threads
- let req = Req::post("v1/statuses")
+ let req = Req::post("api/v1/statuses")
.param("status", post.text.trim_end_matches('\n'))
.param("visibility", post.m.visibility)
.param("language", &post.m.language);
id: &str,
verb: &str,
) -> Result<(), ClientError> {
- let (url, rsp) =
- self.api_request(Req::post(&format!("v1/statuses/{id}/{verb}")))?;
+ let (url, rsp) = self
+ .api_request(Req::post(&format!("api/v1/statuses/{id}/{verb}")))?;
let rspstatus = rsp.status();
// Cache the returned status so as to update its faved/boosted flags
let st: Status = if !rspstatus.is_success() {
&mut self,
id: &str,
) -> Result<Context, ClientError> {
- let (url, rsp) =
- self.api_request(Req::get(&format!("v1/statuses/{id}/context")))?;
+ let (url, rsp) = self
+ .api_request(Req::get(&format!("api/v1/statuses/{id}/context")))?;
let rspstatus = rsp.status();
let ctx: Context = if !rspstatus.is_success() {
Err(ClientError::UrlError(url, rspstatus.to_string()))
choices: impl Iterator<Item = usize>,
) -> Result<(), ClientError> {
let choices: Vec<_> = choices.collect();
- let mut req = Req::post(&format!("v1/polls/{id}/votes"));
+ let mut req = Req::post(&format!("api/v1/polls/{id}/votes"));
for choice in choices {
req = req.param("choices[]", choice);
}
) -> Result<(), ClientError> {
let req = match follow {
Followness::NotFollowing => {
- Req::post(&format!("v1/accounts/{id}/unfollow"))
+ Req::post(&format!("api/v1/accounts/{id}/unfollow"))
}
Followness::Following { boosts, languages } => {
- let mut req = Req::post(&format!("v1/accounts/{id}/follow"))
- .param("reblogs", boosts == Boosts::Show);
+ let mut req =
+ Req::post(&format!("api/v1/accounts/{id}/follow"))
+ .param("reblogs", boosts == Boosts::Show);
for language in languages {
req = req.param("languages[]", &language);
}
) -> Result<(), ClientError> {
let req = match (flag, enable) {
(AccountFlag::Block, true) => {
- Req::post(&format!("v1/accounts/{id}/block"))
+ Req::post(&format!("api/v1/accounts/{id}/block"))
}
(AccountFlag::Block, false) => {
- Req::post(&format!("v1/accounts/{id}/unblock"))
+ Req::post(&format!("api/v1/accounts/{id}/unblock"))
}
(AccountFlag::Mute, true) => {
- Req::post(&format!("v1/accounts/{id}/mute"))
+ Req::post(&format!("api/v1/accounts/{id}/mute"))
}
(AccountFlag::Mute, false) => {
- Req::post(&format!("v1/accounts/{id}/unmute"))
+ Req::post(&format!("api/v1/accounts/{id}/unmute"))
}
};
let (url, rsp) = self.api_request(req)?;
) -> Result<(), ClientError> {
// TODO: add "note" with details.bio, and "fields_attributes"
// for the variable info fields
- let req = Req::patch("v1/accounts/update_credentials")
+ let req = Req::patch("api/v1/accounts/update_credentials")
.param("display_name", &details.display_name)
.param("locked", details.locked)
.param("bot", details.bot)