using System;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using DiscordBot.Bot.Actions.Extra;
using DiscordBot.Utilities;
using DiscordBotCore;
using DiscordBotCore.Bot;
using DiscordBotCore.Others;
using DiscordBotCore.Updater.Application;
using Spectre.Console;
namespace DiscordBot;
public class Program
{
///
/// The main entry point for the application.
///
public static async Task Startup(string[] args)
{
await LoadComponents(args);
await PrepareConsole();
await PluginMethods.RefreshPlugins(false);
await ConsoleInputHandler();
}
///
/// The main loop for the discord bot
///
private static async Task ConsoleInputHandler()
{
while (true)
{
var cmd = Console.ReadLine();
var args = cmd.Split(' ');
var command = args[0];
args = args.Skip(1).ToArray();
if (args.Length == 0)
args = null;
await Application.CurrentApplication.InternalActionManager.Execute(command, args);
}
}
///
/// Start the bot without user interface
///
/// Returns the bootloader for the Discord Bot
private static async Task PrepareConsole()
{
AnsiConsole.MarkupLine($"[yellow]Running on version: {Assembly.GetExecutingAssembly().GetName().Version}[/]");
AnsiConsole.MarkupLine("[yellow]Git SethBot: https://github.com/andreitdr/SethDiscordBot [/]");
AnsiConsole.MarkupLine("[yellow]Git Plugins: https://github.com/andreitdr/SethPlugins [/]");
AnsiConsole.MarkupLine("[yellow]Remember to close the bot using the shutdown command ([/][red]exit[/][yellow]) or some settings won't be saved[/]");
AnsiConsole.MarkupLine($"[yellow]Running on [/][magenta]{(OperatingSystem.IsWindows() ? "Windows" : "Linux")}[/]");
AnsiConsole.MarkupLine("[yellow]===== Seth Discord Bot =====[/]");
try
{
var token = Application.CurrentApplication.ApplicationEnvironmentVariables.Get("token");
var prefix = Application.CurrentApplication.ApplicationEnvironmentVariables.Get("prefix");
var discordbooter = new DiscordBotApplication(token, prefix);
await discordbooter.StartAsync();
}
catch (Exception ex)
{
Application.Logger.Log(ex.ToString(), typeof(Program), LogType.Critical);
}
}
///
/// Load the bot components.
///
/// The startup arguments
private static async Task LoadComponents(string[] args)
{
await Application.CreateApplication();
AppUpdater updater = new AppUpdater();
Update? update = await updater.PrepareUpdate();
if(update is not null)
{
await ConsoleUtilities.ExecuteTaskWithBuiltInProgress(updater.SelfUpdate, update, "Discord Bot Update");
return;
}
Application.Logger.SetOutFunction(AnsiConsole.MarkupLine);
if (!Application.CurrentApplication.ApplicationEnvironmentVariables.ContainsKey("ServerID") ||
!Application.CurrentApplication.ApplicationEnvironmentVariables.ContainsKey("token") ||
!Application.CurrentApplication.ApplicationEnvironmentVariables.ContainsKey("prefix"))
await Installer.GenerateStartupConfig();
}
}