Cargo fmt.

main
Werner Kroneman 2023-12-11 17:12:16 +01:00
parent 837dca3e15
commit 5064adbd21
8 changed files with 79 additions and 65 deletions

View File

@ -14,8 +14,8 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use chrono::{DateTime, FixedOffset};
use crate::types::{DirectMessage, MessageDeliveryError, MucMessage, Nickname};
use chrono::{DateTime, FixedOffset};
/// An outgoing status for a message.
///
@ -42,7 +42,6 @@ pub enum MessageInOut {
///
/// This is a trait, because MUC messages and direct messages are subtly different.
pub trait Message {
/// Whether the message is incoming or outgoing.
/// If outgoing, also contains the status of the message.
fn in_out(&self) -> &MessageInOut;

View File

@ -15,10 +15,10 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::passwords::Password;
use jid::BareJid;
use std::fmt::Debug;
use chrono::{DateTime, FixedOffset};
use jid::BareJid;
use message::{Message, MessageInOut};
use std::fmt::Debug;
pub mod message;
pub mod room;
@ -86,4 +86,3 @@ pub struct LoginCredentials {
pub struct MessageDeliveryError {
pub error: String,
}

View File

@ -50,7 +50,6 @@ impl<'a> TryInto<&'a mut DirectMessageRoom> for &'a mut Room {
_ => Err(WrongRoomType),
}
}
}
impl<'a> TryInto<&'a mut MucRoom> for &'a mut Room {
@ -62,5 +61,4 @@ impl<'a> TryInto<&'a mut MucRoom> for &'a mut Room {
_ => Err(WrongRoomType),
}
}
}

View File

