Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Commands #3

Merged
merged 18 commits into from
Feb 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ go 1.22.0
require (
github.com/bwmarrin/discordgo v0.27.1
github.com/joho/godotenv v1.5.1
github.com/juunini/palworld-rcon v1.0.0
)

require (
github.com/gorcon/rcon v1.3.5 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 // indirect
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY=
github.com/bwmarrin/discordgo v0.27.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY=
github.com/gorcon/rcon v1.3.5 h1:YE/Vrw6R99uEP08wp0EjdPAP3Jwz/ys3J8qxI1nYoeU=
github.com/gorcon/rcon v1.3.5/go.mod h1:zR1qfKZttF8vAgH1NsP6CdpachOvLDq8jE64NboTpIM=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/juunini/palworld-rcon v1.0.0 h1:H5R6ZW216xepxwQa+EVMexR+5pvchIUa2sQJx6Pa93o=
github.com/juunini/palworld-rcon v1.0.0/go.mod h1:hN2aABVdCDpOjea6aPynO6nEM64CKSss+60evi2jQhY=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
Expand Down
30 changes: 30 additions & 0 deletions src/bot/commands/ban.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package commands

import (
"strings"

"github.com/juunini/palworld-discord-bot/src/i18n"
"github.com/juunini/palworld-discord-bot/src/utils"
)

func ban(command string) string {
steamID, found := strings.CutPrefix(command, "ban ")

if !found {
return i18n.WrongParameters
}

client, err := utils.RconClient()
if err != nil {
return i18n.FailedToConnectRconServer
}

defer client.Disconnect()

response, err := client.BanPlayer(steamID)
if err != nil {
return i18n.FailedToBanCommand
}

return response
}
30 changes: 30 additions & 0 deletions src/bot/commands/broadcast.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package commands

import (
"strings"

"github.com/juunini/palworld-discord-bot/src/i18n"
"github.com/juunini/palworld-discord-bot/src/utils"
)

func broadcast(command string) string {
message, found := strings.CutPrefix(command, "broadcast ")

if !found {
return i18n.WrongParameters
}

client, err := utils.RconClient()
if err != nil {
return i18n.FailedToConnectRconServer
}

defer client.Disconnect()

response, err := client.Broadcast(message)
if err != nil {
return i18n.FailedToBroadcastCommand
}

return response
}
24 changes: 24 additions & 0 deletions src/bot/commands/doExit.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package commands

import (
"github.com/juunini/palworld-discord-bot/src/console_decoration"
"github.com/juunini/palworld-discord-bot/src/i18n"
"github.com/juunini/palworld-discord-bot/src/utils"
)

func doExit() string {
client, err := utils.RconClient()
if err != nil {
return i18n.FailedToConnectRconServer
}

defer client.Disconnect()

response, err := client.DoExit()
if err != nil {
console_decoration.PrintError(i18n.FailedToDoExitCommand + ": " + err.Error())
return i18n.FailedToDoExitCommand
}

return response
}
7 changes: 0 additions & 7 deletions src/bot/commands/help.go

This file was deleted.

30 changes: 30 additions & 0 deletions src/bot/commands/kick.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package commands

import (
"strings"

"github.com/juunini/palworld-discord-bot/src/i18n"
"github.com/juunini/palworld-discord-bot/src/utils"
)

func kick(command string) string {
steamID, found := strings.CutPrefix(command, "kick ")

if !found {
return i18n.WrongParameters
}

client, err := utils.RconClient()
if err != nil {
return i18n.FailedToConnectRconServer
}

defer client.Disconnect()

response, err := client.KickPlayer(steamID)
if err != nil {
return i18n.FailedToKickCommand
}

return response
}
32 changes: 27 additions & 5 deletions src/bot/commands/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,36 @@ import (
"strings"

"github.com/juunini/palworld-discord-bot/src/config"
"github.com/juunini/palworld-discord-bot/src/i18n"
"github.com/juunini/palworld-discord-bot/src/utils"
)

func Response(message string) string {
command, _ := strings.CutPrefix(message, config.DISCORD_COMMAND_PREFIX+" ")
func Response(message string, username string) string {
isAdmin := utils.IsAdmin(username)

if command == "help" {
return Help()
command, found := strings.CutPrefix(message, config.DISCORD_COMMAND_PREFIX+" ")
if command == "help" || !found {
return i18n.Help(config.DISCORD_COMMAND_PREFIX, isAdmin)
}

return "Unknown command"
// Under commands, only admins can execute
if !isAdmin {
return i18n.UnknownCommand
}

if command == "kick" {
return kick(command)
} else if command == "ban" {
return ban(command)
} else if strings.HasPrefix(command, "broadcast") {
return broadcast(command)
} else if strings.HasPrefix(command, "shutdown") {
return shutdown(command)
} else if command == "doExit" {
return doExit()
} else if command == "save" {
return save()
}

return i18n.UnknownCommand
}
24 changes: 24 additions & 0 deletions src/bot/commands/save.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package commands

import (
"github.com/juunini/palworld-discord-bot/src/console_decoration"
"github.com/juunini/palworld-discord-bot/src/i18n"
"github.com/juunini/palworld-discord-bot/src/utils"
)

func save() string {
client, err := utils.RconClient()
if err != nil {
return i18n.FailedToConnectRconServer
}

defer client.Disconnect()

response, err := client.Save()
if err != nil {
console_decoration.PrintError(i18n.FailedToSaveCommand + ": " + err.Error())
return i18n.FailedToSaveCommand
}

return response
}
50 changes: 50 additions & 0 deletions src/bot/commands/shutdown.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package commands

import (
"strings"

"github.com/juunini/palworld-discord-bot/src/console_decoration"
"github.com/juunini/palworld-discord-bot/src/i18n"
"github.com/juunini/palworld-discord-bot/src/utils"
)

func shutdown(command string) string {
client, err := utils.RconClient()
if err != nil {
return i18n.FailedToConnectRconServer
}

defer client.Disconnect()

seconds, message, errorMessage := shutdownParameters(command)
if errorMessage != "" {
return errorMessage
}

response, err := client.Shutdown(seconds, message)
if err != nil {
console_decoration.PrintError(i18n.FailedToShutdownCommand + ": " + err.Error())
return i18n.FailedToShutdownCommand
}

return response
}

func shutdownParameters(command string) (uint, string, string) {
paramString, _ := strings.CutPrefix(command, "shutdown ")
params := strings.Split(paramString, " ")

if len(params) < 2 {
console_decoration.PrintError(i18n.WrongParameters)
return 0, "", i18n.WrongParameters
}

seconds, err := utils.ToUint(params[0])
if err != nil {
console_decoration.PrintError(i18n.WrongParameters + ": " + err.Error())
return 0, "", i18n.WrongParameters
}

message := params[1]
return seconds, message, ""
}
2 changes: 1 addition & 1 deletion src/bot/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func Handler(s *discordgo.Session, m *discordgo.MessageCreate) {
}

if isCommand(m) {
s.ChannelMessageSend(m.ChannelID, commands.Response(m.Content))
s.ChannelMessageSend(m.ChannelID, commands.Response(m.Content, m.Author.Username))
return
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ var DISCORD_ADMIN_USERNAMES_STRING = ""
var DISCORD_ADMIN_USERNAMES = []string{}
var DISCORD_COMMAND_PREFIX = "!palbot"
var PALWORLD_RCON_HOST = "127.0.0.1"
var PALWORLD_RCON_PORT = "25575"
var PALWORLD_RCON_PORT_STRING = "25575"
var PALWORLD_RCON_PORT uint64 = 25575
var PALWORLD_RCON_PASSWORD = ""
var DISCORD_DASHBOARD_CHANNEL_ID = ""
var DISCORD_LOG_CHANNEL_ID = ""
Expand Down
15 changes: 12 additions & 3 deletions src/config/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package config
import (
"fmt"
"os"
"strconv"
"strings"

"github.com/joho/godotenv"
Expand All @@ -26,7 +27,7 @@ func askConfigToUser() {
scanEnv("Discord Admin Usernames (comma separated)", &DISCORD_ADMIN_USERNAMES_STRING)
scanEnvWithDefaultValue("Discord Command Prefix", &DISCORD_COMMAND_PREFIX, DISCORD_COMMAND_PREFIX)
scanEnvWithDefaultValue("Palworld RCON Host", &PALWORLD_RCON_HOST, PALWORLD_RCON_HOST)
scanEnvWithDefaultValue("Palworld RCON Port", &PALWORLD_RCON_PORT, PALWORLD_RCON_PORT)
scanEnvWithDefaultValue("Palworld RCON Port", &PALWORLD_RCON_PORT_STRING, PALWORLD_RCON_PORT_STRING)
scanEnv("Palworld RCON Password", &PALWORLD_RCON_PASSWORD)
scanEnvWithDefaultValue("Language", &LANGUAGE, LANGUAGE)

Expand Down Expand Up @@ -60,7 +61,15 @@ func loadEnv() {
DISCORD_ADMIN_USERNAMES = trimSpaceAdminUsers()
DISCORD_COMMAND_PREFIX = os.Getenv("DISCORD_COMMAND_PREFIX")
PALWORLD_RCON_HOST = os.Getenv("PALWORLD_RCON_HOST")
PALWORLD_RCON_PORT = os.Getenv("PALWORLD_RCON_PORT")
PALWORLD_RCON_PORT_STRING = os.Getenv("PALWORLD_RCON_PORT")

var err error
PALWORLD_RCON_PORT, err = strconv.ParseUint(PALWORLD_RCON_PORT_STRING, 10, 64)
if err != nil {
fmt.Printf("%sError parsing PALWORLD_RCON_PORT: %s%s\n", console_decoration.RED, err, console_decoration.RESET)
os.Exit(1)
}

PALWORLD_RCON_PASSWORD = os.Getenv("PALWORLD_RCON_PASSWORD")
DISCORD_DASHBOARD_CHANNEL_ID = os.Getenv("DISCORD_DASHBOARD_CHANNEL_ID")
DISCORD_LOG_CHANNEL_ID = os.Getenv("DISCORD_LOG_CHANNEL_ID")
Expand All @@ -73,7 +82,7 @@ func envMap() map[string]string {
"DISCORD_ADMIN_USERNAMES": DISCORD_ADMIN_USERNAMES_STRING,
"DISCORD_COMMAND_PREFIX": DISCORD_COMMAND_PREFIX,
"PALWORLD_RCON_HOST": PALWORLD_RCON_HOST,
"PALWORLD_RCON_PORT": PALWORLD_RCON_PORT,
"PALWORLD_RCON_PORT": PALWORLD_RCON_PORT_STRING,
"PALWORLD_RCON_PASSWORD": PALWORLD_RCON_PASSWORD,
"DISCORD_DASHBOARD_CHANNEL_ID": DISCORD_DASHBOARD_CHANNEL_ID,
"DISCORD_LOG_CHANNEL_ID": DISCORD_LOG_CHANNEL_ID,
Expand Down
26 changes: 23 additions & 3 deletions src/i18n/en.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,32 @@ package i18n

import (
"fmt"

"github.com/juunini/palworld-discord-bot/src/config"
)

func en() {
BotRunningStart = "Bot is now running. Press CTRL-C to exit."
Help = fmt.Sprintf(`%s help - Display help message.`, config.DISCORD_COMMAND_PREFIX)
FailedToConnectRconServer = "Failed to connect RCON server"
FailedToSaveCommand = "Failed to Save command"
FailedToDoExitCommand = "Failed to DoExit command"
FailedToShutdownCommand = "Failed to Shutdown command"
FailedToBroadcastCommand = "Failed to Broadcast command"
FailedToKickCommand = "Failed to Kick command"
FailedToBanCommand = "Failed to Ban command"
WrongParameters = "Wrong parameters"
Help = func(commandPrefix string, isAdmin bool) string {
message := fmt.Sprintf("`%s help` - Show help\n", commandPrefix)

if !isAdmin {
return message
}

message += fmt.Sprintf("`%s kick <SteamID>` - Kick <SteamID> from server. Can connect again.\n", commandPrefix)
message += fmt.Sprintf("`%s ban <SteamID>` - Ban <SteamID> from server. Can't connect again.\n", commandPrefix)
message += fmt.Sprintf("`%s broadcast <message>` - Send <message> to all users as SYSTEM message.\n", commandPrefix)
message += fmt.Sprintf("`%s shutdown <seconds> <message>` - Shutdown server after <seconds> with <message>.\n", commandPrefix)
message += fmt.Sprintf("`%s doExit` - Force exit server.\n", commandPrefix)
message += fmt.Sprintf("`%s save` - Save server.", commandPrefix)
return message
}
UnknownCommand = "Unknown command"
}
15 changes: 11 additions & 4 deletions src/i18n/i18n.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
package i18n

func SetLanguage(language string) {
en()

switch language {
case "ko":
ko()
return

default:
en()
}
}

var BotRunningStart string
var Help string
var FailedToConnectRconServer string
var FailedToSaveCommand string
var FailedToDoExitCommand string
var FailedToShutdownCommand string
var FailedToBroadcastCommand string
var FailedToKickCommand string
var FailedToBanCommand string
var WrongParameters string
var Help func(commandPrefix string, isAdmin bool) string
var UnknownCommand string
Loading