diff --git a/BSBshared/BotTypes/BasicBot.cs b/BSBshared/BotTypes/BasicBot.cs index 88260ed..d26f789 100644 --- a/BSBshared/BotTypes/BasicBot.cs +++ b/BSBshared/BotTypes/BasicBot.cs @@ -159,25 +159,33 @@ namespace BetterSecondBotShared.bottypes return "0,0,0"; } + protected string BasicBot_laststatus = ""; public virtual string GetStatus() { + string reply = "Info: No client"; if (Client != null) { + reply = "Network: Not ready"; if (Client.Network != null) { + reply = "Network: Not connected"; if (Client.Network.Connected) { + reply = "Sim: Not on sim"; if (Client.Network.CurrentSim != null) { - return "Sim: " + Client.Network.CurrentSim.Name + " " + GetSimPositionAsString() + ""; + reply = "Sim: " + Client.Network.CurrentSim.Name + " " + GetSimPositionAsString() + ""; } - return "Sim: Not on sim"; } - return "Network: Not connected"; } - return "Network: Not ready"; } - return "Info: No client"; + + if (reply != BasicBot_laststatus) + { + BasicBot_laststatus = reply; + return reply; + } + return ""; } protected virtual void LoginHandler(object o, LoginProgressEventArgs e) diff --git a/CLI/CliExitOnLogout.cs b/CLI/CliExitOnLogout.cs index ecd3c45..f6a6c66 100644 --- a/CLI/CliExitOnLogout.cs +++ b/CLI/CliExitOnLogout.cs @@ -32,8 +32,12 @@ namespace BetterSecondBot string NewStatusMessage = Bot.GetStatus(); if (NewStatusMessage != Bot.LastStatusMessage) { - Bot.LastStatusMessage = NewStatusMessage; - Bot.Log2File(LogFormater.Status(Bot.LastStatusMessage),ConsoleLogLogLevel.Status); + NewStatusMessage = NewStatusMessage.Trim(); + if (NewStatusMessage.Replace(" ","") != "") + { + Bot.LastStatusMessage = NewStatusMessage; + Bot.Log2File(LogFormater.Status(Bot.LastStatusMessage, false), ConsoleLogLogLevel.Status); + } } Thread.Sleep(1000); } diff --git a/Core/bottypes/AVstorageBot.cs b/Core/bottypes/AVstorageBot.cs index d36e57f..b9402ac 100644 --- a/Core/bottypes/AVstorageBot.cs +++ b/Core/bottypes/AVstorageBot.cs @@ -22,6 +22,7 @@ namespace BSB.bottypes protected long max_db_storage_age = 240; // how long should we keep an avatar in memory before clearing (in secs) [now - last accessed] protected bool show_av_storage_info_in_status = true; + protected string AVstorageBot_laststatus = ""; public override string GetStatus() { @@ -52,7 +53,12 @@ namespace BSB.bottypes reply = " (AVStorage: Empty)"; } } - return base.GetStatus() + reply; + if (reply != AVstorageBot_laststatus) + { + AVstorageBot_laststatus = reply; + return base.GetStatus() + reply; + } + return base.GetStatus(); } protected void ReTriggerUUIDtoName() diff --git a/Core/bottypes/Discord/Status.cs b/Core/bottypes/Discord/Status.cs index e98df18..cdff0dd 100644 --- a/Core/bottypes/Discord/Status.cs +++ b/Core/bottypes/Discord/Status.cs @@ -15,7 +15,7 @@ namespace BSB.bottypes } } } - + string DiscordBotStatus_laststatus = ""; public override string GetStatus() { string reply = ""; @@ -39,7 +39,12 @@ namespace BSB.bottypes { reply = " " + reply; } - return base.GetStatus() + reply; + if (reply != DiscordBotStatus_laststatus) + { + DiscordBotStatus_laststatus = reply; + return base.GetStatus() + reply; + } + return base.GetStatus(); } } diff --git a/Core/bottypes/athome.cs b/Core/bottypes/athome.cs index 0711e91..5d6a792 100644 --- a/Core/bottypes/athome.cs +++ b/Core/bottypes/athome.cs @@ -21,40 +21,40 @@ namespace BSB.bottypes teleported = false; reconnect_mode = true; last_reconnect_attempt = helpers.UnixTimeNow(); - addon = " [Connection lost - switching to recovery mode]"; + addon = "Connection lost - switching to recovery mode"; } else if ((login_auto_logout == false) && (reconnect_mode == false) && (after_login_fired == false)) { - addon = " [" + login_status + "]"; + addon = login_status; } else if ((login_auto_logout == false) && (reconnect_mode == true) && (dif > 120)) { - addon = " [@Attempting reconnect]"; + addon = "Attempting reconnect"; last_reconnect_attempt = helpers.UnixTimeNow(); reconnect = true; Start(); } else if ((login_auto_logout == false) && (reconnect_mode == true) && (dif <= 120)) { - addon = " [W4>Reconnect attempt timer]"; + addon = "W4>Reconnect attempt timer"; } else if ((login_auto_logout == true) && (auto_logout_login_recover == false)) { auto_logout_login_recover = true; last_reconnect_attempt = helpers.UnixTimeNow(); - addon = " [W4>" + login_status + " (10 secs)]"; + addon = "W4>" + login_status + " (10 secs)"; } else if ((login_auto_logout == true) && (auto_logout_login_recover == true) && (dif >= 10)) { login_auto_logout = false; auto_logout_login_recover = false; last_reconnect_attempt = helpers.UnixTimeNow(); - addon = " [Restarting first login]"; + addon = "Restarting first login"; Start(); } else { - addon = " [" + login_status + "]"; + addon = login_status; } Debug("Function/LoggedOutNextAction - "+ addon); return addon; @@ -69,6 +69,7 @@ namespace BSB.bottypes protected string last_attempted_teleport_region = ""; protected Dictionary avoid_sims = new Dictionary(); protected bool SimShutdownAvoid; + protected long SimShutdownAvoidCooldown = 0; protected bool auto_logout_login_recover; protected void ChangeSim(object sender,SimChangedEventArgs e) @@ -112,22 +113,47 @@ namespace BSB.bottypes public void ResetAtHome() { + Debug("@home / ResetAtHome"); last_tested_home_id = -1; - last_tp_attempt_unixtime = 0; + after_login_fired = false; teleported = false; - reconnect_mode = true; + reconnect_mode = false; + last_tp_attempt_unixtime = 0; } protected void AvoidSim(string simname) { - if(avoid_sims.ContainsKey(simname) == false) + if (avoid_sims.ContainsKey(simname) == false) { + Debug("@home / AvoidSim: " + simname); avoid_sims.Add(simname, helpers.UnixTimeNow() + 240); // @home will avoid that sim for the next 4 mins } } + protected void ExpireOldAvoidSims() + { + if(avoid_sims.Count() > 0) + { + List remove_keys = new List(); + long now = helpers.UnixTimeNow(); + foreach (KeyValuePair avoids in avoid_sims) + { + if(avoids.Value < now) + { + remove_keys.Add(avoids.Key); + } + } + if(remove_keys.Count() > 0) + { + foreach (string a in remove_keys) + { + avoid_sims.Remove(a); + } + } + } + } public bool IsSimHome(string simname) @@ -156,6 +182,60 @@ namespace BSB.bottypes } + public string LoggedinAthome() + { + string addon = ""; + if(IsSimHome(Client.Network.CurrentSim.Name) == true) + { + addon = "Home region"; + } + else + { + if (SimShutdownAvoid == false) + { + long dif = SimShutdownAvoidCooldown - helpers.UnixTimeNow(); + if (dif < 0) + { + dif = helpers.UnixTimeNow() - last_tp_attempt_unixtime; + if (dif > 30) + { + addon = GotoNextHomeRegion(false); + } + else + { + addon = "Busy with TP cooldown"; + } + } + else + { + if (avoid_sims.Keys.Contains(Client.Network.CurrentSim.Name) == true) + { + dif = helpers.UnixTimeNow() - last_tp_attempt_unixtime; + if (dif > 30) + { + addon = GotoNextHomeRegion(true); + } + else + { + addon = "Avoid teleport underway"; + } + } + else + { + double mins = Math.Round((double)dif / 60); + int min = (int)mins; + addon = "Hiding from the storm ("+min.ToString()+" mins remain)"; + } + } + } + else + { + addon = "Avoiding sim shutdown [TP underway]"; + } + } + return addon; + } + public string GotoNextHomeRegion() { return GotoNextHomeRegion(false); @@ -173,14 +253,25 @@ namespace BSB.bottypes { last_tested_home_id = 0; } - TeleportWithSLurl(myconfig.Basic_HomeRegions[last_tested_home_id]); - return " [@home **** active teleport: "+ last_attempted_teleport_region+"***]"; + string Slurl = myconfig.Basic_HomeRegions[last_tested_home_id]; + string simname = helpers.RegionnameFromSLurl(Slurl); + if (avoid_sims.Keys.Contains(simname) == false) + { + string whyrejected = TeleportWithSLurl(Slurl); + if (whyrejected == "ok") + { + return "**** active teleport: " + last_attempted_teleport_region + "***"; + } + return "TP to " + simname + " rejected - " + whyrejected; + } + return "unable to teleport to home region: " + simname + " currently in avoid list"; } - return " [@home No home regions]"; + return "No home regions"; } else { SimShutdownAvoid = true; + SimShutdownAvoidCooldown = helpers.UnixTimeNow() + (60 * 10); string UseSLurl = ""; foreach (string Slurl in myconfig.Basic_HomeRegions) { @@ -208,18 +299,38 @@ namespace BSB.bottypes } } - + protected string AtHomeStatus(string message) + { + return " [@Home: " + message+"]"; + } + + protected string AtHome_laststatus = ""; public override string GetStatus() { + ExpireOldAvoidSims(); + string reply; if (Client.Network.Connected == true) { - return base.GetStatus(); + if (Client.Network.CurrentSim != null) + { + reply = AtHomeStatus(LoggedinAthome()); + } + else + { + reply = AtHomeStatus("No Sim"); + } } else { - return base.GetStatus() + LoggedOutNextAction(); + reply = AtHomeStatus(LoggedOutNextAction()); } + if (reply != AtHome_laststatus) + { + AtHome_laststatus = reply; + return base.GetStatus() + reply; + } + return base.GetStatus(); } protected override void AfterBotLoginHandler() @@ -228,24 +339,26 @@ namespace BSB.bottypes last_tp_attempt_unixtime = helpers.UnixTimeNow() + 30; if (reconnect == true) { - last_tested_home_id = -1; - after_login_fired = false; - teleported = false; - reconnect_mode = false; + ResetAtHome(); } else { Client.Self.AlertMessage += AlertEvent; Client.Network.SimChanged += ChangeSim; } - if (UUID.TryParse(myconfig.Setting_DefaultSit_UUID, out UUID sit_UUID) == true) + if (IsSimHome(Client.Network.CurrentSim.Name) == true) { - Client.Self.RequestSit(sit_UUID, Vector3.Zero); + if (UUID.TryParse(myconfig.Setting_DefaultSit_UUID, out UUID sit_UUID) == true) + { + Client.Self.RequestSit(sit_UUID, Vector3.Zero); + } } after_login_fired = true; } - public void TeleportWithSLurl(string sl_url) + + + public string TeleportWithSLurl(string sl_url) { string[] bits = helpers.ParseSLurl(sl_url); if (helpers.notempty(bits) == true) @@ -261,9 +374,13 @@ namespace BSB.bottypes last_tp_attempt_unixtime = helpers.UnixTimeNow(); last_attempted_teleport_region = regionName; Client.Self.Teleport(regionName, new Vector3(posX, posY, posZ)); + return "ok"; } + return "Sim in avoid list"; } + return "Invaild bits length for SLurl"; } + return "No bits decoded"; } public void SetHome(string sl_url)