/// <summary>
 /// Clear all punishment from player <see cref="Player"/>.
 /// </summary>
 /// <param name="player">The <see cref="Collections.Player"/> player.</param>
 public static void Clear(this Collections.Player player)
 {
     BanCollection.DeleteMany(p => p.Target == player);
     MuteCollection.DeleteMany(p => p.Target == player);
     KickCollection.DeleteMany(p => p.Target == player);
     WarnCollection.DeleteMany(p => p.Target == player);
     SoftBanCollection.DeleteMany(p => p.Target == player);
     SoftWarnCollection.DeleteMany(p => p.Target == player);
     WatchListCollection.DeleteMany(p => p.Target == player);
     JsonManager.PunishToCache(PunishType.All, JsonConvert.SerializeObject(player), player, ActionType.Remove);
 }
        internal static void OnFileChanged(object sender, FileSystemEventArgs e)
        {
            if (!Plugin.Singleton.Config.IsDatabaseGlobal || !Plugin.Singleton.Config.ReceiveFrom.Contains(Path.GetFileNameWithoutExtension(e.Name)?.Split('-')[4]) || Path.GetFileNameWithoutExtension(e.Name)?.Split('-')[4] == Server.Port.ToString())
            {
                return;
            }

            string playerId    = Path.GetFileNameWithoutExtension(e.Name)?.Split('-')[2];
            string rawPlayerId = playerId?.Split('@')[0];

            if (!PlayerCollection.Exists(p => p.Id == rawPlayerId))
            {
                Player player = new Player
                                (
                    rawPlayerId,
                    playerId?.Split('@')[1],
                    e.Name?.Split('-')[3]
                                );
                player.Save();
            }

            switch (Path.GetFileNameWithoutExtension(e.Name)?.Split('-')[1].GetPunishType())
            {
            case PunishType.Ban:
                Ban ban = Utf8Json.JsonSerializer.Deserialize <Ban>(File.ReadAllText(e.FullPath));

                if (ban != null && !ban.Clear)
                {
                    new Ban(ban.Target, ban.Issuer, ban.Reason, ban.Duration, ban.Date, ban.Expire, ban.BanId,
                            ban.Server, false).Save();
                    break;
                }

                BanCollection.DeleteMany(b =>
                                         b.Target == ban.Target && b.BanId == ban.BanId && b.Server == ban.Server);
                break;

            case PunishType.Kick:
                Kick kick = Utf8Json.JsonSerializer.Deserialize <Kick>(File.ReadAllText(e.FullPath));

                if (kick != null && !kick.Clear)
                {
                    new Kick(kick.Target, kick.Issuer, kick.Reason, kick.Date, kick.KickId, kick.Server,
                             false).Save();
                    break;
                }

                KickCollection.DeleteMany(k =>
                                          k.Target == kick.Target && k.KickId == kick.KickId && k.Server == kick.Server);
                break;

            case PunishType.Mute:
                Mute mute = Utf8Json.JsonSerializer.Deserialize <Mute>(File.ReadAllText(e.FullPath));

                if (mute != null && !mute.Clear)
                {
                    new Mute(mute.Target, mute.Issuer, mute.Reason, mute.Duration, mute.Date, mute.Expire,
                             mute.MuteId, mute.Server, false).Save();
                    break;
                }

                KickCollection.DeleteMany(m =>
                                          m.Target == mute.Target && m.KickId == mute.MuteId && m.Server == mute.Server);
                break;

            case PunishType.Warn:
                Warn warn = Utf8Json.JsonSerializer.Deserialize <Warn>(File.ReadAllText(e.FullPath));

                if (warn != null && !warn.Clear)
                {
                    new Warn(warn.Target, warn.Issuer, warn.Reason, warn.Date, warn.WarnId, warn.Server,
                             false).Save();
                    break;
                }

                WarnCollection.DeleteMany(w =>
                                          w.Target == warn.Target && w.WarnId == warn.WarnId && w.Server == warn.Server);
                break;

            case PunishType.SoftBan:
                SoftBan softBan = Utf8Json.JsonSerializer.Deserialize <SoftBan>(File.ReadAllText(e.FullPath));

                if (softBan != null && !softBan.Clear)
                {
                    new SoftBan(softBan.Target, softBan.Issuer, softBan.Reason, softBan.Duration, softBan.Date,
                                softBan.Expire, softBan.SoftBanId, softBan.Server, false).Save();
                    break;
                }

                SoftBanCollection.DeleteMany(sb =>
                                             sb.Target == softBan.Target && sb.SoftBanId == softBan.SoftBanId &&
                                             sb.Server == softBan.Server);
                break;

            case PunishType.SoftWarn:
                SoftWarn softWan = Utf8Json.JsonSerializer.Deserialize <SoftWarn>(File.ReadAllText(e.FullPath));

                if (softWan != null && !softWan.Clear)
                {
                    new SoftWarn(softWan.Target, softWan.Issuer, softWan.Reason, softWan.Date, softWan.SoftWarnId,
                                 softWan.Server, false).Save();
                    break;
                }

                SoftWarnCollection.DeleteMany(sw =>
                                              sw.Target == softWan.Target && sw.SoftWarnId == softWan.SoftWarnId &&
                                              sw.Server == softWan.Server);
                break;

            case PunishType.WatchList:
                WatchList watchList = JsonConvert.DeserializeObject <WatchList>(File.ReadAllText(e.FullPath));

                if (watchList != null && !watchList.Clear)
                {
                    new WatchList(watchList.Target, watchList.Issuer, watchList.Reason, watchList.Date,
                                  watchList.WatchListId, watchList.Server, false).Save();
                    break;
                }

                WatchListCollection.DeleteMany(wl =>
                                               wl.Target == watchList.Target && wl.WatchListId == watchList.WatchListId &&
                                               wl.Server == watchList.Server);
                break;

            case PunishType.All:
                JsonConvert.DeserializeObject <Player>(File.ReadAllText(e.FullPath)).Clear();
                break;
            }
            File.Delete(e.FullPath);
        }