aboutsummaryrefslogtreecommitdiff
path: root/hotline/client_conn.go
diff options
context:
space:
mode:
authorJeff Halter <868228+jhalter@users.noreply.github.com>2022-06-23 14:27:47 -0700
committerGitHub <noreply@github.com>2022-06-23 14:27:47 -0700
commitc6a3fa2cdbf7eb78964a5df7622482cdd8782d74 (patch)
tree74aa3a802c3c3457de888ee63b65aa898f0be91a /hotline/client_conn.go
parent2a42aad2a01e50d158a13439f851e49c799c5510 (diff)
parentdf1ade5433b027f9cb905e584921692313e647f5 (diff)
Merge pull request #41 from jhalter/implement_user_get_info
Implement user get info
Diffstat (limited to 'hotline/client_conn.go')
-rw-r--r--hotline/client_conn.go96
1 files changed, 62 insertions, 34 deletions
diff --git a/hotline/client_conn.go b/hotline/client_conn.go
index 997b9c9..6a27977 100644
--- a/hotline/client_conn.go
+++ b/hotline/client_conn.go
@@ -2,11 +2,14 @@ package hotline
import (
"encoding/binary"
+ "fmt"
"go.uber.org/zap"
"golang.org/x/crypto/bcrypt"
"io"
"math/big"
"sort"
+ "strings"
+ "sync"
)
type byClientID []*ClientConn
@@ -23,33 +26,6 @@ func (s byClientID) Less(i, j int) bool {
return s[i].uint16ID() < s[j].uint16ID()
}
-const template = `Nickname: %s
-Name: %s
-Account: %s
-Address: %s
-
--------- File Downloads ---------
-
-%s
-
-------- Folder Downloads --------
-
-None.
-
---------- File Uploads ----------
-
-None.
-
--------- Folder Uploads ---------
-
-None.
-
-------- Waiting Downloads -------
-
-None.
-
- `
-
// ClientConn represents a client connected to a Server
type ClientConn struct {
Connection io.ReadWriteCloser
@@ -64,9 +40,12 @@ type ClientConn struct {
Version *[]byte
Idle bool
AutoReply []byte
- Transfers map[int][]*FileTransfer
- Agreed bool
- logger *zap.SugaredLogger
+
+ transfersMU sync.Mutex
+ transfers map[int]map[[4]byte]*FileTransfer
+
+ Agreed bool
+ logger *zap.SugaredLogger
}
func (cc *ClientConn) sendAll(t int, fields ...Field) {
@@ -156,10 +135,6 @@ func (cc *ClientConn) uint16ID() uint16 {
// Authorize checks if the user account has the specified permission
func (cc *ClientConn) Authorize(access int) bool {
- if access == 0 {
- return true
- }
-
i := big.NewInt(int64(binary.BigEndian.Uint64(*cc.Account.Access)))
return i.Bit(63-access) == 1
@@ -231,3 +206,56 @@ func sortedClients(unsortedClients map[uint16]*ClientConn) (clients []*ClientCon
sort.Sort(byClientID(clients))
return clients
}
+
+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)
+}