elseware/src/entity/gateway/inmemory.rs

148 lines
4.4 KiB
Rust
Raw Normal View History

use std::collections::HashMap;
2019-12-09 23:11:27 -08:00
use std::default::Default;
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::*;
use libpso::character::settings;
2019-12-09 23:11:27 -08:00
use libpso::item;
use std::sync::{Arc, Mutex};
#[derive(Clone)]
pub struct InMemoryGateway {
users: Arc<Mutex<HashMap<u32, UserAccount>>>,
user_settings: Arc<Mutex<HashMap<u32, UserSettings>>>,
//guildcard: Arc<Mutex<HashMap<u32, GuildCardData>>>,
characters: Arc<Mutex<HashMap<u32, Character>>>,
2019-12-09 23:11:27 -08:00
items: Arc<Mutex<HashMap<u32, Item>>>,
}
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())),
}
}
}
impl EntityGateway for InMemoryGateway {
fn get_user_by_id(&self, id: u32) -> Option<UserAccount> {
let users = self.users.lock().unwrap();
users.get(&id).map(|k| k.clone())
}
fn get_user_by_name(&self, username: String) -> Option<UserAccount> {
let users = self.users.lock().unwrap();
users
.iter()
.find(|(_, k)| k.username == username)
.map(|(_, k)| k.clone())
}
fn set_user(&mut self, user: &UserAccount) {
let mut users = self.users.lock().unwrap();
users.insert(user.id, user.clone());
}
fn get_user_settings_by_user(&self, user: &UserAccount) -> Option<UserSettings> {
let user_settings = self.user_settings.lock().unwrap();
user_settings
.iter()
.find(|(_, k)| k.id == user.id)
.map(|(_, k)| k.clone())
}
fn create_user_settings_by_user(&self, user: &UserAccount) -> UserSettings {
let mut user_settings = self.user_settings.lock().unwrap();
let id = user_settings
.iter()
.fold(0, |sum, (i, _)| std::cmp::max(sum, *i))
+ 1;
let new_settings = UserSettings {
id: id,
user_id: user.id,
settings: settings::UserSettings::default(),
};
user_settings.insert(id, new_settings.clone());
new_settings
}
fn get_characters_by_user(&self, user: &UserAccount) -> [Option<Character>; 4] {
let characters = self.characters.lock().unwrap();
let mut chars = [None; 4];
characters
.iter()
.filter(|(_, c)| c.user_id == user.id)
.for_each(|(_, c)| chars[c.slot as usize] = Some(c.clone()));
chars
}
fn new_character_by_user(&mut self, user: &UserAccount) -> Character {
let mut characters = self.characters.lock().unwrap();
let id = characters
.iter()
.fold(0, |sum, (i, _)| std::cmp::max(sum, *i))
+ 1;
let mut c = Character::default();
c.id = id;
c.user_id = user.id;
characters.insert(id, c.clone());
c
}
fn set_character(&mut self, char: &Character) {
let mut characters = self.characters.lock().unwrap();
characters.insert(char.id, char.clone());
}
fn get_guild_card_data_by_user(&self, _user: &UserAccount) -> GuildCardData {
GuildCardData::default()
}
2019-12-09 23:11:27 -08:00
fn new_item(&mut self, item: item::Item, location: ItemLocation) -> Item {
let mut items = self.items.lock().unwrap();
let id = items
.iter()
.fold(0, |sum, (i, _)| std::cmp::max(sum, *i))
+ 1;
let new_item = Item {
id: id,
location: location,
item: item,
};
items.insert(id, new_item.clone());
new_item
}
fn set_item(&self, item: &Item) {
let mut items = self.items.lock().unwrap();
items.insert(item.id, item.clone());
}
fn get_items_by_character(&self, character: &Character) -> Vec<Item> {
let items = self.items.lock().unwrap();
items
.iter()
.filter(|(_, k)| {
if let ItemLocation::Inventory{character_id, index} = k.location {
character_id == character.id
}
else {
false
}
})
.map(|(_, k)| {
k.clone()
})
.collect()
}
}