Beispiel #1
0
        public async Task RunBotAsync()
        {
            using (var file = new StreamReader(settingsPath))
            {
                var json = file.ReadToEnd();
                EhmBotSettings = JsonConvert.DeserializeObject <EhmBotSettings>(json);
            }

            client   = new DiscordSocketClient();
            commands = new CommandService();

            services = new ServiceCollection()
                       .AddSingleton(client)
                       .AddSingleton(commands)
                       .BuildServiceProvider();

            string botToken = EhmBotSettings.BotToken;

            client.Log += LogMessage;

            await RegisterCommandsAsync();

            await client.LoginAsync(TokenType.Bot, botToken);

            await client.StartAsync();

            await Task.Delay(-1);
        }
Beispiel #2
0
        public async Task <RuntimeResult> DeregisterGeneralManager([Remainder] string teamName)
        {
            logger.Debug($"Attemping to deregister GM from {teamName}");
            ehmBotSettings = Program.EhmBotSettings;
            await Task.Delay(0);

            var team = TeamList.GetTeam(teamName);

            if (team == null)
            {
                return new BotResult(CommandError.Unsuccessful, "Unrecognized team")
                       {
                           Action = EAction.Deregister, ResultTime = DateTime.Now
                       }
            }
            ;
            var             generalManager        = ehmBotSettings.GetGmByTeam(team);
            SocketGuildUser waitingGeneralManager = null;

            if (!string.IsNullOrWhiteSpace(generalManager.WaitingDiscordId))
            {
                waitingGeneralManager = Context.Guild.GetUser(Convert.ToUInt64(generalManager.WaitingDiscordId));
            }
            DeregisterGeneralManager(generalManager);
            ehmBotSettings.Save(settingsPath);
            var nickName = Context.Guild.GetUser(Context.User.Id).Nickname;

            logger.Debug($"Deregistered GM from {teamName} {(waitingGeneralManager != null ? $" Replaced with {waitingGeneralManager.Nickname ?? waitingGeneralManager.Username}" : string.Empty)}");
            return(new BotResult(null, $"Deregistered {nickName} from {team.FullName}" +
                                 $"{(waitingGeneralManager != null ? $" Replaced with {waitingGeneralManager.Nickname ?? waitingGeneralManager.Username}" : string.Empty)}")
            {
                Action = EAction.Deregister,
                ResultTime = DateTime.Now
            });
        }
Beispiel #3
0
        public async Task <RuntimeResult> RegisterGeneralManager([Remainder] string teamName)
        {
            logger.Debug($"Attemping to register GM to {teamName}");
            ehmBotSettings = Program.EhmBotSettings;
            await Task.Delay(0);

            var team = TeamList.GetTeam(teamName);

            if (team == null)
            {
                return new BotResult(CommandError.Unsuccessful, "Unrecognized team")
                       {
                           Action = EAction.Register, ResultTime = DateTime.Now
                       }
            }
            ;
            var generalManager        = ehmBotSettings.GetGmByTeam(team);
            var currentGeneralManager = ehmBotSettings.GetGmById(Context.User.Id.ToString());
            var nickName = Context.Guild.GetUser(Context.User.Id).Nickname;

            if (string.IsNullOrWhiteSpace(generalManager.DiscordId) || generalManager.DiscordId == Context.User.Id.ToString())
            {
                generalManager.DiscordId = Context.User.Id.ToString();

                if (currentGeneralManager != null)
                {
                    DeregisterGeneralManager(currentGeneralManager);
                }
                ehmBotSettings.Save(settingsPath);
                logger.Debug($"Registered GM {nickName} to {teamName}");
                return(new BotResult(null, $"Registered {nickName} as {team.FullName}")
                {
                    Action = EAction.Register, ResultTime = DateTime.Now
                });
            }
            var currentUserOnTeam = Context.Guild.GetUser(Convert.ToUInt64(generalManager.DiscordId));

            if (currentUserOnTeam == null)
            {
                generalManager.DiscordId = Context.User.Id.ToString();
                if (currentGeneralManager != null)
                {
                    DeregisterGeneralManager(currentGeneralManager);
                }
                ehmBotSettings.Save(settingsPath);
                logger.Debug($"Registered GM {nickName} to {teamName}");
                return(new BotResult(null, $"Registered {nickName} as {team.FullName}")
                {
                    Action = EAction.Register, ResultTime = DateTime.Now
                });
            }
            generalManager.WaitingDiscordId = Context.User.Id.ToString();
            ehmBotSettings.Save(settingsPath);
            logger.Debug($"Set GM {nickName} in waiting list for {teamName}");
            return(new BotResult(null, $"{nickName} will be registered as {team.FullName} when {currentUserOnTeam.Nickname ?? currentUserOnTeam.Nickname} registers as another team or deregisters.")
            {
                Action = EAction.Register,
                ResultTime = DateTime.Now
            });
        }
