Skip to content

Commit

Permalink
Feature/clog leader board views (#20)
Browse files Browse the repository at this point in the history
* start of web ui leaderboard

* trackscape ts api client

* some types clean up

* Clans page looks semi decent

* Good ui progress

* Sub router view

* Commit not to lose it

* Good enough

* Forgive me father for i have sinned
  • Loading branch information
fatfingers23 committed Nov 13, 2023
1 parent 6c87738 commit 407f779
Show file tree
Hide file tree
Showing 57 changed files with 1,671 additions and 467 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ shuttle_persist
Secrets.dev.toml
.env
.DS_Store
.shuttle-storage
.shuttle-storage
#trackscape-discord-api/ui
16 changes: 16 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ CC will not be able to be sent to Discord and parsed. This is done by the RuneLi
- [ ] Check your total kills and deaths from Discord bot
- [ ] Check Gold earned and lost from Discord bot
- [ ] In clan leaderboards
* [ ] Collection Log Leaderboards - See where you log stands with the rest of the clan
* [x] Collection Log Leaderboards - See where you log stands with the rest of the clan
* [ ] Bossing PB Leaderboards - See where you stand with the rest of the clan for fastest kills
* Simple Team Bingo - to be determined. May not happen
- [ ] Bingo tiles by certain drops
Expand Down
1 change: 1 addition & 0 deletions trackscape-discord-api/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ serde_with = "1.14.0"
bson = { version = "^2.7", default-features = false, features = [ "chrono-0_4", "serde_with" ] }
dateparser = "0.2.0"
csv = "1.3.0"
actix-cors = "0.6.4"

[dev-dependencies]
mockall = "0.11.4"
155 changes: 155 additions & 0 deletions trackscape-discord-api/src/controllers/clan_controller.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
use actix_web::{get, web, Error, HttpResponse, Scope};
use log::{error, info};
use serde::{Deserialize, Serialize};
use std::str::FromStr;
use trackscape_discord_shared::database::clan_mate_collection_log_totals::ClanMateCollectionLogTotals;
use trackscape_discord_shared::database::clan_mates::{ClanMateModel, ClanMates};
use trackscape_discord_shared::database::BotMongoDb;
use web::Data;

#[derive(Deserialize, Serialize)]
struct ClanViewModel {
id: String,
name: String,
registered_members: u64,
}

#[derive(Deserialize, Serialize)]
struct ClanDetail {
id: String,
name: String,
discord_guild_id: String,
registered_members: u64,
members: Vec<ClanMateModel>,
}

#[get("/list")]
async fn list_clans(mongodb: Data<BotMongoDb>) -> Result<HttpResponse, Error> {
let result = mongodb.guilds.list_clans().await;

match result {
Ok(clans) => {
let mut view_models: Vec<ClanViewModel> = Vec::new();
for clan in clans {
if clan.clan_name.is_none() {
continue;
}
view_models.push(ClanViewModel {
id: clan.id.to_string(),
name: clan.clan_name.unwrap(),
registered_members: mongodb
.clan_mates
.get_clan_member_count(clan.guild_id)
.await
.unwrap(),
});
}

Ok(HttpResponse::Ok().json(view_models))
}
Err(_) => Ok(HttpResponse::InternalServerError().body("Failed to list clans.")),
}
}

#[get("/{id}/detail")]
async fn detail(
mongodb: Data<BotMongoDb>,
path: web::Path<(String,)>,
) -> Result<HttpResponse, Error> {
info!("{:?}", path);
let id = path.into_inner().0;
let possible_parsed_id = bson::oid::ObjectId::from_str(id.as_str());
let id = match possible_parsed_id {
Ok(parsed_id) => parsed_id,
Err(_) => {
return Ok(HttpResponse::BadRequest().body("Invalid id format."));
}
};

let registered_guild_query = mongodb.guilds.get_by_id(id).await;
match registered_guild_query {
Ok(possible_registered_guild) => match possible_registered_guild {
None => {
return Ok(HttpResponse::NotFound().body("Clan not found."));
}
Some(registered_guild) => {
//return clan details

let detail = ClanDetail {
id: registered_guild.id.to_string(),
name: registered_guild.clan_name.unwrap(),
discord_guild_id: registered_guild.guild_id.to_string(),
registered_members: mongodb
.clan_mates
.get_clan_member_count(registered_guild.guild_id)
.await
.unwrap(),
members: mongodb
.clan_mates
.get_clan_mates_by_guild_id(registered_guild.guild_id)
.await
.unwrap(),
};
return Ok(HttpResponse::Ok().json(detail));
}
},
Err(err) => {
error!("Failed to get clan by id: {}", err);
return Ok(HttpResponse::BadRequest().body("There was an issue with the request"));
}
}
}

#[get("/{id}/collection-log")]
async fn collection_log(
mongodb: Data<BotMongoDb>,
path: web::Path<(String,)>,
) -> Result<HttpResponse, Error> {
info!("{:?}", path);
let id = path.into_inner().0;
let possible_parsed_id = bson::oid::ObjectId::from_str(id.as_str());
let id = match possible_parsed_id {
Ok(parsed_id) => parsed_id,
Err(_) => {
return Ok(HttpResponse::BadRequest().body("Invalid id format."));
}
};

let registered_guild_query = mongodb.guilds.get_by_id(id).await;
match registered_guild_query {
Ok(possible_registered_guild) => match possible_registered_guild {
None => {
return Ok(HttpResponse::NotFound().body("Clan not found."));
}
Some(registered_guild) => {
//return clan details
let result = mongodb
.clan_mate_collection_log_totals
.get_guild_totals(registered_guild.guild_id)
.await;
match result {
Ok(totals) => {
return Ok(HttpResponse::Ok().json(totals));
}
Err(err) => {
error!("Failed to get clan by id: {}", err);
return Ok(
HttpResponse::BadRequest().body("There was an issue with the request")
);
}
}
}
},
Err(err) => {
error!("Failed to get clan by id: {}", err);
return Ok(HttpResponse::BadRequest().body("There was an issue with the request"));
}
}
}

pub fn clan_controller() -> Scope {
web::scope("/clans")
.service(list_clans)
.service(detail)
.service(collection_log)
}
1 change: 1 addition & 0 deletions trackscape-discord-api/src/controllers/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
pub mod bot_info_controller;
pub mod chat_controller;
pub mod clan_controller;
pub mod drop_log_controller;
12 changes: 11 additions & 1 deletion trackscape-discord-api/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ mod websocket_server;
use crate::cache::Cache;
use crate::controllers::bot_info_controller::info_controller;
use crate::controllers::chat_controller::chat_controller;
use actix_cors::Cors;
use actix_web::web::Data;
use actix_web::{guard, web, web::ServiceConfig, Error};
use dotenv::dotenv;
Expand All @@ -25,6 +26,7 @@ use trackscape_discord_shared::ge_api::ge_api::{get_item_mapping, GeItemMapping}
use uuid::Uuid;

pub use self::websocket_server::{ChatServer, ChatServerHandle};
use crate::controllers::clan_controller::clan_controller;
use crate::controllers::drop_log_controller::drop_log_controller;
use actix_files::{Files, NamedFile};
use log::{error, info};
Expand Down Expand Up @@ -113,7 +115,14 @@ async fn actix_web(
web::scope("/api")
.service(chat_controller())
.service(info_controller())
.service(drop_log_controller()),
.service(drop_log_controller())
.service(clan_controller())
.wrap(
Cors::default()
.allow_any_origin()
.allow_any_method()
.allow_any_header(),
),
)
.service(Files::new("/", "./trackscape-discord-api/ui/").index_file("index.html"))
.app_data(web::Data::new(server_tx.clone()))
Expand All @@ -125,5 +134,6 @@ async fn actix_web(
.app_data(web::Data::new(persist.clone()))
.default_service(web::route().guard(guard::Not(guard::Get())).to(index));
};

Ok(config.into())
}
Original file line number Diff line number Diff line change
Expand Up @@ -498,7 +498,7 @@ impl<T: DropLogs, CL: ClanMateCollectionLogTotals, CM: ClanMates> OSRSBroadcastH
player_it_happened_to: exported_data.player_it_happened_to,
message: self.clan_message.message.clone(),
icon_url: exported_data.quest_reward_scroll_icon,
title: ":tada: New quest completed!".to_string(),
title,
item_quantity: None,
})
}
Expand Down
Binary file removed trackscape-discord-api/ui/.DS_Store
Binary file not shown.
1 change: 1 addition & 0 deletions trackscape-discord-api/ui/assets/ClanListView-2d27690a.css
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.list-enter-active[data-v-4930928f],.list-leave-active[data-v-4930928f]{transition:all .5s ease}.list-enter-from[data-v-4930928f],.list-leave-to[data-v-4930928f]{opacity:0;transform:translate(30px)}
1 change: 1 addition & 0 deletions trackscape-discord-api/ui/assets/ClanListView-cc522af6.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions trackscape-discord-api/ui/assets/ClanView-413261cb.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions trackscape-discord-api/ui/assets/ClanView-eabc7033.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 407f779

Please sign in to comment.