170 lines
4.6 KiB
Text
170 lines
4.6 KiB
Text
@startuml "IRC Server - Detailed UML"
|
|
|
|
' ========================
|
|
' ENTRY: main()
|
|
' ========================
|
|
class "main()"
|
|
|
|
' ========================
|
|
' CLASS: Server
|
|
' ========================
|
|
class Server {
|
|
- _port : int
|
|
- _serverFd : int
|
|
- _password : string
|
|
- _pollManager : PollManager
|
|
- _users : map<int, User*>
|
|
|
|
+ Server(port : int, password : string)
|
|
+ ~Server()
|
|
+ start() : void
|
|
+ getPort() : int
|
|
+ showInfo() : void
|
|
}
|
|
|
|
' ============================
|
|
' CLASS: PollManager
|
|
' ============================
|
|
class PollManager {
|
|
- _fds : vector<pollfd>
|
|
|
|
+ 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<int>, disconnected : vector<int>, readyClients : vector<pair<int, string>>) : 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<User>
|
|
- _topic : string
|
|
|
|
+ getName() : string
|
|
+ getTopic() : string
|
|
+ isUserInChannel(User *user) : bool
|
|
+ getUsers() : list<User>
|
|
+ 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" <<namespace>> {
|
|
class CommandDispatcher {
|
|
+ dispatchCommand(user : *User, channel : *channel, line : string) : void
|
|
+ splitCommand(line : string) : vector<string>
|
|
}
|
|
}
|
|
|
|
' =============================
|
|
' NAMESPACE: Command
|
|
' =============================
|
|
package "Command" <<namespace>> {
|
|
class PASS {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class NICK {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class USER {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class JOIN {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class PART {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class PRIVMSG {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class NOTICE {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class PING {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class PONG {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class QUIT {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class TOPIC {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class MODE {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class INVITE {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class KICK {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class LIST {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class UNKNOWN {
|
|
+ execute(user : User, args : vector<string>) : void
|
|
}
|
|
class CAP {
|
|
+ execute(user : User, args : vector<string>) : 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
|