added user support
This commit is contained in:
parent
61dbde2ad5
commit
0f0dcc6f3a
6 changed files with 162 additions and 16 deletions
|
@ -57,6 +57,30 @@ pub fn parse(input: &str) -> Option<Command> {
|
||||||
let content = parts.next()?;
|
let content = parts.next()?;
|
||||||
ClientRequest::new_message_set_content(channel_id, id, content)
|
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,
|
_ => return None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -85,6 +109,12 @@ pub const CMDS: &'static [Description] = &[
|
||||||
&["channel_id", "id", "content"],
|
&["channel_id", "id", "content"],
|
||||||
"set a message's 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<String> {
|
pub fn smart_split(input: &str) -> Vec<String> {
|
||||||
|
@ -103,12 +133,8 @@ pub fn smart_split(input: &str) -> Vec<String> {
|
||||||
}
|
}
|
||||||
|
|
||||||
match char {
|
match char {
|
||||||
'\\' => {
|
'\\' => ignoring = true,
|
||||||
ignoring = true;
|
'"' => capturing = !capturing,
|
||||||
}
|
|
||||||
'"' => {
|
|
||||||
capturing = !capturing;
|
|
||||||
}
|
|
||||||
' ' if !capturing => {
|
' ' if !capturing => {
|
||||||
result.push(current);
|
result.push(current);
|
||||||
current = String::new();
|
current = String::new();
|
||||||
|
|
|
@ -162,6 +162,24 @@ impl ClientRequest {
|
||||||
content,
|
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<Self> {
|
pub fn try_parse(line: &str) -> Option<Self> {
|
||||||
use repr::Command::*;
|
use repr::Command::*;
|
||||||
|
|
|
@ -61,7 +61,9 @@ pub struct MessageSetContent {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct UserList {}
|
pub struct UserList {
|
||||||
|
pub users: Vec<u64>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct UserCreate {
|
pub struct UserCreate {
|
||||||
|
@ -174,6 +176,30 @@ impl ServerRequest {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn new_user_list(users: Vec<u64>) -> 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<String>) -> 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<Self> {
|
pub fn try_parse(line: &str) -> Option<Self> {
|
||||||
use repr::Command::*;
|
use repr::Command::*;
|
||||||
let command: repr::Command = serde_json::from_str(line).ok()?;
|
let command: repr::Command = serde_json::from_str(line).ok()?;
|
||||||
|
@ -221,7 +247,7 @@ impl ServerRequest {
|
||||||
content,
|
content,
|
||||||
id,
|
id,
|
||||||
}),
|
}),
|
||||||
user_list {} => Self::UserList(UserList {}),
|
user_list { users } => Self::UserList(UserList { users }),
|
||||||
user_create { id, name } => Self::UserCreate(UserCreate { id, name }),
|
user_create { id, name } => Self::UserCreate(UserCreate { id, name }),
|
||||||
user_delete { id } => Self::UserDelete(UserDelete { id }),
|
user_delete { id } => Self::UserDelete(UserDelete { id }),
|
||||||
user_get_name { id, name } => Self::UserGetName(UserGetName { id, name }),
|
user_get_name { id, name } => Self::UserGetName(UserGetName { id, name }),
|
||||||
|
@ -278,7 +304,7 @@ impl ServerRequest {
|
||||||
id,
|
id,
|
||||||
content,
|
content,
|
||||||
},
|
},
|
||||||
Self::UserList(UserList {}) => user_list {},
|
Self::UserList(UserList { users }) => user_list { users },
|
||||||
Self::UserCreate(UserCreate { id, name }) => user_create { id, name },
|
Self::UserCreate(UserCreate { id, name }) => user_create { id, name },
|
||||||
Self::UserDelete(UserDelete { id }) => user_delete { id },
|
Self::UserDelete(UserDelete { id }) => user_delete { id },
|
||||||
Self::UserGetName(UserGetName { id, name }) => user_get_name { id, name },
|
Self::UserGetName(UserGetName { id, name }) => user_get_name { id, name },
|
||||||
|
@ -342,7 +368,9 @@ mod repr {
|
||||||
id: u64,
|
id: u64,
|
||||||
content: String,
|
content: String,
|
||||||
},
|
},
|
||||||
user_list {},
|
user_list {
|
||||||
|
users: Vec<u64>,
|
||||||
|
},
|
||||||
user_create {
|
user_create {
|
||||||
id: u64,
|
id: u64,
|
||||||
name: String,
|
name: String,
|
||||||
|
|
|
@ -51,22 +51,54 @@ impl GatewayProc {
|
||||||
|
|
||||||
// TODO: user
|
// TODO: user
|
||||||
UserList(c::UserList {}) => {
|
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 }) => {
|
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 }) => {
|
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 }) => {
|
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 }) => {
|
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 }) => {
|
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,42 @@ impl StorageCmd {
|
||||||
pub fn new_message_set_content(channel_id: Id, id: Id, content: String) -> Self {
|
pub fn new_message_set_content(channel_id: Id, id: Id, content: String) -> Self {
|
||||||
Self::MessageSetContent(channel_id, id, content)
|
Self::MessageSetContent(channel_id, id, content)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn new_user_list() -> (Self, Receiver<Vec<Id>>) {
|
||||||
|
let (sender, receiver) = oneshot::channel();
|
||||||
|
let cmd = Self::UserList(sender);
|
||||||
|
(cmd, receiver)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_user_create(name: String, pass: String) -> (Self, Receiver<Id>) {
|
||||||
|
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<Option<String>>) {
|
||||||
|
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<Option<String>>) {
|
||||||
|
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 {
|
pub struct StorageProc {
|
||||||
|
|
|
@ -43,6 +43,12 @@ impl From<u64> for Id {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<Id> for u64 {
|
||||||
|
fn from(input: Id) -> Self {
|
||||||
|
input.to_u64()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_string_convertion() {
|
fn test_string_convertion() {
|
||||||
let id = Id::from_now();
|
let id = Id::from_now();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue