1 use mysql; |
1 use mysql; |
2 use mysql::{error::DriverError, error::Error, from_row_opt, params}; |
2 use mysql::{error::DriverError, error::Error, from_row_opt, params}; |
3 use openssl::sha::sha1; |
3 use openssl::sha::sha1; |
4 |
4 |
5 use crate::handlers::{AccountInfo, Sha1Digest}; |
5 use crate::handlers::{AccountInfo, Sha1Digest}; |
|
6 |
|
7 const CHECK_ACCOUNT_EXISTS_QUERY: &str = |
|
8 r"SELECT 1 FROM users WHERE users.name = :username LIMIT 1"; |
6 |
9 |
7 const GET_ACCOUNT_QUERY: &str = |
10 const GET_ACCOUNT_QUERY: &str = |
8 r"SELECT CASE WHEN users.status = 1 THEN users.pass ELSE '' END, |
11 r"SELECT CASE WHEN users.status = 1 THEN users.pass ELSE '' END, |
9 (SELECT COUNT(users_roles.rid) FROM users_roles WHERE users.uid = users_roles.uid AND users_roles.rid = 3), |
12 (SELECT COUNT(users_roles.rid) FROM users_roles WHERE users.uid = users_roles.uid AND users_roles.rid = 3), |
10 (SELECT COUNT(users_roles.rid) FROM users_roles WHERE users.uid = users_roles.uid AND users_roles.rid = 13) |
13 (SELECT COUNT(users_roles.rid) FROM users_roles WHERE users.uid = users_roles.uid AND users_roles.rid = 13) |
11 FROM users WHERE users.name = :username"; |
14 FROM users WHERE users.name = :username"; |
12 |
15 |
13 const STORE_STATS_QUERY: &str = r"INSERT INTO gameserver_stats |
16 const STORE_STATS_QUERY: &str = r"INSERT INTO gameserver_stats |
14 (players, rooms, last_update) |
17 (players, rooms, last_update) |
15 VALUES |
18 VALUES |
16 (:players, :rooms, UNIX_TIMESTAMP())"; |
19 (:players, :rooms, UNIX_TIMESTAMP())"; |
17 |
20 |
18 const GET_REPLAY_NAME_QUERY: &str = r"SELECT filename FROM achievements WHERE id = :id"; |
21 const GET_REPLAY_NAME_QUERY: &str = r"SELECT filename FROM achievements WHERE id = :id"; |
19 |
22 |
20 struct ServerStatistics { |
23 struct ServerStatistics { |
21 rooms: u32, |
24 rooms: u32, |
35 |
38 |
36 pub fn connect(&mut self, url: &str) -> Result<(), Error> { |
39 pub fn connect(&mut self, url: &str) -> Result<(), Error> { |
37 self.pool = Some(mysql::Pool::new(url)?); |
40 self.pool = Some(mysql::Pool::new(url)?); |
38 |
41 |
39 Ok(()) |
42 Ok(()) |
|
43 } |
|
44 |
|
45 pub fn is_registered(&mut self, nick: &str) -> Result<bool, Error> { |
|
46 if let Some(pool) = &self.pool { |
|
47 let is_registered = pool |
|
48 .first_exec(CHECK_ACCOUNT_EXISTS_QUERY, params! { "username" => nick })? |
|
49 .is_some(); |
|
50 Ok(is_registered) |
|
51 } else { |
|
52 Err(DriverError::SetupError.into()) |
|
53 } |
40 } |
54 } |
41 |
55 |
42 pub fn get_account( |
56 pub fn get_account( |
43 &mut self, |
57 &mut self, |
44 nick: &str, |
58 nick: &str, |
99 pub fn get_replay_name(&mut self, replay_id: u32) -> Result<Option<String>, Error> { |
113 pub fn get_replay_name(&mut self, replay_id: u32) -> Result<Option<String>, Error> { |
100 if let Some(pool) = &self.pool { |
114 if let Some(pool) = &self.pool { |
101 if let Some(row) = |
115 if let Some(row) = |
102 pool.first_exec(GET_REPLAY_NAME_QUERY, params! { "id" => replay_id })? |
116 pool.first_exec(GET_REPLAY_NAME_QUERY, params! { "id" => replay_id })? |
103 { |
117 { |
104 let (filename) = from_row_opt::<(String)>(row)?; |
118 let filename = from_row_opt::<(String)>(row)?; |
105 Ok(Some(filename)) |
119 Ok(Some(filename)) |
106 } else { |
120 } else { |
107 Ok(None) |
121 Ok(None) |
108 } |
122 } |
109 } else { |
123 } else { |