using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.Json;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using Bloodstone.API;
using Bloodstone.Hooks;
using Bloody.Core.API.v1;
using Bloody.Core.GameData.v1;
using Bloody.Core.Models.v1;
using Bloody.Core.Models.v1.Base;
using BloodyMailBox.Common.Models;
using BloodyMailBox.Exceptions;
using BloodyMailBox.System;
using BloodyMailBox.Utils;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using ProjectM;
using ProjectM.Network;
using Stunlock.Network;
using Unity.Collections;
using Unity.Entities;
using VampireCommandFramework;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("BloodyMailBox")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Mod for Ticket Admin System")]
[assembly: AssemblyFileVersion("1.0.3.0")]
[assembly: AssemblyInformationalVersion("1.0.3+3.Branch.master.Sha.1859f76d95336ce63eccca906c1afcfa1a3d432f")]
[assembly: AssemblyProduct("BloodyMailBox")]
[assembly: AssemblyTitle("BloodyMailBox")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.3.0")]
[module: UnverifiableCode]
namespace BloodyMailBox
{
[BepInPlugin("BloodyMailBox", "BloodyMailBox", "1.0.3")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BasePlugin
{
public static ManualLogSource Logger;
private Harmony _harmony;
public static ConfigEntry<bool> OwnMessages;
public static ConfigEntry<int> MaxMessages;
public override void Load()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Expected O, but got Unknown
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Expected O, but got Unknown
_harmony = new Harmony("BloodyMailBox");
_harmony.PatchAll(Assembly.GetExecutingAssembly());
CommandRegistry.RegisterAll();
EventsHandlerSystem.OnInitialize += new OnGameDataInitializedEventHandler(GameDataOnInitialize);
EventsHandlerSystem.OnDestroy += new OnGameDataDestroyedEventHandler(GameDataOnDestroy);
InitConfigServer();
ManualLogSource log = ((BasePlugin)this).Log;
bool flag = default(bool);
BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(18, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Plugin ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("BloodyMailBox");
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" is loaded!");
}
log.LogInfo(val);
}
private void InitConfigServer()
{
OwnMessages = ((BasePlugin)this).Config.Bind<bool>("Config", "ownMessages", false, "Allows you to send messages to your mailbox to yourself.");
MaxMessages = ((BasePlugin)this).Config.Bind<int>("Config", "maxMessages", 20, "Maximum number of messages that a user can have in the mailbox. If the value is 0 they are infinite (Not recommended)");
}
private static void GameDataOnInitialize(World world)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
EventsHandlerSystem.OnUserConnected += new OnUserConnectedEventHandler(OnUserOnlineSystem.OnUserOnline);
}
private static void GameDataOnDestroy()
{
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "BloodyMailBox";
public const string PLUGIN_NAME = "BloodyMailBox";
public const string PLUGIN_VERSION = "1.0.3";
}
}
namespace BloodyMailBox.Utils
{
internal class FontColorChat
{
public static string Color(string hexColor, string text)
{
return $"<color={hexColor}>{text}</color>";
}
public static string Red(string text)
{
return Color("#E90000", text);
}
public static string Blue(string text)
{
return Color("#0000ff", text);
}
public static string Green(string text)
{
return Color("#7FE030", text);
}
public static string Yellow(string text)
{
return Color("#FBC01E", text);
}
public static string White(string text)
{
return Color("#FFFFFF", text);
}
}
internal class MailBox
{
public static readonly string ConfigPath = Path.Combine(Paths.ConfigPath, "BloodyMailBox");
public static readonly string MailBoxPath = Path.Combine(ConfigPath, "MailBox");
public static bool CreateMailBox(string user)
{
if (!Directory.Exists(ConfigPath))
{
Directory.CreateDirectory(ConfigPath);
}
if (!Directory.Exists(MailBoxPath))
{
Directory.CreateDirectory(MailBoxPath);
}
string path = Path.Combine(MailBoxPath, user + ".json");
if (!File.Exists(path))
{
File.WriteAllText(path, "[]");
return true;
}
return false;
}
public static List<MessageModel> ReadMailBox(string user)
{
try
{
string path = Path.Combine(MailBoxPath, user + ".json");
if (!File.Exists(path))
{
CreateMailBox(user);
return new List<MessageModel>();
}
return JsonSerializer.Deserialize<List<MessageModel>>(File.ReadAllText(path));
}
catch
{
return new List<MessageModel>();
}
}
public static void SaveMailBox(string user, List<MessageModel> messages)
{
string path = Path.Combine(MailBoxPath, user + ".json");
string contents = JsonSerializer.Serialize(messages);
File.WriteAllText(path, contents);
}
public static void MessageToMailBox(string user, string message, string fromUser)
{
MessageModel messageModel = new MessageModel();
List<MessageModel> list = new List<MessageModel>();
if (CreateMailBox(user))
{
messageModel.Id = 1;
}
else
{
int num = 0;
list = ReadMailBox(user);
if (Plugin.MaxMessages.Value > 0 && list.Count == Plugin.MaxMessages.Value)
{
throw new MailBoxException("The user " + FontColorChat.White(user ?? "") + " has no space in the mailbox");
}
if (list.Count() > 0)
{
num = (from p in list
orderby p.Id descending
select p into r
select r.Id).First();
}
messageModel.Id = num + 1;
}
messageModel.Author = fromUser;
messageModel.Body = message;
messageModel.Open = false;
list.Add(messageModel);
SaveMailBox(user, list);
}
public static MessageModel SelectMessageFromMailBox(string user, int id)
{
new List<MessageModel>();
if (CreateMailBox(user))
{
throw new MailBoxException("The selected message does not exist.");
}
return ReadMailBox(user).FirstOrDefault((MessageModel message) => message.Id == id);
}
public static bool DeleteMessageFromMailBox(string user, int id)
{
SelectMessageFromMailBox(user, id);
List<MessageModel> list = new List<MessageModel>();
if (CreateMailBox(user))
{
throw new MailBoxException("The selected message does not exist.");
}
list = ReadMailBox(user);
list.RemoveAll((MessageModel message) => message.Id == id);
SaveMailBox(user, list);
return true;
}
public static bool DeleteAllMessageFromMailBox(string user)
{
List<MessageModel> messages = new List<MessageModel>();
if (CreateMailBox(user))
{
throw new MailBoxException("You don't have any messages to delete.");
}
SaveMailBox(user, messages);
return true;
}
public static bool SetOpenedMessageFromMailBox(string user, int id)
{
SelectMessageFromMailBox(user, id);
List<MessageModel> list = new List<MessageModel>();
if (CreateMailBox(user))
{
throw new MailBoxException("The selected message does not exist.");
}
list = ReadMailBox(user);
list.Where((MessageModel message) => message.Id == id).ToList().ForEach(delegate(MessageModel message)
{
message.Open = true;
});
SaveMailBox(user, list);
return true;
}
}
}
namespace BloodyMailBox.System
{
public class OnUserOnlineSystem
{
internal static void OnUserOnline(ServerBootstrapSystem sender, NetConnectionId netConnectionId)
{
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
int num = sender._NetEndPointToApprovedUserIndex[netConnectionId];
Entity userEntity = ((Il2CppArrayBase<ServerClient>)(object)sender._ApprovedUsersLookup)[num].UserEntity;
UserModel userModel = GameData.Users.FromEntity(userEntity);
CoroutineHandler.StartGenericCoroutine((Action)delegate
{
OnTimedAuto(userModel);
}, 10f);
}
private static void OnTimedAuto(UserModel user)
{
//IL_01df: Unknown result type (might be due to invalid IL or missing references)
//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_0222: Unknown result type (might be due to invalid IL or missing references)
//IL_0232: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
List<MessageModel> list = MailBox.ReadMailBox(user.CharacterName.ToString().ToLower());
IEnumerable<MessageModel> enumerable = list.Where((MessageModel message) => !message.Open);
int num = enumerable.Count();
EntityManager entityManager = VWorld.Server.EntityManager;
if (num > 0)
{
ServerChatUtils.SendSystemMessageToClient(entityManager, ((EntityModel)user).Internals.User.Value, "You have " + FontColorChat.White($"{num}") + " unread messages in your mailbox.");
try
{
ServerChatUtils.SendSystemMessageToClient(entityManager, ((EntityModel)user).Internals.User.Value, FontColorChat.Yellow("------------ MailBox ------------"));
foreach (MessageModel item in enumerable)
{
string text = (item.Open ? "Read" : "Unread");
ServerChatUtils.SendSystemMessageToClient(entityManager, ((EntityModel)user).Internals.User.Value, FontColorChat.Yellow($"[{FontColorChat.White($"{item.Id}")}][{FontColorChat.White(text ?? "")}] Message Author: {FontColorChat.White(item.Author ?? "")}"));
}
ServerChatUtils.SendSystemMessageToClient(entityManager, ((EntityModel)user).Internals.User.Value, FontColorChat.Yellow("------------ End MailBox ------------"));
}
catch (MailBoxException ex)
{
ServerChatUtils.SendSystemMessageToClient(entityManager, ((EntityModel)user).Internals.User.Value, FontColorChat.Red(ex.Message ?? ""));
}
}
if (list.Count == Plugin.MaxMessages.Value)
{
ServerChatUtils.SendSystemMessageToClient(entityManager, ((EntityModel)user).Internals.User.Value, "\r\n " + FontColorChat.White("ATTENTION") + " \r\n " + FontColorChat.Red("Your mailbox is full, delete messages to receive more."));
}
}
}
}
namespace BloodyMailBox.Server.Timer
{
public class AutoLoadNewMessages
{
private bool _enabled;
private bool _isRunning;
private DateTime _lastRunTime;
private TimeSpan _delay;
private Action<World> _action;
private Func<object, TimeSpan> _delayAction;
public void Start(Action<World> action, TimeSpan delay)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Expected O, but got Unknown
_delay = delay;
_lastRunTime = DateTime.UtcNow - delay;
_action = action;
_enabled = true;
GameFrame.OnUpdate += new GameFrameUpdateEventHandler(GameFrame_OnUpdate);
}
public void Start(Action<World> action, Func<object, TimeSpan> delayAction)
{
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Expected O, but got Unknown
_delayAction = delayAction;
_delay = _delayAction(1);
_lastRunTime = DateTime.UtcNow;
_action = action;
_enabled = true;
GameFrame.OnUpdate += new GameFrameUpdateEventHandler(GameFrame_OnUpdate);
}
private void GameFrame_OnUpdate()
{
Update(World.DefaultGameObjectInjectionWorld);
}
private void Update(World world)
{
if (!_enabled || _isRunning || _lastRunTime + _delay >= DateTime.UtcNow)
{
return;
}
_isRunning = true;
try
{
_action(world);
}
catch (Exception ex)
{
Plugin.Logger.LogError((object)ex);
}
finally
{
int num = 30;
if (_delayAction != null)
{
_delay = _delayAction(num);
}
_lastRunTime = DateTime.UtcNow;
_isRunning = false;
}
}
public void Stop()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
GameFrame.OnUpdate -= new GameFrameUpdateEventHandler(GameFrame_OnUpdate);
_enabled = false;
}
public void Dispose()
{
if (_enabled)
{
Stop();
}
}
}
}
namespace BloodyMailBox.Server.Commands
{
[CommandGroup("mailbox", null)]
internal class MailBoxCommands
{
[Command("send", null, "<UserNick> \"<Message>\"", "Send a message to the mailbox of a server user", null, false)]
public static void SendMail(ChatCommandContext ctx, string name, string message)
{
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
//IL_0122: Unknown result type (might be due to invalid IL or missing references)
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_013d: Unknown result type (might be due to invalid IL or missing references)
UserModel val = GameData.Users.All.FirstOrDefault((Func<UserModel, bool>)((UserModel user) => user.CharacterName.ToString().ToLower() == name.ToString().ToLower())) ?? throw ctx.Error("User " + FontColorChat.White(name ?? "") + " does not exist on this server.");
User user2 = ctx.User;
if (((object)(FixedString64Bytes)(ref user2.CharacterName)).ToString().ToLower() == name.ToString().ToLower() && !Plugin.OwnMessages.Value)
{
throw ctx.Error("You are not allowed to send messages to yourself.");
}
try
{
string user3 = name.ToString().ToLower();
user2 = ctx.User;
MailBox.MessageToMailBox(user3, message, ((object)(FixedString64Bytes)(ref user2.CharacterName)).ToString());
ctx.Reply(FontColorChat.Yellow("Message sent to user " + FontColorChat.White(name ?? "") + " successfully."));
if (val.IsConnected)
{
ServerChatUtils.SendSystemMessageToClient(VWorld.Server.EntityManager, ((EntityModel)val).Internals.User.Value, "You have a new message from " + FontColorChat.White($"{ctx.User.CharacterName}") + " in your mailbox.");
}
}
catch (MailBoxException ex)
{
throw ctx.Error(ex.Message);
}
}
[Command("read", null, "<idMessage>", "Read a certain message from your mailbox", null, false)]
public static void ReadMessageFromMailBox(ChatCommandContext ctx, int id)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
try
{
User user = ctx.User;
MessageModel messageModel = MailBox.SelectMessageFromMailBox(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString().ToLower(), id);
ctx.Reply(FontColorChat.Yellow("------------ Message " + FontColorChat.White($"{id}") + " ------------"));
ctx.Reply(FontColorChat.Yellow("Message Author: " + FontColorChat.White(messageModel.Author ?? "")));
ctx.Reply(FontColorChat.Yellow("Message Body:"));
ctx.Reply(FontColorChat.Yellow(FontColorChat.White(messageModel.Body ?? "") ?? ""));
ctx.Reply(FontColorChat.Yellow("------------ End Message " + FontColorChat.White($"{id}") + " ------------"));
if (!messageModel.Open)
{
user = ctx.User;
MailBox.SetOpenedMessageFromMailBox(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString().ToLower(), id);
}
}
catch (MailBoxException ex)
{
throw ctx.Error(ex.Message);
}
}
[Command("list", null, "", "List of all your messages in the mailbox", null, false)]
public static void ListMail(ChatCommandContext ctx)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
try
{
string text = "";
User user = ctx.User;
List<MessageModel> list = MailBox.ReadMailBox(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString().ToLower());
if (Plugin.MaxMessages.Value > 0)
{
ctx.Reply(FontColorChat.Yellow($"------------ MailBox [{FontColorChat.White($"{list.Count()}")}/{FontColorChat.White($"{Plugin.MaxMessages.Value}")}] ------------"));
}
else
{
ctx.Reply(FontColorChat.Yellow("------------ MailBox ------------"));
}
foreach (MessageModel item in list)
{
text = (item.Open ? "Read" : "Unread");
ctx.Reply(FontColorChat.Yellow($"[{FontColorChat.White($"{item.Id}")}][{FontColorChat.White(text ?? "")}] Message Author: {FontColorChat.White(item.Author ?? "")}"));
}
ctx.Reply(FontColorChat.Yellow("------------ End MailBox ------------"));
}
catch (MailBoxException ex)
{
throw ctx.Error(ex.Message);
}
}
[Command("delete", null, "<idMessage>", "Delete a certain message from your mailbox", null, false)]
public static void DeleteMail(ChatCommandContext ctx, int id)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
try
{
User user = ctx.User;
MailBox.DeleteMessageFromMailBox(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString().ToLower(), id);
ctx.Reply(FontColorChat.Yellow("Message " + FontColorChat.White($"{id}") + " deleted"));
}
catch (MailBoxException ex)
{
throw ctx.Error(ex.Message);
}
}
[Command("deleteall", null, "", "Delete all messages from your mailbox", null, false)]
public static void DeleteAllMessagesFromMailBox(ChatCommandContext ctx)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
try
{
User user = ctx.User;
MailBox.DeleteAllMessageFromMailBox(((object)(FixedString64Bytes)(ref user.CharacterName)).ToString().ToLower());
ctx.Reply(FontColorChat.Yellow("All messages in the mailbox have been deleted"));
}
catch (MailBoxException ex)
{
throw ctx.Error(ex.Message);
}
}
}
}
namespace BloodyMailBox.Exceptions
{
[Serializable]
internal class MailBoxException : Exception
{
public MailBoxException()
{
}
public MailBoxException(string message)
: base(message)
{
}
public MailBoxException(string message, Exception innerException)
: base(message, innerException)
{
}
protected MailBoxException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
}
}
namespace BloodyMailBox.Common.Models
{
internal class MessageModel
{
public int Id { get; set; }
public string Author { get; set; }
public string Body { get; set; }
public bool Open { get; set; }
}
}