protected override LootEvent ProcessAddDesynthSell(LootMessage message)
        {
            // Desynth (Local Player)
            if (ProcessAddDesynthSellDesynthRegex.IsMatch(message.MessageParts.Last()))
            {
                return new LootEvent
                       {
                           LootEventType = LootEventType.Desynth,
                           IsLocalPlayer = true,
                           PlayerName    = Plugin.GetLocalPlayerName()
                       }
            }
            ;

            // Orchestration (Local Player)
            if (ProcessAddDesynthSellOrchestrationRegex.IsMatch(message.MessageParts.Last()))
            {
                return new LootEvent
                       {
                           LootEventType = LootEventType.Use,
                           IsLocalPlayer = true,
                           PlayerName    = Plugin.GetLocalPlayerName()
                       }
            }
            ;

            // Sell (Local Player)
            if (ProcessAddDesynthSellSellRegex.IsMatch(message.MessageParts.Last()))
            {
                return new LootEvent
                       {
                           LootEventType = LootEventType.Sell,
                           IsLocalPlayer = true,
                           PlayerName    = Plugin.GetLocalPlayerName()
                       }
            }
            ;

            return(null);
        }
        protected override LootEvent ProcessSystem(LootMessage message)
        {
            // Searched (Local Player)
            if (ProcessSystemSearchRegex.IsMatch(message.MessageParts[0]))
            {
                return new LootEvent
                       {
                           LootEventType = LootEventType.Search,
                           IsLocalPlayer = true,
                           PlayerName    = Plugin.GetLocalPlayerName()
                       }
            }
            ;

            // Added
            if (ProcessSystemAddedRegex.IsMatch(message.MessageParts.First()))
            {
                return new LootEvent
                       {
                           LootEventType = LootEventType.Add
                       }
            }
            ;

            // Lost
            if (ProcessSystemLostRegex.IsMatch(message.MessageParts[0]))
            {
                return new LootEvent
                       {
                           LootEventType = LootEventType.Lost
                       }
            }
            ;

            // Purchased (Local Player)
            if (ProcessSystemPurchasedRegex.IsMatch(message.MessageParts[0]))
            {
                return new LootEvent
                       {
                           LootEventType = LootEventType.Purchase,
                           IsLocalPlayer = true,
                           PlayerName    = Plugin.GetLocalPlayerName()
                       }
            }
            ;

            // Discarded (Local Player)
            if (ProcessSystemDiscardedRegex.IsMatch(message.MessageParts[0]))
            {
                return new LootEvent
                       {
                           LootEventType = LootEventType.Discard,
                           IsLocalPlayer = true,
                           PlayerName    = Plugin.GetLocalPlayerName()
                       }
            }
            ;

            // Obtained from Desynth (Local Player)
            if (ProcessSystemObtainedFromDesynthRegex.IsMatch(message.MessageParts[0]))
            {
                return new LootEvent
                       {
                           LootEventType = LootEventType.Obtain,
                           IsLocalPlayer = true,
                           PlayerName    = Plugin.GetLocalPlayerName()
                       }
            }
            ;

            // Obtained by Retrieving Materia (Local Player)
            if (ProcessSystemObtainedFromMateriaRegex.IsMatch(message.MessageParts[0]))
            {
                return new LootEvent
                       {
                           LootEventType = LootEventType.Obtain,
                           IsLocalPlayer = true,
                           PlayerName    = Plugin.GetLocalPlayerName()
                       }
            }
            ;

            // Lost Materia (Local Player)
            if (message.MessageParts.Count >= 3 && ProcessSystemLostMateriaRegex.IsMatch(message.MessageParts[2]))
            {
                return new LootEvent
                       {
                           LootEventType = LootEventType.Lost,
                           IsLocalPlayer = true,
                           PlayerName    = Plugin.GetLocalPlayerName()
                       }
            }
            ;

            // Sell (Local Player)
            if (ProcessAddDesynthSellSellRegex.IsMatch(message.MessageParts[0]))
            {
                return new LootEvent
                       {
                           LootEventType = LootEventType.Sell,
                           IsLocalPlayer = true,
                           PlayerName    = Plugin.GetLocalPlayerName()
                       }
            }
            ;

            return(null);
        }