diff --git a/harsh-client/src/commands.rs b/harsh-client/src/commands.rs index 1d0f98f..5be95e9 100644 --- a/harsh-client/src/commands.rs +++ b/harsh-client/src/commands.rs @@ -57,6 +57,30 @@ pub fn parse(input: &str) -> Option { let content = parts.next()?; ClientRequest::new_message_set_content(channel_id, id, content) } + "usrls" => ClientRequest::new_user_list(), + "usradd" => { + let name = parts.next()?; + let pass = parts.next()?; + ClientRequest::new_user_create(name, pass) + } + "usrdel" => { + let id = parts.next()?.parse().ok()?; + ClientRequest::new_user_delete(id) + } + "usrgname" => { + let id = parts.next()?.parse().ok()?; + ClientRequest::new_user_get_name(id) + } + "usrsname" => { + let id = parts.next()?.parse().ok()?; + let name = parts.next()?; + ClientRequest::new_user_set_name(id, name) + } + "usrspass" => { + let id = parts.next()?.parse().ok()?; + let pass = parts.next()?; + ClientRequest::new_user_set_pass(id, pass) + } _ => return None, }; @@ -85,6 +109,12 @@ pub const CMDS: &'static [Description] = &[ &["channel_id", "id", "content"], "set a message's content", ), + Description::new("usrls", &[], "list users"), + Description::new("usradd", &["name", "pass"], "add a user"), + Description::new("usrdel", &["id"], "delete a user"), + Description::new("usrgname", &["id"], "get a user name"), + Description::new("usrsname", &["id", "name"], "set a user name"), + Description::new("usrspass", &["id", "pass"], "set a user pass"), ]; pub fn smart_split(input: &str) -> Vec { @@ -103,12 +133,8 @@ pub fn smart_split(input: &str) -> Vec { } match char { - '\\' => { - ignoring = true; - } - '"' => { - capturing = !capturing; - } + '\\' => ignoring = true, + '"' => capturing = !capturing, ' ' if !capturing => { result.push(current); current = String::new(); diff --git a/harsh-common/src/client.rs b/harsh-common/src/client.rs index ed998da..13540be 100644 --- a/harsh-common/src/client.rs +++ b/harsh-common/src/client.rs @@ -162,6 +162,24 @@ impl ClientRequest { content, }) } + pub fn new_user_list() -> Self { + Self::UserList(UserList {}) + } + pub fn new_user_create(name: String, pass: String) -> Self { + Self::UserCreate(UserCreate { name, pass }) + } + pub fn new_user_delete(id: u64) -> Self { + Self::UserDelete(UserDelete { id }) + } + pub fn new_user_get_name(id: u64) -> Self { + Self::UserGetName(UserGetName { id }) + } + pub fn new_user_set_name(id: u64, name: String) -> Self { + Self::UserSetName(UserSetName { id, name }) + } + pub fn new_user_set_pass(id: u64, pass: String) -> Self { + Self::UserSetPass(UserSetPass { id, pass }) + } pub fn try_parse(line: &str) -> Option { use repr::Command::*; diff --git a/harsh-common/src/server.rs b/harsh-common/src/server.rs index 5a43d51..b19900d 100644 --- a/harsh-common/src/server.rs +++ b/harsh-common/src/server.rs @@ -61,7 +61,9 @@ pub struct MessageSetContent { } #[derive(Debug)] -pub struct UserList {} +pub struct UserList { + pub users: Vec, +} #[derive(Debug)] pub struct UserCreate { @@ -174,6 +176,30 @@ impl ServerRequest { }) } + pub fn new_user_list(users: Vec) -> Self { + Self::UserList(UserList { users }) + } + + pub fn new_user_create(id: u64, name: String) -> Self { + Self::UserCreate(UserCreate { id, name }) + } + + pub fn new_user_delete(id: u64) -> Self { + Self::UserDelete(UserDelete { id }) + } + + pub fn new_user_get_name(id: u64, name: Option) -> Self { + Self::UserGetName(UserGetName { id, name }) + } + + pub fn new_user_set_name(id: u64, name: String) -> Self { + Self::UserSetName(UserSetName { id, name }) + } + + pub fn new_user_set_pass(id: u64) -> Self { + Self::UserSetPass(UserSetPass { id }) + } + pub fn try_parse(line: &str) -> Option { use repr::Command::*; let command: repr::Command = serde_json::from_str(line).ok()?; @@ -221,7 +247,7 @@ impl ServerRequest { content, id, }), - user_list {} => Self::UserList(UserList {}), + user_list { users } => Self::UserList(UserList { users }), user_create { id, name } => Self::UserCreate(UserCreate { id, name }), user_delete { id } => Self::UserDelete(UserDelete { id }), user_get_name { id, name } => Self::UserGetName(UserGetName { id, name }), @@ -278,7 +304,7 @@ impl ServerRequest { id, content, }, - Self::UserList(UserList {}) => user_list {}, + Self::UserList(UserList { users }) => user_list { users }, Self::UserCreate(UserCreate { id, name }) => user_create { id, name }, Self::UserDelete(UserDelete { id }) => user_delete { id }, Self::UserGetName(UserGetName { id, name }) => user_get_name { id, name }, @@ -342,7 +368,9 @@ mod repr { id: u64, content: String, }, - user_list {}, + user_list { + users: Vec, + }, user_create { id: u64, name: String, diff --git a/harsh-server/src/gateway.rs b/harsh-server/src/gateway.rs index 17fe20f..d1c61b0 100644 --- a/harsh-server/src/gateway.rs +++ b/harsh-server/src/gateway.rs @@ -51,22 +51,54 @@ impl GatewayProc { // TODO: user UserList(c::UserList {}) => { - todo!() + let (cmd, rec) = StorageCmd::new_user_list(); + self.storage.send(cmd).unwrap(); + let result = rec.await.unwrap().iter().map(Id::to_u64).collect(); + let request = ServerRequest::new_user_list(result); + let command = SessionCmd::new_send(address, request); + self.sessions.send(command).unwrap(); } + UserCreate(c::UserCreate { name, pass }) => { - todo!() + let (cmd, rec) = StorageCmd::new_user_create(name.clone(), pass); + self.storage.send(cmd).unwrap(); + let id = rec.await.unwrap(); + let request = ServerRequest::new_user_create(id.into(), name); + let command = SessionCmd::new_broadcast(request); + self.sessions.send(command).unwrap(); } + UserDelete(c::UserDelete { id }) => { - todo!() + let command = StorageCmd::new_user_delete(id.into()); + self.storage.send(command).unwrap(); + let request = ServerRequest::new_user_delete(id.into()); + let command = SessionCmd::new_broadcast(request); + self.sessions.send(command).unwrap(); } + UserGetName(c::UserGetName { id }) => { - todo!() + let (cmd, rec) = StorageCmd::new_user_get_name(id.into()); + self.storage.send(cmd).unwrap(); + let name = rec.await.unwrap(); + let request = ServerRequest::new_user_get_name(id.into(), name); + let command = SessionCmd::new_send(address, request); + self.sessions.send(command).unwrap(); } + UserSetName(c::UserSetName { id, name }) => { - todo!() + let command = StorageCmd::new_user_set_name(id.into(), name.clone()); + self.storage.send(command).unwrap(); + let request = ServerRequest::new_user_set_name(id.into(), name); + let command = SessionCmd::new_broadcast(request); + self.sessions.send(command).unwrap(); } + UserSetPass(c::UserSetPass { id, pass }) => { - todo!() + let command = StorageCmd::new_user_set_pass(id.into(), pass); + self.storage.send(command).unwrap(); + let request = ServerRequest::new_user_set_pass(id.into()); + let command = SessionCmd::new_send(address, request); + self.sessions.send(command).unwrap(); } } } diff --git a/harsh-server/src/storage.rs b/harsh-server/src/storage.rs index ec72fdf..8fd00f2 100644 --- a/harsh-server/src/storage.rs +++ b/harsh-server/src/storage.rs @@ -74,6 +74,42 @@ impl StorageCmd { pub fn new_message_set_content(channel_id: Id, id: Id, content: String) -> Self { Self::MessageSetContent(channel_id, id, content) } + + pub fn new_user_list() -> (Self, Receiver>) { + let (sender, receiver) = oneshot::channel(); + let cmd = Self::UserList(sender); + (cmd, receiver) + } + + pub fn new_user_create(name: String, pass: String) -> (Self, Receiver) { + let (sender, receiver) = oneshot::channel(); + let cmd = Self::UserCreate(name, pass, sender); + (cmd, receiver) + } + + pub fn new_user_delete(id: Id) -> Self { + Self::UserDelete(id) + } + + pub fn new_user_get_name(id: Id) -> (Self, Receiver>) { + let (sender, receiver) = oneshot::channel(); + let cmd = Self::UserGetName(id, sender); + (cmd, receiver) + } + + pub fn new_user_set_name(id: Id, name: String) -> Self { + Self::UserSetName(id, name) + } + + pub fn new_user_get_pass(id: Id) -> (Self, Receiver>) { + let (sender, receiver) = oneshot::channel(); + let cmd = Self::UserGetPass(id, sender); + (cmd, receiver) + } + + pub fn new_user_set_pass(id: Id, pass: String) -> Self { + Self::UserSetPass(id, pass) + } } pub struct StorageProc { diff --git a/harsh-server/src/utils.rs b/harsh-server/src/utils.rs index 620cfbe..f5c0b5e 100644 --- a/harsh-server/src/utils.rs +++ b/harsh-server/src/utils.rs @@ -43,6 +43,12 @@ impl From for Id { } } +impl From for u64 { + fn from(input: Id) -> Self { + input.to_u64() + } +} + #[test] fn test_string_convertion() { let id = Id::from_now();