diff --git a/src/database/entities/user.rs b/src/database/entities/user.rs
index 9bfa8bfe47e08184d6181f85bda27f3646faab74..f36f7b67147947bce7d182b56e943df87ebf834b 100644
--- a/src/database/entities/user.rs
+++ b/src/database/entities/user.rs
@@ -1,14 +1,6 @@
+use crate::database::get_collection;
 use crate::database::guards::reference::Ref;
-use crate::{
-    database::get_collection,
-    notifications::events::ClientboundNotification,
-    util::result::{Error, Result},
-};
-use futures::StreamExt;
-use mongodb::{
-    bson::{doc, from_bson, Bson},
-    options::FindOptions,
-};
+use mongodb::bson::{doc, from_bson, Bson};
 use rauth::auth::Session;
 use rocket::http::Status;
 use rocket::request::{self, FromRequest, Outcome, Request};
@@ -81,57 +73,4 @@ impl User {
             id: self.id.to_string(),
         }
     }
-
-    pub async fn generate_ready_payload(self) -> Result<ClientboundNotification> {
-        let mut users = vec![];
-
-        if let Some(relationships) = &self.relations {
-            let user_ids: Vec<String> = relationships
-                .iter()
-                .map(|relationship| relationship.id.clone())
-                .collect();
-
-            let mut cursor = get_collection("users")
-                .find(
-                    doc! {
-                        "_id": {
-                            "$in": user_ids
-                        }
-                    },
-                    FindOptions::builder()
-                        .projection(doc! { "_id": 1, "username": 1 })
-                        .build(),
-                )
-                .await
-                .map_err(|_| Error::DatabaseError {
-                    operation: "find",
-                    with: "users",
-                })?;
-
-            while let Some(result) = cursor.next().await {
-                if let Ok(doc) = result {
-                    let mut user: User =
-                        from_bson(Bson::Document(doc)).map_err(|_| Error::DatabaseError {
-                            operation: "from_bson",
-                            with: "user",
-                        })?;
-
-                    user.relationship = Some(
-                        relationships
-                            .iter()
-                            .find(|x| user.id == x.id)
-                            .ok_or_else(|| Error::InternalError)?
-                            .status
-                            .clone(),
-                    );
-
-                    users.push(user);
-                }
-            }
-        }
-
-        users.push(self);
-
-        Ok(ClientboundNotification::Ready { users })
-    }
 }
diff --git a/src/notifications/mod.rs b/src/notifications/mod.rs
index 22f7bf4f379a353e24eef66fecca2f90a702b2df..577bb11a480980222daffe104b039c650f30f587 100644
--- a/src/notifications/mod.rs
+++ b/src/notifications/mod.rs
@@ -1,4 +1,5 @@
 pub mod events;
 pub mod hive;
+pub mod payload;
 pub mod subscriptions;
 pub mod websocket;
diff --git a/src/notifications/payload.rs b/src/notifications/payload.rs
new file mode 100644
index 0000000000000000000000000000000000000000..0769e57b4669beff9aa9af3fa54df220076914bb
--- /dev/null
+++ b/src/notifications/payload.rs
@@ -0,0 +1,63 @@
+use crate::notifications::events::ClientboundNotification;
+use crate::{
+    database::{entities::User, get_collection},
+    util::result::{Error, Result},
+};
+use futures::StreamExt;
+use mongodb::{
+    bson::{doc, from_bson, Bson},
+    options::FindOptions,
+};
+
+pub async fn generate_ready(user: User) -> Result<ClientboundNotification> {
+    let mut users = vec![];
+
+    if let Some(relationships) = &user.relations {
+        let user_ids: Vec<String> = relationships
+            .iter()
+            .map(|relationship| relationship.id.clone())
+            .collect();
+
+        let mut cursor = get_collection("users")
+            .find(
+                doc! {
+                    "_id": {
+                        "$in": user_ids
+                    }
+                },
+                FindOptions::builder()
+                    .projection(doc! { "_id": 1, "username": 1 })
+                    .build(),
+            )
+            .await
+            .map_err(|_| Error::DatabaseError {
+                operation: "find",
+                with: "users",
+            })?;
+
+        while let Some(result) = cursor.next().await {
+            if let Ok(doc) = result {
+                let mut user: User =
+                    from_bson(Bson::Document(doc)).map_err(|_| Error::DatabaseError {
+                        operation: "from_bson",
+                        with: "user",
+                    })?;
+
+                user.relationship = Some(
+                    relationships
+                        .iter()
+                        .find(|x| user.id == x.id)
+                        .ok_or_else(|| Error::InternalError)?
+                        .status
+                        .clone(),
+                );
+
+                users.push(user);
+            }
+        }
+    }
+
+    users.push(user);
+
+    Ok(ClientboundNotification::Ready { users })
+}
diff --git a/src/notifications/websocket.rs b/src/notifications/websocket.rs
index 9845c6c3f3fb32c8222d95a78a3b104f8dfefadb..8f5f4671f704371b7f202f2bb53c445a1a39c702 100644
--- a/src/notifications/websocket.rs
+++ b/src/notifications/websocket.rs
@@ -97,8 +97,9 @@ async fn accept(stream: TcpStream) {
                                             ) {
                                                 send(ClientboundNotification::Authenticated);
 
-                                                match task::block_on(user.generate_ready_payload())
-                                                {
+                                                match task::block_on(
+                                                    super::payload::generate_ready(user),
+                                                ) {
                                                     Ok(payload) => {
                                                         send(payload);
                                                     }
diff --git a/src/routes/onboard/complete.rs b/src/routes/onboard/complete.rs
index 857d7c68595f5fab0d9bf7cdb2a5ec08b4e5b7b1..ffd9e75219fbea454808afa1b422c977e4f048c0 100644
--- a/src/routes/onboard/complete.rs
+++ b/src/routes/onboard/complete.rs
@@ -10,7 +10,7 @@ use serde::{Deserialize, Serialize};
 use validator::Validate;
 
 lazy_static! {
-    static ref RE_USERNAME: Regex = Regex::new(r"^[a-zA-Z0-9-_]+$").unwrap();
+    static ref RE_USERNAME: Regex = Regex::new(r"^[a-zA-Z0-9_]+$").unwrap();
 }
 
 #[derive(Validate, Serialize, Deserialize)]