private void Forgive(TeamKill kill)
        {
            var killer = kill.KillerName;
            var victim = kill.VictimName;

            var message = _forgivenMessage
                          .Replace("{killer}", killer)
                          .Replace("{victim}", victim);

            AdminSayPlayer(killer, message);
            AdminSayPlayer(victim, message);

            kill.Status = TeamKillStatus.Forgiven;
        }
        private void Apologize(TeamKill kill)
        {
            var killer = kill.KillerName;
            var victim = kill.VictimName;

            var message = _apologizedMessage
                          .Replace("{killer}", killer)
                          .Replace("{victim}", victim);

            AdminSayPlayer(killer, message);
            AdminSayPlayer(victim, message);

            kill.Status = TeamKillStatus.Apologized;
        }
        private void Punish(TeamKill kill)
        {
            var killer = kill.KillerName;
            var victim = kill.VictimName;

            if (_useAdKats == enumBoolYesNo.Yes && !IsAdKatsAvailable())
            {
                WriteConsole(string.Format("^8\"Use AdKats\" is \"Yes\", but AdKats is either not enabled or not yet fully initialized. Can not record punishment of {0} for teamkilling {1}.^0", killer, victim));
            }

            if ((_useAdKats == enumBoolYesNo.No || !IsAdKatsAvailable()) && ShouldKick(killer))
            {
                Kick(killer);
                return;
            }

            var message = _autoAction == Action.Punish
                                ? "{killer} auto-punished."
                                : _punishedMessage;

            message = message
                      .Replace("{killer}", killer)
                      .Replace("{victim}", victim);

            if (_useAdKats == enumBoolYesNo.No || !IsAdKatsAvailable())
            {
                AdminSayPlayer(killer, message);
            }

            AdminSayPlayer(victim, message);

            kill.Status = TeamKillStatus.Punished;

            if (IsProtected(killer))
            {
                AdminSayPlayer(killer, "Protected from kill.");
                return;
            }

            if (_useAdKats == enumBoolYesNo.No || !IsAdKatsAvailable())
            {
                ExecuteCommand("procon.protected.send", "admin.killPlayer", killer);
                return;
            }

            // AdKats reference:
            // AdminSayMessage(record.target_name + " was PUNISHED by " + record.source_name + " for " + record.record_message);

            var command = new Hashtable
            {
                { "caller_identity", "TeamKillTracker" },
                { "response_requested", false },
                { "command_type", "player_punish" },
                { "target_name", killer },
                { "target_guid", kill.KillerGuid },
                { "source_name", "TeamKillTracker" },
                { "record_message", "teamkilling " + victim }
            };

            ExecuteCommand("procon.protected.plugins.call", "AdKats", "IssueCommand", "TeamKillTracker", JSON.JsonEncode(command));
        }