79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package logic
|
|
|
|
import (
|
|
"slgserver/net"
|
|
"slgserver/server/chatserver/proto"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type Group struct {
|
|
userMutex sync.RWMutex
|
|
msgMutex sync.RWMutex
|
|
users map[int]*User
|
|
msgs ItemQueue
|
|
}
|
|
|
|
func NewGroup() *Group {
|
|
return &Group{users: map[int]*User{}}
|
|
}
|
|
|
|
func (this*Group) Enter(u *User) {
|
|
this.userMutex.Lock()
|
|
defer this.userMutex.Unlock()
|
|
this.users[u.rid] = u
|
|
}
|
|
|
|
func (this*Group) Exit(rid int) {
|
|
this.userMutex.Lock()
|
|
defer this.userMutex.Unlock()
|
|
delete(this.users, rid)
|
|
}
|
|
|
|
func (this*Group) GetUser(rid int) *User {
|
|
this.userMutex.Lock()
|
|
defer this.userMutex.Unlock()
|
|
return this.users[rid]
|
|
}
|
|
|
|
func (this*Group) PutMsg(text string, rid int, t int8) *proto.ChatMsg {
|
|
|
|
this.userMutex.RLock()
|
|
u, ok := this.users[rid]
|
|
this.userMutex.RUnlock()
|
|
if ok == false{
|
|
return nil
|
|
}
|
|
|
|
msg := &Msg{Msg: text, RId: rid, Time: time.Now(), NickName: u.nickName}
|
|
this.msgMutex.Lock()
|
|
size := this.msgs.Size()
|
|
if size > 100 {
|
|
this.msgs.Dequeue()
|
|
}
|
|
this.msgs.Enqueue(msg)
|
|
this.msgMutex.Unlock()
|
|
|
|
//广播
|
|
this.userMutex.RLock()
|
|
c := &proto.ChatMsg{RId: msg.RId, NickName: msg.NickName, Time: msg.Time.Unix(), Msg: msg.Msg, Type: t}
|
|
for _, user := range this.users {
|
|
net.ConnMgr.PushByRoleId(user.rid, "chat.push", c)
|
|
}
|
|
this.userMutex.RUnlock()
|
|
return c
|
|
}
|
|
|
|
func (this*Group) History() []proto.ChatMsg {
|
|
r := make([]proto.ChatMsg, 0)
|
|
this.msgMutex.RLock()
|
|
items := this.msgs.items
|
|
for _, item := range items {
|
|
msg := item.(*Msg)
|
|
c := proto.ChatMsg{RId: msg.RId, NickName: msg.NickName, Time: msg.Time.Unix(), Msg: msg.Msg}
|
|
r = append(r, c)
|
|
}
|
|
this.msgMutex.RUnlock()
|
|
|
|
return r
|
|
} |