Example #1
0
def blacklist_player(request):
    data = _get_data(request)
    res = {}
    try:
        name = data["name"] if "name" in data else None
        # Using the the perma ban by steamid actually sucks because the player won't see the reason for his ban
        # Also it could seem interesting to use it, so that if the player is on the server at the time of the
        # Blacklist he'd be banned immediately, however that's not the case, which is apparently a bug
        # ctl.do_perma_ban(
        #     steam_id_64=data["steam_id_64"], reason=data["reason"], by=name
        # )
        add_player_to_blacklist(data["steam_id_64"], data["reason"], name,
                                request.user.username)
        audit("Blacklist", request, data)
        failed = False
    except:
        logger.exception("Unable to blacklist player")
        failed = True

    return JsonResponse({
        "result": res,
        "command": "blacklist_player",
        "arguments": data,
        "failed": failed,
    })
 def do_perma_ban(self, player, reason, by):
     res = super().do_perma_ban(player, reason)
     safe_save_player_action(rcon=self,
                             player_name=player,
                             action_type="PERMABAN",
                             reason=reason,
                             by=by)
     try:
         info = self.get_player_info(player)
         add_player_to_blacklist(info['steam_id_64'], reason)
     except:
         logger.exception("Unable to blacklist")
     return res
Example #3
0
 def do_perma_ban(self, player=None, steam_id_64=None, reason="", by=""):
     res = super().do_perma_ban(player, steam_id_64, reason, admin_name=by)
     safe_save_player_action(
         rcon=self, player_name=player, action_type="PERMABAN", reason=reason, by=by, steam_id_64=steam_id_64
     )
     try:
         if not steam_id_64:
             info = self.get_player_info(player)
             steam_id_64 = info['steam_id_64']
         # TODO add author
         add_player_to_blacklist(steam_id_64, reason, by=by)
     except:
         logger.exception("Unable to blacklist")
     return res
Example #4
0
def blacklist_player(request):
    data = _get_data(request)
    res = {}
    try:
        name = data["name"] if "name" in data else None
        add_player_to_blacklist(data["steam_id_64"], data["reason"], name)
        audit("Blacklist", request, data)
        failed = False
    except:
        logger.exception("Unable to blacklist player")
        failed = True

    return JsonResponse({
        "result": res,
        "command": "players_history",
        "arguments": data,
        "failed": failed,
    })
Example #5
0
def blacklist_player(request):
    data = _get_data(request)
    res = {}
    try:
        send_to_discord_audit("Blacklist '{}' for '{}'".format(data['steam_id_64'], data['reason']), get_client_ip(request))
        name = data['name'] if 'name' in data else None
        add_player_to_blacklist(data['steam_id_64'], data['reason'], name)
        failed = False
    except:
        logger.exception("Unable to blacklist player")
        failed = True

    return JsonResponse({
        "result": res,
        "command": "players_history",
        "arguments": data,
        "failed": failed
    })
Example #6
0
def auto_ban_if_tks_right_after_connection(rcon: RecordedRcon, log):
    config = get_config()
    config = config.get("BAN_TK_ON_CONNECT")
    if not config or not config.get("enabled"):
        return

    player_name = log["player"]
    player_steam_id = log["steam_id_64_1"]
    player_profile = None
    vips = {}
    try:
        player_profile = get_player_profile(player_steam_id, 0)
    except:
        logger.exception("Unable to get player profile")
    try:
        vips = set(v["steam_id_64"] for v in rcon.get_vip_ids())
    except:
        logger.exception("Unable to get VIPS")

    last_logs = get_recent_logs(end=500,
                                player_search=player_name,
                                exact_player_match=True)
    logger.debug("Checking TK from %s", player_name)
    author = config.get("author_name", "Automation")
    reason = config.get("message", "No reasons provided")
    discord_msg = config.get("discord_webhook_message", "No message provided")
    webhook = config.get("discord_webhook_url")
    max_time_minute = config.get("max_time_after_connect_minutes", 5)
    excluded_weapons = [w.lower() for w in config.get("exclude_weapons", [])]
    ignore_after_kill = config.get("ignore_tk_after_n_kills", 1)
    ignore_after_death = config.get("ignore_tk_after_n_death", 1)
    whitelist_players = config.get("whitelist_players", {})
    tk_tolerance_count = config.get("teamkill_tolerance_count", 1)

    if player_profile:
        if whitelist_players.get("is_vip") and player_steam_id in vips:
            logger.debug("Not checking player because he's VIP")
            return

        if whitelist_players.get("has_at_least_n_sessions") and player_profile[
                "sessions_count"] >= whitelist_players.get(
                    "has_at_least_n_sessions"):
            logger.debug(
                "Not checking player because he has %s sessions",
                player_profile["sessions_count"],
            )
            return

        flags = whitelist_players.get("has_flag", [])
        if not isinstance(flags, list):
            flags = [flags]

        for f in flags:
            if player_has_flag(player_profile, f):
                logger.debug("Not checking player because he has flag %s", f)
                return

    last_action_is_connect = False
    last_connect_time = None
    kill_counter = 0
    death_counter = 0
    tk_counter = 0
    for log in reversed(last_logs["logs"]):
        logger.debug(log)

        if log["action"] == "CONNECTED":
            last_action_is_connect = log
            last_connect_time = log["timestamp_ms"]
            kill_counter = 0
            death_counter = 0
            continue
        if (log["action"] == "TEAM KILL" and log["player"] == player_name
                and last_action_is_connect):
            if excluded_weapons and log["weapon"].lower() in excluded_weapons:
                logger.debug(
                    "Not counting TK as offense due to weapon exclusion")
                continue
            if log["timestamp_ms"] - last_connect_time > max_time_minute * 60 * 1000:
                logger.debug(
                    "Not counting TK as offense due to elapsed time exclusion, last connection time %s, tk time %s",
                    datetime.datetime.fromtimestamp(last_connect_time / 1000),
                    datetime.datetime.fromtimestamp(log["timestamp_ms"]),
                )
                continue

            tk_counter += 1
            if tk_counter > tk_tolerance_count:
                logger.info("Banning player %s for TEAMKILL after connect %s",
                            player_name, log)
                try:
                    rcon.do_perma_ban(
                        player=player_name,
                        reason=reason,
                        by=author,
                    )
                except:
                    logger.exception("Can't perma, trying blacklist")
                    add_player_to_blacklist(player_steam_id, reason, by=author)
                logger.info("Banned player %s for TEAMKILL after connect %s",
                            player_name, log)
                send_to_discord_audit(discord_msg.format(player=player_name),
                                      by=author,
                                      webhookurl=webhook)
        elif is_player_death(player_name, log):
            death_counter += 1
            if death_counter >= ignore_after_death:
                last_action_is_connect = False
        elif is_player_kill(player_name, log):
            kill_counter += 1
            if kill_counter >= ignore_after_kill:
                last_action_is_connect = False