1
0

fix config

This commit is contained in:
syui 2024-02-07 10:52:09 +09:00
parent a2dd0a6008
commit f441f638a3
Signed by: syui
GPG Key ID: 5417CFEBAD92DF56
4 changed files with 208 additions and 27 deletions

View File

@ -1,6 +1,6 @@
[package] [package]
name = "ai" name = "ai"
version = "0.1.0" version = "0.0.1"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
@ -8,3 +8,10 @@ seahorse = "*"
reqwest = { version = "*", features = ["blocking", "json"] } reqwest = { version = "*", features = ["blocking", "json"] }
tokio = { version = "1", features = ["full"] } tokio = { version = "1", features = ["full"] }
shellexpand = "*" shellexpand = "*"
config = "*"
serde = "*"
serde_json = "*"
serde_derive = "*"
url = { version = "2.0", features = ["serde"] }
rustc-serialize = "*"
toml = "*"

View File

@ -1,7 +1,9 @@
//use config::{Config, ConfigError, File}; use config::{Config, ConfigError, File};
//use serde_derive::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
use std::fs;
use std::io::Write;
pub fn token_file(s: &str) -> String { pub fn data_file(s: &str) -> String {
let file = "/.config/ai/token"; let file = "/.config/ai/token";
let mut f = shellexpand::tilde("~").to_string(); let mut f = shellexpand::tilde("~").to_string();
f.push_str(&file); f.push_str(&file);
@ -11,3 +13,175 @@ pub fn token_file(s: &str) -> String {
_ => f + &"." + &s, _ => f + &"." + &s,
} }
} }
impl Token {
pub fn new() -> Result<Self, ConfigError> {
let d = data_file("json");
let s = Config::builder()
.add_source(File::with_name(&d))
.add_source(config::Environment::with_prefix("APP"))
.build()?;
s.try_deserialize()
}
}
impl Data {
pub fn new() -> Result<Self, ConfigError> {
let d = data_file("toml");
let s = Config::builder()
.add_source(File::with_name(&d))
.add_source(config::Environment::with_prefix("APP"))
.build()?;
s.try_deserialize()
}
}
#[derive(Debug, Serialize, Deserialize)]
#[allow(non_snake_case)]
pub struct Token {
pub did: String,
pub handle: String,
pub accessJwt: String,
pub refreshJwt: String,
}
#[derive(Debug, Serialize, Deserialize)]
#[allow(non_snake_case)]
pub struct Data {
pub host: String,
pub did: String,
pub handle: String,
pub access: String,
pub refresh: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct BaseUrl {
pub profile_get: String,
pub thread_get: String,
pub describe: String,
pub record_list: String,
pub record_create: String,
pub record_delete: String,
pub session_create: String,
pub session_refresh: String,
pub session_get: String,
pub timeline_get: String,
pub timeline_author: String,
pub upload_blob: String,
pub update_handle: String,
pub account_create: String,
pub notify_count: String,
pub notify_list: String,
pub notify_update: String,
pub repo_update: String,
pub like: String,
pub repost: String,
pub follow: String,
pub follows: String,
pub followers: String,
}
pub fn url(s: &str) -> String {
let s = String::from(s);
let data = Data::new().unwrap();
let data = Data {
host: data.host,
handle: data.handle,
did: data.did,
access: data.access,
refresh: data.refresh,
};
let t = "https://".to_string() + &data.host.to_string() + &"/xrpc/".to_string();
let baseurl = BaseUrl {
profile_get: "com.atproto.identity.resolveHandle".to_string(),
thread_get: "app.bsky.feed.getPostThread".to_string(),
record_create: "com.atproto.repo.createRecord".to_string(),
record_delete: "com.atproto.repo.deleteRecord".to_string(),
describe: "com.atproto.repo.describeRepo".to_string(),
record_list: "com.atproto.repo.listRecords".to_string(),
session_create: "com.atproto.server.createSession".to_string(),
session_refresh: "com.atproto.server.refreshSession".to_string(),
session_get: "com.atproto.server.getSession".to_string(),
timeline_get: "app.bsky.feed.getTimeline".to_string(),
timeline_author: "app.bsky.feed.getAuthorFeed".to_string(),
like: "app.bsky.feed.like".to_string(),
repost: "app.bsky.feed.repost".to_string(),
follow: "app.bsky.graph.follow".to_string(),
follows: "app.bsky.graph.getFollows".to_string(),
followers: "app.bsky.graph.getFollowers".to_string(),
upload_blob: "com.atproto.repo.uploadBlob".to_string(),
account_create: "com.atproto.server.createAccount".to_string(),
update_handle: "com.atproto.identity.updateHandle".to_string(),
notify_count: "app.bsky.notification.getUnreadCount".to_string(),
notify_list: "app.bsky.notification.listNotifications".to_string(),
notify_update: "app.bsky.notification.updateSeen".to_string(),
repo_update: "com.atproto.sync.updateRepo".to_string(),
};
match &*s {
"profile_get" => t.to_string() + &baseurl.profile_get,
"thread_get" => t.to_string() + &baseurl.thread_get,
"describe" => t.to_string() + &baseurl.describe,
"record_list" => t.to_string() + &baseurl.record_list,
"record_create" => t.to_string() + &baseurl.record_create,
"record_delete" => t.to_string() + &baseurl.record_delete,
"session_create" => t.to_string() + &baseurl.session_create,
"session_refresh" => t.to_string() + &baseurl.session_refresh,
"session_get" => t.to_string() + &baseurl.session_get,
"timeline_get" => t.to_string() + &baseurl.timeline_get,
"timeline_author" => t.to_string() + &baseurl.timeline_get,
"upload_blob" => t.to_string() + &baseurl.upload_blob,
"account_create" => t.to_string() + &baseurl.account_create,
"update_handle" => t.to_string() + &baseurl.update_handle,
"notify_list" => t.to_string() + &baseurl.notify_list,
"notify_count" => t.to_string() + &baseurl.notify_count,
"notify_update" => t.to_string() + &baseurl.notify_update,
"repo_update" => t.to_string() + &baseurl.repo_update,
"like" => t.to_string() + &baseurl.like,
"repost" => t.to_string() + &baseurl.repost,
"follow" => t.to_string() + &baseurl.follow,
"follows" => t.to_string() + &baseurl.follows,
"followers" => t.to_string() + &baseurl.followers,
_ => s,
}
}
pub fn data_toml(s: &str) -> String {
let s = String::from(s);
let data = Data::new().unwrap();
let data = Data {
host: data.host,
handle: data.handle,
did: data.did,
access: data.access,
refresh: data.refresh,
};
match &*s {
"host" => data.handle,
"handle" => data.handle,
"did" => data.did,
"access" => data.access,
"refresh" => data.refresh,
_ => s,
}
}
pub fn w_cfg(h: &str, res: &str) {
let f = data_file(&"json");
let ff = data_file(&"toml");
let mut f = fs::File::create(f.clone()).unwrap();
let mut ff = fs::File::create(ff.clone()).unwrap();
f.write_all(&res.as_bytes()).unwrap();
let json: Token = serde_json::from_str(&res).unwrap();
let datas = Data {
host: h.to_string(),
did: json.did.to_string(),
handle: json.handle.to_string(),
access: json.accessJwt.to_string(),
refresh: json.refreshJwt.to_string(),
};
let toml = toml::to_string(&datas).unwrap();
ff.write_all(&toml.as_bytes()).unwrap();
}

View File

@ -1,14 +1,16 @@
pub mod refresh;
pub mod token;
pub mod ascii;
pub mod data;
use seahorse::{App, Command, Context, Flag, FlagType}; use seahorse::{App, Command, Context, Flag, FlagType};
use std::env; use std::env;
use std::fs;
use std::io::Write;
use crate::ascii::c_ascii; use crate::ascii::c_ascii;
use crate::data::token_file; use crate::data::data_toml;
use crate::data::url;
use crate::data::w_cfg;
pub mod data;
pub mod refresh;
pub mod token;
pub mod ascii;
fn main() { fn main() {
let args: Vec<String> = env::args().collect(); let args: Vec<String> = env::args().collect();
@ -47,31 +49,27 @@ fn c_ascii_art(c: &Context) {
c_ascii(c.bool_flag("type")); c_ascii(c.bool_flag("type"));
} }
fn refresh(c: &Context) { fn refresh() {
let m = c.args[0].to_string();
let h = async { let h = async {
let str = refresh::post_request(m.to_string()).await; let res = refresh::post_request().await;
println!("{}",str); println!("{}", res);
w_cfg("bsky.social", &res)
}; };
let res = tokio::runtime::Runtime::new().unwrap().block_on(h); let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
return res return res
} }
fn c_refresh(c: &Context) { fn c_refresh(_c: &Context) {
refresh(c); refresh();
} }
fn token(c: &Context) { fn token(c: &Context) {
let m = c.args[0].to_string(); let m = c.args[0].to_string();
let f = token_file(&"json");
let mut f = fs::File::create(f.clone()).unwrap();
let h = async { let h = async {
if let Ok(p) = c.string_flag("password") { if let Ok(p) = c.string_flag("password") {
let str = token::post_request(m.to_string(), p.to_string()).await; let res = token::post_request(m.to_string(), p.to_string()).await;
println!("{}",str); println!("{}", res);
w_cfg("bsky.social", &res)
f.write_all(&str.as_bytes()).unwrap();
} }
}; };
let res = tokio::runtime::Runtime::new().unwrap().block_on(h); let res = tokio::runtime::Runtime::new().unwrap().block_on(h);

View File

@ -1,8 +1,10 @@
extern crate reqwest; extern crate reqwest;
use crate::data_toml;
use crate::url;
pub async fn post_request(refresh: String) -> String { pub async fn post_request() -> String {
let refresh = data_toml(&"refresh");
let url = "https://bsky.social/xrpc/com.atproto.server.refreshSession"; let url = url(&"session_refresh");
let client = reqwest::Client::new(); let client = reqwest::Client::new();
let res = client let res = client