Пример #1
0
        public static async Task LoadArkServer(string serializedData)
        {
            //Deserialize
            ArkServer server = (ArkServer)Tools.DeserializeObject(serializedData, typeof(ArkServer));

            //Add to list.
            activeServers.Add(server);
            //Init
            await server.Reinit();
        }
Пример #2
0
        static async Task OnDmMessage(DSharpPlus.EventArgs.MessageCreateEventArgs e)
        {
            //Assume this is for creation
            DiscordUser user = await DiscordUser.GetUserFromDiscord(e);

            await ArkServer.MessageSentToFinshSetup(e, user);

            /*//First, check if this user is in the process of creating an Ark server
             * ArkServer[] userCreatingServers = ArkServer.GetArkServersInSetupStageForUser(e.Author.Id);
             * if (userCreatingServers.Length == 1)
             * {
             *  //User is creating a server. Go through with the setup of it.
             *  await userCreatingServers[0].MessageSentDuringSetup(e);
             *  return;
             * }*/
        }
Пример #3
0
        static async Task OnMessage(DSharpPlus.EventArgs.MessageCreateEventArgs e)
        {
            //Stop if this is myself.
            if (e.Author.IsCurrent || e.Author.IsBot)
            {
                return;
            }
            //If this is a dm, use the other function.
            if (e.Guild == null)
            {
                //DM
                await OnDmMessage(e);

                return;
            }
            //First, authorize the user.
            ArkServer selectedServer = null;

            if (activeServers.Count > 0)
            {
                selectedServer = activeServers[0];
            }
            DiscordUser user = await DiscordUser.GetUserFromDiscord(e, selectedServer);

            if (e.Message.Content.ToLower().StartsWith(PrefixString + "rcon "))
            {
                await LegacyArkRconConnection.DiscordRawRconCommand(e, user, selectedServer);
            }
            if (e.Message.Content.ToLower().StartsWith(PrefixString + "help"))
            {
                await user.ShowPersonalHelp(e, selectedServer);
            }
            if (e.Message.Content.ToLower().StartsWith(PrefixString + "role"))
            {
                await e.Message.RespondAsync("You're in role **" + user.permissionLevel.ToString() + "**.");
            }
            if (e.Message.Content.ToLower().StartsWith(PrefixString + "link"))
            {
                await user.BeginArkLink(e);
            }
            if (e.Message.Content.ToLower().StartsWith(PrefixString + "stats"))
            {
                await user.SendUserStatus(e);
            }
            if (e.Message.Content.ToLower().StartsWith(PrefixString + "chat"))
            {
                string msg = e.Message.Content.Substring((PrefixString + "chat ").Length);
                if (Tools.WhitelistSafeText(msg, out string badChars))
                {
                    //Check length
                    if (msg.Length > 800)
                    {
                        //Bad.
                        var embed = Tools.GenerateEmbed("Too Long!", "Dang it, " + e.Author.Username, "Your chat message is " + (msg.Length - 800).ToString() + " characters over the limit of 800!", DSharpPlus.Entities.DiscordColor.Orange);
                        await e.Message.RespondAsync(embed : embed);
                    }
                    else
                    {
                        //Okay to send
                        await selectedServer.SendArkMessage(msg, e.Author.Username);

                        var emoji = DSharpPlus.Entities.DiscordEmoji.FromName(discord, ":white_check_mark:");
                        e.Message.CreateReactionAsync(emoji);
                    }
                }
                else
                {
                    //Bad.
                    var embed = Tools.GenerateEmbed("Illegal Character!", "Dang it, " + e.Author.Username, "The character '" + badChars + "' isn't allowed.", DSharpPlus.Entities.DiscordColor.Orange);
                    await e.Message.RespondAsync(embed : embed);
                }
            }
            if (e.Message.Content.ToLower().StartsWith(PrefixString + "list") && !e.Message.Content.ToLower().StartsWith(PrefixString + "listbackup"))
            {
                await selectedServer.ListPlayersCmd(e);
            }
            if (e.Message.Content.ToLower().StartsWith(PrefixString + "backup"))
            {
                await selectedServer.arkIO.BackupServerDiscord(e, @"C:\Program Files (x86)\Steam\steamapps\common\ARK\ShooterGame\Saved\SavedArks\", @"D:\ArkBackups\");
            }

            if (e.Message.Content.ToLower().StartsWith(PrefixString + "listbackup"))
            {
                await selectedServer.arkIO.ListBackupsDiscord(e, @"D:\ArkBackups\");
            }

            //Save and close user
            user.CloseUser();
        }
Пример #4
0
        //Setup functions

        /// <summary>
        /// This function will be called when the encoded string is sent to the bot's DM to setup the server.
        /// </summary>
        /// <param name="e"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        ///

        public static async Task MessageSentToFinshSetup(DSharpPlus.EventArgs.MessageCreateEventArgs e, DiscordUser user)
        {
            var embed = Tools.GenerateEmbed("ArkBot Setup", "", "Verifying...", DSharpPlus.Entities.DiscordColor.Red);
            var msg   = await e.Message.RespondAsync(embed : embed);

            //Check if user is auth.
            if (user.permissionLevel != DiscordUserPermissionLevel.owner)
            {
                //Not owner!
                embed = Tools.GenerateEmbed("ArkBot Setup", "", "You're not the owner of the bot! Ask the owner to do this action.", DSharpPlus.Entities.DiscordColor.Red);
                await msg.ModifyAsync(embed : embed);

                return;
            }
            //Decode the base 64
            string decoded = Encoding.UTF8.GetString(Convert.FromBase64String(e.Message.Content));
            //Deserialize
            ArkServer s = (ArkServer)Tools.DeserializeObject(decoded, typeof(ArkServer));

            if (s == null)
            {
                //Failed
                await msg.ModifyAsync(embed : Tools.GenerateEmbed("ArkBot Setup Error", "Keep in mind that a DM chat can only be used to create servers", "The encoded string couldn't be read! Make sure it is copied in it's entirety. ", DSharpPlus.Entities.DiscordColor.Red));

                return;
            }
            //Todo: Verify
            //Todo: Rcon port
            //Test RCON connection IF rcon is enabled
            if (s.isRconEnabled)
            {
                embed = Tools.GenerateEmbed("Testing RCON...", "", "One moment...", DSharpPlus.Entities.DiscordColor.Yellow);
                var testMsg = await e.Message.RespondAsync(embed : embed);

                try
                {
                    /*
                     * var rcon = await ArkRconConnection.ConnectToRcon(s.rconIp, s.rconPort, s.rconPassword);
                     * bool isConnected = rcon.isReady;
                     * if (isConnected)
                     * {
                     *  embed = Tools.GenerateEmbed("RCON test passed!", "", "Thanks for setting up RCON!", DSharpPlus.Entities.DiscordColor.Green);
                     *  await testMsg.ModifyAsync(embed: embed);
                     * }
                     * else
                     * {
                     *  embed = Tools.GenerateEmbed("RCON test failed!", "Please try again.", "No other info provided.", DSharpPlus.Entities.DiscordColor.Red);
                     *  await testMsg.ModifyAsync(embed: embed);
                     *  return;
                     * }*/
                    throw new NotImplementedException();
                } catch (Exception ex)
                {
                    embed = Tools.GenerateEmbed("RCON test failed!", "Please try again.", ex.Message, DSharpPlus.Entities.DiscordColor.Red);
                    await testMsg.ModifyAsync(embed : embed);

                    return;
                }
            }
            //Test the notification channel
            DSharpPlus.Entities.DiscordChannel channel;
            try
            {
                ulong id = s.notificationChannel;
                channel = await Program.discord.GetChannelAsync(id);

                var channelTestMsg = await Program.discord.SendMessageAsync(channel, "Setting ArkBot channel to this for server '" + s.name + "'.");
            }
            catch (Exception ex)
            {
                embed = Tools.GenerateEmbed("Creation Failed!", ex.Message, "The notification channel couldn't be found.", DSharpPlus.Entities.DiscordColor.Red);
                await msg.ModifyAsync(embed : embed);

                await msg.RespondAsync(embed : Tools.DumpEmbedException(ex));

                return;
            }

            //We're good if we land here. The message was sent correctly.
            //Create roles if they don't exist
            try
            {
                var guild = channel.Guild;
                //Look for the roles.
                var   existingRoles = guild.Roles;
                ulong roleId_admin  = 0;
                ulong roleId_user   = 0;
                foreach (var role in existingRoles)
                {
                    if (role.Name == DiscordUser.ROLE_NAME_USER)
                    {
                        roleId_user = role.Id;
                    }
                    if (role.Name == DiscordUser.ROLE_NAME_ADMIN)
                    {
                        roleId_admin = role.Id;
                    }
                }
                //Create the roles if they don't exist
                if (roleId_admin == 0)
                {
                    roleId_admin = (await guild.CreateRoleAsync(DiscordUser.ROLE_NAME_ADMIN)).Id;
                }
                if (roleId_user == 0)
                {
                    roleId_user = (await guild.CreateRoleAsync(DiscordUser.ROLE_NAME_USER)).Id;
                }
                //We know the roles exist.
                s.adminRoleId = roleId_admin;
                s.userRoleId  = roleId_user;
            } catch (Exception ex)
            {
                embed = Tools.GenerateEmbed("Creation Failed!", ex.Message, "Failed to create roles. Make sure the bot has permission to do so.", DSharpPlus.Entities.DiscordColor.Red);
                await msg.ModifyAsync(embed : embed);

                await msg.RespondAsync(embed : Tools.DumpEmbedException(ex));

                return;
            }

            //Now save
            try
            {
                await s.SaveSettings();
            } catch (Exception ex)
            {
                embed = Tools.GenerateEmbed("Creation Failed!", ex.Message, "Failed to save. Make sure the path used is correct.", DSharpPlus.Entities.DiscordColor.Red);
                await msg.ModifyAsync(embed : embed);

                await msg.RespondAsync(embed : Tools.DumpEmbedException(ex));

                return;
            }

            //Done.
            embed = Tools.GenerateEmbed("Creation Finished!", "", "You may need to reload ArkBot.", DSharpPlus.Entities.DiscordColor.Green);
            await msg.ModifyAsync(embed : embed);
        }
Пример #5
0
        //Works with RCON stuff

        /*
         * public static async Task<ArkRconConnection> ConnectToRcon(string ip, ushort port, string arkPassword)
         * {
         *  ArkRconConnection c = null;
         *  bool ready = false;
         *  var rcon = new RconClient(new System.Net.IPEndPoint(System.Net.IPAddress.Parse(ip), port), arkPassword, new RconClient.ReadyCallback((RconClient context, bool okay) =>
         *  {
         *      ready = true;
         *
         *  }));
         *  c = new ArkRconConnection(rcon, ip, port, arkPassword);
         *  while (ready == false) ;
         *  c.isReady = ready;
         *  Console.WriteLine("Sock ready");
         *  return c;
         * }
         *
         * public static async Task<ArkRconConnection> ConnectToRcon(string ip, int port, string arkPassword)
         * {
         *  return await ConnectToRcon(ip, ushort.Parse(port.ToString()), arkPassword);
         * }
         *
         * //Class stuff
         * RconClient rconClient;
         * public bool isReady = false;
         * public string failMsg;
         * public string ip;
         * public ushort port;
         * public string arkPassword;
         *
         * public ArkRconConnection(RconClient client, string _ip, ushort _port, string _arkPassword)
         * {
         *  //Main constructor.
         *  rconClient = client;
         *  ip = _ip;
         *  port = _port;
         *  arkPassword = _arkPassword;
         * }
         *
         * public string RunCommand(string msg)
         * {
         *  //Wait to be ready
         *  Console.WriteLine("what");
         *  string response = rconClient.GetResponse(msg);
         *  Console.WriteLine(response);
         *  return response;
         * }*/

        public static async Task DiscordRawRconCommand(DSharpPlus.EventArgs.MessageCreateEventArgs e, DiscordUser user, ArkServer server)
        {
            if (user.permissionLevel == DiscordUserPermissionLevel.owner)
            {
                //Ok to run.
                await e.Message.RespondAsync(server.rconConnection.GetResponse(e.Message.Content.Substring((Program.PrefixString + "rcon ").Length)));
            }
            else
            {
                //Cannot run becasue of permission level.
                await e.Message.RespondAsync("ERROR - Cannot run raw command because you're not the bot owner!");
            }
        }
Пример #6
0
        public static async Task <DiscordUser> GetUserFromDiscord(DSharpPlus.EventArgs.MessageCreateEventArgs e, ArkServer server = null)
        {
            //Check if this user has roles.
            DiscordUserPermissionLevel perm = DiscordUserPermissionLevel.anyone;

            if (server != null)
            {
                //Fetch their permission level.
                var guild = e.Guild;
                if (guild != null)
                {
                    var member = await guild.GetMemberAsync(e.Author.Id);

                    CheckIfUserHasRoles(member, server.adminRoleId, server.userRoleId, out bool isAdmin, out bool isUser);

                    if (isUser)
                    {
                        perm = DiscordUserPermissionLevel.user;
                    }
                    if (isAdmin)
                    {
                        perm = DiscordUserPermissionLevel.admin;
                    }
                }
            }
            //Check if this user owns the bot.
            if (e.Author.Id == Program.ownerId)
            {
                perm = DiscordUserPermissionLevel.owner;
            }

            return(new DiscordUser(e.Author.Username, e.Author.Id, perm));
        }
Пример #7
0
        public async Task ShowPersonalHelp(DSharpPlus.EventArgs.MessageCreateEventArgs e, ArkServer server)
        {
            string help   = "";
            string prefix = Program.PrefixString;

            help += prefix + "**help** - Shows the menu you're in right now! \r\n";
            help += prefix + "**chat** - If your admin enabled it, sends a chat message to the Ark server. \r\n";
            help += prefix + "**list** - Shows a playerlist of everyone on the Ark server. \r\n";
            var channel = await Program.discord.GetChannelAsync(server.notificationChannel);

            help += "\r\nThe current notification channel for this Ark server is **" + channel.Name + "**.";

            //Create embed
            var embed = Tools.GenerateEmbed("ArkBot Help", "ArkBot by RomanPort - V0.0.0 - romanport.com", help, Program.CreateDynamicColor());
            await e.Message.RespondAsync(embed : embed);
        }