+
+const userInfoTemplate = `Nickname: %s
+Name: %s
+Account: %s
+Address: %s
+
+-------- File Downloads ---------
+
+%s
+------- Folder Downloads --------
+
+%s
+--------- File Uploads ----------
+
+%s
+-------- Folder Uploads ---------
+
+%s
+------- Waiting Downloads -------
+
+%s
+`
+
+func formatDownloadList(fts map[[4]byte]*FileTransfer) (s string) {
+ if len(fts) == 0 {
+ return "None.\n"
+ }
+
+ for _, dl := range fts {
+ s += dl.String()
+ }
+
+ return s
+}
+
+func (cc *ClientConn) String() string {
+ cc.transfersMU.Lock()
+ defer cc.transfersMU.Unlock()
+ template := fmt.Sprintf(
+ userInfoTemplate,
+ cc.UserName,
+ cc.Account.Name,
+ cc.Account.Login,
+ cc.RemoteAddr,
+ formatDownloadList(cc.transfers[FileDownload]),
+ formatDownloadList(cc.transfers[FolderDownload]),
+ formatDownloadList(cc.transfers[FileUpload]),
+ formatDownloadList(cc.transfers[FolderUpload]),
+ "None.\n",
+ )
+
+ return strings.Replace(template, "\n", "\r", -1)
+}