@startuml "IRC Server - Detailed UML" ' ======================== ' ENTRY: main() ' ======================== class "main()" ' ======================== ' CLASS: Server ' ======================== class Server { - _port : int - _password : string - _server_fd : int - _poll : PollManager + Server(port : int, password : string) + start() : void + getPort() : int + showInfo() : void } ' ============================ ' CLASS: PollManager ' ============================ class PollManager { - _fds : vector - _users : map + addUser(fd : int) : void + removeUser(fd : int) : void + updateUser(fd : int, events : short) : void + pollLoop(server_fd : int) : void + readFromUser(fd : int) : void + writeToUser(fd : int) : void } ' ======================== ' CLASS: User ' ======================== class User { - _fd : int - _nickname : string - _username : string - _hostname : string - _readBuffer : string - _writeBuffer : string - _registered : bool + getFd() : int + getNickname() : string + setNickname(name : string) : void + appendToReadBuffer(data : string) : void + appendToWriteBuffer(data : string) : void + extractFullCommand() : string + isReadyToSend() : bool + isRegistered() : bool } ' ======================== ' 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, 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 } } ' ======================== ' 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