/*
TShock, a server mod for Terraria
Copyright (C) 2011-2019 Pryaxis & TShock Contributors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
using System;
namespace TShockAPI.Modules;
public class ReduceConsoleSpam : Module
{
public override void Initialise() =>
OTAPI.Hooks.Main.StatusTextChange += OnMainStatusTextChange;
public override void Dispose() =>
OTAPI.Hooks.Main.StatusTextChange -= OnMainStatusTextChange;
///
/// Holds the last status text value, to determine if there is a suitable change to report.
///
private string _lastStatusText = null;
///
/// Aims to reduce the amount of console spam by filtering out load/save progress
///
///
/// OTAPI event
private void OnMainStatusTextChange(object sender, OTAPI.Hooks.Main.StatusTextChangeArgs e)
{
void WriteIfChange(string text)
{
if (_lastStatusText != text)
{
Console.WriteLine(text); // write it manually instead of terraria which causes double writes
_lastStatusText = text;
}
}
bool replace(string text)
{
if (e.Value.StartsWith(text))
{
var segment = e.Value.Substring(0, text.Length);
WriteIfChange(segment);
e.Value = "";
return true;
}
return false;
}
if (replace("Resetting game objects")
|| replace("Settling liquids")
|| replace("Loading world data")
|| replace("Saving world data")
|| replace("Validating world save"))
return;
// try parsing % - [text] - %
const string FindMaster = "% - ";
const string FindSub = " - ";
var master = e.Value.IndexOf(FindMaster);
if (master > -1)
{
var sub = e.Value.LastIndexOf(FindSub);
if (master > -1 && sub > master)
{
var mprogress = e.Value.Substring(0, master + 1/*%*/);
var sprogress = e.Value.Substring(sub + FindSub.Length);
if (mprogress.EndsWith("%") && sprogress.EndsWith("%"))
{
var text = e.Value.Substring(master + FindMaster.Length, sub - master - FindMaster.Length).Trim();
if (text.Length > 0 && !(
// relogic has made a mess of this
(
_lastStatusText != "Validating world save"
|| _lastStatusText != "Saving world data"
)
&& text == "Finalizing world"
))
WriteIfChange(text);
e.Value = "";
}
}
}
}
}