Fix for the mail script. (#1102)

* New version of the bot.

I improved some things and added the option to change some settings directly through minecraft.

* Update Mail.cs

* Update Mail.cs

* Easy cross server fix.

Besides some other lines, I added a simple way, to setup a cross server system. Through the preconfigured save path, you just need to put two or more instances in the same folder and launch them, to get a cross server mail system.

* Improvement to cross server system.

You are now able to change the directory of the mail/option file inside of the applications folder through mc chat. This means you can run several applications in one folder which are grouped to several safe files and have completely different option settings. (Linking servers in groups or adjust every bot perfectly for the individual server.)
This commit is contained in:
Daenges 2020-07-04 10:39:37 +02:00 committed by GitHub
parent f58798df61
commit 4f3f217c0f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,17 +1,13 @@
using System;
using System.Collections.Generic;
using System;
using System.Linq;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace MinecraftClient.ChatBots
{
/// <summary>
/// All saved options.
/// <summary>
/// All saved options.
/// </summary>
[Serializable]
class Options
@ -24,29 +20,27 @@ namespace MinecraftClient.ChatBots
public int maxSavedMails_Player { get; set; }
public int daysTosaveMsg { get; set; }
public bool debug_msg { get; set; }
public string[] moderator = new string[1];
public string[] moderator = new string[0];
public DateTime lastReset { get; set; }
public int timevar_100ms { get; set; }
public Options()
{
path_mail = Path.GetFullPath(@"\mails.txt"); // Path where the mail file is saved. You can also apply a normal path like @"C:\Users\SampleUser\Desktop"
path_setting = Path.GetFullPath(@"\options.txt"); // Path where the settings are saved
botname = "Chatie"; // Ingamename of the bot
moderator[0] = "daenges"; // Enter your own MC name. !!! CAUTION !!! Who you give mod previliges!
interval_sendmail = 100; // Intervall atempting to send mails / do a respawn [in 100 ms] -> eg. 100 * 100ms = 10 sec
maxSavedMails = 2000; // How many mails you want to safe
maxSavedMails_Player = 3; // How many mails can be sent per player
daysTosaveMsg = 30; // After how many days the message should get deleted
debug_msg = true; // Disable debug Messages for a cleaner console
path_mail = AppDomain.CurrentDomain.BaseDirectory + "mails.txt"; // Path where the mail file is saved. You can also apply a normal path like @"C:\Users\SampleUser\Desktop"
path_setting = AppDomain.CurrentDomain.BaseDirectory + "options.txt"; // Path where the settings are saved
interval_sendmail = 100; // Intervall atempting to send mails / do a respawn [in 100 ms] -> eg. 100 * 100ms = 10 sec
maxSavedMails = 2000; // How many mails you want to safe
maxSavedMails_Player = 3; // How many mails can be sent per player
daysTosaveMsg = 30; // After how many days the message should get deleted
debug_msg = true; // Disable debug Messages for a cleaner console
timevar_100ms = 0;
lastReset = DateTime.UtcNow;
}
}
/// <summary>
/// The Way every mail is safed.
/// <summary>
/// The Way every mail is safed.
/// </summary>
[Serializable]
class Message
@ -103,8 +97,8 @@ namespace MinecraftClient.ChatBots
Message[] logged_msg;
Options options;
/// <summary>
/// Sets the message an option cache
/// <summary>
/// Sets the message an option cache
/// </summary>
public override void Initialize()
{
@ -113,8 +107,8 @@ namespace MinecraftClient.ChatBots
}
/// <summary>
/// Standard settings for the bot.
/// <summary>
/// Standard settings for the bot.
/// </summary>
public override void AfterGameJoined()
{
@ -134,17 +128,18 @@ namespace MinecraftClient.ChatBots
deleteOldMails();
options.lastReset = DateTime.UtcNow;
options.botname = GetUsername();
}
/// <summary>
/// Timer for autorespawn and the message deliverer
/// <summary>
/// Timer for autorespawn and the message deliverer
/// </summary>
public override void Update()
{
if (options.timevar_100ms == options.interval_sendmail)
{
DeliverMail();
PerformInternalCommand("/respawn");
PerformInternalCommand("respawn");
if ((DateTime.Now - options.lastReset).TotalDays > options.daysTosaveMsg)
{
@ -157,30 +152,29 @@ namespace MinecraftClient.ChatBots
options.timevar_100ms++;
}
/// <summary>
/// Listening for Messages.
/// <summary>
/// Listening for Messages.
/// </summary>
public override void GetText(string text)
{
string message = "";
string username = "";
text = GetVerbatim(text);
if (IsPrivateMessage(text, ref message, ref username) && username.ToLower() != options.botname)
if (IsPrivateMessage(text, ref message, ref username))
{
message = message.ToLower();
cmd_reader(message, username, isMessageFromMod(username));
if(username.ToLower() != options.botname.ToLower())
{
message = message.ToLower();
cmd_reader(message, username, isMessageFromMod(username));
}
}
}
/// <summary>
/// Interprets command.
/// <summary>
/// Interprets command.
/// </summary>
public void cmd_reader(string message, string sender, bool isMod)
{
@ -209,10 +203,14 @@ namespace MinecraftClient.ChatBots
}
}
if (sender != string.Empty && destination != string.Empty && content != string.Empty)
if (IsValidName(sender) && IsValidName(destination) && content != string.Empty)
{
AddMail(sender, destination, content);
}
else
{
SendPrivateMessage(sender, "Something went wrong!");
}
}
else
{
@ -221,122 +219,296 @@ namespace MinecraftClient.ChatBots
clearLogged_msg();
}
if (isMod)
if (isMod || options.moderator.Length == 0) // Delete the safe file of the bot to reset all mods || 2. otion to get the owner as a moderator.
{
// These commands can be exploited easily and may cause huge damage.
if (message.Contains("getmails"))
{
if (options.debug_msg)
{
LogToConsole("Listing all Messages. \n Performed by: " + sender);
}
GetMailsFromFile();
foreach (Message m in logged_msg)
{
LogToConsole(m.GetSender() + " " + m.GetDestination() + " " + m.GetContent() + " " + Convert.ToString(m.GetTimeStamp()));
}
clearLogged_msg();
}
/*
// Only uncomment for testing reasons
if (message.Contains("clearmails"))
{
if (debug_msg)
{
LogToConsole("Clearing Messages.");
}
clearSavedMails();
}
*/
if (message.Contains("respawn"))
{
if (options.debug_msg)
{
LogToConsole("Respawning! \n Performed by: " + sender);
}
PerformInternalCommand("/respawn");
}
if (message.Contains("deliver"))
{
if (options.debug_msg)
{
LogToConsole("Sending Mails! \n Performed by: " + sender);
}
DeliverMail();
}
if (message.Contains("reconnect"))
{
if (options.debug_msg)
{
LogToConsole("Reconnecting! \n Performed by: " + sender);
}
ReconnectToTheServer();
}
if (message.Contains("addmod"))
{
string name = "";
for (int i = message.IndexOf("addMod") + 7; i < message.Length; i++)
{
if (message[i] != Convert.ToChar(" "))
{
name += message[i];
}
else
{
break;
}
}
addMod(name);
if (options.debug_msg)
{
LogToConsole("Added " + name + " as moderator! \n Performed by: " + sender);
}
}
if (message.Contains("removemod"))
{
string name = "";
for (int i = message.IndexOf("addMod") + 7; i < message.Length; i++)
{
if (message[i] != Convert.ToChar(" "))
{
name += message[i];
}
else
{
break;
}
}
removeMod(name);
if (options.debug_msg)
{
LogToConsole("Removed " + name + " as moderator! \n Performed by: " + sender);
}
}
mod_Commands(message, sender);
}
}
/// <summary>
/// Clear the safe File.
private void mod_Commands(string message, string sender)
{
// These commands can be exploited easily and may cause huge damage.
if (message.Contains("getmails"))
{
if (options.debug_msg)
{
LogToConsole("Listing all Messages. \n Performed by: " + sender);
}
GetMailsFromFile();
foreach (Message m in logged_msg)
{
LogToConsole(m.GetSender() + " " + m.GetDestination() + " " + m.GetContent() + " " + Convert.ToString(m.GetTimeStamp()));
}
clearLogged_msg();
}
/*
// Only uncomment for testing reasons
if (message.Contains("clearmails"))
{
if (debug_msg)
{
LogToConsole("Clearing Messages.");
}
clearSavedMails();
}
*/
if (message.Contains("respawn"))
{
if (options.debug_msg)
{
LogToConsole("Respawning! \n Performed by: " + sender);
}
PerformInternalCommand("respawn");
}
if (message.Contains("deliver"))
{
if (options.debug_msg)
{
LogToConsole("Sending Mails! \n Performed by: " + sender);
}
DeliverMail();
}
if (message.Contains("reconnect"))
{
if (options.debug_msg)
{
LogToConsole("Reconnecting! \n Performed by: " + sender);
}
SaveMailsToFile();
SaveOptionsToFile();
ReconnectToTheServer();
}
if (message.Contains("deleteoldmails"))
{
if (options.debug_msg)
{
LogToConsole("Deleting old mails! \n Performed by: " + sender);
}
deleteOldMails();
SaveMailsToFile();
}
if (message.Contains("addmod"))
{
string name = "";
for (int i = message.IndexOf("addMod") + 7; i < message.Length; i++)
{
if (message[i] != Convert.ToChar(" "))
{
name += message[i];
}
else
{
break;
}
}
addMod(name);
SendPrivateMessage(sender, name + "is now Moderator.");
SaveOptionsToFile();
if (options.debug_msg)
{
LogToConsole("Added " + name + " as moderator! \n Performed by: " + sender);
}
}
if (message.Contains("removemod"))
{
string name = "";
for (int i = message.IndexOf("addMod") + 7; i < message.Length; i++)
{
if (message[i] != Convert.ToChar(" "))
{
name += message[i];
}
else
{
break;
}
}
removeMod(name);
SendPrivateMessage(sender, name + "is no Moderator anymmore.");
SaveOptionsToFile();
if (options.debug_msg)
{
LogToConsole("Removed " + name + " as moderator! \n Performed by: " + sender);
}
}
//////////////////////////////
// Change options through mc chat
//////////////////////////////
if (message.Contains("toggledebug"))
{
if (options.debug_msg)
{
options.debug_msg = false;
if (options.debug_msg)
{
LogToConsole(sender + ": Turned Console Log off!");
}
}
else
{
options.debug_msg = true;
if (options.debug_msg)
{
LogToConsole(sender + ": Turned Console Log off!");
}
}
SendPrivateMessage(sender, "Settings changed! Rejoin to apply!");
SaveOptionsToFile();
}
if (message.Contains("daystosavemsg"))
{
options.daysTosaveMsg = getIntInCommand(message, "daystosavemsg");
SaveOptionsToFile();
SendPrivateMessage(sender, "Settings changed! Rejoin to apply!");
if (options.debug_msg)
{
LogToConsole(sender + " changed daystosavemsg to: " + Convert.ToString(options.daysTosaveMsg));
}
}
if (message.Contains("intervalsendmail"))
{
options.interval_sendmail = getIntInCommand(message, "intervalsendmail");
SaveOptionsToFile();
SendPrivateMessage(sender, "Settings changed! Rejoin to apply!");
if (options.debug_msg)
{
LogToConsole(sender + " changed intervalsendmail to: " + Convert.ToString(options.interval_sendmail));
}
}
if (message.Contains("maxsavedmails"))
{
options.maxSavedMails = getIntInCommand(message, "maxsavedmails");
SaveOptionsToFile();
SendPrivateMessage(sender, "Settings changed! Rejoin to apply!");
if (options.debug_msg)
{
LogToConsole(sender + " changed maxsavedmails to: " + Convert.ToString(options.maxSavedMails));
}
}
if (message.Contains("maxmailsperplayer"))
{
options.maxSavedMails_Player = getIntInCommand(message, "maxmailsperplayer");
SaveOptionsToFile();
SendPrivateMessage(sender, "Settings changed! Rejoin to apply!");
if (options.debug_msg)
{
LogToConsole(sender + " changed maxmailsperplayer to: " + Convert.ToString(options.maxSavedMails_Player));
}
}
if (message.Contains("changemailpath"))
{
string path = "";
for (int i = message.IndexOf("changemailpath") + "changemailpath".Length + 1; i < message.Length; i++)
{
if (message[i] != Convert.ToChar(" "))
{
path += message[i];
}
else
{
break;
}
}
options.path_mail = AppDomain.CurrentDomain.BaseDirectory + path;
SendPrivateMessage(sender, "Settings changed!");
SaveOptionsToFile();
GetOptionsFromFile();
if (options.debug_msg)
{
LogToConsole(sender + " changed mailpath to: " + Convert.ToString(options.path_mail));
}
}
if (message.Contains("changesettingspath"))
{
string path = "";
for (int i = message.IndexOf("changesettingspath") + "changesettingspath".Length + 1; i < message.Length; i++)
{
if (message[i] != Convert.ToChar(" "))
{
path += message[i];
}
else
{
break;
}
}
options.path_setting = AppDomain.CurrentDomain.BaseDirectory + path;
SendPrivateMessage(sender, "Settings changed!");
SaveOptionsToFile();
GetOptionsFromFile();
if(options.debug_msg)
{
LogToConsole(sender + " changed settingsspath to: " + Convert.ToString(options.path_setting));
}
}
if (message.Contains("listsettings"))
{
SendPrivateMessage(sender, "debugmsg: " + Convert.ToString(options.debug_msg) + "; daystosavemsg: " + Convert.ToString(options.daysTosaveMsg) + "; intervalsendmail: " + Convert.ToString(options.interval_sendmail) + "; maxsavedmails: " + Convert.ToString(options.maxSavedMails) + "; maxsavedmails_player: " + Convert.ToString(options.maxSavedMails_Player + "; messagepath: " + options.path_mail + "; settingspath: " + options.path_setting));
}
}
/// <summary>
/// Get the number after a certain word in the message.
/// </summary>
public int getIntInCommand(string message, string searched)
{
string num = "";
for (int i = message.IndexOf(searched) + searched.Length + 1; i < message.Length; i++)
{
if (message[i] != Convert.ToChar(" "))
{
num += message[i];
}
else
{
return Int32.Parse(num);
}
}
return Int32.Parse(num);
}
/// <summary>
/// Clear the safe File.
/// </summary>
public void clearSavedMails()
{
@ -344,16 +516,16 @@ namespace MinecraftClient.ChatBots
SaveMailsToFile();
}
/// <summary>
/// Clear the messages in ram.
/// <summary>
/// Clear the messages in ram.
/// </summary>
public void clearLogged_msg()
{
logged_msg = new Message[0];
}
/// <summary>
/// Add a player who can moderate the bot.
/// <summary>
/// Add a player who can moderate the bot.
/// </summary>
public void addMod(string name)
{
@ -367,8 +539,8 @@ namespace MinecraftClient.ChatBots
options.moderator[options.moderator.Length - 1] = name;
}
/// <summary>
/// Remove a player from the moderator list.
/// <summary>
/// Remove a player from the moderator list.
/// </summary>
public void removeMod(string name)
{
@ -383,12 +555,11 @@ namespace MinecraftClient.ChatBots
options.moderator = options.moderator.Where(x => !string.IsNullOrEmpty(x)).ToArray();
}
/// <summary>
/// Serialize mails to binary file.
/// <summary>
/// Serialize mails to binary file.
/// </summary>
public void SaveMailsToFile()
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream stream = new FileStream(options.path_mail, FileMode.Create, FileAccess.Write);
@ -397,16 +568,15 @@ namespace MinecraftClient.ChatBots
if (options.debug_msg)
{
LogToConsole("Saved mails to File! \n" + "Location: " + options.path_mail + "\n Time: " + Convert.ToString(DateTime.UtcNow));
LogToConsole("Saved mails to File!" + " Location: " + options.path_mail + " Time: " + Convert.ToString(DateTime.UtcNow));
}
}
/// <summary>
/// Get mails from save file.
/// <summary>
/// Get mails from save file.
/// </summary>
public void GetMailsFromFile()
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream stream = new FileStream(options.path_mail, FileMode.Open, FileAccess.Read);
@ -415,16 +585,15 @@ namespace MinecraftClient.ChatBots
if (options.debug_msg)
{
LogToConsole("Loaded mails from File! \n" + "Location: " + options.path_mail + "\n Time: " + Convert.ToString(DateTime.UtcNow));
LogToConsole("Loaded mails from File!" + " Location: " + options.path_mail + " Time: " + Convert.ToString(DateTime.UtcNow));
}
}
/// <summary>
/// Serialize settings to binary file.
/// <summary>
/// Serialize settings to binary file.
/// </summary>
public void SaveOptionsToFile()
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream stream = new FileStream(options.path_setting, FileMode.Create, FileAccess.Write);
@ -433,12 +602,12 @@ namespace MinecraftClient.ChatBots
if (options.debug_msg)
{
LogToConsole("Saved options to File! \n" + "Location: " + options.path_setting + "\n Time: " + Convert.ToString(DateTime.UtcNow));
LogToConsole("Saved options to File! " + "Location: " + options.path_setting + " Time: " + Convert.ToString(DateTime.UtcNow));
}
}
/// <summary>
/// Get settings from save file.
/// <summary>
/// Get settings from save file.
/// </summary>
public void GetOptionsFromFile()
{
@ -451,12 +620,12 @@ namespace MinecraftClient.ChatBots
if (options.debug_msg)
{
LogToConsole("Loaded options from File! \n" + "Location: " + options.path_setting + "\n Time: " + Convert.ToString(DateTime.UtcNow));
LogToConsole("Loaded options from File! " + "Location: " + options.path_setting + " Time: " + Convert.ToString(DateTime.UtcNow));
}
}
/// <summary>
/// Add a message to the list.
/// <summary>
/// Add a message to the list.
/// </summary>
public void AddMail(string sender, string destination, string content)
{
@ -476,12 +645,12 @@ namespace MinecraftClient.ChatBots
SendPrivateMessage(sender, "Message saved!");
}
/// <summary>
/// Try to send all messages.
/// <summary>
/// Try to send all messages.
/// </summary>
public void DeliverMail()
{
LogToConsole("Looking for mails to send:");
LogToConsole("Looking for mails to send: " + DateTime.UtcNow); // Can not be disabled to indicate, that the script is still running.
GetMailsFromFile();
foreach(string Player in GetOnlinePlayers())
@ -506,8 +675,8 @@ namespace MinecraftClient.ChatBots
clearLogged_msg();
}
/// <summary>
/// See how many messages of a user are saved.
/// <summary>
/// See how many messages of a user are saved.
/// </summary>
public int getSentMessagesByUser(string player)
{
@ -523,8 +692,8 @@ namespace MinecraftClient.ChatBots
return mailcount;
}
/// <summary>
/// Test if the sender is in the moderator list.
/// <summary>
/// Test if the sender is in the moderator list.
/// </summary>
public bool isMessageFromMod(string player)
{
@ -538,8 +707,8 @@ namespace MinecraftClient.ChatBots
return false;
}
/// <summary>
/// Deleting mails older than a month.
/// <summary>
/// Deleting mails older than a month.
/// </summary>
public void deleteOldMails()
{