fix postgres stuff to get to a game
This commit is contained in:
		
							parent
							
								
									dfd48e1496
								
							
						
					
					
						commit
						43579f7058
					
				
							
								
								
									
										2
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -1040,6 +1040,7 @@ checksum = "739e9d7726dc32173fed2d69d17eef3c54682169e4e20ff1d0a45dcd37063cef" | ||||
| [[package]] | ||||
| name = "libpso" | ||||
| version = "0.1.0" | ||||
| source = "git+http://git.sharnoth.com/jake/libpso#5051514fb1d3b39a7eb6ff97b624a9ceebd93e40" | ||||
| dependencies = [ | ||||
|  "chrono", | ||||
|  "psopacket", | ||||
| @ -1398,6 +1399,7 @@ dependencies = [ | ||||
| [[package]] | ||||
| name = "psopacket" | ||||
| version = "1.0.0" | ||||
| source = "git+http://git.sharnoth.com/jake/libpso#5051514fb1d3b39a7eb6ff97b624a9ceebd93e40" | ||||
| dependencies = [ | ||||
|  "proc-macro2", | ||||
|  "quote", | ||||
|  | ||||
| @ -10,9 +10,10 @@ use crate::entity::item::*; | ||||
| // TODO: better granularity?
 | ||||
| //#[derive(Error, Debug)]
 | ||||
| #[derive(Error, Debug)] | ||||
| #[error("")] | ||||
| pub enum GatewayError { | ||||
|     #[error("unknown error")] | ||||
|     Error, | ||||
|     #[error("postgres error {0}")] | ||||
|     PgError(#[from] sqlx::Error) | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1,10 +1,10 @@ | ||||
| create table character_meseta ( | ||||
|   pchar integer references character (id) not null unique, | ||||
|   meseta integer not null, | ||||
|   pchar integer references player_character (id) not null unique, | ||||
|   meseta integer not null | ||||
| ); | ||||
| 
 | ||||
| create table bank_meseta ( | ||||
|   pchar integer references character (id) not null, | ||||
|   pchar integer references player_character (id) not null, | ||||
|   bank varchar(128) not null, | ||||
|   meseta integer not null, | ||||
|   unique (pchar, bank) | ||||
| @ -12,4 +12,5 @@ create table bank_meseta ( | ||||
| 
 | ||||
| 
 | ||||
| alter table player_character | ||||
|   drop column meseta, bank_meseta; | ||||
|   drop column meseta, | ||||
|   drop column bank_meseta; | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| create table trades ( | ||||
|   id serial primary key not null, | ||||
|   character1 integer references character (id) not null, | ||||
|   character2 integer references character (id) not null, | ||||
|   character1 integer references player_character (id) not null, | ||||
|   character2 integer references player_character (id) not null | ||||
| ); | ||||
|  | ||||
| @ -49,8 +49,8 @@ pub struct PgUserSettings { | ||||
|     id: i32, | ||||
|     user_account: i32, | ||||
|     blocked_users: Vec<u8>, //[u32; 0x1E],
 | ||||
|     keyboard_config: Vec<u8>, //[u8; 0x16C],
 | ||||
|     gamepad_config: Vec<u8>, //[u8; 0x38],
 | ||||
|     key_config: Vec<u8>, //[u8; 0x16C],
 | ||||
|     joystick_config: Vec<u8>, //[u8; 0x38],
 | ||||
|     option_flags: i32, | ||||
|     shortcuts: Vec<u8>, //[u8; 0xA40],
 | ||||
|     symbol_chats: Vec<u8>, //[u8; 0x4E0],
 | ||||
| @ -64,8 +64,8 @@ impl From<PgUserSettings> for UserSettingsEntity { | ||||
|             user_id: UserAccountId(other.user_account as u32), | ||||
|             settings: settings::UserSettings { | ||||
|                 blocked_users: vec_to_array(other.blocked_users.chunks(4).map(|b| u32::from_le_bytes([b[0], b[1], b[2], b[3]])).collect()), | ||||
|                 keyboard_config: vec_to_array(other.keyboard_config), | ||||
|                 gamepad_config: vec_to_array(other.gamepad_config), | ||||
|                 keyboard_config: vec_to_array(other.key_config), | ||||
|                 gamepad_config: vec_to_array(other.joystick_config), | ||||
|                 option_flags: other.option_flags as u32, | ||||
|                 shortcuts: vec_to_array(other.shortcuts), | ||||
|                 symbol_chats: vec_to_array(other.symbol_chats), | ||||
|  | ||||
| @ -224,10 +224,21 @@ async fn save_user_settings(conn: &mut sqlx::PgConnection, settings: &UserSettin | ||||
| async fn create_character(conn: &mut sqlx::PgConnection, char: NewCharacterEntity) -> Result<CharacterEntity, GatewayError> | ||||
| { | ||||
|     let q = r#"insert into player_character
 | ||||
|               (user_account, slot, name, exp, class, section_id, costume, skin, face, head, hair, hair_r, hair_g, hair_b, prop_x, prop_y, techs, | ||||
|                config, infoboard, guildcard, power, mind, def, evade, luck, hp, tp, tech_menu, option_flags) | ||||
|               (user_account, slot, name, exp, class, | ||||
|                section_id, costume, skin, face, head, | ||||
|                hair, hair_r, hair_g, hair_b, prop_x, | ||||
|                prop_y, techs, config, infoboard, guildcard, | ||||
|                power, mind, def, evade, luck, 
 | ||||
|                hp, tp, tech_menu, option_flags, keyboard_config, | ||||
|                gamepad_config, playtime) | ||||
|               values | ||||
|               ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31) | ||||
|               ($1, $2, $3, $4, $5, 
 | ||||
|                $6, $7, $8, $9, $10, | ||||
|                $11, $12, $13, $14, $15, | ||||
|                $16, $17, $18, $19, $20, | ||||
|                $21, $22, $23, $24, $25, | ||||
|                $26, $27, $28, $29, $30, | ||||
|                $31, $32) | ||||
|               returning *;"#;
 | ||||
|     let character = sqlx::query_as::<_, PgCharacter>(q) | ||||
|         .bind(char.user_id.0) | ||||
| @ -259,6 +270,9 @@ async fn create_character(conn: &mut sqlx::PgConnection, char: NewCharacterEntit | ||||
|         .bind(char.materials.tp as i16) | ||||
|         .bind(char.tech_menu.tech_menu.to_vec()) | ||||
|         .bind(char.option_flags as i32) | ||||
|         .bind(&char.keyboard_config.keyboard_config.to_vec()) | ||||
|         .bind(&char.gamepad_config.gamepad_config.to_vec()) | ||||
|         .bind(0) | ||||
|         .fetch_one(conn).await?; | ||||
| 
 | ||||
|     Ok(character.into()) | ||||
| @ -284,8 +298,8 @@ async fn save_character(conn: &mut sqlx::PgConnection, char: &CharacterEntity) - | ||||
|     let q = r#"update player_character set
 | ||||
|                    user_account=$1, slot=$2, name=$3, exp=$4, class=$5, section_id=$6, costume=$7, skin=$8, face=$9, head=$10, hair=$11, hair_r=$12, | ||||
|                    hair_g=$13, hair_b=$14, prop_x=$15, prop_y=$16, techs=$17, config=$18, infoboard=$19, guildcard=$20, power=$21, mind=$22, def=$23, | ||||
|                    evade=$24, luck=$25, hp=$26, tp=$27, tech_menu=$28, option_flags=$29, playtime=$30 | ||||
|                    where id=$31;"#;
 | ||||
|                    evade=$24, luck=$25, hp=$26, tp=$27, tech_menu=$28, option_flags=$29, keyboard_config=$30, gamepad_config=$31, playtime=$32, | ||||
|                where id=$33;"#;
 | ||||
|     sqlx::query(q) | ||||
|         .bind(char.user_id.0) // $1
 | ||||
|         .bind(char.slot as i16) // $2
 | ||||
| @ -316,8 +330,10 @@ async fn save_character(conn: &mut sqlx::PgConnection, char: &CharacterEntity) - | ||||
|         .bind(char.materials.tp as i16) // $27
 | ||||
|         .bind(char.tech_menu.tech_menu.to_vec()) // $28
 | ||||
|         .bind(char.option_flags as i32) // $29
 | ||||
|         .bind(char.playtime as i32) // $20
 | ||||
|         .bind(char.id.0 as i32) // $31
 | ||||
|         .bind(&char.keyboard_config.keyboard_config.to_vec()) // $30
 | ||||
|         .bind(&char.gamepad_config.gamepad_config.to_vec()) // $31
 | ||||
|         .bind(char.playtime as i32) // $32
 | ||||
|         .bind(char.id.0 as i32) // $33
 | ||||
|         .execute(conn).await?; | ||||
|     Ok(()) | ||||
| } | ||||
| @ -530,7 +546,7 @@ async fn set_character_equips(conn: &mut sqlx::PgConnection, char_id: &Character | ||||
| 
 | ||||
| async fn set_character_meseta(conn: &mut sqlx::PgConnection, char_id: &CharacterEntityId, meseta: Meseta) -> Result<(), GatewayError> | ||||
| { | ||||
|     sqlx::query("insert into character_meseta values ($1, $2) on conflict (pchar) do update set items = $2") | ||||
|     sqlx::query("insert into character_meseta values ($1, $2) on conflict (pchar) do update set meseta = $2") | ||||
|         .bind(char_id.0) | ||||
|         .bind(meseta.0 as i32) | ||||
|         .execute(conn) | ||||
| @ -542,7 +558,7 @@ async fn get_character_meseta(conn: &mut sqlx::PgConnection, char_id: &Character | ||||
| { | ||||
|     #[derive(sqlx::FromRow)] | ||||
|     struct PgMeseta(i32); | ||||
|     let meseta = sqlx::query_as::<_, PgMeseta>(r#"select meseta from character_meseta where id = $1"#) | ||||
|     let meseta = sqlx::query_as::<_, PgMeseta>(r#"select meseta from character_meseta where pchar = $1"#) | ||||
|         .bind(char_id.0) | ||||
|         .fetch_one(conn) | ||||
|         .await?; | ||||
| @ -551,10 +567,10 @@ async fn get_character_meseta(conn: &mut sqlx::PgConnection, char_id: &Character | ||||
| 
 | ||||
| async fn set_bank_meseta(conn: &mut sqlx::PgConnection, char_id: &CharacterEntityId, bank: &BankName, meseta: Meseta) -> Result<(), GatewayError> | ||||
| { | ||||
|     sqlx::query("insert into bank_meseta values ($1, $2, $3) on conflict (pchar, bank) do update set items = $2") | ||||
|     sqlx::query("insert into bank_meseta values ($1, $2, $3) on conflict (pchar, bank) do update set meseta = $3") | ||||
|         .bind(char_id.0) | ||||
|         .bind(meseta.0 as i32) | ||||
|         .bind(bank.0.clone()) | ||||
|         .bind(meseta.0 as i32) | ||||
|         .execute(conn) | ||||
|         .await?; | ||||
|     Ok(()) | ||||
| @ -564,7 +580,7 @@ async fn get_bank_meseta(conn: &mut sqlx::PgConnection, char_id: &CharacterEntit | ||||
| { | ||||
|     #[derive(sqlx::FromRow)] | ||||
|     struct PgMeseta(i32); | ||||
|     let meseta = sqlx::query_as::<_, PgMeseta>(r#"select meseta from character_meseta where id = $1 and bank = $2"#) | ||||
|     let meseta = sqlx::query_as::<_, PgMeseta>(r#"select meseta from bank_meseta where pchar = $1 and bank = $2"#) | ||||
|         .bind(char_id.0) | ||||
|         .bind(bank.0.clone()) | ||||
|         .fetch_one(conn) | ||||
| @ -584,10 +600,10 @@ async fn create_trade(conn: &mut sqlx::PgConnection, char_id1: &CharacterEntityI | ||||
| 
 | ||||
| async fn set_character_playtime(conn: &mut sqlx::PgConnection, char_id: &CharacterEntityId, playtime: u32) -> Result<(), GatewayError> | ||||
| { | ||||
|     sqlx::query_as::<_, PgTradeEntity>(r#"update player_character set playtime=$2 where id=$1;"#) | ||||
|     sqlx::query(r#"update player_character set playtime=$2 where id=$1;"#) | ||||
|         .bind(char_id.0) | ||||
|         .bind(playtime) | ||||
|         .fetch_one(conn) | ||||
|         .execute(conn) | ||||
|         .await?; | ||||
|     Ok(()) | ||||
| } | ||||
|  | ||||
| @ -3,7 +3,6 @@ | ||||
| #![feature(drain_filter)] | ||||
| #![feature(try_blocks)] | ||||
| #![feature(once_cell)] | ||||
| #![feature(pin_macro)] | ||||
| #![feature(test)] | ||||
| 
 | ||||
| extern crate test; | ||||
|  | ||||
| @ -38,13 +38,18 @@ pub const CHARACTER_PORT: u16 = 12001; | ||||
| pub const SHIP_MENU_ID: u32 = 1; | ||||
| 
 | ||||
| #[derive(thiserror::Error, Debug)] | ||||
| #[error("")] | ||||
| pub enum CharacterError { | ||||
|     #[error("invalid menu selection {0} {1}")] | ||||
|     InvalidMenuSelection(u32, u32), | ||||
|     #[error("client not found {0}")] | ||||
|     ClientNotFound(ClientId), | ||||
|     CouldNotLoadSettings, | ||||
|     #[error("could not load settings {0}")] | ||||
|     CouldNotLoadSettings(GatewayError), | ||||
|     #[error("could not load characters")] | ||||
|     CouldNotLoadCharacters, | ||||
|     #[error("could not load guildcard")] | ||||
|     CouldNotLoadGuildcard, | ||||
|     #[error("gateway error {0}")] | ||||
|     GatewayError(#[from] GatewayError), | ||||
| } | ||||
| 
 | ||||
| @ -206,6 +211,7 @@ async fn new_character<EG: EntityGateway + Clone>(entity_gateway: &mut EG, user: | ||||
| 
 | ||||
|     let character = entity_gateway.create_character(character).await?; | ||||
|     entity_gateway.set_character_meseta(&character.id, Meseta(300)).await?; | ||||
|     entity_gateway.set_bank_meseta(&character.id, &BankName("".into()), Meseta(300)).await?; | ||||
| 
 | ||||
|     let new_weapon = match character.char_class { | ||||
|         CharacterClass::HUmar | CharacterClass::HUnewearl | CharacterClass::HUcast | CharacterClass::HUcaseal => item::weapon::WeaponType::Saber, | ||||
| @ -385,7 +391,7 @@ impl<EG: EntityGateway + Clone> CharacterServerState<EG> { | ||||
|             Ok(settings) => settings, | ||||
|             Err(_) => { | ||||
|                 let user_settings = NewUserSettingsEntity::new(user.id); | ||||
|                 self.entity_gateway.create_user_settings(user_settings).await.map_err(|_| CharacterError::CouldNotLoadSettings)? | ||||
|                 self.entity_gateway.create_user_settings(user_settings).await.map_err(|err| CharacterError::CouldNotLoadSettings(err))? | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|  | ||||
| @ -21,8 +21,8 @@ pub const LOGIN_PORT: u16 = 12000; | ||||
| pub const COMMUNICATION_PORT: u16 = 12123; | ||||
| 
 | ||||
| #[derive(thiserror::Error, Debug)] | ||||
| #[error("")] | ||||
| pub enum LoginError { | ||||
|     #[error("dberror")] | ||||
|     DbError | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -834,6 +834,8 @@ impl<EG: EntityGateway + Clone> ServerState for ShipServerState<EG> { | ||||
|             self.item_state.remove_character_from_room(&client.character).await | ||||
|         } | ||||
| 
 | ||||
|         block.client_location.remove_client_from_area(id).await?; | ||||
| 
 | ||||
|         Ok(neighbors.into_iter().map(|n| { | ||||
|             (n.client, pkt.clone()) | ||||
|         }).collect()) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user