first commit
This commit is contained in:
79
server/chatserver/logic/group.go
Normal file
79
server/chatserver/logic/group.go
Normal file
@@ -0,0 +1,79 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user