@startuml "IRC Server - Detailed UML" ' ======================== ' ENTRY: main() ' ======================== class "main()" ' ======================== ' CLASS: Server ' ======================== class Server { - _port : int - _serverFd : int - _password : string - _pollManager : PollManager - _users : map + Server(port : int, password : string) + ~Server() + start() : void + getPort() : int + showInfo() : void } ' ============================ ' CLASS: PollManager ' ============================ class PollManager { - _fds : vector + PollManager() + ~PollManager() + setServerFd(fd : int) : void + addClient(fd : short unsigned) : void + removeClient(fd : short unsigned) : void + updateServer(fd : short unsigned) : void + pollLoop(server_fd : int, newClients : vector, disconnected : vector, readyClients : vector>) : void } ' ======================== ' CLASS: User ' ======================== class User { - _fd : short unsigned int - _registered : bool - _nickname : string - _hostname : string - _read_buffer : string - _write_buffer : string - _username : string - _hasNick : bool - _hasUser : bool + User(fd : short unsigned int) + getFd() : short unsigned int + isReadyToSend() : bool + isRegistered() : bool + getName() : string + extractFullCommand() : string + appendToReadBuffer(data : string) : void + appendToWriteBuffer(data : string) : void + setNickname(nickname : string) : void + setUsername(username : string) : void + checkRegistration() : void } ' ======================== ' CLASS: Channel ' ======================== class Channel { - _name : string - _password : string - _owner : User - _operators : List - _topic : string + getName() : string + getTopic() : string + isUserInChannel(User *user) : bool + getUsers() : list + getOwner() : User + isOperator(user : User) : bool + isUserInChannel(User *user) : bool + setTopic(newTopic : string) : void + addOperator(user : User) : void + addUser(user : User) : void + removeOperator(user : User) : void + removeUser(user : User) : void } ' ==================================== ' NAMESPACE: CommandDispatcher (static) ' ==================================== package "CommandDispatcher" <> { class CommandDispatcher { + dispatchCommand(user : *User, channel : *channel, line : string) : void + splitCommand(line : string) : vector } } ' ============================= ' NAMESPACE: Command ' ============================= package "Command" <> { class PASS { + execute(user : User, args : vector) : void } class NICK { + execute(user : User, args : vector) : void } class USER { + execute(user : User, args : vector) : void } class JOIN { + execute(user : User, args : vector) : void } class PART { + execute(user : User, args : vector) : void } class PRIVMSG { + execute(user : User, args : vector) : void } class NOTICE { + execute(user : User, args : vector) : void } class PING { + execute(user : User, args : vector) : void } class PONG { + execute(user : User, args : vector) : void } class QUIT { + execute(user : User, args : vector) : void } class TOPIC { + execute(user : User, args : vector) : void } class MODE { + execute(user : User, args : vector) : void } class INVITE { + execute(user : User, args : vector) : void } class KICK { + execute(user : User, args : vector) : void } class LIST { + execute(user : User, args : vector) : void } class UNKNOWN { + execute(user : User, args : vector) : void } class CAP { + execute(user : User, args : vector) : void } } ' ======================== ' RELATIONS ' ======================== "main()" --> Server : creates Server "1" *-- "1" PollManager : _poll PollManager "1" o-- "*" User : _users User "1" o-- "*" Channel : _channels Channel "1" *-- "1" User : _owner Channel "1" o-- "*" User : _operators PollManager --> CommandDispatcher.CommandDispatcher : calls CommandDispatcher.CommandDispatcher --> Command : dispatches CommandDispatcher.CommandDispatcher --> User : parses commands @enduml