add twitter support
This commit is contained in:
parent
0aec5a3d98
commit
3926969188
File diff suppressed because it is too large
Load Diff
|
@ -9,7 +9,7 @@ edition = "2018"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
chrono = { version = "0.4", features = ["serde"] }
|
chrono = { version = "0.4", features = ["serde"] }
|
||||||
color-eyre = "0.5"
|
color-eyre = "0.5"
|
||||||
egg-mode = "0.15"
|
twapi-ureq = "0.1.5"
|
||||||
elefren = "0.22"
|
elefren = "0.22"
|
||||||
kankyo = "0.3"
|
kankyo = "0.3"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
|
|
@ -7,7 +7,7 @@ use rocket::{
|
||||||
response::Responder,
|
response::Responder,
|
||||||
Data,
|
Data,
|
||||||
Outcome::*,
|
Outcome::*,
|
||||||
Response,
|
Response, State,
|
||||||
};
|
};
|
||||||
use rocket_contrib::json::Json;
|
use rocket_contrib::json::Json;
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
|
@ -30,6 +30,14 @@ pub fn token_info(tok: paseto::Token) -> Json<paseto::Token> {
|
||||||
Json(tok)
|
Json(tok)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[post("/tweet", data = "<body>")]
|
||||||
|
#[instrument(skip(tw), err)]
|
||||||
|
pub fn tweet(body: StringBody, tw: State<web::twitter::Client>, tok: paseto::Token) -> Result {
|
||||||
|
tw.tweet(body.unwrap())?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct StringBody(String);
|
pub struct StringBody(String);
|
||||||
|
|
||||||
|
|
|
@ -43,9 +43,10 @@ fn main() -> Result<()> {
|
||||||
.attach(MainDatabase::fairing())
|
.attach(MainDatabase::fairing())
|
||||||
.attach(SpaceHelmet::default())
|
.attach(SpaceHelmet::default())
|
||||||
.attach(paseto::ed25519_keypair())
|
.attach(paseto::ed25519_keypair())
|
||||||
|
.attach(web::discord_webhook::Client::fairing())
|
||||||
.attach(web::pluralkit::Client::fairing())
|
.attach(web::pluralkit::Client::fairing())
|
||||||
.attach(web::switchcounter::Client::fairing())
|
.attach(web::switchcounter::Client::fairing())
|
||||||
.attach(web::discord_webhook::Client::fairing())
|
.attach(web::twitter::Client::fairing())
|
||||||
.mount("/metrics", prometheus)
|
.mount("/metrics", prometheus)
|
||||||
.mount("/", routes![botinfo])
|
.mount("/", routes![botinfo])
|
||||||
.mount(
|
.mount(
|
||||||
|
@ -56,7 +57,8 @@ fn main() -> Result<()> {
|
||||||
api::switch::list,
|
api::switch::list,
|
||||||
api::switch::switch,
|
api::switch::switch,
|
||||||
api::get_members,
|
api::get_members,
|
||||||
api::token_info
|
api::token_info,
|
||||||
|
api::tweet,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
.launch();
|
.launch();
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
pub mod discord_webhook;
|
pub mod discord_webhook;
|
||||||
pub mod pluralkit;
|
pub mod pluralkit;
|
||||||
pub mod switchcounter;
|
pub mod switchcounter;
|
||||||
|
pub mod twitter;
|
||||||
|
|
||||||
pub type Result<T = ()> = std::result::Result<T, Error>;
|
pub type Result<T = ()> = std::result::Result<T, Error>;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
use super::{Error, Result};
|
||||||
|
use rocket::fairing::AdHoc;
|
||||||
|
use twapi_ureq::*;
|
||||||
|
|
||||||
|
pub struct Client {
|
||||||
|
consumer_token: String,
|
||||||
|
consumer_secret: String,
|
||||||
|
api_key: String,
|
||||||
|
api_secret: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Client {
|
||||||
|
pub fn fairing() -> AdHoc {
|
||||||
|
AdHoc::on_attach("Twitter client", |rocket| {
|
||||||
|
let cfg = rocket.config();
|
||||||
|
let table = cfg.get_table("twitter").unwrap();
|
||||||
|
let consumer_token = table["consumer_token"].as_str().unwrap().to_string();
|
||||||
|
let consumer_secret = table["consumer_secret"].as_str().unwrap().to_string();
|
||||||
|
let api_key = table["api_key"].as_str().unwrap().to_string();
|
||||||
|
let api_secret = table["api_secret"].as_str().unwrap().to_string();
|
||||||
|
|
||||||
|
Ok(rocket.manage(Client {
|
||||||
|
consumer_token: consumer_token,
|
||||||
|
consumer_secret: consumer_secret,
|
||||||
|
api_key: api_key,
|
||||||
|
api_secret: api_secret,
|
||||||
|
}))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn tweet(&self, body: String) -> Result<()> {
|
||||||
|
let url = "https://api.twitter.com/1.1/statuses/update.json";
|
||||||
|
let form_options = vec![("status", body.as_str())];
|
||||||
|
|
||||||
|
let resp = v1::post(
|
||||||
|
url,
|
||||||
|
&vec![],
|
||||||
|
&form_options,
|
||||||
|
&self.consumer_token,
|
||||||
|
&self.consumer_secret,
|
||||||
|
&self.api_key,
|
||||||
|
&self.api_secret,
|
||||||
|
);
|
||||||
|
|
||||||
|
if resp.ok() {
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
Err(match resp.synthetic_error() {
|
||||||
|
Some(why) => Error::UReq(why.to_string()),
|
||||||
|
None => Error::HttpStatus(resp.status()),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue