2021-01-24 05:00:26 -08:00
|
|
|
package main
|
2021-01-14 07:54:30 -08:00
|
|
|
|
2021-01-14 10:06:40 -08:00
|
|
|
import "sync"
|
|
|
|
|
2021-04-06 06:53:08 -07:00
|
|
|
const (
|
|
|
|
MaxPlayerNameLength = 20
|
2021-05-02 04:02:50 -07:00
|
|
|
PlayerNameChars = "^[a-zA-Z0-9-_]*$"
|
2021-04-06 06:53:08 -07:00
|
|
|
)
|
|
|
|
|
2021-01-14 10:06:40 -08:00
|
|
|
var onlinePlayers map[string]bool
|
|
|
|
var onlinePlayerMu sync.RWMutex
|
|
|
|
|
2021-03-29 09:57:30 -07:00
|
|
|
var onJoinPlayer []func(*Conn)
|
|
|
|
var onLeavePlayer []func(*Conn)
|
2021-01-14 07:54:30 -08:00
|
|
|
|
2021-01-17 12:43:23 -08:00
|
|
|
// RegisterOnJoinPlayer registers a callback function that is called
|
2021-03-29 09:57:30 -07:00
|
|
|
// when a TOSERVER_CLIENT_READY pkt is received from the Conn
|
|
|
|
func RegisterOnJoinPlayer(function func(*Conn)) {
|
2021-01-14 07:54:30 -08:00
|
|
|
onJoinPlayer = append(onJoinPlayer, function)
|
|
|
|
}
|
|
|
|
|
2021-01-17 12:43:23 -08:00
|
|
|
// RegisterOnLeavePlayer registers a callback function that is called
|
2021-03-29 09:57:30 -07:00
|
|
|
// when a client Conn disconnects
|
|
|
|
func RegisterOnLeavePlayer(function func(*Conn)) {
|
2021-01-14 07:54:30 -08:00
|
|
|
onLeavePlayer = append(onLeavePlayer, function)
|
|
|
|
}
|
|
|
|
|
2021-03-29 09:57:30 -07:00
|
|
|
func processJoin(c *Conn) {
|
2021-01-14 10:06:40 -08:00
|
|
|
onlinePlayerMu.Lock()
|
|
|
|
defer onlinePlayerMu.Unlock()
|
|
|
|
|
2021-03-29 09:57:30 -07:00
|
|
|
cltSrv := c.ServerName()
|
|
|
|
for ; cltSrv == ""; cltSrv = c.ServerName() {
|
2021-03-17 09:18:21 -07:00
|
|
|
}
|
|
|
|
|
2021-01-24 05:56:04 -08:00
|
|
|
rpcSrvMu.Lock()
|
|
|
|
for srv := range rpcSrvs {
|
2021-05-02 04:12:24 -07:00
|
|
|
srv.doRPC("->JOIN "+c.Username()+" "+cltSrv, "--")
|
2021-01-24 05:56:04 -08:00
|
|
|
}
|
|
|
|
rpcSrvMu.Unlock()
|
|
|
|
|
2021-03-29 09:57:30 -07:00
|
|
|
onlinePlayers[c.Username()] = true
|
2021-01-14 07:54:30 -08:00
|
|
|
for i := range onJoinPlayer {
|
2021-03-29 09:57:30 -07:00
|
|
|
onJoinPlayer[i](c)
|
2021-01-14 07:54:30 -08:00
|
|
|
}
|
2021-03-08 01:11:22 -08:00
|
|
|
|
|
|
|
go OptimizeRPCConns()
|
2021-01-14 07:54:30 -08:00
|
|
|
}
|
|
|
|
|
2021-03-29 09:57:30 -07:00
|
|
|
func processLeave(c *Conn) {
|
2021-01-14 10:06:40 -08:00
|
|
|
onlinePlayerMu.Lock()
|
|
|
|
defer onlinePlayerMu.Unlock()
|
|
|
|
|
2021-01-24 05:56:04 -08:00
|
|
|
rpcSrvMu.Lock()
|
|
|
|
for srv := range rpcSrvs {
|
2021-05-02 04:12:24 -07:00
|
|
|
srv.doRPC("->LEAVE "+c.Username(), "--")
|
2021-01-24 05:56:04 -08:00
|
|
|
}
|
|
|
|
rpcSrvMu.Unlock()
|
|
|
|
|
2021-03-29 09:57:30 -07:00
|
|
|
onlinePlayers[c.Username()] = false
|
2021-01-14 07:54:30 -08:00
|
|
|
for i := range onLeavePlayer {
|
2021-03-29 09:57:30 -07:00
|
|
|
onLeavePlayer[i](c)
|
2021-01-14 07:54:30 -08:00
|
|
|
}
|
|
|
|
}
|
2021-01-14 10:06:40 -08:00
|
|
|
|
2021-01-17 12:43:23 -08:00
|
|
|
// IsOnline reports if a player is connected
|
2021-01-14 10:06:40 -08:00
|
|
|
func IsOnline(name string) bool {
|
|
|
|
onlinePlayerMu.RLock()
|
|
|
|
defer onlinePlayerMu.RUnlock()
|
|
|
|
|
|
|
|
return onlinePlayers[name]
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
onlinePlayers = make(map[string]bool)
|
|
|
|
}
|