Skip to content

Commit

Permalink
Saving of clan mates and clogs
Browse files Browse the repository at this point in the history
  • Loading branch information
fatfingers23 committed Nov 2, 2023
1 parent ac5dcb5 commit 84588d8
Show file tree
Hide file tree
Showing 6 changed files with 212 additions and 28 deletions.
2 changes: 2 additions & 0 deletions trackscape-discord-api/src/controllers/chat_controller.rs
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,8 @@ async fn new_clan_chats(
quests_from_state,
registered_guild.clone(),
mongodb.drop_logs.clone(),
mongodb.clan_mate_collection_log_totals.clone(),
mongodb.clan_mates.clone(),
);
let possible_broadcast = handler.extract_message().await;
match possible_broadcast {
Expand Down
93 changes: 72 additions & 21 deletions trackscape-discord-api/src/services/osrs_broadcast_handler.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use log::error;
use num_format::{Locale, ToFormattedString};
use trackscape_discord_shared::database::clan_mate_collection_log_totals::ClanMateCollectionLogTotals;
use trackscape_discord_shared::database::clan_mates::ClanMates;
use trackscape_discord_shared::database::drop_logs_db::DropLogs;
use trackscape_discord_shared::database::guilds_db::RegisteredGuildModel;
use trackscape_discord_shared::ge_api::ge_api::{get_item_value_by_id, GeItemMapping};
Expand All @@ -25,21 +27,25 @@ pub struct BroadcastMessageToDiscord {
}

#[derive(Debug, Clone)]
pub struct OSRSBroadcastHandler<T: DropLogs> {
pub struct OSRSBroadcastHandler<T: DropLogs, CL: ClanMateCollectionLogTotals, CM: ClanMates> {
clan_message: ClanMessage,
item_mapping: Option<GeItemMapping>,
quests: Option<Vec<WikiQuest>>,
registered_guild: RegisteredGuildModel,
db: T,
drop_log_db: T,
collection_log_db: CL,
clan_mates_db: CM,
}

impl<T: DropLogs> OSRSBroadcastHandler<T> {
impl<T: DropLogs, CL: ClanMateCollectionLogTotals, CM: ClanMates> OSRSBroadcastHandler<T, CL, CM> {
pub fn new(
clan_message: ClanMessage,
item_mapping_from_state: Result<GeItemMapping, ()>,
quests_from_state: Result<Vec<WikiQuest>, ()>,
register_guild: RegisteredGuildModel,
db: T,
drop_log_db: T,
collection_log_db: CL,
clan_mates_db: CM,
) -> Self {
Self {
clan_message,
Expand All @@ -52,7 +58,9 @@ impl<T: DropLogs> OSRSBroadcastHandler<T> {
Err(_) => None,
},
registered_guild: register_guild,
db: db,
drop_log_db,
collection_log_db,
clan_mates_db,
}
}

Expand Down Expand Up @@ -88,7 +96,7 @@ impl<T: DropLogs> OSRSBroadcastHandler<T> {
}
None => {}
}
self.db
self.drop_log_db
.new_drop_log(drop_item.clone(), self.registered_guild.guild_id)
.await;
let is_disallowed = self
Expand Down Expand Up @@ -282,7 +290,7 @@ impl<T: DropLogs> OSRSBroadcastHandler<T> {
}
}
}
BroadcastType::CollectionLog => self.collection_log_handler(),
BroadcastType::CollectionLog => self.collection_log_handler().await,
_ => None,
}
}
Expand All @@ -299,7 +307,7 @@ impl<T: DropLogs> OSRSBroadcastHandler<T> {
None
}
Some(drop_item) => {
self.db
self.drop_log_db
.new_drop_log(drop_item.clone(), self.registered_guild.guild_id)
.await;
let is_disallowed = self.check_if_allowed_broad_cast(BroadcastType::ItemDrop);
Expand Down Expand Up @@ -521,7 +529,7 @@ impl<T: DropLogs> OSRSBroadcastHandler<T> {
false
}

fn collection_log_handler(&self) -> Option<BroadcastMessageToDiscord> {
async fn collection_log_handler(&self) -> Option<BroadcastMessageToDiscord> {
let possible_collection_log =
collection_log_broadcast_extractor(self.clan_message.message.clone());
match possible_collection_log {
Expand All @@ -533,6 +541,29 @@ impl<T: DropLogs> OSRSBroadcastHandler<T> {
None
}
Some(collection_log_broadcast) => {
let possible_clan_mate = self
.clan_mates_db
.find_or_create_clan_mate(
self.registered_guild.guild_id,
collection_log_broadcast.player_it_happened_to.clone(),
)
.await;
let _ = match possible_clan_mate {
Ok(clan_mate) => {
self.collection_log_db
.update_or_create(
clan_mate.guild_id,
clan_mate.id,
collection_log_broadcast.log_slots,
)
.await
}
Err(error) => {
error!("{:?}", error);
Err(error)
}
};

let is_disallowed = self.check_if_allowed_broad_cast(BroadcastType::CollectionLog);
if is_disallowed {
return None;
Expand All @@ -554,6 +585,8 @@ impl<T: DropLogs> OSRSBroadcastHandler<T> {
mod tests {
use super::*;
use log::info;
use trackscape_discord_shared::database::clan_mate_collection_log_totals::MockClanMateCollectionLogTotals;
use trackscape_discord_shared::database::clan_mates::MockClanMates;
use trackscape_discord_shared::database::drop_logs_db::MockDropLogs;
use trackscape_discord_shared::ge_api::ge_api::GetItem;
use trackscape_discord_shared::osrs_broadcast_extractor::osrs_broadcast_extractor::{
Expand Down Expand Up @@ -590,16 +623,18 @@ mod tests {

let quests = Ok(Vec::new());

let mut db_mock = MockDropLogs::new();
db_mock.expect_new_drop_log().returning(|_, _| {
let mut drop_log_db_mock = MockDropLogs::new();
drop_log_db_mock.expect_new_drop_log().returning(|_, _| {
info!("Should not be calling this function");
});
let handler = OSRSBroadcastHandler::new(
clan_message,
get_item_mapping,
quests,
registered_guild,
db_mock,
drop_log_db_mock,
MockClanMateCollectionLogTotals::new(),
MockClanMates::new(),
);

let extracted_message = handler.drop_item_handler().await;
Expand Down Expand Up @@ -644,8 +679,8 @@ mod tests {
}
let quests = Ok(Vec::new());

let mut db_mock = MockDropLogs::new();
db_mock.expect_new_drop_log().returning(|_, _| {
let mut drop_log_db_mock = MockDropLogs::new();
drop_log_db_mock.expect_new_drop_log().returning(|_, _| {
info!("Should not be calling this function");
});

Expand All @@ -654,7 +689,9 @@ mod tests {
get_item_mapping,
quests,
registered_guild,
db_mock,
drop_log_db_mock,
MockClanMateCollectionLogTotals::new(),
MockClanMates::new(),
);

let extracted_message = handler.drop_item_handler().await;
Expand Down Expand Up @@ -699,8 +736,8 @@ mod tests {
}
let quests = Ok(Vec::new());

let mut db_mock = MockDropLogs::new();
db_mock.expect_new_drop_log().returning(|_, _| {
let mut drop_log_db_mock = MockDropLogs::new();
drop_log_db_mock.expect_new_drop_log().returning(|_, _| {
info!("Should not be calling this function");
});

Expand All @@ -709,7 +746,9 @@ mod tests {
get_item_mapping,
quests,
registered_guild,
db_mock,
drop_log_db_mock,
MockClanMateCollectionLogTotals::new(),
MockClanMates::new(),
);

let extracted_message = handler.drop_item_handler().await;
Expand Down Expand Up @@ -755,8 +794,8 @@ mod tests {
}
let quests = Ok(Vec::new());

let mut db_mock = MockDropLogs::new();
db_mock.expect_new_drop_log().returning(|_, _| {
let mut drop_log_db_mock = MockDropLogs::new();
drop_log_db_mock.expect_new_drop_log().returning(|_, _| {
info!("Should not be calling this function");
});

Expand All @@ -765,7 +804,9 @@ mod tests {
get_item_mapping,
quests,
registered_guild,
db_mock,
drop_log_db_mock,
MockClanMateCollectionLogTotals::new(),
MockClanMates::new(),
);

let extracted_message = handler.drop_item_handler().await;
Expand Down Expand Up @@ -822,6 +863,8 @@ mod tests {
quests,
registered_guild,
MockDropLogs::new(),
MockClanMateCollectionLogTotals::new(),
MockClanMates::new(),
);

let extracted_message = handler.quest_handler();
Expand Down Expand Up @@ -876,6 +919,8 @@ mod tests {
quests,
registered_guild,
MockDropLogs::new(),
MockClanMateCollectionLogTotals::new(),
MockClanMates::new(),
);

let extracted_message = handler.quest_handler();
Expand Down Expand Up @@ -928,6 +973,8 @@ mod tests {
quests,
registered_guild,
MockDropLogs::new(),
MockClanMateCollectionLogTotals::new(),
MockClanMates::new(),
);

let extracted_message = handler.pk_handler();
Expand Down Expand Up @@ -980,6 +1027,8 @@ mod tests {
quests,
registered_guild,
MockDropLogs::new(),
MockClanMateCollectionLogTotals::new(),
MockClanMates::new(),
);

let extracted_message = handler.diary_handler();
Expand Down Expand Up @@ -1031,6 +1080,8 @@ mod tests {
quests,
registered_guild,
MockDropLogs::new(),
MockClanMateCollectionLogTotals::new(),
MockClanMates::new(),
);

let extracted_message = handler.diary_handler();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
use crate::database::ClanMateCollectionLogTotalsDb;
use anyhow::Error;
use async_trait::async_trait;
use log::info;
use mockall::automock;
use mongodb::bson::{doc, DateTime};
use mongodb::{bson, Database};
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ClanMateCollectionLogTotalModel {
pub guild_id: u64,
pub player_id: bson::oid::ObjectId,
pub total: i64,
pub created_at: DateTime,
}

impl ClanMateCollectionLogTotalModel {
pub const COLLECTION_NAME: &'static str = "clan_mate_collection_log_totals";

pub fn new(guild_id: u64, player_id: bson::oid::ObjectId, total: i64) -> Self {
Self {
guild_id,
player_id,
total,
created_at: DateTime::now(),
}
}
}

#[automock]
#[async_trait]
pub trait ClanMateCollectionLogTotals {
fn new_instance(mongodb: Database) -> Self;

async fn update_or_create(
&self,
guild_id: u64,
player_id: bson::oid::ObjectId,
total: i64,
) -> Result<(), anyhow::Error>;
}

#[async_trait]
impl ClanMateCollectionLogTotals for ClanMateCollectionLogTotalsDb {
fn new_instance(mongodb: Database) -> Self {
Self { db: mongodb }
}

async fn update_or_create(
&self,
guild_id: u64,
player_id: bson::oid::ObjectId,
total: i64,
) -> Result<(), Error> {
let collection = self.db.collection::<ClanMateCollectionLogTotalModel>(
ClanMateCollectionLogTotalModel::COLLECTION_NAME,
);

let filter = doc! {
"guild_id": bson::to_bson(&guild_id).unwrap(),
"player_id": player_id.clone(),
};

let update_result = collection
.update_one(
filter,
doc! {
"$set": {
"total": bson::to_bson(&total).unwrap()
}
},
None,
)
.await?;
info!("Update result: {:?}", update_result);
if update_result.matched_count > 0 {
return Ok(());
}
let new_total = ClanMateCollectionLogTotalModel::new(guild_id, player_id, total);
let _ = collection
.insert_one(new_total, None)
.await
.expect("Error inserting new collection log total.");
Ok(())
}
}
Loading

0 comments on commit 84588d8

Please sign in to comment.