Add new command for logging out of iamb session (#162)

This commit is contained in:
Aaditya Dhruv 2023-10-13 00:58:59 -05:00 committed by Ulyssa
parent b2b47ed7a0
commit 3b86be0545
No known key found for this signature in database
GPG key ID: F2873CA2997B83C5
4 changed files with 77 additions and 2 deletions

View file

@ -261,6 +261,7 @@ pub enum SendAction {
pub enum HomeserverAction {
/// Create a new room with an optional localpart.
CreateRoom(Option<String>, CreateRoomType, CreateRoomFlags),
Logout(String, bool),
}
/// An action that the main program loop should.

View file

@ -471,6 +471,19 @@ fn iamb_open(desc: CommandDescription, ctx: &mut ProgContext) -> ProgResult {
return Ok(step);
}
fn iamb_logout(desc: CommandDescription, ctx: &mut ProgContext) -> ProgResult {
let args = desc.arg.strings()?;
if args.len() != 1 {
return Result::Err(CommandError::InvalidArgument);
}
let iact = IambAction::from(HomeserverAction::Logout(args[0].clone(), desc.bang));
let step = CommandStep::Continue(iact.into(), ctx.context.take());
return Ok(step);
}
fn add_iamb_commands(cmds: &mut ProgramCommands) {
cmds.add_command(ProgramCommand {
name: "cancel".into(),
@ -557,6 +570,11 @@ fn add_iamb_commands(cmds: &mut ProgramCommands) {
aliases: vec![],
f: iamb_editor,
});
cmds.add_command(ProgramCommand {
name: "logout".into(),
aliases: vec![],
f: iamb_logout,
});
}
/// Initialize the default command state.

View file

@ -115,12 +115,12 @@ use modalkit::{
WindowAction,
WindowContainer,
},
base::{MoveDir1D, OpenTarget, RepeatType},
base::{CloseFlags, MoveDir1D, OpenTarget, RepeatType, TabTarget},
context::Resolve,
key::KeyManager,
store::Store,
},
input::{bindings::BindingMachine, dialog::Pager, key::TerminalKey},
input::{bindings::BindingMachine, dialog::Pager, dialog::PromptYesNo, key::TerminalKey},
widgets::{
cmdbar::CommandBarState,
screen::{FocusList, Screen, ScreenState, TabLayoutDescription},
@ -571,6 +571,21 @@ impl Application {
Ok(vec![(action.into(), ctx)])
},
HomeserverAction::Logout(user, true) => {
self.worker.logout(user)?;
let flags = CloseFlags::QUIT | CloseFlags::FORCE;
let act = TabAction::Close(TabTarget::All, flags);
Ok(vec![(act.into(), ctx)])
},
HomeserverAction::Logout(user, false) => {
let msg = "Would you like to logout?";
let act = IambAction::from(HomeserverAction::Logout(user, true));
let prompt = PromptYesNo::new(msg, vec![Action::from(act)]);
let prompt = Box::new(prompt);
Err(UIError::NeedConfirm(prompt))
},
}
}

View file

@ -455,6 +455,7 @@ pub type FetchedRoom = (MatrixRoom, DisplayName, Option<Tags>);
pub enum WorkerTask {
Init(AsyncProgramStore, ClientReply<()>),
Login(LoginStyle, ClientReply<IambResult<EditInfo>>),
Logout(String, ClientReply<IambResult<EditInfo>>),
GetInviter(Invited, ClientReply<IambResult<Option<RoomMember>>>),
GetRoom(OwnedRoomId, ClientReply<IambResult<FetchedRoom>>),
JoinRoom(String, ClientReply<IambResult<OwnedRoomId>>),
@ -480,6 +481,9 @@ impl Debug for WorkerTask {
.field(&format_args!("_"))
.finish()
},
WorkerTask::Logout(user_id, _) => {
f.debug_tuple("WorkerTask::Logout").field(user_id).finish()
},
WorkerTask::GetInviter(invite, _) => {
f.debug_tuple("WorkerTask::GetInviter").field(invite).finish()
},
@ -550,6 +554,14 @@ impl Requester {
return response.recv();
}
pub fn logout(&self, user_id: String) -> IambResult<EditInfo> {
let (reply, response) = oneshot();
self.tx.send(WorkerTask::Logout(user_id, reply)).unwrap();
return response.recv();
}
pub fn get_inviter(&self, invite: Invited) -> IambResult<Option<RoomMember>> {
let (reply, response) = oneshot();
@ -704,6 +716,10 @@ impl ClientWorker {
assert!(self.initialized);
reply.send(self.login_and_sync(style).await);
},
WorkerTask::Logout(user_id, reply) => {
assert!(self.initialized);
reply.send(self.logout(user_id).await);
},
WorkerTask::Members(room_id, reply) => {
assert!(self.initialized);
reply.send(self.members(room_id).await);
@ -1073,6 +1089,31 @@ impl ClientWorker {
Ok(Some(InfoMessage::from("Successfully logged in!")))
}
async fn logout(&mut self, user_id: String) -> IambResult<EditInfo> {
// Verify that the user is logging out of the correct profile.
let curr = self.settings.profile.user_id.as_ref();
if user_id != curr {
let msg = format!("Incorrect user ID (currently logged in as {curr})");
let err = UIError::Failure(msg);
return Err(err);
}
// Send the logout request.
if let Err(e) = self.client.logout().await {
let msg = format!("Failed to logout: {e}");
let err = UIError::Failure(msg);
return Err(err);
}
// Remove the session.json file.
std::fs::remove_file(&self.settings.session_json)?;
Ok(Some(InfoMessage::from("Sucessfully logged out")))
}
async fn direct_message(&mut self, user: OwnedUserId) -> IambResult<OwnedRoomId> {
for room in self.client.rooms() {
if !room.is_direct() {