Beispiel #4
0
 private void ReloadSettings()
 {
     using (var file = new StreamReader(settingsPath))
     {
         var json = file.ReadToEnd();
         EhmBotSettings = JsonConvert.DeserializeObject <EhmBotSettings>(json);
     }
 }
Beispiel #5
0
 public Register()
 {
     using (var file = new StreamReader(settingsPath))
     {
         var json = file.ReadToEnd();
         ehmBotSettings = JsonConvert.DeserializeObject <EhmBotSettings>(json);
     }
 }
Beispiel #6
0
        public async Task <RuntimeResult> SaveAsync([Remainder] string freeText = "")
        {
            logger.Debug("Starting save task");
            ehmBotSettings = Program.EhmBotSettings;
            Process.Start("Utilities//Save.exe");
            await Task.Delay(ehmBotSettings.MillisecondsToSave);

            var crashed   = false;
            var processes = Process.GetProcessesByName("ehm");

            if (!processes.Any())
            {
                logger.Debug("Process crashed");
                crashed = true;
            }

            var       success = false;
            BotResult fRes;

            try
            {
                logger.Debug("Getting last saved file");
                var savePath      = new DirectoryInfo(ehmBotSettings.SaveLocation);
                var lastSavedFile = savePath.GetFiles("*.sav")
                                    .Where(x => x.Name.StartsWith(ehmBotSettings.SavePrefix, StringComparison.OrdinalIgnoreCase))
                                    .OrderByDescending(x => x.LastWriteTime).FirstOrDefault();

                if (lastSavedFile == null)
                {
                    throw new ArgumentNullException($"No save files with prefix {ehmBotSettings.SavePrefix} were found");
                }
                if (lastSavedFile.LastWriteTime > DateTime.Now.AddMilliseconds(ehmBotSettings.MillisecondsToSave).AddSeconds(-5))
                {
                    logger.Debug("File was saved in the last 20 seconds");
                    success = true;
                }

                if (!crashed)
                {
                    fRes = !success ? new BotResult(CommandError.Unsuccessful, $"Save Failed! {Context.User.Mention}") : new BotResult(null, $"Saved {Context.User.Mention}");
                }
                else
                {
                    fRes = !success ? new BotResult(CommandError.Unsuccessful, $"Game crashed, save didn't stick. {Context.User.Mention}.") : new BotResult(null, $"Saved {Context.User.Mention}, but game crashed.");
                }
                fRes.Action     = EAction.Save;
                fRes.ResultTime = DateTime.Now;
            }
            catch (Exception e)
            {
                logger.Error(e, "Error saving game");
                throw;
            }
            return(fRes);
        }
Beispiel #7
0
        public async Task <RuntimeResult> SimGames([Remainder] string length)
        {
            ehmBotSettings = Program.EhmBotSettings;
            await Task.Delay(0);

            /*var process = Process.Start("Utilities//Sim.exe");
             * process?.WaitForExit();*/
            var fRes = true ? new BotResult(CommandError.Unsuccessful, "Can't sim yet") : new BotResult(null, "Save made");

            fRes.Action     = EAction.Sim;
            fRes.ResultTime = DateTime.Now;
            return(fRes);
        }
Beispiel #8
0
        public async Task <RuntimeResult> FinishRestoreAsync()
        {
            logger.Debug("Finishing restore");
            ehmBotSettings = Program.EhmBotSettings;
            var process = Process.Start("Utilities//Restore.exe");

            process?.WaitForExit();

            await Context.Channel.SendMessageAsync("");

            return(new BotResult(null, "Restored")
            {
                Action = EAction.Restore, ResultTime = DateTime.Now
            });
        }
Beispiel #9
0
        public async Task <RuntimeResult> SaveAnnounce()
        {
            logger.Debug("Announcing save");
            ehmBotSettings = Program.EhmBotSettings;
            await Task.Delay(0);

            var savePath      = new DirectoryInfo(ehmBotSettings.SaveLocation);
            var lastSavedFile = savePath.GetFiles("*.sav")
                                .Where(x => x.Name.Contains($"{ehmBotSettings.SavePrefix} ") &&
                                       int.TryParse(x.Name.Split(' ')[1].Substring(0, x.Name.Split(' ')[1].Length - 4), out var saveNumber))
                                .OrderByDescending(x => x.LastWriteTime).First();

            return(new BotResult(null, $"Last save at {lastSavedFile.LastWriteTime}")
            {
                Action = EAction.Save, ResultTime = DateTime.Now
            });
        }
