Added command line arguments: --config, --transcript, --leave, --help, --version
This commit is contained in:
parent
9f15236878
commit
e3137eaa1f
5 changed files with 126 additions and 32 deletions
17
Config.cs
17
Config.cs
|
@ -32,16 +32,25 @@ internal static class Config
|
||||||
internal static string username = "supportchild";
|
internal static string username = "supportchild";
|
||||||
internal static string password = "";
|
internal static string password = "";
|
||||||
|
|
||||||
|
private static string configPath = "./config.yml";
|
||||||
|
|
||||||
public static void LoadConfig()
|
public static void LoadConfig()
|
||||||
{
|
{
|
||||||
// Writes default config to file if it does not already exist
|
if (!string.IsNullOrEmpty(SupportChild.commandLineArgs.configPath))
|
||||||
if (!File.Exists("./config.yml"))
|
|
||||||
{
|
{
|
||||||
File.WriteAllText("./config.yml", Utilities.ReadManifestData("default_config.yml"));
|
configPath = SupportChild.commandLineArgs.configPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.Log("Loading config \"" + Path.GetFullPath(configPath) + "\"");
|
||||||
|
|
||||||
|
// Writes default config to file if it does not already exist
|
||||||
|
if (!File.Exists(configPath))
|
||||||
|
{
|
||||||
|
File.WriteAllText(configPath, Utilities.ReadManifestData("default_config.yml"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reads config contents into FileStream
|
// Reads config contents into FileStream
|
||||||
FileStream stream = File.OpenRead("./config.yml");
|
FileStream stream = File.OpenRead(configPath);
|
||||||
|
|
||||||
// Converts the FileStream into a YAML object
|
// Converts the FileStream into a YAML object
|
||||||
IDeserializer deserializer = new DeserializerBuilder().Build();
|
IDeserializer deserializer = new DeserializerBuilder().Build();
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using DSharpPlus;
|
using DSharpPlus;
|
||||||
using DSharpPlus.Entities;
|
using DSharpPlus.Entities;
|
||||||
|
@ -29,17 +30,23 @@ internal static class EventHandler
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static Task OnGuildAvailable(DiscordClient _, GuildCreateEventArgs e)
|
internal static async Task OnGuildAvailable(DiscordClient discordClient, GuildCreateEventArgs e)
|
||||||
{
|
{
|
||||||
Logger.Log("Guild available: " + e.Guild.Name);
|
Logger.Log("Found Discord server: " + e.Guild.Name + " (" + e.Guild.Id + ")");
|
||||||
|
|
||||||
|
if (SupportChild.commandLineArgs.serversToLeave.Contains(e.Guild.Id))
|
||||||
|
{
|
||||||
|
Logger.Warn("LEAVING DISCORD SERVER AS REQUESTED: " + e.Guild.Name + " (" + e.Guild.Id + ")");
|
||||||
|
await e.Guild.LeaveAsync();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
IReadOnlyDictionary<ulong, DiscordRole> roles = e.Guild.Roles;
|
IReadOnlyDictionary<ulong, DiscordRole> roles = e.Guild.Roles;
|
||||||
|
|
||||||
foreach ((ulong roleID, DiscordRole role) in roles)
|
foreach ((ulong roleID, DiscordRole role) in roles)
|
||||||
{
|
{
|
||||||
Logger.Log(role.Name.PadRight(40, '.') + roleID);
|
Logger.Debug(role.Name.PadRight(40, '.') + roleID);
|
||||||
}
|
}
|
||||||
return Task.CompletedTask;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static Task OnClientError(DiscordClient _, ClientErrorEventArgs e)
|
internal static Task OnClientError(DiscordClient _, ClientErrorEventArgs e)
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using System.Linq;
|
||||||
using DSharpPlus;
|
using DSharpPlus;
|
||||||
using DSharpPlus.Interactivity;
|
using DSharpPlus.Interactivity;
|
||||||
using DSharpPlus.Interactivity.Enums;
|
using DSharpPlus.Interactivity.Enums;
|
||||||
|
@ -9,6 +11,7 @@ using DSharpPlus.Interactivity.Extensions;
|
||||||
using DSharpPlus.SlashCommands;
|
using DSharpPlus.SlashCommands;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using SupportChild.Commands;
|
using SupportChild.Commands;
|
||||||
|
using CommandLine;
|
||||||
|
|
||||||
namespace SupportChild;
|
namespace SupportChild;
|
||||||
|
|
||||||
|
@ -30,8 +33,65 @@ internal static class SupportChild
|
||||||
|
|
||||||
private static SlashCommandsExtension commands = null;
|
private static SlashCommandsExtension commands = null;
|
||||||
|
|
||||||
private static void Main()
|
public class CommandLineArguments
|
||||||
{
|
{
|
||||||
|
[CommandLine.Option('c',
|
||||||
|
"config",
|
||||||
|
Required = false,
|
||||||
|
HelpText = "Select a config file to use.",
|
||||||
|
Default = "config.yml",
|
||||||
|
MetaValue = "PATH")]
|
||||||
|
public string configPath { get; set; }
|
||||||
|
|
||||||
|
[CommandLine.Option('t',
|
||||||
|
"transcripts",
|
||||||
|
Required = false,
|
||||||
|
HelpText = "Select directory to store transcripts in.",
|
||||||
|
Default = "./transcripts",
|
||||||
|
MetaValue = "PATH")]
|
||||||
|
public string transcriptDir { get; set; }
|
||||||
|
|
||||||
|
[CommandLine.Option(
|
||||||
|
"leave",
|
||||||
|
Required = false,
|
||||||
|
HelpText = "Leaves one or more Discord servers. " +
|
||||||
|
"You can check which servers your bot is in when it starts up.",
|
||||||
|
MetaValue = "ID,ID,ID...",
|
||||||
|
Separator = ','
|
||||||
|
)]
|
||||||
|
public IEnumerable<ulong> serversToLeave { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static CommandLineArguments commandLineArgs;
|
||||||
|
|
||||||
|
private static void Main(string[] args)
|
||||||
|
{
|
||||||
|
StringWriter sw = new StringWriter();
|
||||||
|
commandLineArgs = new Parser(settings =>
|
||||||
|
{
|
||||||
|
settings.AutoHelp = true;
|
||||||
|
settings.HelpWriter = sw;
|
||||||
|
settings.AutoVersion = false;
|
||||||
|
}).ParseArguments<CommandLineArguments>(args).Value;
|
||||||
|
|
||||||
|
// CommandLineParser has some bugs related to the built-in version option, ignore the output if it isn't found.
|
||||||
|
if (!sw.ToString().Contains("Option 'version' is unknown."))
|
||||||
|
{
|
||||||
|
Console.Write(sw);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.Contains("--help"))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.Contains("--version"))
|
||||||
|
{
|
||||||
|
Console.WriteLine(Assembly.GetEntryAssembly()?.GetName().Name + ' ' + GetVersion());
|
||||||
|
Console.WriteLine("Build time: " + BuildInfo.BuildTimeUTC.ToString("yyyy-MM-dd HH:mm:ss") + " UTC");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
MainAsync().GetAwaiter().GetResult();
|
MainAsync().GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +115,11 @@ internal static class SupportChild
|
||||||
public static string GetVersion()
|
public static string GetVersion()
|
||||||
{
|
{
|
||||||
Version version = Assembly.GetEntryAssembly()?.GetName().Version;
|
Version version = Assembly.GetEntryAssembly()?.GetName().Version;
|
||||||
return version?.Major + "." + version?.Minor + "." + version?.Build + (version?.Revision == 0 ? "" : "-" + (char)(64 + version?.Revision ?? 0));
|
return version?.Major + "."
|
||||||
|
+ version?.Minor + "."
|
||||||
|
+ version?.Build
|
||||||
|
+ (version?.Revision == 0 ? "" : "-" + (char)(64 + version?.Revision ?? 0))
|
||||||
|
+ " (" + ThisAssembly.Git.Commit + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async void Reload()
|
public static async void Reload()
|
||||||
|
@ -66,7 +130,6 @@ internal static class SupportChild
|
||||||
discordClient.Dispose();
|
discordClient.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
Logger.Log("Loading config \"" + Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + "config.yml\"");
|
|
||||||
Config.LoadConfig();
|
Config.LoadConfig();
|
||||||
|
|
||||||
// Check if token is unset
|
// Check if token is unset
|
||||||
|
|
|
@ -1,26 +1,28 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<Version>3.1.0.0</Version>
|
<Version>3.1.0</Version>
|
||||||
<ApplicationIcon>ellie_icon.ico</ApplicationIcon>
|
<ApplicationIcon>ellie_icon.ico</ApplicationIcon>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<StartupObject>SupportChild.SupportChild</StartupObject>
|
<StartupObject>SupportChild.SupportChild</StartupObject>
|
||||||
<RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers>
|
<RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers>
|
||||||
<PublishSingleFile>true</PublishSingleFile>
|
<PublishSingleFile>true</PublishSingleFile>
|
||||||
<TrimMode>partial</TrimMode>
|
<TrimMode>partial</TrimMode>
|
||||||
|
|
||||||
<Authors>EmotionChild</Authors>
|
<Authors>EmotionChild</Authors>
|
||||||
<Description>A Discord support ticket bot built for the Ellie's home server</Description>
|
<Description>A Discord support ticket bot built for the Ellie's home server</Description>
|
||||||
<NeutralLanguage>en</NeutralLanguage>
|
<NeutralLanguage>en</NeutralLanguage>
|
||||||
<RepositoryType>Git</RepositoryType>
|
<RepositoryType>Git</RepositoryType>
|
||||||
<RepositoryUrl>https://toastielab.dev/Emotions-stuff/SupportChild</RepositoryUrl>
|
<RepositoryUrl>https://toastielab.dev/Emotions-stuff/SupportChild</RepositoryUrl>
|
||||||
|
|
||||||
<PackageIconUrl>https://cdn.discordapp.com/attachments/765441543100170271/914327948667011132/Ellie_Concept_2_transparent_ver.png</PackageIconUrl>
|
<PackageIconUrl>https://cdn.discordapp.com/attachments/765441543100170271/914327948667011132/Ellie_Concept_2_transparent_ver.png</PackageIconUrl>
|
||||||
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||||
<PackageProjectUrl>https://toastielab.dev/Emotions-stuff/SupportChild</PackageProjectUrl>
|
<PackageProjectUrl>https://toastielab.dev/Emotions-stuff/SupportChild</PackageProjectUrl>
|
||||||
<PackageVersion>3.1.0</PackageVersion>
|
<PackageVersion>3.1.0</PackageVersion>
|
||||||
<LangVersion>default</LangVersion>
|
<LangVersion>default</LangVersion>
|
||||||
|
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
|
||||||
|
<GitVersion>false</GitVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||||
|
@ -28,9 +30,15 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="CommandLineParser" Version="2.9.1" />
|
||||||
<PackageReference Include="DSharpPlus" Version="4.5.0" />
|
<PackageReference Include="DSharpPlus" Version="4.5.0" />
|
||||||
<PackageReference Include="DSharpPlus.Interactivity" Version="4.5.0" />
|
<PackageReference Include="DSharpPlus.Interactivity" Version="4.5.0" />
|
||||||
<PackageReference Include="DSharpPlus.SlashCommands" Version="4.5.0" />
|
<PackageReference Include="DSharpPlus.SlashCommands" Version="4.5.0" />
|
||||||
|
<PackageReference Include="EmbeddedBuildTime" Version="1.0.3" />
|
||||||
|
<PackageReference Include="GitInfo" Version="3.3.5">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
<PackageReference Include="JsonExtensions" Version="1.2.0" />
|
<PackageReference Include="JsonExtensions" Version="1.2.0" />
|
||||||
<PackageReference Include="MySqlConnector" Version="2.3.7" />
|
<PackageReference Include="MySqlConnector" Version="2.3.7" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
|
|
|
@ -11,14 +11,21 @@ namespace SupportChild;
|
||||||
|
|
||||||
internal static class Transcriber
|
internal static class Transcriber
|
||||||
{
|
{
|
||||||
|
private static string transcriptDir = "./transcripts";
|
||||||
|
|
||||||
internal static async Task ExecuteAsync(ulong channelID, uint ticketID)
|
internal static async Task ExecuteAsync(ulong channelID, uint ticketID)
|
||||||
{
|
{
|
||||||
DiscordClient discordClient = new DiscordClient(Config.token);
|
DiscordClient discordClient = new DiscordClient(Config.token);
|
||||||
ChannelExporter exporter = new ChannelExporter(discordClient);
|
ChannelExporter exporter = new ChannelExporter(discordClient);
|
||||||
|
|
||||||
if (!Directory.Exists("./transcripts"))
|
if (!string.IsNullOrEmpty(SupportChild.commandLineArgs.transcriptDir))
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory("./transcripts");
|
transcriptDir = SupportChild.commandLineArgs.transcriptDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Directory.Exists(transcriptDir))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(transcriptDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
Channel channel = await discordClient.GetChannelAsync(new Snowflake(channelID));
|
Channel channel = await discordClient.GetChannelAsync(new Snowflake(channelID));
|
||||||
|
@ -46,7 +53,7 @@ internal static class Transcriber
|
||||||
|
|
||||||
internal static string GetPath(uint ticketNumber)
|
internal static string GetPath(uint ticketNumber)
|
||||||
{
|
{
|
||||||
return "./transcripts/" + GetFilename(ticketNumber);
|
return transcriptDir + "/" + GetFilename(ticketNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static string GetFilename(uint ticketNumber)
|
internal static string GetFilename(uint ticketNumber)
|
||||||
|
|
Loading…
Reference in a new issue