Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
juunini committed Feb 18, 2024
2 parents 3695389 + 402d423 commit ac2fa8d
Show file tree
Hide file tree
Showing 5 changed files with 157 additions and 11 deletions.
9 changes: 9 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package main

import (
"time"

"github.com/juunini/palworld-discord-bot/src/bot"
"github.com/juunini/palworld-discord-bot/src/config"
"github.com/juunini/palworld-discord-bot/src/i18n"
Expand All @@ -16,5 +18,12 @@ func main() {

session.AddHandler(bot.Handler)

go func() {
for {
bot.Watch(session)
time.Sleep(10 * time.Second)
}
}()

bot.Connect(session)
}
72 changes: 72 additions & 0 deletions src/bot/watch.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package bot

import (
"fmt"

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

func Watch(session *discordgo.Session) {
if err := watchers.Players(); err != nil {
return
}

sendNewPlayers(session)
sendLeftPlayers(session)
sendOnlinePlayerDashboard(session)
}

func sendNewPlayers(session *discordgo.Session) {
for _, player := range watchers.NewPlayers {
fmt.Println(player.Username)
session.ChannelMessageSend(config.DISCORD_LOG_CHANNEL_ID, player.Username+" joined the server")
}
}

func sendLeftPlayers(session *discordgo.Session) {
for _, player := range watchers.LeftPlayers {
session.ChannelMessageSend(config.DISCORD_LOG_CHANNEL_ID, player.Username+" left the server")
}
}

func sendOnlinePlayerDashboard(session *discordgo.Session) {
if len(watchers.NewPlayers) == 0 && len(watchers.LeftPlayers) == 0 {
return
}

content := ""

for _, player := range watchers.OnlinePlayers {
content += fmt.Sprintf("- %s\n", player.Username)
}

embed := &discordgo.MessageEmbed{
Title: fmt.Sprintf("Online Players (%d)", len(watchers.OnlinePlayers)),
Fields: []*discordgo.MessageEmbedField{
{
Value: content,
Inline: false,
},
},
}

if config.DISCORD_DASHBAORD_ONLINE_PLAYERS_MESSAGE_ID == "" {
message, err := session.ChannelMessageSendEmbed(config.DISCORD_DASHBOARD_CHANNEL_ID, embed)
if err != nil {
return
}

config.DISCORD_DASHBAORD_ONLINE_PLAYERS_MESSAGE_ID = message.ID
config.SaveEnv()
return
}

_, err := session.ChannelMessageEditEmbed(config.DISCORD_DASHBOARD_CHANNEL_ID, config.DISCORD_DASHBAORD_ONLINE_PLAYERS_MESSAGE_ID, embed)
if err != nil {
fmt.Println(err)
return
}

}
62 changes: 62 additions & 0 deletions src/bot/watchers/players.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package watchers

import (
"encoding/csv"
"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"
)

var LeftPlayers = map[string]Player{}
var OnlinePlayers = map[string]Player{}
var NewPlayers = []Player{}

type Player struct {
Username string
PlayerID string
SteamID string
}

func Players() error {
client, err := utils.RconClient()
if err != nil {
console_decoration.PrintError(i18n.FailedToConnectRconServer)
return err
}

response, err := client.ShowPlayers()
if err != nil {
console_decoration.PrintError(i18n.FailedToShowPlayerCommand)
return err
}

rows, err := csv.NewReader(strings.NewReader(response)).ReadAll()
if err != nil {
return err
}

LeftPlayers = OnlinePlayers
OnlinePlayers = map[string]Player{}
NewPlayers = []Player{}

for _, row := range rows[1:] {
player := Player{
Username: row[0],
PlayerID: row[1],
SteamID: row[2],
}
OnlinePlayers[player.SteamID] = player

_, ok := LeftPlayers[player.SteamID]
if ok {
delete(LeftPlayers, player.SteamID)
continue
}

NewPlayers = append(NewPlayers, player)
}

return nil
}
1 change: 1 addition & 0 deletions src/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ var PALWORLD_RCON_PORT_STRING = "25575"
var PALWORLD_RCON_PORT uint64 = 25575
var PALWORLD_RCON_PASSWORD = ""
var DISCORD_DASHBOARD_CHANNEL_ID = ""
var DISCORD_DASHBAORD_ONLINE_PLAYERS_MESSAGE_ID = ""
var DISCORD_LOG_CHANNEL_ID = ""
var LANGUAGE = "en"
24 changes: 13 additions & 11 deletions src/config/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@ func askConfigToUser() {
scanEnv("Palworld RCON Password", &PALWORLD_RCON_PASSWORD)
scanEnvWithDefaultValue("Language", &LANGUAGE, LANGUAGE)

saveEnv()
SaveEnv()
printEnv()
loadEnv()
}

func saveEnv() {
func SaveEnv() {
if err := godotenv.Write(envMap(), ".env"); err != nil {
fmt.Printf("%sError writing .env file: %s%s\n", console_decoration.RED, err, console_decoration.RESET)
os.Exit(1)
Expand Down Expand Up @@ -72,21 +72,23 @@ func loadEnv() {

PALWORLD_RCON_PASSWORD = os.Getenv("PALWORLD_RCON_PASSWORD")
DISCORD_DASHBOARD_CHANNEL_ID = os.Getenv("DISCORD_DASHBOARD_CHANNEL_ID")
DISCORD_DASHBAORD_ONLINE_PLAYERS_MESSAGE_ID = os.Getenv("DISCORD_DASHBAORD_ONLINE_PLAYERS_MESSAGE_ID")
DISCORD_LOG_CHANNEL_ID = os.Getenv("DISCORD_LOG_CHANNEL_ID")
LANGUAGE = os.Getenv("LANGUAGE")
}

func envMap() map[string]string {
return map[string]string{
"DISCORD_BOT_TOKEN": DISCORD_BOT_TOKEN,
"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_STRING,
"PALWORLD_RCON_PASSWORD": PALWORLD_RCON_PASSWORD,
"DISCORD_DASHBOARD_CHANNEL_ID": DISCORD_DASHBOARD_CHANNEL_ID,
"DISCORD_LOG_CHANNEL_ID": DISCORD_LOG_CHANNEL_ID,
"LANGUAGE": LANGUAGE,
"DISCORD_BOT_TOKEN": DISCORD_BOT_TOKEN,
"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_STRING,
"PALWORLD_RCON_PASSWORD": PALWORLD_RCON_PASSWORD,
"DISCORD_DASHBOARD_CHANNEL_ID": DISCORD_DASHBOARD_CHANNEL_ID,
"DISCORD_DASHBAORD_ONLINE_PLAYERS_MESSAGE_ID": DISCORD_DASHBAORD_ONLINE_PLAYERS_MESSAGE_ID,
"DISCORD_LOG_CHANNEL_ID": DISCORD_LOG_CHANNEL_ID,
"LANGUAGE": LANGUAGE,
}
}

Expand Down

0 comments on commit ac2fa8d

Please sign in to comment.