2019-10-06 11:22:33 -07:00
|
|
|
use std::collections::HashMap;
|
2019-12-09 23:11:27 -08:00
|
|
|
use std::default::Default;
|
2019-10-06 11:22:33 -07:00
|
|
|
|
|
|
|
use crate::entity::account::*;
|
|
|
|
use crate::entity::character::*;
|
|
|
|
use crate::entity::gateway::EntityGateway;
|
2019-12-09 23:11:27 -08:00
|
|
|
use crate::entity::item::*;
|
2019-10-06 11:22:33 -07:00
|
|
|
|
|
|
|
use libpso::character::settings;
|
2019-12-09 23:11:27 -08:00
|
|
|
use libpso::item;
|
2019-10-06 11:22:33 -07:00
|
|
|
|
|
|
|
use std::sync::{Arc, Mutex};
|
|
|
|
|
2019-10-09 22:45:14 -07:00
|
|
|
#[derive(Clone)]
|
2019-10-06 11:22:33 -07:00
|
|
|
pub struct InMemoryGateway {
|
2020-03-29 16:11:14 -07:00
|
|
|
users: Arc<Mutex<HashMap<UserAccountId, UserAccountEntity>>>,
|
|
|
|
user_settings: Arc<Mutex<HashMap<UserSettingsId, UserSettingsEntity>>>,
|
2020-03-29 14:40:24 -07:00
|
|
|
characters: Arc<Mutex<HashMap<CharacterEntityId, CharacterEntity>>>,
|
2020-03-29 14:53:51 -07:00
|
|
|
items: Arc<Mutex<HashMap<ItemEntityId, ItemEntity>>>,
|
2019-10-06 11:22:33 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
impl InMemoryGateway {
|
|
|
|
pub fn new() -> InMemoryGateway {
|
|
|
|
InMemoryGateway {
|
|
|
|
users: Arc::new(Mutex::new(HashMap::new())),
|
|
|
|
user_settings: Arc::new(Mutex::new(HashMap::new())),
|
|
|
|
characters: Arc::new(Mutex::new(HashMap::new())),
|
2019-12-09 23:11:27 -08:00
|
|
|
items: Arc::new(Mutex::new(HashMap::new())),
|
2019-10-06 11:22:33 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl EntityGateway for InMemoryGateway {
|
2020-03-29 16:11:14 -07:00
|
|
|
fn get_user_by_id(&self, id: UserAccountId) -> Option<UserAccountEntity> {
|
2019-10-06 11:22:33 -07:00
|
|
|
let users = self.users.lock().unwrap();
|
|
|
|
users.get(&id).map(|k| k.clone())
|
|
|
|
}
|
|
|
|
|
2020-03-29 16:11:14 -07:00
|
|
|
fn get_user_by_name(&self, username: String) -> Option<UserAccountEntity> {
|
2019-10-06 11:22:33 -07:00
|
|
|
let users = self.users.lock().unwrap();
|
|
|
|
users
|
|
|
|
.iter()
|
|
|
|
.find(|(_, k)| k.username == username)
|
|
|
|
.map(|(_, k)| k.clone())
|
|
|
|
}
|
|
|
|
|
2020-03-29 22:00:07 -07:00
|
|
|
fn set_user(&mut self, user: &mut UserAccountEntity) {
|
2019-10-06 11:22:33 -07:00
|
|
|
let mut users = self.users.lock().unwrap();
|
2020-03-29 22:00:07 -07:00
|
|
|
if let None = user.id {
|
|
|
|
let id = users
|
|
|
|
.iter()
|
|
|
|
.fold(0, |sum, (i, _)| std::cmp::max(sum, i.0))
|
|
|
|
+ 1;
|
|
|
|
user.id = Some(UserAccountId(id));
|
|
|
|
}
|
|
|
|
users.insert(user.id.unwrap(), user.clone());
|
2019-10-06 11:22:33 -07:00
|
|
|
}
|
|
|
|
|
2020-03-29 16:11:14 -07:00
|
|
|
fn get_user_settings_by_user(&self, user: &UserAccountEntity) -> Option<UserSettingsEntity> {
|
2019-10-06 11:22:33 -07:00
|
|
|
let user_settings = self.user_settings.lock().unwrap();
|
|
|
|
user_settings
|
|
|
|
.iter()
|
2020-03-29 22:00:07 -07:00
|
|
|
.find(|(_, k)| k.user_id == user.id.unwrap())
|
2019-10-06 11:22:33 -07:00
|
|
|
.map(|(_, k)| k.clone())
|
|
|
|
}
|
|
|
|
|
2020-03-29 22:00:07 -07:00
|
|
|
|
|
|
|
fn set_user_settings(&mut self, user_setting: &mut UserSettingsEntity) {
|
2019-10-06 11:22:33 -07:00
|
|
|
let mut user_settings = self.user_settings.lock().unwrap();
|
2020-03-29 22:00:07 -07:00
|
|
|
if let None = user_setting.id {
|
|
|
|
let id = user_settings
|
|
|
|
.iter()
|
|
|
|
.fold(0, |sum, (i, _)| std::cmp::max(sum, i.0))
|
|
|
|
+ 1;
|
|
|
|
user_setting.id = Some(UserSettingsId(id));
|
|
|
|
}
|
|
|
|
user_settings.insert(user_setting.id.unwrap(), user_setting.clone());
|
2019-10-06 11:22:33 -07:00
|
|
|
}
|
|
|
|
|
2020-03-29 16:11:14 -07:00
|
|
|
fn get_characters_by_user(&self, user: &UserAccountEntity) -> [Option<CharacterEntity>; 4] {
|
2019-10-06 11:22:33 -07:00
|
|
|
let characters = self.characters.lock().unwrap();
|
|
|
|
let mut chars = [None; 4];
|
|
|
|
characters
|
|
|
|
.iter()
|
2020-03-29 22:00:07 -07:00
|
|
|
.filter(|(_, c)| c.user_id == user.id.unwrap())
|
2019-10-06 11:22:33 -07:00
|
|
|
.for_each(|(_, c)| chars[c.slot as usize] = Some(c.clone()));
|
|
|
|
chars
|
|
|
|
}
|
|
|
|
|
2020-03-29 22:00:07 -07:00
|
|
|
fn set_character(&mut self, char: &mut CharacterEntity) {
|
2019-10-06 11:22:33 -07:00
|
|
|
let mut characters = self.characters.lock().unwrap();
|
2020-03-29 22:00:07 -07:00
|
|
|
if let None = char.id {
|
|
|
|
let id = characters
|
|
|
|
.iter()
|
|
|
|
.fold(0, |sum, (i, _)| std::cmp::max(sum, i.0))
|
|
|
|
+ 1;
|
|
|
|
char.id = Some(CharacterEntityId(id));
|
|
|
|
}
|
|
|
|
characters.insert(char.id.unwrap(), char.clone());
|
2019-10-06 11:22:33 -07:00
|
|
|
}
|
|
|
|
|
2020-03-29 22:00:07 -07:00
|
|
|
fn get_guild_card_data_by_user(&self, user: &UserAccountEntity) -> GuildCardDataEntity {
|
|
|
|
GuildCardDataEntity::new(user.id.unwrap())
|
2019-10-06 11:22:33 -07:00
|
|
|
}
|
2019-12-09 23:11:27 -08:00
|
|
|
|
2020-03-29 22:00:07 -07:00
|
|
|
fn set_item(&mut self, item: &mut ItemEntity) {
|
2019-12-09 23:11:27 -08:00
|
|
|
let mut items = self.items.lock().unwrap();
|
2020-03-29 22:00:07 -07:00
|
|
|
if let None = item.id {
|
|
|
|
let id = items
|
|
|
|
.iter()
|
|
|
|
.fold(0, |sum, (i, _)| std::cmp::max(sum, i.0))
|
|
|
|
+ 1;
|
|
|
|
item.id = Some(ItemEntityId(id));
|
|
|
|
}
|
|
|
|
items.insert(item.id.unwrap(), item.clone());
|
2019-12-09 23:11:27 -08:00
|
|
|
}
|
|
|
|
|
2020-03-29 14:53:51 -07:00
|
|
|
fn get_items_by_character(&self, character: &CharacterEntity) -> Vec<ItemEntity> {
|
2019-12-09 23:11:27 -08:00
|
|
|
let items = self.items.lock().unwrap();
|
|
|
|
items
|
|
|
|
.iter()
|
|
|
|
.filter(|(_, k)| {
|
2020-01-18 23:36:28 -08:00
|
|
|
match k.location {
|
2020-03-29 22:00:07 -07:00
|
|
|
ItemLocation::Inventory{character_id, ..} => character_id == character.id.unwrap(),
|
|
|
|
ItemLocation::Bank{character_id, ..} => character_id == character.id.unwrap(),
|
2020-01-18 23:36:28 -08:00
|
|
|
_ => false
|
2019-12-09 23:11:27 -08:00
|
|
|
}
|
|
|
|
})
|
|
|
|
.map(|(_, k)| {
|
|
|
|
k.clone()
|
|
|
|
})
|
|
|
|
.collect()
|
|
|
|
}
|
2019-10-06 11:22:33 -07:00
|
|
|
}
|