Beispiel #10
0
        private static async Task Main(string[] args)
        {
            logger.Debug("Checking online players");
            try
            {
                using (var file = new StreamReader(Path.Combine(System.AppContext.BaseDirectory, EhmBotSettings.SETTINGS_FILE_NAME)))
                {
                    var json = file.ReadToEnd();
                    ehmBotSettings = JsonConvert.DeserializeObject <EhmBotSettings>(json);
                }
            }
            catch (Exception e)
            {
                logger.Error(e, "Error loading settings");
                throw;
            }
            await Utilities.ActivateApp();

            SendKeys.SendWait("{F11}");
            await Task.Delay(1200);

            ReadOnline(1, 0);
            await Task.Delay(1800);

            await Utilities.Click(ehmBotSettings.ClickPositions["Scroll to middle"]);

            await Task.Delay(1800);

            ReadOnline(1, 11);
            await Task.Delay(1800);

            await Utilities.Click(ehmBotSettings.ClickPositions["Scroll to end"]);

            await Task.Delay(1800);

            ReadOnline(4, 19);
            await Task.Delay(1800);

            await CheckResponse();

            responseList.Remove(ehmBotSettings.HostPosition);
            Console.WriteLine(string.Join(",", responseList));
        }
Beispiel #11
0
        private static void Main(string[] args)
        {
            var fileExists = File.Exists(Path.Combine(System.AppContext.BaseDirectory, EhmBotSettings.SETTINGS_FILE_NAME));

            if (!fileExists)
            {
                FirstSetup();
            }
            else
            {
                using (var file = new StreamReader(Path.Combine(System.AppContext.BaseDirectory, EhmBotSettings.SETTINGS_FILE_NAME)))
                {
                    var json = file.ReadToEnd();
                    oldSettings    = JsonConvert.DeserializeObject <EhmBotSettings>(json);
                    ehmBotSettings = JsonConvert.DeserializeObject <EhmBotSettings>(json);
                }
                StartingMenu();
            }
        }
Beispiel #12
0
        private static async Task Main(string[] args)
        {
            try
            {
                using (var file = new StreamReader(Path.Combine(System.AppContext.BaseDirectory, EhmBotSettings.SETTINGS_FILE_NAME)))
                {
                    var json = file.ReadToEnd();
                    ehmBotSettings = JsonConvert.DeserializeObject <EhmBotSettings>(json);
                }
            }
            catch (Exception e)
            {
                logger.Error(e, "Error loading settings");
                throw;
            }

            await Utilities.ActivateApp();

            await Utilities.Click(ehmBotSettings.ClickPositions["Finish"]);

            await Task.Delay(300);

            await Utilities.Click(ehmBotSettings.ClickPositions["Anywhere"]);

            await Task.Delay(300);

            await Utilities.Click(ehmBotSettings.ClickPositions["Anywhere"]);

            await Task.Delay(300);

            await Utilities.Click(ehmBotSettings.ClickPositions["Anywhere"]);

            await Task.Delay(300);

            await Utilities.Click(ehmBotSettings.ClickPositions["Anywhere"]);

            await Task.Delay(300);

            await Utilities.Click(ehmBotSettings.ClickPositions["Anywhere"]);

            Console.WriteLine("Done");
        }
Beispiel #13
0
        public async Task <RuntimeResult> ViewTeamsAsync([Remainder] string freeText = "")
        {
            logger.Debug("Posting GM list");
            ehmBotSettings = Program.EhmBotSettings;
            var fRes = new StringBuilder();

            foreach (var kvp in ehmBotSettings.GeneralManagers)
            {
                fRes.AppendLine(
                    $"{kvp.Key} : {kvp.Value.Team.FullName} - " +
                    $"{(string.IsNullOrWhiteSpace(kvp.Value.DiscordId) ? "No GM" : (Context.Guild.GetUser(Convert.ToUInt64(kvp.Value.DiscordId)).Nickname ?? Context.Guild.GetUser(Convert.ToUInt64(kvp.Value.DiscordId)).Username))}");
            }

            await Context.Channel.SendMessageAsync(fRes.ToString());

            return(new BotResult(null, "Printed GM List")
            {
                Action = EAction.ViewTeams, ResultTime = DateTime.Now
            });
        }
