+ ID ClientID
+ Icon []byte // TODO: make fixed size of 2
+ Version []byte // TODO: make fixed size of 2
+
+ FlagsMU sync.Mutex // TODO: move into UserFlags struct
+ Flags UserFlags
+
+ UserName []byte
+ Account *Account
+ IdleTime int
+ Server *Server // TODO: consider adding methods to interact with server
+ AutoReply []byte
+
+ ClientFileTransferMgr ClientFileTransferMgr
+
+ Logger *slog.Logger
+
+ mu sync.RWMutex
+}
+
+func (cc *ClientConn) FileRoot() string {
+ if cc.Account.FileRoot != "" {
+ return cc.Account.FileRoot
+ }
+ return cc.Server.Config.FileRoot
+}
+
+type ClientFileTransferMgr struct {
+ transfers map[FileTransferType]map[FileTransferID]*FileTransfer
+
+ mu sync.RWMutex
+}
+
+func NewClientFileTransferMgr() ClientFileTransferMgr {
+ return ClientFileTransferMgr{
+ transfers: map[FileTransferType]map[FileTransferID]*FileTransfer{
+ FileDownload: {},
+ FileUpload: {},
+ FolderDownload: {},
+ FolderUpload: {},
+ BannerDownload: {},
+ },
+ }
+}