Add server chat commands

master
HimbeerserverDE 2021-01-17 11:08:34 +01:00
parent af3abd49cb
commit 221e374adb
4 changed files with 78 additions and 8 deletions

41
chat.go
View File

@ -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))
}

View File

@ -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
}

View File

@ -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
View File

@ -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
}