Beispiel #14
0
        private static void FirstSetup()
        {
            oldSettings    = new EhmBotSettings();
            ehmBotSettings = new EhmBotSettings();
            Console.WriteLine("Welcome to Alain's EHM Save Bot Version 2.0 :)");
            Console.WriteLine($"Looks like this is your first time starting the bot, if this is incorrect, please make sure the {EhmBotSettings.SETTINGS_FILE_NAME} file is present.");
            Console.WriteLine("Do you want to proceed to the initial setup? (y/n)");
            var yesNo = Console.ReadLine();

            if (!string.IsNullOrWhiteSpace(yesNo) && yesNo[0] == 'y')
            {
                initialSetup = true;
                Console.WriteLine("Please set F11 to open the General Manager Status page in EHM, and make sure F9 is 'Save Game' then press any key to continue.");
                Console.ReadKey();
                Console.WriteLine(string.Empty);
                SetBotToken();
            }
            else
            {
                StartingMenu();
            }
        }
Beispiel #15
0
        public async Task <RuntimeResult> RestoreAsync([Remainder] string freeText = "")
        {
            logger.Debug("Starting restore");
            ehmBotSettings = Program.EhmBotSettings;
            if (Context.Guild.GetUser(Context.User.Id).Roles.FirstOrDefault(x => string.Equals(x.Name, ehmBotSettings.VncRoleName, StringComparison.OrdinalIgnoreCase)) == null)
            {
                return new BotResult(CommandError.UnmetPrecondition, "Insufficient permissions")
                       {
                           Action = EAction.Restore, ResultTime = DateTime.Now
                       }
            }
            ;
            var process = Process.Start("Utilities//Restart.exe");

            process?.WaitForExit();

            await Context.Channel.SendMessageAsync("Ready for login as all");

            return(new BotResult(null, "Ready for login as all")
            {
                Action = EAction.Restore, ResultTime = DateTime.Now
            });
        }
Beispiel #16
0
        private static async Task Main(string[] args)
        {
            try
            {
                using (var file = new StreamReader(Path.Combine(System.AppContext.BaseDirectory, EhmBotSettings.SETTINGS_FILE_NAME)))
                {
                    var json = file.ReadToEnd();
                    ehmBotSettings = JsonConvert.DeserializeObject <EhmBotSettings>(json);
                }
            }
            catch (Exception e)
            {
                logger.Error(e, "Error loading settings file");
                throw;
            }

            try
            {
                if (!await Utilities.KillAppIfRunning())
                {
                    if (!await Utilities.KillAppIfRunning())
                    {
                        logger.Warn("Error killing app");
                        Environment.Exit(0);
                    }
                }
            }
            catch (Exception e)
            {
                logger.Error(e, "Error killing app");
                throw;
            }

            logger.Debug("Starting game");
            Process.Start(Path.Combine(ehmBotSettings.GameLocation, "ehm.exe"));
            await Task.Delay(8500);

            await Utilities.ActivateApp();

            await Utilities.Click(ehmBotSettings.ClickPositions["Load network game"]);

            await Task.Delay(500);

            logger.Debug("Getting last saved game");
            var savePath = new DirectoryInfo(ehmBotSettings.SaveLocation);

            try
            {
                var mostRecentSaveFile = savePath.GetFiles("*.sav").Where(x => x.Name.Contains(ehmBotSettings.SavePrefix) && int.TryParse(x.Name.Split(' ')[1].Substring(0, x.Name.Split(' ')[1].Length - 4), out var saveNumber)).OrderByDescending(x => x.LastWriteTime).First();
                foreach (var character in mostRecentSaveFile.Name.Substring(0, mostRecentSaveFile.Name.Length - 4))
                {
                    SendKeys.SendWait(character.ToString());
                    await Task.Delay(50);
                }
            }
            catch (Exception e)
            {
                logger.Error(e, "Error finding most recent save");
                throw;
            }

            await Utilities.Click(ehmBotSettings.ClickPositions["Load game OK"]);

            await Task.Delay(8500);

            if (ehmBotSettings.ClickPositions.TryGetValue("Restore scroll", out var restoreScroll) && restoreScroll.X > 0)
            {
                await Utilities.Click(restoreScroll);

                await Task.Delay(950);
            }
            await Utilities.Click(ehmBotSettings.ClickPositions["Host"]);

            await Task.Delay(950);

            await Utilities.Click(ehmBotSettings.ClickPositions["Host log in yes"]);

            Console.WriteLine("Done");
        }