add push event
This commit is contained in:
@@ -127,7 +127,7 @@ pub struct GithubRepository {
|
|||||||
watchers_count: Option<u32>,
|
watchers_count: Option<u32>,
|
||||||
size: Option<u64>,
|
size: Option<u64>,
|
||||||
default_branch: Option<String>,
|
default_branch: Option<String>,
|
||||||
open_issues_count: Option<String>,
|
open_issues_count: Option<u32>,
|
||||||
is_template: Option<bool>,
|
is_template: Option<bool>,
|
||||||
topics: Option<Vec<String>>,
|
topics: Option<Vec<String>>,
|
||||||
has_issues: Option<bool>,
|
has_issues: Option<bool>,
|
||||||
@@ -139,16 +139,16 @@ pub struct GithubRepository {
|
|||||||
archived: Option<bool>,
|
archived: Option<bool>,
|
||||||
disabled: Option<bool>,
|
disabled: Option<bool>,
|
||||||
visibility: Option<String>,
|
visibility: Option<String>,
|
||||||
pushed_at: Option<String>,
|
pushed_at: Option<u64>,
|
||||||
created_at: Option<String>,
|
created_at: Option<u64>,
|
||||||
updated_at: Option<String>,
|
updated_at: Option<String>,
|
||||||
permissions: GithubRepositoryPermissions,
|
permissions: Option<GithubRepositoryPermissions>,
|
||||||
role_name: Option<String>,
|
role_name: Option<String>,
|
||||||
temp_clone_token: Option<String>,
|
temp_clone_token: Option<String>,
|
||||||
delete_branch_on_merge: Option<bool>,
|
delete_branch_on_merge: Option<bool>,
|
||||||
subscribers_count: Option<u32>,
|
subscribers_count: Option<u32>,
|
||||||
network_count: Option<u32>,
|
network_count: Option<u32>,
|
||||||
code_of_conduct: GithubRepositoryCodeOfConduct,
|
code_of_conduct: Option<GithubRepositoryCodeOfConduct>,
|
||||||
license: Option<GithubRepositoryLicense>,
|
license: Option<GithubRepositoryLicense>,
|
||||||
forks: Option<u32>,
|
forks: Option<u32>,
|
||||||
open_issues: Option<u32>,
|
open_issues: Option<u32>,
|
||||||
@@ -158,17 +158,55 @@ pub struct GithubRepository {
|
|||||||
security_and_analysis: Option<GithubRepositorySecurityAndAnalysis>
|
security_and_analysis: Option<GithubRepositorySecurityAndAnalysis>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
|
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
|
||||||
#[serde(rename_all = "lowercase")]
|
pub struct CommitAuthor {
|
||||||
|
date: Option<String>,
|
||||||
|
email: Option<String>,
|
||||||
|
name: String,
|
||||||
|
username: Option<String>
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
|
||||||
|
pub struct GithubCommit {
|
||||||
|
added: Option<Vec<String>>,
|
||||||
|
author: CommitAuthor,
|
||||||
|
committer: CommitAuthor,
|
||||||
|
distinct: bool,
|
||||||
|
id: String,
|
||||||
|
message: String,
|
||||||
|
modified: Option<Vec<String>>,
|
||||||
|
removed: Option<Vec<String>>,
|
||||||
|
timestamp: String,
|
||||||
|
tree_id: String,
|
||||||
|
url: String
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
|
||||||
|
#[serde(rename_all = "lowercase", tag = "type")]
|
||||||
pub enum BaseEvent {
|
pub enum BaseEvent {
|
||||||
Star {
|
Star {
|
||||||
starred_at: Option<String>,
|
starred_at: Option<String>,
|
||||||
|
},
|
||||||
|
Ping {},
|
||||||
|
Push {
|
||||||
|
after: String,
|
||||||
|
base_ref: Option<String>,
|
||||||
|
before: String,
|
||||||
|
commits: Vec<GithubCommit>,
|
||||||
|
compare: String,
|
||||||
|
created: bool,
|
||||||
|
deleted: bool,
|
||||||
|
forced: bool,
|
||||||
|
head_commit: Option<GithubCommit>,
|
||||||
|
pusher: CommitAuthor,
|
||||||
|
r#ref: String
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
|
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
|
||||||
pub struct Event {
|
pub struct Event {
|
||||||
action: String,
|
action: Option<String>,
|
||||||
sender: GithubUser,
|
sender: GithubUser,
|
||||||
repository: GithubRepository,
|
repository: GithubRepository,
|
||||||
organization: Option<Value>,
|
organization: Option<Value>,
|
||||||
@@ -228,6 +266,14 @@ impl<'r> OpenApiFromRequest<'r> for EventHeader<'r> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const GREEN: &'static str = "#0f890f";
|
||||||
|
const RED: &'static str = "#e73e3e";
|
||||||
|
const GREY: &'static str = "#202224";
|
||||||
|
const BLUE: &'static str = "#279adc";
|
||||||
|
const ORANGE: &'static str = "#d76a34";
|
||||||
|
const LIGHT_ORANGE: &'static str = "#d9916d";
|
||||||
|
const WHITE: &'static str = "#c3e1c3";
|
||||||
|
|
||||||
/// # executes a webhook specific to github
|
/// # executes a webhook specific to github
|
||||||
///
|
///
|
||||||
/// executes a webhook specific to github and sends a message containg the relavent info about the event
|
/// executes a webhook specific to github and sends a message containg the relavent info about the event
|
||||||
@@ -242,27 +288,68 @@ pub async fn req(db: &Db, target: Ref, token: String, event: EventHeader<'_>, da
|
|||||||
|
|
||||||
let channel = db.fetch_channel(&webhook.channel).await?;
|
let channel = db.fetch_channel(&webhook.channel).await?;
|
||||||
|
|
||||||
let body = format!(r#"{{"{}": {data}}}"#, &event.0);
|
let body = format!(r#"{}, "type": "{}"}}"#, &data[0..data.len() - 1], &event.0);
|
||||||
|
|
||||||
log::info!("{body}");
|
log::info!("{body}");
|
||||||
|
|
||||||
let Ok(event) = serde_json::from_str::<Event>(&body) else {
|
let event = match serde_json::from_str::<Event>(&body) {
|
||||||
return Err(Error::InvalidOperation)
|
Ok(event) => event,
|
||||||
|
Err(err) => {
|
||||||
|
log::error!("{err:?}");
|
||||||
|
return Err(Error::InvalidOperation);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
log::info!("{event:?}");
|
||||||
|
|
||||||
let sendable_embed = match event.event {
|
let sendable_embed = match event.event {
|
||||||
BaseEvent::Star { .. } => {
|
BaseEvent::Star { .. } => {
|
||||||
if event.action != "created" { return Ok(()) };
|
if !(event.action.as_deref() == Some("created")) { return Ok(()) };
|
||||||
|
|
||||||
SendableEmbed {
|
SendableEmbed {
|
||||||
title: Some(event.sender.login),
|
title: Some(event.sender.login),
|
||||||
description: Some(format!("[[{}] New star added]({})", event.repository.full_name, event.repository.html_url)),
|
description: Some(format!("[[{}] New star added]({})", event.repository.full_name, event.repository.html_url)),
|
||||||
colour: Some("#202224".to_string()),
|
colour: Some(GREY.to_string()),
|
||||||
icon_url: Some(event.sender.avatar_url),
|
icon_url: Some(event.sender.avatar_url),
|
||||||
url: Some(event.sender.html_url),
|
url: Some(event.sender.html_url),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
BaseEvent::Push { after, base_ref, before, commits, compare, created, deleted, forced, head_commit, pusher, r#ref } => {
|
||||||
|
let branch = r#ref.split('/').nth(2).unwrap();
|
||||||
|
|
||||||
|
if forced {
|
||||||
|
let description = format!("[{}] Branch {} was force-pushed to {}\n[compare changes]({})", event.repository.full_name, branch, &after[0..=7], compare);
|
||||||
|
|
||||||
|
SendableEmbed {
|
||||||
|
icon_url: Some(event.sender.avatar_url),
|
||||||
|
title: Some(event.sender.login),
|
||||||
|
description: Some(description),
|
||||||
|
url: Some(event.sender.html_url),
|
||||||
|
colour: Some(RED.to_string()),
|
||||||
|
..Default::default()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let title = format!("[[{}:{}] {} new commit]({})", event.repository.full_name, branch, commits.len(), compare);
|
||||||
|
let commit_description = commits
|
||||||
|
.into_iter()
|
||||||
|
.map(|commit| format!("[`{}`]({}) {} - {}", &commit.id[0..=7], commit.url, commit.message, commit.author.name))
|
||||||
|
.collect::<Vec<String>>()
|
||||||
|
.join("\n");
|
||||||
|
|
||||||
|
SendableEmbed {
|
||||||
|
title: Some(event.sender.login),
|
||||||
|
description: Some(format!("{title}\n{commit_description}")),
|
||||||
|
colour: Some(BLUE.to_string()),
|
||||||
|
icon_url: Some(event.sender.avatar_url),
|
||||||
|
url: Some(event.sender.html_url),
|
||||||
|
..Default::default()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
return Ok(())
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let message_id = Ulid::new().to_string();
|
let message_id = Ulid::new().to_string();
|
||||||
|
|||||||
Reference in New Issue
Block a user