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(); }
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; * }*/ }
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(); }
//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); }
//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!"); } }
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)); }
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); }