Got it! Let’s create UML sequence diagrams for each method, incorporating both API calls and socket interactions. The user will interact with the server via APIs for user creation and settings, while other operations will use sockets.

1. initialize

sequenceDiagram
    participant User
    participant Server
    participant Database
    Server->>Database: countDocuments(User)
    alt No users
        Server->>Database: save(defaultUser)
    end

2. newUser

sequenceDiagram
    participant User
    participant Server (API)
    participant Database
    User->>Server (API): newUser(username, pfpUrl)
    Server (API)->>Database: findOne(User, {username})
    alt User exists
        Server (API)-->>User: return -1
    else User does not exist
        Server (API)->>Database: save(newUser)
        Server (API)-->>User: return newUser._id
    end

3. createSession

sequenceDiagram
    participant User
    participant Server (API)
    participant Database
    User->>Server (API): createSession(code)
    Server (API)->>Database: save(newSession)
    Server (API)-->>User: return newSession._id

4. joinSession

sequenceDiagram
    participant User
    participant Server (Socket)
    participant Database
    User->>Server (Socket): joinSession(userId, session_id)
    Server (Socket)->>Database: isValid(session_id)
    alt Invalid session_id
        Server (Socket)-->>User: throw Error
    else Valid session_id
        Server (Socket)->>Database: findOne(UserSession, {user_id, session_id})
        alt UserSession exists
            Server (Socket)-->>User: End
        else UserSession does not exist
            Server (Socket)->>Database: save(userSession)
        end
    end

5. addAdmin

sequenceDiagram
    participant User
    participant Server (Socket)
    participant Database
    User->>Server (Socket): addAdmin(userId, sessionId)
    Server (Socket)->>Database: updateOne(UserSession, {user_id, session_id}, {$set: {is_admin: true}})

6. removeAdmin

sequenceDiagram
    participant User
    participant Server (Socket)
    participant Database
    User->>Server (Socket): removeAdmin(userId, sessionId)
    Server (Socket)->>Database: updateOne(UserSession, {user_id, session_id}, {$set: {is_admin: false}})

7. joinOrCreateSession

sequenceDiagram
    participant User
    participant Server (API)
    participant Server (Socket)
    participant Database
    User->>Server (API): joinOrCreateSession(username, code)
    Server (API)->>Database: newUser(username)
    Server (API)->>Database: findOne(Session, {code})
    alt Session exists
        Server (API)->>Server (Socket): joinSession(userId, session._id)
    else Session does not exist
        Server (API)->>Database: createSession(code)
        Server (API)->>Database: addAdmin(userId, newSession._id)
        Server (API)->>Server (Socket): joinSession(userId, newSession._id)
    end
    Server (API)-->>User: return {sessionId, userId}

8. sendMessage

sequenceDiagram
    participant User
    participant Server (Socket)
    participant Database
    User->>Server (Socket): sendMessage(userId, sessionId, content, fileUrl, messageType)
    Server (Socket)->>Database: save(message)

9. getMessage

sequenceDiagram
    participant User
    participant Server (Socket)
    participant Database
    User->>Server (Socket): getMessage(sessionId, limit)
    Server (Socket)->>Database: find(Message, {session_id})
    Database->>Database: sort({timestamp: -1})
    Database->>Database: limit(limit)
    Database->>Database: populate('user_id', 'username')
    Server (Socket)-->>User: return messages

10. updateSessionSettings

sequenceDiagram
    participant User
    participant Server (API)
    participant Database
    User->>Server (API): updateSessionSettings(sessionId, newSettings)
    Server (API)->>Database: updateOne(Session, {_id: sessionId}, {$set: {session_settings: newSettings}})

11. editMessage

sequenceDiagram
    participant User
    participant Server (Socket)
    participant Database
    User->>Server (Socket): editMessage(messageId, newContent)
    Server (Socket)->>Database: updateOne(Message, {_id: messageId}, {$set: {content: newContent}})

12. deleteMessage

sequenceDiagram
    participant User
    participant Server (Socket)
    participant Database
    User->>Server (Socket): deleteMessage(messageId)
    Server (Socket)->>Database: deleteOne(Message, {_id: messageId})

13. checkMessage

sequenceDiagram
    participant User
    participant Server (Socket)
    participant Database
    User->>Server (Socket): checkMessage(messageId, sessionId)
    Server (Socket)->>Database: findOne(Message, {_id: messageId, session_id})
    alt Message exists
        Server (Socket)-->>User: return true
    else Message does not exist
        Server (Socket)-->>User: return false
    end

14. checkSession

sequenceDiagram
    participant User
    participant Server (API)
    participant Database
    User->>Server (API): checkSession(sessionCode)
    Server (API)->>Database: findOne(Session, {code: sessionCode})
    alt Session exists
        Server (API)-->>User: return session._id
    else Session does not exist
        Server (API)-->>User: return false
    end

These UML sequence diagrams illustrate the interactions between the user, server (via API or sockets), and the database for each method, showing how different operations are handled using APIs and sockets.