@ -14,6 +14,8 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::types::room::Room;
use crate::xmpp_interface::Messages;
use crate::{
configuration::store_login_details,
configuration::{load_config, try_retrieve_credentials},
@ -22,9 +24,9 @@ use crate::{
login_screen::LoginAttempt,
login_screen::{LoginScreen, LoginStatus},
no_room_open::NoRoomPlaceholder,
room_list::RoomMeta,
room_view::RoomView,
sidebar::SideBar,
room_list::RoomMeta,
},
xmpp_interface,
xmpp_interface::NetworkCommand,
@ -35,8 +37,6 @@ use futures_util::StreamExt;
use jid::BareJid;
use log::{error, info};
use std::string::String;
use crate::xmpp_interface::Messages;
use crate::types::room::Room;
pub mod login_screen;
pub mod no_room_open;
@ -76,7 +76,10 @@ pub fn App(cx: Scope) -> Element {
// Can I not clone this? Am I reconstructing the entire VDOM every time? What's happening?
// TODO: The borrowing situation here is kinda fucked; how do I fix this?
let current_room_messages = current_room.get().clone().and_then(|x| messages.read().messages.get(&x).map(|x| x.clone()));
let current_room_messages = current_room
.get()
.clone()
.and_then(|x| messages.read().messages.get(&x).map(|x| x.clone()));
render! {

View File

@ -14,18 +14,18 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use std::time::Instant;
use chrono::{DateTime, FixedOffset};
use dioxus::core::{Element, Scope};
use dioxus::core_macro::Props;
use dioxus::html::button;
use dioxus::prelude::*;
use jid::BareJid;
use std::time::Instant;
#[derive(Clone, Eq, PartialEq)]
pub struct RoomMeta {
pub room: BareJid,
pub last_update_time: Option<DateTime<FixedOffset>>
pub last_update_time: Option<DateTime<FixedOffset>>,
}
#[derive(Clone, Eq, PartialEq, Copy)]
@ -41,16 +41,15 @@ pub enum SortMethod {
///
/// How "selecting" and "leaving" a room is handled is up to the context.
#[component]
pub fn RoomList<'a>(cx: Scope<'a>,
rooms: Vec<RoomMeta>, // TODO: Should this be a reference of some kind?
on_room_picked: EventHandler<'a, BareJid>,
on_room_left: EventHandler<'a, BareJid>) -> Element<'a> {
pub fn RoomList<'a>(
cx: Scope<'a>,
rooms: Vec<RoomMeta>, // TODO: Should this be a reference of some kind?
on_room_picked: EventHandler<'a, BareJid>,
on_room_left: EventHandler<'a, BareJid>,
) -> Element<'a> {
let sort_method = use_state(cx, || SortMethod::Recency);
let sorted_rooms = use_memo(cx, (rooms,sort_method), |(mut rooms, sort_method)| {
let sorted_rooms = use_memo(cx, (rooms, sort_method), |(mut rooms, sort_method)| {
match *sort_method.current() {
SortMethod::Alphabetical => rooms.sort_by_key(|room| room.room.to_string()),
SortMethod::Recency => rooms.sort_by_key(|room| room.last_update_time),

View File

@ -15,21 +15,21 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::types::message::Message;
use crate::types::Room;
use crate::widgets::send_message::SendMessage;
use dioxus::core::{Element, Scope};
use dioxus::core_macro::Props;
use dioxus::hooks::use_state;
use dioxus::prelude::*;
use jid::BareJid;
use crate::types::Room;
/// A widget that shows a room, including a list of messages and a widget to send new messages.
#[component]
pub fn RoomView<'a, R:Room>(cx: Scope<'a>,
room: BareJid,
messages: R,
on_message_sent: EventHandler<'a, String>) -> Element<'a> {
pub fn RoomView<'a, R: Room>(
cx: Scope<'a>,
room: BareJid,
messages: R,
on_message_sent: EventHandler<'a, String>,
) -> Element<'a> {
render! {
div {
padding: "5mm",

View File

@ -24,14 +24,15 @@ use jid::BareJid;
/// A widget that combines the RoomList, RoomJoinWidget, and current user info into a sidebar.
#[component]
pub fn SideBar<'a>(cx: Scope<'a, SideBarProps>,
current_user: BareJid,
rooms: Vec<RoomMeta>,
on_room_picked: EventHandler<'a, BareJid>,
on_room_left: EventHandler<'a, BareJid>,
on_join_room: EventHandler<'a, BareJid>,
on_logout: EventHandler<'a, ()>) -> Element<'a> {
pub fn SideBar<'a>(
cx: Scope<'a, SideBarProps>,
current_user: BareJid,
rooms: Vec<RoomMeta>,
on_room_picked: EventHandler<'a, BareJid>,
on_room_left: EventHandler<'a, BareJid>,
on_join_room: EventHandler<'a, BareJid>,
on_logout: EventHandler<'a, ()>,
) -> Element<'a> {
render! {
div {
padding: "5mm",

View File

@ -14,19 +14,21 @@
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
use crate::types::{DirectMessage, DirectMessageRoom, LoginCredentials, MucMessage, MucRoom, Nickname};
use crate::types::message::MessageInOut;
use crate::types::room::{Room, WrongRoomType};
use crate::types::{
DirectMessage, DirectMessageRoom, LoginCredentials, MucMessage, MucRoom, Nickname,
};
use crate::widgets::login_screen::LoginStatus;
use dioxus::hooks::{UnboundedReceiver, UseRef, UseState};
use futures_util::stream::StreamExt;
use jid::BareJid;
use log::{debug, error, info, warn};
use std::collections::HashMap;
use std::future::Future;
use crate::widgets::login_screen::LoginStatus;
use tokio::select;
use xmpp::parsers::message::MessageType;
use xmpp::{Agent, ClientBuilder, ClientType};
use crate::types::room::{Room, WrongRoomType};
use crate::types::message::MessageInOut;
/// An enum of commands that can be sent to the XMPP interface.
///
@ -34,16 +36,25 @@ use crate::types::message::MessageInOut;
#[derive(Debug)]
pub enum NetworkCommand {
/// Start a new login attempt, resulting in either a successful login or an error.
TryLogin { credentials: LoginCredentials },
TryLogin {
credentials: LoginCredentials,
},
/// Join a room.
JoinRoom { room: BareJid },
JoinRoom {
room: BareJid,
},
/// Leave a room.
LeaveRoom { room: BareJid },
LeaveRoom {
room: BareJid,
},
/// Send a message to a recipient.
SendMessage { recipient: BareJid, message: String },
SendMessage {
recipient: BareJid,
message: String,
},
Logout,
}
@ -54,7 +65,6 @@ pub struct Messages {
}
impl Messages {
pub fn new() -> Self {
Self {
messages: HashMap::new(),
@ -65,18 +75,22 @@ impl Messages {
self.messages.get(room)
}
pub fn get_or_create_mut_direct(&mut self, room: &BareJid) -> Result<&mut DirectMessageRoom, WrongRoomType> {
self.messages.entry(room.clone()).or_insert(Room::Direct(DirectMessageRoom {
messages: vec![],
})).try_into()
pub fn get_or_create_mut_direct(
&mut self,
room: &BareJid,
) -> Result<&mut DirectMessageRoom, WrongRoomType> {
self.messages
.entry(room.clone())
.or_insert(Room::Direct(DirectMessageRoom { messages: vec![] }))
.try_into()
}
pub fn get_or_create_mut_muc(&mut self, room: &BareJid) -> Result<&mut MucRoom, WrongRoomType> {
self.messages.entry(room.clone()).or_insert(Room::Muc(MucRoom {
messages: vec![],
})).try_into()
self.messages
.entry(room.clone())
.or_insert(Room::Muc(MucRoom { messages: vec![] }))
.try_into()
}
}
async fn handle_event(
@ -92,9 +106,9 @@ async fn handle_event(
xmpp::Event::RoomJoined(room_jid) => {
debug!("Joined room: {}", &room_jid);
messages.with_mut(move |m| {
m.messages.entry(room_jid.clone()).or_insert(Room::Muc(MucRoom {
messages: vec![],
}));
m.messages
.entry(room_jid.clone())
.or_insert(Room::Muc(MucRoom { messages: vec![] }));
});
}
xmpp::Event::RoomLeft(room_jid) => {
@ -106,9 +120,12 @@ async fn handle_event(
xmpp::Event::ChatMessage(_id, sender, body, timestamp) => {
debug!("Message from {}: {}", &sender, &body.0);
messages.with_mut(move |m| {
let dms : &mut DirectMessageRoom = m.messages.entry(sender.clone()).or_insert(Room::Direct(DirectMessageRoom {
messages: vec![],
})).try_into().expect("Received direct message with a JID from a MUC");
let dms: &mut DirectMessageRoom = m
.messages
.entry(sender.clone())
.or_insert(Room::Direct(DirectMessageRoom { messages: vec![] }))
.try_into()
.expect("Received direct message with a JID from a MUC");
dms.messages.push(DirectMessage {
in_out: MessageInOut::Incoming,
@ -123,8 +140,8 @@ async fn handle_event(
&room_jid, &sender_nick, &body.0
);
messages.with_mut(move |m| {
let muc : &mut MucRoom = m.get_or_create_mut_muc(&room_jid)
let muc: &mut MucRoom = m
.get_or_create_mut_muc(&room_jid)
.expect("Received direct message with a JID from a MUC");
muc.messages.push(MucMessage {
@ -134,7 +151,6 @@ async fn handle_event(
timestamp,
is_private: false,
});
});
}
xmpp::Event::RoomPrivateMessage(_id, room_jid, sender_nick, body, timestamp) => {
@ -143,8 +159,8 @@ async fn handle_event(
&room_jid, &sender_nick, &body.0
);
messages.with_mut(move |m| {
let muc : &mut MucRoom = m.get_or_create_mut_muc(&room_jid)
let muc: &mut MucRoom = m
.get_or_create_mut_muc(&room_jid)
.expect("Received direct message with a JID from a MUC");
muc.messages.push(MucMessage {
@ -154,7 +170,6 @@ async fn handle_event(
timestamp,
is_private: true,
});
});
}
_ => {