From 9d0e49c4615cc18dc1277ab57043ae6ab632cd4a Mon Sep 17 00:00:00 2001 From: qowevisa Date: Fri, 7 Jun 2024 21:57:23 +0300 Subject: [PATCH] Add a lot to server --- cmd/server/links.go | 54 +++++++++++++++++++++++++++++++++++++++++++++ cmd/server/main.go | 46 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 cmd/server/links.go diff --git a/cmd/server/links.go b/cmd/server/links.go new file mode 100644 index 0000000..143ef1e --- /dev/null +++ b/cmd/server/links.go @@ -0,0 +1,54 @@ +package main + +import ( + "sync" + + com "git.qowevisa.me/Qowevisa/gotell/communication" +) + +type UserLink struct { + LeftNum uint16 + UserID uint16 +} + +type LinkCenter struct { + Links map[string]*UserLink + Mu sync.Mutex +} + +var ( + linkCenter LinkCenter +) + +func (l *LinkCenter) Init() { + l.Links = make(map[string]*UserLink) +} + +func (l *LinkCenter) AddLink(id uint16, link com.Link) error { + _, found := l.Links[string(link.Data)] + if found { + return ERROR_ALREADY_HAVE + } + l.Mu.Lock() + l.Links[string(link.Data)] = &UserLink{ + LeftNum: link.UseCount, + UserID: id, + } + l.Mu.Unlock() + return nil +} + +func (l *LinkCenter) DeleteLink(data []byte) error { + l.Mu.Lock() + delete(l.Links, string(data)) + l.Mu.Unlock() + return nil +} + +func (l *LinkCenter) GetLink(data []byte) (*UserLink, error) { + val, found := l.Links[string(data)] + if !found { + return nil, ERROR_DONT_HAVE + } + return val, nil +} diff --git a/cmd/server/main.go b/cmd/server/main.go index 307d176..5d742b6 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -15,6 +15,7 @@ import ( func main() { userCenter.Init() + linkCenter.Init() host, err := env.GetHost() if err != nil { log.Fatal(err) @@ -110,6 +111,51 @@ func handleClient(conn net.Conn) { registeredID = id } case com.ID_CLIENT_SEND_SERVER_LINK: + l, err := com.DecodeLink(msg.Data) + if err != nil { + log.Printf("ERROR: DecodeLink: %v\n", err) + continue + } + err = linkCenter.AddLink(msg.FromID, *l) + if err != nil { + log.Printf("ERROR: AddLink: %v\n", err) + answ, err := com.ServerDeclineClientLink() + if err != nil { + log.Printf("ERROR: BYTES: %v\n", err) + continue + } + conn.Write(answ) + continue + } + answ, err := com.ServerApproveClientLink() + if err != nil { + log.Printf("ERROR: BYTES: %v\n", err) + continue + } + conn.Write(answ) + case com.ID_CLIENT_ASK_SERVER_LINK: + link, err := linkCenter.GetLink(msg.Data) + if err != nil { + log.Printf("Error: %v\n", err) + continue + } + if link.LeftNum == 0 { + linkCenter.DeleteLink(msg.Data) + continue + } + // TODO: there can be an error on multi-thread app + link.LeftNum -= 1 + name, err := userCenter.GetName(link.UserID) + if err != nil { + log.Printf("ERROR: userCenter: Getname: %v\n", err) + continue + } + answ, err := com.ServerSendClientIDFromLink(link.UserID, []byte(name)) + if err != nil { + log.Printf("ERROR: BYTES: %v\n", err) + continue + } + conn.Write(answ) default: } // Handle