add feature to ping only required reviewers
This commit is contained in:
parent
e687b3fda3
commit
dd957e1772
105
src/api.rs
105
src/api.rs
|
@ -1,102 +1,19 @@
|
||||||
|
|
||||||
use crate::gitea::{User, Repo, Pull};
|
|
||||||
|
|
||||||
pub async fn get_user() -> User {
|
pub fn get_reviewers_pings_inner(author_login: String) -> Vec<String> {
|
||||||
let user = reqwest::get(gitea_api!("/api/v1/user")).await.unwrap();
|
let mut reviewers: Vec<String> = vec![
|
||||||
|
"@bleki42".into(),
|
||||||
|
"@x3paerz".into(),
|
||||||
|
"@balistiktw".into()
|
||||||
|
];
|
||||||
|
|
||||||
if user.status() != 200 {
|
let map: Vec<String> = vec!["blek".into(), "balistik".into(), "xepaerz".into()];
|
||||||
panic!("Request failed with code {}", user.status());
|
|
||||||
}
|
|
||||||
|
|
||||||
let user = user.bytes().await.unwrap();
|
|
||||||
let user = String::from_utf8(user.to_vec()).unwrap();
|
|
||||||
serde_json::from_str::<User>(user.as_str()).unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_org_repos(org: String) -> Vec<Repo> {
|
|
||||||
let repos = reqwest::get(gitea_api!(format!("/api/v1/orgs/{org}/repos"))).await.unwrap();
|
|
||||||
|
|
||||||
if repos.status() != 200 {
|
|
||||||
panic!("Request failed with code {}", repos.status());
|
|
||||||
}
|
|
||||||
|
|
||||||
let repos = repos.bytes().await.unwrap();
|
|
||||||
let repos = String::from_utf8(repos.to_vec()).unwrap();
|
|
||||||
|
|
||||||
serde_json::from_str::<Vec<Repo>>(repos.as_str()).unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_repo_pulls(org: String, repo: String) -> Vec<Pull> {
|
|
||||||
let pulls = reqwest::get(gitea_api!(format!("/api/v1/repos/{org}/{repo}/pulls"))).await.unwrap();
|
|
||||||
|
|
||||||
if pulls.status() != 200 {
|
|
||||||
panic!("Request failed with code {}", pulls.status());
|
|
||||||
}
|
|
||||||
|
|
||||||
let pulls = pulls.bytes().await.unwrap();
|
|
||||||
let pulls = String::from_utf8(pulls.to_vec()).unwrap();
|
|
||||||
|
|
||||||
let parsed = serde_json::from_str(pulls.as_str());
|
|
||||||
if parsed.is_err() {
|
|
||||||
println!("{pulls}");
|
|
||||||
}
|
|
||||||
parsed.unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub async fn get_all_prs(repos: Vec<Repo>) -> Vec<Pull> {
|
|
||||||
let mut out: Vec<Pull> = vec![];
|
|
||||||
|
|
||||||
let futures: Vec<_> =
|
|
||||||
repos.iter()
|
|
||||||
.map(|x| get_repo_pulls(x.owner.login.clone(), x.name.clone()))
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
let mut set = tokio::task::JoinSet::new();
|
if ! map.contains(&author_login) {
|
||||||
|
return reviewers
|
||||||
for future in futures {
|
|
||||||
set.spawn(future);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while let Some(res) = set.join_next().await {
|
reviewers.remove(map.iter().position(|x| **x == author_login).unwrap());
|
||||||
let res = res.unwrap();
|
|
||||||
|
|
||||||
for pull in res.iter() {
|
|
||||||
out.push(pull.clone());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
out
|
reviewers
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
The first one is the never seen before PRs and the 2nd is just the data
|
|
||||||
*/
|
|
||||||
pub async fn get_new_prs(old: Vec<Pull>, repos: Vec<Repo>) -> ( Vec<Pull>, Vec<Pull> ) {
|
|
||||||
|
|
||||||
log::debug!("Getting all PRs now");
|
|
||||||
|
|
||||||
let data = get_all_prs(repos.clone()).await;
|
|
||||||
let mut new_pulls: Vec<Pull> = vec![];
|
|
||||||
|
|
||||||
|
|
||||||
for pull in data.iter() {
|
|
||||||
let mut alr_exists = false;
|
|
||||||
for old_pull in old.iter() {
|
|
||||||
if pull.id == old_pull.id {
|
|
||||||
alr_exists = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ! alr_exists {
|
|
||||||
new_pulls.push(pull.clone());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
(new_pulls, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn filter_repos(repos: Vec<Repo>) -> Vec<Repo> {
|
|
||||||
repos.iter()
|
|
||||||
.filter(|x| (!x.archived) && x.has_pull_requests)
|
|
||||||
.cloned()
|
|
||||||
.collect()
|
|
||||||
}
|
}
|
14
src/main.rs
14
src/main.rs
|
@ -7,6 +7,7 @@ use tide::{Server, Request, Response};
|
||||||
use tokio::fs;
|
use tokio::fs;
|
||||||
|
|
||||||
mod gitea;
|
mod gitea;
|
||||||
|
mod api;
|
||||||
|
|
||||||
const CHAT_ID: &str = dotenvy_macro::dotenv!("CHAT_ID", "Chat ID is not set!");
|
const CHAT_ID: &str = dotenvy_macro::dotenv!("CHAT_ID", "Chat ID is not set!");
|
||||||
const TG_KEY: &str = dotenvy_macro::dotenv!("TG_KEY", "Telegram key is not set!");
|
const TG_KEY: &str = dotenvy_macro::dotenv!("TG_KEY", "Telegram key is not set!");
|
||||||
|
@ -121,13 +122,16 @@ async fn webhook(mut req: Request<SharedState>) -> tide::Result {
|
||||||
let state = req.state().clone();
|
let state = req.state().clone();
|
||||||
|
|
||||||
state.bot.send_message(state.chat.id, format!("New PR\n{} ({}#{}) by {}\n{}", pr.pull_request.title, pr.pull_request.head.repo.name, pr.pull_request.number, pr.pull_request.user.login, pr.pull_request.url)).await.unwrap();
|
state.bot.send_message(state.chat.id, format!("New PR\n{} ({}#{}) by {}\n{}", pr.pull_request.title, pr.pull_request.head.repo.name, pr.pull_request.number, pr.pull_request.user.login, pr.pull_request.url)).await.unwrap();
|
||||||
state.bot.send_message(state.chat.id, "апрувните пж @bleki42 @balistiktw @x3paerz").await.unwrap();
|
state.bot.send_message(
|
||||||
|
state.chat.id,
|
||||||
|
format!("апрувните пж{}", api::get_reviewers_pings_inner(pr.sender.login).iter().map(|x| " ".to_string() + x).collect::<Vec<String>>().concat())
|
||||||
|
).await.unwrap();
|
||||||
|
|
||||||
Ok(
|
Ok(
|
||||||
Response::builder(200)
|
Response::builder(200)
|
||||||
.body("{ \"status\": \"sent\" }")
|
.body("{ \"status\": \"sent\" }")
|
||||||
.content_type("application/json")
|
.content_type("application/json")
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue