From 82f07c959dc7a87251b4617e462003471e3cc071 Mon Sep 17 00:00:00 2001 From: TrueDoctor Date: Mon, 9 Apr 2018 00:54:19 +0200 Subject: Refactoring and Cleanup --- DiscoBot/Commands/CommandTypes.cs | 12 +++++ DiscoBot/Commands/Gm.cs | 103 ++++++++++++++++++++++++++++++++++++++ DiscoBot/Commands/List.cs | 76 ++++++++++++++++++++++++++++ DiscoBot/Commands/NpcCommands.cs | 37 ++++++++++++++ DiscoBot/Commands/Test.cs | 47 +++++++++++++++++ DiscoBot/Commands/Utility.cs | 32 ++++++++++++ DiscoBot/Commands/Voice.cs | 67 +++++++++++++++++++++++++ 7 files changed, 374 insertions(+) create mode 100644 DiscoBot/Commands/CommandTypes.cs create mode 100644 DiscoBot/Commands/Gm.cs create mode 100644 DiscoBot/Commands/List.cs create mode 100644 DiscoBot/Commands/NpcCommands.cs create mode 100644 DiscoBot/Commands/Test.cs create mode 100644 DiscoBot/Commands/Utility.cs create mode 100644 DiscoBot/Commands/Voice.cs (limited to 'DiscoBot/Commands') diff --git a/DiscoBot/Commands/CommandTypes.cs b/DiscoBot/Commands/CommandTypes.cs new file mode 100644 index 0000000..4ff0814 --- /dev/null +++ b/DiscoBot/Commands/CommandTypes.cs @@ -0,0 +1,12 @@ +namespace DiscoBot.Commands +{ + public enum CommandTypes + { + Talent, + Eigenschaft, + Angriff, + Parade, + Fernkampf, + KeinChar + } +} diff --git a/DiscoBot/Commands/Gm.cs b/DiscoBot/Commands/Gm.cs new file mode 100644 index 0000000..60b82fb --- /dev/null +++ b/DiscoBot/Commands/Gm.cs @@ -0,0 +1,103 @@ +namespace DiscoBot.Commands +{ + using System.Linq; + using System.Threading.Tasks; + + using DiscoBot.Auxiliary; + + using Discord.Commands; + using Discord.WebSocket; + + public class Gm : ModuleBase + { + public static string CheckCommand(string name, CommandTypes command, string waffe, int erschwernis = 0) + { + var comp = new SpellCorrect(); + var chr = Dsa.Chars.OrderBy(x => comp.Compare(x.Name, name)).First(); + switch (command) + { + case CommandTypes.Talent: + return chr.TestTalent(waffe, erschwernis); + case CommandTypes.Eigenschaft: + return chr.TestEigenschaft(waffe, erschwernis); + case CommandTypes.Angriff: + return chr.Angriff(waffe, erschwernis); + case CommandTypes.Parade: + return chr.Parade(waffe, erschwernis); + case CommandTypes.Fernkampf: + return chr.Fernkampf(waffe, erschwernis); + } + + return $"{name} verwendet {waffe}"; + } + + [Command("gm"), Summary("Führt eine probe aus")] + [Alias("GM", "as", "As", "als")] + public async Task ProbeAsync([Summary("Fernkampfwaffe")] string name, string command, string waffe, int erschwernis = 0) + { + if (!((SocketGuildUser)this.Context.User).Roles.ToList().Exists(v => v.Name.Equals("Meister"))) + { + await this.ReplyAsync("```xl\n Keine ausreichenden Berechtigunen\n```"); + return; + } + + command = command.ToLower(); + string res = this.Test(name, command, waffe, erschwernis); + + if (Dsa.GeneralContext != null && Dsa.GeneralContext.Channel.Id != this.Context.Channel.Id) + { + await Dsa.GeneralContext.Channel.SendMessageAsync("```xl\n" + res + "\n```"); + } + + await this.ReplyAsync("```xl\n" + res + "\n```"); + } + + private string Test(string name, string command, string waffe, int erschwernis = 0) + { + string res; + switch (command) + { + case "f": + case "fern": + case "fernkampf": + res = CheckCommand(name, CommandTypes.Fernkampf, waffe, erschwernis); + break; + case "t": + case "ta": + case "talent": + case "talente": + res = CheckCommand(name, CommandTypes.Talent, waffe, erschwernis); + break; + case "e": + case "ei": + case "eigenschaft": + res = CheckCommand(name, CommandTypes.Eigenschaft, waffe, erschwernis); + break; + case "z": + case "za": + case "zauber": + case "magie": + case "m": + res = CheckCommand(name, CommandTypes.Talent, waffe, erschwernis); + break; + case "a": + case "at": + case "an": + case "angrif": + case "angriff": + res = CheckCommand(name, CommandTypes.Angriff, waffe, erschwernis); + break; + case "p": + case "pa": + case "parade": + res = CheckCommand(name, CommandTypes.Parade, waffe, erschwernis); + break; + default: + res = $"Kommando {command} nicht gefunden"; + break; + } + + return res; + } + } +} diff --git a/DiscoBot/Commands/List.cs b/DiscoBot/Commands/List.cs new file mode 100644 index 0000000..9eac3a1 --- /dev/null +++ b/DiscoBot/Commands/List.cs @@ -0,0 +1,76 @@ +namespace DiscoBot.Commands +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Text; + using System.Threading.Tasks; + + using DiscoBot.Auxiliary; + using DiscoBot.Characters; + + using Discord.Commands; + + public class List : ModuleBase + { + [Command("list"), Summary("gibt eine Auflistung aus")] + public async Task ListAsync([Summary("Aktion")] string prop) + { + var res = new List(); + switch (prop.ToLower()) + { + case "chars": + case "Chars": + res.AddRange(Dsa.Chars.Select(x => x.Name)); + break; + case "t": + case "ta": + case "talent": + case "zauber": + res.AddRange( + ((Character)Dsa.Chars.Find(x => x.Name.Equals(Dsa.Relation[this.Context.User.Username]))) + .Talente.Select(s => s.Name + "\t " + s.Value + "\t " + s.Probe)); + break; + case "w": + case "waffe": + case "waffen": + res.AddRange( + ((Character)Dsa.Chars.Find(x => x.Name.Equals(Dsa.Relation[this.Context.User.Username]))) + .Kampftalente.Select(s => s.Name)); + break; + case "fern": + res.AddRange( + ((Character)Dsa.Chars.Find(x => x.Name.Equals(Dsa.Relation[this.Context.User.Username]))) + .Talente.Select(s => s.Name)); + break; + case "v": + case "vt": + case "vor": + case "vorteil": + res.AddRange( + ((Character)Dsa.Chars.Find(x => x.Name.Equals(Dsa.Relation[this.Context.User.Username]))) + .Vorteile + .Select(s => s.Name + "\t " + (s.Value == 0 ? string.Empty : s.Value.ToString()))); + break; + + default: + res.Add($"Kommando {prop} nicht gefunden"); + break; + } + + var sb = new StringBuilder(); + foreach (string re in res) + { + if (sb.Length + re.Length > 1798) + { + await this.ReplyTimedAsync(sb.ToString(), TimeSpan.FromSeconds(90)); + sb.Clear(); + } + + sb.AppendLine(re); + } + + await this.ReplyTimedAsync(sb.ToString(), TimeSpan.FromSeconds(90)); + } + } +} diff --git a/DiscoBot/Commands/NpcCommands.cs b/DiscoBot/Commands/NpcCommands.cs new file mode 100644 index 0000000..f2b17b6 --- /dev/null +++ b/DiscoBot/Commands/NpcCommands.cs @@ -0,0 +1,37 @@ +namespace DiscoBot.Commands +{ + using System; + using System.Linq; + using System.Threading.Tasks; + + using DiscoBot.Auxiliary; + using DiscoBot.Characters; + + using Discord.Commands; + + public class NpcCommands : ModuleBase + { + [Command("npc"), Summary("Erstellt ein NPC")] + [Alias("Npc", "NPc", "NPC", "nPC")] + public Task RandomAsync([Summary("Create Random")] string npcName, int mean = 9, int stDv = 1) + { + Dsa.Chars.Add(new Npc(npcName, mean, stDv)); + return this.ReplyAsync($"{npcName} wurde zufällig generiert"); + } + + [Command("npc"), Summary("Erstellt ein NPC")] + [Alias("Npc", "NPc", "NPC", "nPC")] + public Task CopyAsync([Summary("Create Copy")] string npcName, string source, int stDv = 1) + { + if (Dsa.Chars.Exists(x => x.Name.Equals(npcName))) + { + throw new Exception("Char gibt es schon"); + } + + var comp = new SpellCorrect(); + var chr = Dsa.Chars.OrderBy(x => comp.Compare(x.Name, source)).First(); + Dsa.Chars.Add(new Character(chr as Character, npcName, stDv)); + return this.ReplyAsync($"{npcName} wurde als variierte Kopie von {source} erstellt"); + } + } +} diff --git a/DiscoBot/Commands/Test.cs b/DiscoBot/Commands/Test.cs new file mode 100644 index 0000000..d56a43c --- /dev/null +++ b/DiscoBot/Commands/Test.cs @@ -0,0 +1,47 @@ +namespace DiscoBot.Commands +{ + using System.Threading.Tasks; + + using Discord.Commands; + + public class Test : ModuleBase + { + [Command("t"), Summary("Würfelt ein Talent-/Zauberprobe")] + [Alias("T", "Talent", "talent", "zauber", "z", "versuche")] + public Task TalentAsync([Summary("Talent oder Zaubername")] string talent, int erschwernis = 0) + { + string res = Gm.CheckCommand(Dsa.Relation[this.Context.User.Username], CommandTypes.Talent, talent, erschwernis); + return this.ReplyAsync("```xl\n" + res + "\n```"); + } + + [Command("e"), Summary("Würfelt eine Eigenschaftsprobe")] + [Alias("E", "Eigenschaft", "eigenschaft", "eigen")] + public Task EigenschaftAsync([Summary("Eigenschaftskürzel und Erschwernis")] string talent, int erschwernis = 0) + { + var chr = Dsa.Chars.Find(x => x.Name.Equals(Dsa.Relation[this.Context.User.Username])); + string res = chr.TestEigenschaft(talent, erschwernis); + return this.ReplyAsync("```xl\n" + res + "\n```"); + } + + [Command("a"), Summary("Würfelt ein Angriff")] + [Alias("At", "at", "Angriff", "angriff", "attackiere_mit", "attacke", "Attacke")] + public Task AngriffAsync([Summary("Weapon")] string weapon, int erschwernis = 0) + { + return this.ReplyAsync("```xl\n" + Dsa.Chars.Find(x => x.Name.Equals(Dsa.Relation[this.Context.User.Username])).Angriff(weapon, erschwernis) + "\n```"); + } + + [Command("p"), Summary("Würfelt eine Parade Probe")] + [Alias("P", "Parade", "parade", "pariere_mit")] + public Task ParadeAsync([Summary("Parade Weapon")] string talent, int erschwernis = 0) + { + return this.ReplyAsync("```xl\n" + Dsa.Chars.Find(x => x.Name.Equals(Dsa.Relation[this.Context.User.Username])).Parade(talent, erschwernis) + "\n```"); + } + + [Command("f"), Summary("Führt eine Fernkampfprobe aus")] + [Alias("F", "fernkampf", "Fernkampf", "schieße", "schieße_mit")] + public Task FernkampfAsync([Summary("Fernkampfwaffe")] string waffe, int erschwernis = 0) + { + return this.ReplyAsync("```xl\n" + Dsa.Chars.Find(x => x.Name.Equals(Dsa.Relation[this.Context.User.Username])).Fernkampf(waffe, erschwernis) + "\n```"); + } + } +} diff --git a/DiscoBot/Commands/Utility.cs b/DiscoBot/Commands/Utility.cs new file mode 100644 index 0000000..bbba1a1 --- /dev/null +++ b/DiscoBot/Commands/Utility.cs @@ -0,0 +1,32 @@ +namespace DiscoBot.Commands +{ + using System.Threading.Tasks; + + using DiscoBot.Auxiliary; + + using Discord.Commands; + + public class Utility : ModuleBase + { + [Command("r"), Summary("Würfelt ")] + [Alias("R", "Roll", "roll", "Würfle")] + public Task RollAsync([Remainder, Summary("Weapon")] string roll) + { + return this.ReplyAsync("```xl\n" + Misc.Roll(roll) + "\n```"); + } + + [Command("general"), Summary("Set General ")] + public Task SetGeneralAsync([Remainder, Summary("Set General")] int i = 0) + { + Dsa.GeneralContext = this.Context; + return this.Context.Channel.SendMessageAsync($"```xl\n Der Dachs hat in '{this.Context.Channel.Name}' ein Zuhause gefunden. Gm Nachrichten werden nun auch in diesem Channel gepostet. \n```"); + } + + [Command("say"), Summary("Echos a message.")] + [Alias("s")] + public Task SayAsync([Remainder, Summary("The text to echo")] string echo) + { + return this.ReplyAsync(echo); + } + } +} diff --git a/DiscoBot/Commands/Voice.cs b/DiscoBot/Commands/Voice.cs new file mode 100644 index 0000000..72988d4 --- /dev/null +++ b/DiscoBot/Commands/Voice.cs @@ -0,0 +1,67 @@ +namespace DiscoBot.Commands +{ + using System.Diagnostics; + using System.Threading.Tasks; + + using Discord; + using Discord.Audio; + using Discord.Commands; + + public class Voice : ModuleBase + { + public static IAudioClient Client { get; set; } + [Command("join", RunMode = RunMode.Async)] + public async Task JoinChannelAsync(IVoiceChannel channel = null) + { + var msg = this.Context.Message; + + // Get the audio channel + channel = channel ?? (msg.Author as IGuildUser)?.VoiceChannel; + if (channel == null) + { + await msg.Channel.SendMessageAsync( + "User must be in a voice channel, or a voice channel must be passed as an argument."); + return; + } + + // For the next step with transmitting audio, you would want to pass this Audio Client in to a service. + var audioClient = await channel.ConnectAsync(); + Client = audioClient; + } + + [Command("leave", RunMode = RunMode.Async)] + public Task LeaveChannelAsync(IVoiceChannel channel = null) + { + // For the next step with transmitting audio, you would want to pass this Audio Client in to a service. + return Client.StopAsync(); + } + + [Command("play")] + public Task PlayAudioAsync(string path) + { + return this.SendAsync(Client, path); + } + + private Process CreateStream(string path) + { + var ffmpeg = new ProcessStartInfo + { + FileName = "ffmpeg", + Arguments = $"-i {path} -ac 2 -f s16le -ar 48000 -ab 620000 pipe:1", + UseShellExecute = false, + RedirectStandardOutput = true, + }; + return Process.Start(ffmpeg); + } + + private async Task SendAsync(IAudioClient client, string path) + { + // Create FFmpeg using the previous example + var ffmpeg = this.CreateStream(path); + var output = ffmpeg.StandardOutput.BaseStream; + var discord = client.CreatePCMStream(AudioApplication.Music); + await output.CopyToAsync(discord); + await discord.FlushAsync(); + } + } +} -- cgit v1.3.1 From 4ca7291ebee440d9f3ef2a1643d8d01b29006459 Mon Sep 17 00:00:00 2001 From: TrueDoctor Date: Mon, 9 Apr 2018 13:13:54 +0200 Subject: Added FileHandler to enable sending heros via Discord --- DiscoBot/Commands/FileHandler.cs | 43 ++++++++++++++++++ DiscoBot/Commands/Voice.cs | 10 ++--- DiscoBot/DiscoBot.csproj | 3 +- UnitTestProject1/Properties/AssemblyInfo.cs | 20 --------- UnitTestProject1/UnitTest1.cs | 14 ------ UnitTestProject1/UnitTestProject1.csproj | 67 ----------------------------- UnitTestProject1/packages.config | 5 --- Voice.cs | 4 -- 8 files changed, 50 insertions(+), 116 deletions(-) create mode 100644 DiscoBot/Commands/FileHandler.cs delete mode 100644 UnitTestProject1/Properties/AssemblyInfo.cs delete mode 100644 UnitTestProject1/UnitTest1.cs delete mode 100644 UnitTestProject1/UnitTestProject1.csproj delete mode 100644 UnitTestProject1/packages.config delete mode 100644 Voice.cs (limited to 'DiscoBot/Commands') diff --git a/DiscoBot/Commands/FileHandler.cs b/DiscoBot/Commands/FileHandler.cs new file mode 100644 index 0000000..efebe3f --- /dev/null +++ b/DiscoBot/Commands/FileHandler.cs @@ -0,0 +1,43 @@ +namespace DiscoBot.Commands +{ + using System; + using System.Linq; + using System.Net; + + using DiscoBot.Auxiliary; + using DiscoBot.Characters; + + using Discord.Commands; + + public class FileHandler : ModuleBase + { + [Command("add"), Summary("fügt Helden hinzu")] + public void AddChar() + { + var msg = this.Context.Message; + if (msg.Attachments == null) + { + throw new ArgumentException("Es wurde keine Datei angehängt"); + } + + var attachments = msg.Attachments.ToList(); + + if (!attachments.Any(x => x.Filename.EndsWith(".xml"))) + { + throw new ArgumentException("Es wurde kein xml Held mitgeschickt"); + } + + foreach (var attachment in attachments.Where(x => x.Filename.EndsWith(".xml"))) + { + using (var client = new WebClient()) + { + client.DownloadFile(attachment.Url, "helden\\" + attachment.Filename); + } + + Dsa.Chars.Add(new Character("helden\\" + attachment.Filename)); + (Dsa.Chars.Last() as Character)?.Talente.Select(x => new Talent(x.Name, x.Probe, 0)) + .Where(c => !Dsa.Talente.Exists(v => v.Name.Equals(c.Name))).ToList().ForEach(v => Dsa.Talente.Add(v)); + } + } + } +} diff --git a/DiscoBot/Commands/Voice.cs b/DiscoBot/Commands/Voice.cs index 72988d4..02210e8 100644 --- a/DiscoBot/Commands/Voice.cs +++ b/DiscoBot/Commands/Voice.cs @@ -39,10 +39,10 @@ [Command("play")] public Task PlayAudioAsync(string path) { - return this.SendAsync(Client, path); + return SendAsync(path); } - private Process CreateStream(string path) + private static Process CreateStream(string path) { var ffmpeg = new ProcessStartInfo { @@ -54,12 +54,12 @@ return Process.Start(ffmpeg); } - private async Task SendAsync(IAudioClient client, string path) + private static async Task SendAsync(string path) { // Create FFmpeg using the previous example - var ffmpeg = this.CreateStream(path); + var ffmpeg = CreateStream(path); var output = ffmpeg.StandardOutput.BaseStream; - var discord = client.CreatePCMStream(AudioApplication.Music); + var discord = Client.CreatePCMStream(AudioApplication.Music); await output.CopyToAsync(discord); await discord.FlushAsync(); } diff --git a/DiscoBot/DiscoBot.csproj b/DiscoBot/DiscoBot.csproj index 2bf17e5..3955ef6 100644 --- a/DiscoBot/DiscoBot.csproj +++ b/DiscoBot/DiscoBot.csproj @@ -148,16 +148,17 @@ + - + diff --git a/UnitTestProject1/Properties/AssemblyInfo.cs b/UnitTestProject1/Properties/AssemblyInfo.cs deleted file mode 100644 index 9dbb2a9..0000000 --- a/UnitTestProject1/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("UnitTestProject1")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("UnitTestProject1")] -[assembly: AssemblyCopyright("Copyright © 2018")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] - -[assembly: Guid("75b56398-a683-4b85-9ba3-b445d2b55527")] - -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/UnitTestProject1/UnitTest1.cs b/UnitTestProject1/UnitTest1.cs deleted file mode 100644 index dbc289d..0000000 --- a/UnitTestProject1/UnitTest1.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace UnitTestProject1 -{ - [TestClass] - public class UnitTest1 - { - [TestMethod] - public void TestMethod1() - { - } - } -} diff --git a/UnitTestProject1/UnitTestProject1.csproj b/UnitTestProject1/UnitTestProject1.csproj deleted file mode 100644 index e887a0e..0000000 --- a/UnitTestProject1/UnitTestProject1.csproj +++ /dev/null @@ -1,67 +0,0 @@ - - - - - Debug - AnyCPU - {75B56398-A683-4B85-9BA3-B445D2B55527} - Library - Properties - UnitTestProject1 - UnitTestProject1 - v4.7.1 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 15.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\MSTest.TestFramework.1.2.0\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll - - - ..\packages\MSTest.TestFramework.1.2.0\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll - - - - - - - - - - - - - - - - Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}". - - - - - - \ No newline at end of file diff --git a/UnitTestProject1/packages.config b/UnitTestProject1/packages.config deleted file mode 100644 index 8819694..0000000 --- a/UnitTestProject1/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Voice.cs b/Voice.cs deleted file mode 100644 index 031c49e..0000000 --- a/Voice.cs +++ /dev/null @@ -1,4 +0,0 @@ -using System; -using Discord; - - -- cgit v1.3.1