Add server chat commands
parent
af3abd49cb
commit
221e374adb
41
chat.go
41
chat.go
|
@ -16,14 +16,25 @@ type chatCommand struct {
|
|||
var chatCommands map[string]chatCommand
|
||||
var onChatMsg []func(*Peer, string) bool
|
||||
|
||||
var serverChatCommands map[string]func(*Peer, string)
|
||||
var onServerChatMsg []func(*Peer, string) bool
|
||||
|
||||
func RegisterChatCommand(name string, privs map[string]bool, function func(*Peer, string)) {
|
||||
chatCommands[name] = chatCommand{privs: privs, function: function}
|
||||
}
|
||||
|
||||
func registerOnChatMessage(function func(*Peer, string) bool) {
|
||||
func RegisterOnChatMessage(function func(*Peer, string) bool) {
|
||||
onChatMsg = append(onChatMsg, function)
|
||||
}
|
||||
|
||||
func RegisterServerChatCommand(name string, function func(*Peer, string)) {
|
||||
serverChatCommands[name] = function
|
||||
}
|
||||
|
||||
func RegisterOnServerChatMessage(function func(*Peer, string) bool) {
|
||||
onServerChatMsg = append(onServerChatMsg, function)
|
||||
}
|
||||
|
||||
func processChatMessage(p *Peer, pkt Pkt) bool {
|
||||
s := string(narrow(pkt.Data[4:]))
|
||||
if strings.HasPrefix(s, "#") {
|
||||
|
@ -110,6 +121,33 @@ func processChatMessage(p *Peer, pkt Pkt) bool {
|
|||
}
|
||||
}
|
||||
|
||||
func processServerChatMessage(p *Peer, pkt Pkt) bool {
|
||||
s := string(narrow(pkt.Data[4:]))
|
||||
if strings.HasPrefix(s, ":") {
|
||||
// Server chat command
|
||||
s = strings.Replace(s, ":", "", 1)
|
||||
params := strings.Split(s, " ")
|
||||
|
||||
// Callback
|
||||
// Existance check
|
||||
if serverChatCommands[params[0]] == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
serverChatCommands[params[0]](p, strings.Join(params[1:], " "))
|
||||
return true
|
||||
} else {
|
||||
// Regular message
|
||||
noforward := false
|
||||
for i := range onServerChatMsg {
|
||||
if onServerChatMsg[i](p, s) {
|
||||
noforward = true
|
||||
}
|
||||
}
|
||||
return noforward
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Peer) SendChatMsg(msg string) {
|
||||
wstr := wider([]byte(msg))
|
||||
|
||||
|
@ -173,4 +211,5 @@ func wider(b []byte) []byte {
|
|||
|
||||
func init() {
|
||||
chatCommands = make(map[string]chatCommand)
|
||||
serverChatCommands = make(map[string]func(*Peer, string))
|
||||
}
|
||||
|
|
12
command.go
12
command.go
|
@ -115,6 +115,18 @@ func processPktCommand(src, dst *Peer, pkt *Pkt) bool {
|
|||
case ToClientActiveObjectRemoveAdd:
|
||||
pkt.Data = processAoRmAdd(dst, pkt.Data)
|
||||
return false
|
||||
case ToClientChatMessage:
|
||||
namelen := binary.BigEndian.Uint16(pkt.Data[4:6])
|
||||
msglen := binary.BigEndian.Uint16(pkt.Data[6+namelen : 8+namelen])
|
||||
msg := pkt.Data[8+namelen:]
|
||||
|
||||
data := make([]byte, 4+msglen*2)
|
||||
data[0] = uint8(0x00)
|
||||
data[1] = uint8(ToServerChatMessage)
|
||||
binary.BigEndian.PutUint16(data[2:4], uint16(msglen))
|
||||
copy(data[4:], msg)
|
||||
|
||||
return processServerChatMessage(dst, Pkt{Data: data, ChNo: pkt.ChNo})
|
||||
default:
|
||||
return false
|
||||
}
|
||||
|
|
|
@ -135,11 +135,30 @@ func init() {
|
|||
}
|
||||
})
|
||||
|
||||
multiserver.RegisterServerChatCommand("send",
|
||||
func(p *multiserver.Peer, param string) {
|
||||
if param == "" {
|
||||
return
|
||||
}
|
||||
|
||||
servers := multiserver.GetConfKey("servers").(map[interface{}]interface{})
|
||||
if servers[param] == nil {
|
||||
return
|
||||
}
|
||||
|
||||
go p.Redirect(param)
|
||||
})
|
||||
|
||||
multiserver.RegisterChatCommand("alert", privs["alert"],
|
||||
func(p *multiserver.Peer, param string) {
|
||||
multiserver.ChatSendAll("[ALERT] " + param)
|
||||
})
|
||||
|
||||
multiserver.RegisterServerChatCommand("alert",
|
||||
func(p *multiserver.Peer, param string) {
|
||||
multiserver.ChatSendAll("[ALERT] " + param)
|
||||
})
|
||||
|
||||
multiserver.RegisterChatCommand("server", nil,
|
||||
func(p *multiserver.Peer, param string) {
|
||||
if param == "" {
|
||||
|
|
14
peer.go
14
peer.go
|
@ -45,19 +45,19 @@ type Peer struct {
|
|||
ping *time.Ticker
|
||||
|
||||
username []byte
|
||||
srp_s []byte
|
||||
srp_A []byte
|
||||
srp_a []byte
|
||||
srp_B []byte
|
||||
srp_K []byte
|
||||
srp_s []byte
|
||||
srp_A []byte
|
||||
srp_a []byte
|
||||
srp_B []byte
|
||||
srp_K []byte
|
||||
authMech int
|
||||
sudoMode bool
|
||||
|
||||
forward bool
|
||||
|
||||
redirectMu sync.Mutex
|
||||
srvMu sync.RWMutex
|
||||
srv *Peer
|
||||
srvMu sync.RWMutex
|
||||
srv *Peer
|
||||
|
||||
initAoReceived bool
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue