Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/B-2U/ISAC
Browse files Browse the repository at this point in the history
  • Loading branch information
B-2U committed Aug 2, 2024
2 parents 08091a8 + 1ff8037 commit 8a8c791
Show file tree
Hide file tree
Showing 8 changed files with 410 additions and 21 deletions.
308 changes: 307 additions & 1 deletion Cargo.lock

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@
name = "isac-rs"
version = "0.1.0"
edition = "2021"
rust-version = "1.76"
rust-version = "1.80"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
bytes = "1.5.0"
chrono = "0.4.31"
dotenv = "0.15.0"
fantoccini = "0.21.0"
futures = "0.3.28"
fuzzy-matcher = "0.3.7"
handlebars = "6.0.0"
headless_chrome = "1.0.12"
itertools = "0.13.0"
libc = "0.2.153"
lru = "0.12.3"
Expand Down
4 changes: 2 additions & 2 deletions renderer/template/overall.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -356,9 +356,9 @@
<img class="dogtag-dogtag" src="{{user.dogtag}}" onerror="this.style.display='none'">
<img class="dogtag-dogtag_bg" src="{{user.dogtag_bg}}" onerror=" this.style.display='none'">
</div>
{{#clan}}
{{#if clan}}
<span style="color: {{clan.color}}; font-weight: bold;">[{{clan.tag}}]</span>
{{/clan}}
{{/if}}
<span class="user-id" style="font-weight: bold;">{{user.ign}}
<sup style="color:#AAAAAA;font-size:25px;">{{user.karma}}</sup>
</span>
Expand Down
16 changes: 8 additions & 8 deletions renderer/template/recent.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@
<div class="division-stats-label avg-frags-label label-text">Frags</div>
<div class="division-stats-label avg-planes-label label-text">Planes</div>
</div>
{{#div.pvp_solo}}
{{#if div.pvp_solo}}
<div class="division-stats-row">
<div class="division-stats-label division-type-label division-type-pvp_solo">Solo</div>
<div class="division-stats-data battles-data division-type-pvp_solo">{{div.pvp_solo.battles}}</div>
Expand All @@ -290,8 +290,8 @@
<div class="division-stats-data avg-planes-data division-type-pvp_solo"
style="color: {{div.pvp_solo.planes.color}};">{{div.pvp_solo.planes.value}}</div>
</div>
{{/div.pvp_solo}}
{{#div.pvp_div2}}
{{/if}}
{{#if div.pvp_div2}}
<div class="division-stats-row">
<div class="division-stats-label division-type-label division-type-pvp_div2">Div 2</div>
<div class="division-stats-data battles-data division-type-pvp_div2">{{div.pvp_div2.battles}}</div>
Expand All @@ -308,8 +308,8 @@
<div class="division-stats-data avg-planes-data division-type-pvp_div2"
style="color: {{div.pvp_div2.planes.color}};">{{div.pvp_div2.planes.value}}</div>
</div>
{{/div.pvp_div2}}
{{#div.pvp_div3}}
{{/if}}
{{#if div.pvp_div3}}
<div class="division-stats-row">
<div class="division-stats-label division-type-label division-type-pvp_div3">Div 3</div>
<div class="division-stats-data battles-data division-type-pvp_div3">{{div.pvp_div3.battles}}</div>
Expand All @@ -326,8 +326,8 @@
<div class="division-stats-data avg-planes-data division-type-pvp_div3"
style="color: {{div.pvp_div3.planes.color}};">{{div.pvp_div3.planes.value}}</div>
</div>
{{/div.pvp_div3}}
{{#div.rank_solo}}
{{/if}}
{{#if div.rank_solo}}
<div class="division-stats-row">
<div class="division-stats-label division-type-label division-type-rank_solo">Rank</div>
<div class="division-stats-data battles-data division-type-rank_solo">{{div.rank_solo.battles}}
Expand All @@ -345,7 +345,7 @@
<div class="division-stats-data avg-planes-data division-type-rank_solo"
style="color: {{div.rank_solo.planes.color}};">{{div.rank_solo.planes.value}}</div>
</div>
{{/div.rank_solo}}
{{/if}}
</div>
</section>
<div class="divider"></div>
Expand Down
2 changes: 1 addition & 1 deletion src/cmds/wws.rs
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ pub async fn func_wws(ctx: &Context<'_>, partial_player: PartialPlayer) -> Resul
clan: clan.clone(),
user: player.clone(),
};
let img = overall_data.render(&ctx.data().client).await?;
let img = overall_data.render_test(&ctx.data().renderer).await?;

let mut view = WwsView::new(overall_data, partial_player);
let mut msg = ctx
Expand Down
12 changes: 4 additions & 8 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
mod cmds;
use cmds::*;
mod dc_utils;
mod renderer;
mod structs;
mod tasks;
mod template_data;
Expand All @@ -18,11 +19,11 @@ use tracing::{error, info, warn};
use tracing_subscriber::{prelude::*, EnvFilter};

use crate::{
renderer::Renderer,
structs::{
Banner, ExpectedJs, GuildDefaultRegion, Linked, LittleConstant, Patrons, ShipLeaderboard,
ShipsPara,
},
tasks::launch_renderer,
utils::{error_handler, LoadSaveFromJson},
};

Expand Down Expand Up @@ -147,8 +148,6 @@ async fn main() {

let webhook_http = bot.http.clone();

let _renderer = launch_renderer().await; // it's used in linux specific code below

tokio::spawn(async move {
if let Err(why) = bot.start().await {
error!("Client error: {:?}", why);
Expand Down Expand Up @@ -178,11 +177,6 @@ async fn main() {
lb.save_json().await;
info!("Saved leaderboard.json");

// close renderer
#[cfg(target_os = "linux")]
if let Some(renderer_pid) = _renderer.id() {
unsafe { libc::kill(renderer_pid as i32, libc::SIGINT) };
}
shard_manager.shutdown_all().await;
}

Expand Down Expand Up @@ -212,6 +206,7 @@ pub struct DataInner {
guild_default: tokio::sync::RwLock<GuildDefaultRegion>,
banner: tokio::sync::RwLock<Banner>,
leaderboard: Mutex<ShipLeaderboard>,
renderer: Renderer,
}

impl Default for DataInner {
Expand All @@ -227,6 +222,7 @@ impl Default for DataInner {
guild_default: tokio::sync::RwLock::new(GuildDefaultRegion::load_json_sync()),
banner: tokio::sync::RwLock::new(Banner::load_json_sync()),
leaderboard: Mutex::new(ShipLeaderboard::load_json_sync()),
renderer: Renderer::launch(),
}
}
}
80 changes: 80 additions & 0 deletions src/renderer.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
use bytes::Bytes;
use handlebars::Handlebars;
use headless_chrome::{protocol::cdp::Page::CaptureScreenshotFormatOption, Browser, LaunchOptions};
use serde::Serialize;
use std::fs;

use crate::utils::{IsacError, IsacInfo};

pub struct Renderer {
browser: Browser,
reg: Handlebars<'static>,
}

impl Renderer {
pub fn launch() -> Self {
const TEMPLATE_PATH: &str = "./renderer/template/";
// let args = [
// "-allow-file-access-from-files",
// "-disable-web-security",
// "--no-sandbox",
// ]
// .into_iter()
// .map(OsStr::new)
// .collect();

let browser = Browser::new(
LaunchOptions::default_builder()
.devtools(false)
// .args(args)
.build()
.unwrap(),
)
.unwrap();
let mut reg = Handlebars::new();

let templates = fs::read_dir(TEMPLATE_PATH)
.unwrap()
.filter_map(|entry| {
entry.ok().and_then(|e| {
let path = e.path();
if path.is_file() && path.extension().unwrap_or_default() == "hbs" {
Some(path)
} else {
None
}
})
})
.collect::<Vec<_>>();
for path in templates {
reg.register_template_file(path.file_stem().unwrap().to_str().unwrap(), &path)
.unwrap();
}
Self { browser, reg }
}

pub async fn render(&self, template: &str, data: impl Serialize) -> Result<Bytes, IsacError> {
let js_script = format!(
"document.write(`{}`);",
self.reg
.render(template, &data)
.unwrap()
.replace("`", "\\`") // Escape backticks in the HTML content
);
let tab = self.browser.new_tab().unwrap();
tab.evaluate(&js_script, false).unwrap();
let img = tab
.find_element(".main")
.and_then(|element| element.capture_screenshot(CaptureScreenshotFormatOption::Png))
.map_err(|_| IsacInfo::GeneralError {
msg: "screenshot failed".to_string(),
})?;
let _ = tab.close_target();
Ok(Bytes::from(img))
}
}

#[test]
fn lauch_renderer() {
Renderer::launch();
}
4 changes: 4 additions & 0 deletions src/template_data/overall.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use std::collections::HashMap;

use super::Render;
use crate::{
renderer::Renderer,
structs::{PartialClan, Player, ShipClass, ShipTier, Statistic},
utils::{IsacError, IsacInfo},
};
Expand Down Expand Up @@ -50,6 +51,9 @@ impl OverallTemplate {
msg: "screenshot failed".to_string(),
})?)
}
pub async fn render_test(&self, renderer: &Renderer) -> Result<Bytes, IsacError> {
renderer.render("overall", &self).await
}
}

#[derive(Serialize, Deserialize, Debug)]
Expand Down

0 comments on commit 8a8c791

Please sign in to comment.