diff --git a/cmd/server/links.go b/cmd/server/links.go index 3eda559..72200d4 100644 --- a/cmd/server/links.go +++ b/cmd/server/links.go @@ -12,9 +12,14 @@ type UserLink struct { UserID uint16 } +type LinkArray struct { + Array []string +} + type LinkCenter struct { - Links map[string]*UserLink - Mu sync.Mutex + Links map[string]*UserLink + SavedLinks map[uint16]*LinkArray + Mu sync.Mutex } var ( @@ -35,7 +40,18 @@ func (l *LinkCenter) AddLink(id uint16, link com.Link) error { LeftNum: link.UseCount, UserID: id, } + val, found := l.SavedLinks[id] + if !found { + var tmpAr []string + tmpAr = append(tmpAr, string(link.Data)) + l.SavedLinks[id] = &LinkArray{ + Array: tmpAr, + } + } else { + val.Array = append(val.Array, string(link.Data)) + } log.Printf("Added link by %s\n", string(link.Data)) + log.Printf("SavedLinks[%d] is now %v\n", id, l.SavedLinks[id]) l.Mu.Unlock() return nil } @@ -58,9 +74,26 @@ func (l *LinkCenter) DeleteLink(data []byte) error { } func (l *LinkCenter) GetLink(data []byte) (*UserLink, error) { + l.Mu.Lock() + l.Mu.Unlock() val, found := l.Links[string(data)] if !found { return nil, ERROR_DONT_HAVE } return val, nil } + +func (l *LinkCenter) CleanAfterLeave(id uint16) { + log.Printf("Cleaning after id=%d left;\n", id) + ar, found := l.SavedLinks[id] + if !found { + log.Printf("Cleaning: Id=%d not found;\n", id) + return + } + l.Mu.Lock() + for _, link := range ar.Array { + log.Printf("Cleaning: Id=%d deleting %s;\n", id, link) + delete(l.Links, link) + } + l.Mu.Unlock() +} diff --git a/cmd/server/main.go b/cmd/server/main.go index b128760..dbf5cb7 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -163,5 +163,6 @@ func handleClient(conn net.Conn) { log.Println("server: conn: closed") if isRegistered { userCenter.DeleteIfHaveOne(registeredID) + linkCenter.CleanAfterLeave(registeredID) } }