diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-12-08 23:38:31 +0100 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-12-08 23:41:41 +0100 |
commit | 47ca511ebba357fb60692c3f537acfe970f6d137 (patch) | |
tree | 7177b4525eeefa9b74fd35970b75948e09b108f0 | |
parent | 02b86e3aafa9a505863ad217fb7916d389f8a199 (diff) |
add gsend command
-rw-r--r-- | README.md | 8 | ||||
-rw-r--r-- | chatcommands.go | 129 |
2 files changed, 137 insertions, 0 deletions
@@ -40,6 +40,14 @@ Usage: `send <player <server> <name> | current <server> | all <server>>` Example: `send player lobby bob` ``` +> `gsend` +``` +Permission: cmd_gsend +Description: end player(s) to a new server group. player causes a single player to be r edirected, current affects all players that are on your current server and all affects ever yone. +Usage: `gsend <player <group> <name> | current <group> | all <group>>` +Example: `gsend player lobbies bob` +``` + > `players` ``` Permission: cmd_players diff --git a/chatcommands.go b/chatcommands.go index 04dd01f..e4b8ad7 100644 --- a/chatcommands.go +++ b/chatcommands.go @@ -186,6 +186,135 @@ func init() { }, }) proxy.RegisterChatCmd(proxy.ChatCmd{ + Name: "gsend", + Perm: "cmd_gsend", + Help: "Send player(s) to a new server group. player causes a single player to be redirected, current affects all players that are on your current server and all affects everyone.", + Usage: "gsend <player <group> <name> | current <server> | all <server>>", + Handler: func(cc *proxy.ClientConn, args ...string) string { + usage := "Usage: gsend <player <group> <name> | current <server> | all <server>>" + + if len(args) < 2 { + return usage + } + + switch args[0] { + case "player": + if len(args) != 3 { + return usage + } + + clt := proxy.Find(args[2]) + if clt == nil { + return "Player is not connected." + } + + for i := 0; i < 5; i++ { + srv, ok := proxy.Conf().RandomGroupServer(args[1]) + if !ok { + return "Group does not exist." + } + + if srv == args[1] { + return "Group is also a server." + } + + if clt.ServerName() == srv { + if i == 4 { + return "Player is already connected to this server after 5 attempts." + } else { + continue + } + } + + if err := clt.HopGroup(args[1]); err != nil { + clt.Log("<-", err) + + if errors.Is(err, proxy.ErrNoSuchServer) { + return "Server does not exist." + } else if errors.Is(err, proxy.ErrNewMediaPool) { + return "The new server belongs to a media pool that is not present on this client." + } + + clt.SendChatMsg("Could not switch servers. Reconnect if you encounter any problems. Error:", err.Error()) + return "Could not switch servers. Error: " + err.Error() + } + } + case "current": + if len(args) != 2 { + return usage + } + + for clt := range proxy.Clts() { + if clt.ServerName() == cc.ServerName() { + for i := 0; i < 5; i++ { + srv, ok := proxy.Conf().RandomGroupServer(args[1]) + if !ok { + return "Group does not exist." + } + + if srv == args[1] { + return "Group is also a server." + } + + if srv == cc.ServerName() { + return "Start and destination are identical." + } + + if clt.ServerName() == srv { + continue + } + + if err := clt.HopGroup(args[1]); err != nil { + clt.Log("<-", err) + + if errors.Is(err, proxy.ErrNoSuchServer) { + return "Server does not exist." + } + + clt.SendChatMsg("Could not switch servers. Reconnect if you encounter any problems. Error:", err.Error()) + } + } + } + } + case "all": + if len(args) != 2 { + return usage + } + + for clt := range proxy.Clts() { + for i := 0; i < 5; i++ { + srv, ok := proxy.Conf().RandomGroupServer(args[1]) + if !ok { + return "Group does not exist." + } + + if srv == args[1] { + return "Group is also a server." + } + + if clt.ServerName() == srv { + continue + } + + if err := clt.HopGroup(args[1]); err != nil { + clt.Log("<-", err) + + if errors.Is(err, proxy.ErrNoSuchServer) { + return "Server does not exist." + } + + clt.SendChatMsg("Could not switch servers. Reconnect if you encounter any problems. Error:", err.Error()) + } + } + } + default: + return usage + } + + return "" + }, + }) + proxy.RegisterChatCmd(proxy.ChatCmd{ Name: "players", Perm: "cmd_players", Help: "Show the player list of every server.", |