tricrypt/cmd/server/links.go
2024-06-08 23:21:16 +03:00

102 lines
2.0 KiB
Go

package main
import (
"log"
"sync"
com "git.qowevisa.me/Qowevisa/gotell/communication"
)
type UserLink struct {
LeftNum uint16
UserID uint16
}
type LinkArray struct {
Array []string
}
type LinkCenter struct {
Links map[string]*UserLink
SavedLinks map[uint16]*LinkArray
Mu sync.Mutex
}
var (
linkCenter LinkCenter
)
func (l *LinkCenter) Init() {
l.Links = make(map[string]*UserLink)
l.SavedLinks = make(map[uint16]*LinkArray)
}
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,
}
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
}
func (l *LinkCenter) debug() {
for val, key := range l.Links {
if key == nil {
log.Printf("DEBUG: LINKCENTER: VAL = %s LINK = NIL\n", val)
continue
}
log.Printf("DEBUG: LINKCENTER: VAL = %s LINK = %v\n", val, *key)
}
}
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) {
l.Mu.Lock()
defer 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.debug()
l.Mu.Unlock()
}