From 1d8de473c4726d5d96792b4504e067b72ca9e13c Mon Sep 17 00:00:00 2001 From: Dustin Pianalto Date: Wed, 24 Feb 2021 16:29:42 -0900 Subject: [PATCH] Add broadcast command --- internal/exts/arcon/arcon.go | 79 ++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/internal/exts/arcon/arcon.go b/internal/exts/arcon/arcon.go index 902cf87..c213fc0 100644 --- a/internal/exts/arcon/arcon.go +++ b/internal/exts/arcon/arcon.go @@ -101,3 +101,82 @@ func listplayers(ctx disgoman.Context, server geeksbot.Server) { fmt.Sprintf("**%s:**%s", server.Name, strings.Join(players, "\n")), ) } + +var BroadcastCommand = &disgoman.Command{ + Name: "broadcast", + Aliases: nil, + Description: "Broadcast a message to ARK servers.", + OwnerOnly: false, + Hidden: false, + RequiredPermissions: 0, + Invoke: broadcastCommandFunc, +} + +func broadcastCommandFunc(ctx disgoman.Context, args []string) { + guild, err := services.GuildService.GetOrCreateGuild(ctx.Guild.ID) + if err != nil { + discord_utils.SendErrorMessage(ctx, "Error getting Guild from the database", err) + return + } + author, err := services.UserService.GetOrCreateUser(ctx.Message.Author.ID) + if err != nil { + discord_utils.SendErrorMessage(ctx, "Sorry, there was a problem getting your user.", err) + return + } + if !discord_utils.IsGuildAdmin(ctx, author) && !discord_utils.IsGuildMod(ctx, author) { + return + } + message := strings.Join(args[1:len(args)-1], " ") + if strings.ToLower(args[0]) == "all" { + servers, err := services.ServerService.GuildServers(guild) + if err != nil { + discord_utils.SendErrorMessage(ctx, "Could not find any servers for this guild", err) + return + } + for _, server := range servers { + go broadcast(ctx, server, message) + } + return + } else { + serverName := strings.Title(strings.ReplaceAll(args[0], "_", " ")) + server, err := services.ServerService.ServerByName(serverName, guild) + if err != nil { + discord_utils.SendErrorMessage(ctx, fmt.Sprintf("Could not find %s", serverName), err) + return + } + broadcast(ctx, server, message) + } +} + +func broadcast(ctx disgoman.Context, server geeksbot.Server, message string) { + msg, err := ctx.Send(fmt.Sprintf("**Broadcasting to: %s**", server.Name)) + if err != nil { + discord_utils.SendErrorMessage(ctx, "There was an error getting the player list", err) + return + } + conn, err := rcon.Dial(fmt.Sprintf("%s:%d", server.IPAddr, server.Port), server.Password) + if err != nil { + _, _ = ctx.Session.ChannelMessageEdit(ctx.Channel.ID, msg.ID, + fmt.Sprintf("**Could not open connection to %s**", server.Name), + ) + return + } + defer conn.Close() + userName := discord_utils.GetDisplayName(ctx, ctx.Message.Author.ID) + response, err := conn.Execute(fmt.Sprintf("broadcast %s: %s", userName, message)) + if err != nil { + _, _ = ctx.Session.ChannelMessageEdit(ctx.Channel.ID, msg.ID, + fmt.Sprintf("**There was a problem getting a response from %s**", server.Name), + ) + return + } + if response == "Server recieved, But no response!!" { + _, _ = ctx.Session.ChannelMessageEdit(ctx.Channel.ID, msg.ID, + fmt.Sprintf("**%s Broadcast Successful**", server.Name), + ) + return + } + _, _ = ctx.Session.ChannelMessageEdit(ctx.Channel.ID, msg.ID, + fmt.Sprintf("**Broadcasting to %s Failed!**", server.Name), + ) +}