[İSTEK] Plugin’e Ban Sistemi Eklenmesi

Konu

#1
Kod:
#include <amxmodx>
#include <amxmisc>

#define INITIAL_BAN_TIME 30 // dakika cinsinden
#define MAX_BAN_TIME 1440 // 24 saat (dakika cinsinden)
#define REPORT_COOLDOWN 300 // saniye cinsinden (5 dakika)

// Renk tanımlamaları
#define NORMAL  "\x01"
#define RED     "\x04"
#define BLUE    "\x03"

// PLUGIN_TAG değiştirilmiş hali
#define PLUGIN_TAG "^x04[Report News]^x01"
#define SLASH_REPORT_TAG "^x04!t[/ReportMenu]^x01"

// Bilgilendirme mesajı
#define INFORMATIVE_MESSAGE "^x04[Report News]^x01 !tHaksız kullanımların ban sebebi olabileceğini lütfen unutmayın!"

new g_ReportCounts[33][33]; // [reporter][reported]
new g_LastBanTime[33];
new g_LastReportTime[33];
new g_LastReportMessageTime[33]; // Bilgilendirme mesajı için zaman kaydedici

new g_LogFile[128]; // Log dosyası için yeni değişken

public plugin_init() {
    register_plugin("Report News", "1.0", "Your Name");
    register_clcmd("say /reportmenu", "cmd_reportmenu");
    register_clcmd("say_team /reportmenu", "cmd_reportmenu");
    log_report_to_file_init(); // Log dosyasını başlat
}

public cmd_reportmenu(id) {
    new current_time = get_systime();
    new time_left = g_LastReportTime[id] + REPORT_COOLDOWN - current_time;
    new message_time_left = g_LastReportMessageTime[id] + REPORT_COOLDOWN - current_time;

    if (time_left <= 0) {
        // Komutun yazıldığı herkes tarafından görülsün
        new name[32];
        get_user_name(id, name, charsmax(name));
        ColorChat(0, "%s !g%s !yadlı oyuncu !g/reportmenu !ykomutunu kullandı.", SLASH_REPORT_TAG, name);

        // Bilgilendirme mesajını göster
        ColorChat(id, INFORMATIVE_MESSAGE);
        g_LastReportMessageTime[id] = current_time; // Bilgilendirme mesajı için zamanı kaydet
    } else if (message_time_left <= 0) {
        // 300 saniye bekledikten sonra mesajı göster
        new name[32];
        get_user_name(id, name, charsmax(name));
        ColorChat(0, "%s !g%s !yadlı oyuncu !g/reportmenu !ykomutunu kullandı.", SLASH_REPORT_TAG, name);
        ColorChat(id, INFORMATIVE_MESSAGE);
        g_LastReportMessageTime[id] = current_time; // Bilgilendirme mesajı için zamanı kaydet
    } else {
        new minutes = time_left / 60;
        new seconds = time_left % 60;
        ColorChat(id, "%s Şikayet için kalan süre: !g%d dakika %d saniye", PLUGIN_TAG, minutes, seconds);
    }

    if (time_left > 0) {
        return PLUGIN_HANDLED;
    }

    new menu = menu_create("\yQuality | ReportMenu\w", "reportmenu_handler");

    new players[32], pnum;
    get_players(players, pnum, "ch"); // Sadece bağlı olan oyuncuları al

    for (new i = 0; i < pnum; i++) {
        new name[32], authid[32];
        get_user_name(players[i], name, charsmax(name));
        get_user_authid(players[i], authid, charsmax(authid));

        // Oyuncu Spectator takımında değilse ve oyuncu kendisi değilse menüye ekle
        if (get_user_team(players[i]) > 0 && players[i] != id && g_ReportCounts[id][players[i]] == 0) {
            // Tüm takımların (CT/Terörist) isimleri menüde gözükecek
            menu_additem(menu, name, authid);
        }
    }

    menu_setprop(menu, MPROP_EXITNAME, "Çıkış");
    menu_display(id, menu);

    return PLUGIN_HANDLED;
}

public reportmenu_handler(id, menu, item) {
    if (item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    new authid[32], name[32];
    menu_item_getinfo(menu, item, _, authid, charsmax(authid), name, charsmax(name));

    new target = find_player("c", authid);
    if (!target) {
        ColorChat(id, "%s !g%s !yadlı oyuncu bulunamadı.", PLUGIN_TAG, name);
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    // Kendini şikayet etme kontrolü
    if (target == id) {
        ColorChat(id, "%s !yKendinizi şikayet edemezsiniz!", PLUGIN_TAG);
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    // Şikayet sayısını kontrol et
    if (g_ReportCounts[id][target] == 0) {
        g_ReportCounts[id][target] = 1; // Oyuncu bir kez şikayet etti
        g_LastReportTime[id] = get_systime();
        g_LastReportMessageTime[id] = get_systime(); // Şikayet yapıldığında bilgilendirme mesajını göstermek için zamanı ayarla

        new total_reports = 0;
        for (new i = 1; i <= 32; i++) {
            total_reports += g_ReportCounts[i][target];
        }

        new required_reports = get_required_reports();

        // Şikayet eden ve edilenin sohbet ekranında görünmesi
        new reporter_name[32], target_name[32];
        get_user_name(id, reporter_name, charsmax(reporter_name));
        get_user_name(target, target_name, charsmax(target_name));

        // Şikayet edilen kişiye bildirim gönder
        ColorChat(0, "%s !g%s !yadlı oyuncu !t%s !yadlı oyuncuyu şikayet etti. Toplam şikayet: !t%d!y/!g%d", PLUGIN_TAG, reporter_name, target_name, total_reports, required_reports);

        log_report_to_file(g_LogFile, "Reporter: %s, Reported: %s, Total Reports: %d/%d", reporter_name, target_name, total_reports, required_reports);

        if (total_reports >= required_reports) {
            new ban_time = INITIAL_BAN_TIME;
            if (g_LastBanTime[target] > 0) {
                ban_time = min(g_LastBanTime[target] * 2, MAX_BAN_TIME);
            }

            new ban_reason[64];
            formatex(ban_reason, charsmax(ban_reason), "Oyuncular tarafından şikayet edildi (%d/%d şikayet)", total_reports, required_reports);

            server_cmd("banid %d #%s kick", ban_time, authid);
            server_exec();

            g_LastBanTime[target] = ban_time;

            ColorChat(0, "%s !g%s !yadlı oyuncu !t%d dakika !ybanlandı. Sebep: !g%s", PLUGIN_TAG, target_name, ban_time, ban_reason);
            log_report_to_file(g_LogFile, "Banned: %s, Ban Time: %d dakika, Reason: %s", target_name, ban_time, ban_reason);
        } else {
            ColorChat(id, "%s !g%s !yadlı oyuncuyu şikayet ettiniz. Toplam şikayet: !t%d!y/!g%d", PLUGIN_TAG, target_name, total_reports, required_reports);
        }
    } else {
        ColorChat(id, "%s !yBu oyuncuya zaten şikayet ettiniz!", PLUGIN_TAG);
    }

    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

// Gerekli şikayet sayısını hesapla
stock get_required_reports() {
    new players[32], pnum;
    get_players(players, pnum, "ch"); // Sadece bağlı olan oyuncuları al

    if (pnum <= 10) {
        return 4;
    } else if (pnum <= 25) {
        return 7;
    } else {
        return 10;
    }
}

// ColorChat fonksiyonu
stock ColorChat(const id, const input[], any:...) {
    new count = 1, players[32];
    static msg[191];
    vformat(msg, 190, input, 3);

    replace_all(msg, 190, "!g", "^x04"); // Green Color
    replace_all(msg, 190, "!y", "^x01"); // Default Color (Yellow)
    replace_all(msg, 190, "!t", "^x03"); // Team Color (Blue/Red)

    if (id) {
        players[0] = id;
    } else {
        get_players(players, count, "ch");
    }

    for (new i = 0; i < count; i++) {
        if (is_user_connected(players[i])) {
            message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
            write_byte(players[i]);
            write_string(msg);
            message_end();
        }
    }
}

// Log dosyasına yazan fonksiyon
stock log_report_to_file(const file[], const input[], any:...) {
    new data[512];
    vformat(data, 511, input, 3);

    new logFile = fopen(file, "a");
    if (logFile) {
        fprintf(logFile, "%s", data);
        fclose(logFile);
    }
}

// Log dosyası başlatma fonksiyonu
stock log_report_to_file_init() {
    new date[12];
    get_time("%Y-%m-%d", date, charsmax(date)); // Günlük formatı değiştirildi (YYYY-MM-DD)
    formatex(g_LogFile, charsmax(g_LogFile), "addons/amxmodx/logs/%s-ReportLog.txt", date); // Her gün için farklı bir dosya
}

hocalarım şöyle bir plugin tasarladım; pluginin amacı serverde admin yokken hile veya oyunda huzuru bozan kişileri /reportmenu komutuyla şikayet edip oyuncuları belirli bir şikayet sayısına ulaştıktan sonra kademeli olarak banlaması. 

her şey iyi hoş fakat banlama kısmında başarısız oldum örneğin 4 şikayete ulaştığında kişinin banlanması gerekiyor, hatta banlandı mesajı da cıkıyor plugin üzerinden fakat banlanmıyor oyuncu. 

steam id ve ip ban olacak şekilde ban sistemi ekleyebilirseniz çok sevinirim.

bir de log tutuyor kimlerin komutu kullandığına dair ama diyelim map değiştiğinde veya sunucu yeniden başlatıldığında şikayet sayılarının sıfırlanmamasını istiyorum. (4/3) şikayeti var ise gene o şikayet sayısından devam etsin.

teşekkür ederim hayırlı forumlar dilerim.
#2
Konu taşındı
MODEL TASARIMI SİLAH TASARIMI SPREY TASARIMI EKLENTİ İŞLERİ MOD KURULUMU İÇİN DİSCORD:okan5705 veya Ts3:flexekip
#3
Kod:
#include <amxmodx>
#include <amxmisc>
#include <nvault>

#define INITIAL_BAN_TIME 30 // dakika cinsinden
#define MAX_BAN_TIME 1440 // 24 saat (dakika cinsinden)
#define REPORT_COOLDOWN 300 // saniye cinsinden (5 dakika)

// Renk tanımlamaları
#define NORMAL  "\x01"
#define RED     "\x04"
#define BLUE    "\x03"

// PLUGIN_TAG değiştirilmiş hali
#define PLUGIN_TAG "^x04[Report News]^x01"
#define SLASH_REPORT_TAG "^x04!t[/ReportMenu]^x01"

// Bilgilendirme mesajı
#define INFORMATIVE_MESSAGE "^x04[Report News]^x01 !tHaksız kullanımların ban sebebi olabileceğini lütfen unutmayın!"

new g_ReportCounts[33][33]; // [reporter][reported]
new g_LastBanTime[33];
new g_LastReportTime[33];
new g_LastReportMessageTime[33]; // Bilgilendirme mesajı için zaman kaydedici

new g_LogFile[128]; // Log dosyası için yeni değişken

new Vault; //Vault için değişken

public plugin_init() {
    register_plugin("Report News", "1.0", "Your Name");
    register_clcmd("say /reportmenu", "cmd_reportmenu");
    register_clcmd("say_team /reportmenu", "cmd_reportmenu");
    log_report_to_file_init(); // Log dosyasını başlat
}

public plugin_cfg()
{
    Vault = nvault_open("report"); //report nvaultunu açıyoruz

    if(Vault == INVALID_HANDLE) {
        set_fail_state("report: unknown vault.");
    }
}

public plugin_end()
{
    nvault_close(Vault); //plugin kapandığında nvaultu kapatıyoruz
}

public client_putinserver(id)
{
    new authid[MAX_AUTHID_LENGTH];
    get_user_authid(id, authid, charsmax(authid));

    g_ReportCounts[0][id] = nvault_get(Vault, fmt("Reports-%s", authid)); //Kullanıcı giriş yaptığında Report sayısını nvaulttan çektiriyoruz, baştaki kısma 0 girmemin sebebi 0 idsi olmuyor bildiğim kadarıyla, o yüzden boş bir satıra çekiyormuş gibi düşünün.
}

public client_disconnected(id)
{
    new authid[MAX_AUTHID_LENGTH], data[MAX_AUTHID_LENGTH+10];
    get_user_authid(id, authid, charsmax(authid));

        new total_reports = 0;
        for (new i = 0; i <= 32; i++) { // for döngüsünü 0dan başlatıyoruz çünkü g_ReportCounts[0] 0'a kaydettiğimiz reportları çekmeli.
            total_reports += g_ReportCounts[i][id];
        }

    num_to_str(total_reports, data, charsmax(data));
    nvault_pset(Vault, fmt("Reports-%s", authid), data); // for döngüsüyle çektiğimiz reportları nvaulta kaydediyoruz.
}

public cmd_reportmenu(id) {
    new current_time = get_systime();
    new time_left = g_LastReportTime[id] + REPORT_COOLDOWN - current_time;
    new message_time_left = g_LastReportMessageTime[id] + REPORT_COOLDOWN - current_time;

    if (time_left <= 0) {
        // Komutun yazıldığı herkes tarafından görülsün
        new name[32];
        get_user_name(id, name, charsmax(name));
        ColorChat(0, "%s !g%s !yadlı oyuncu !g/reportmenu !ykomutunu kullandı.", SLASH_REPORT_TAG, name);

        // Bilgilendirme mesajını göster
        ColorChat(id, INFORMATIVE_MESSAGE);
        g_LastReportMessageTime[id] = current_time; // Bilgilendirme mesajı için zamanı kaydet
    } else if (message_time_left <= 0) {
        // 300 saniye bekledikten sonra mesajı göster
        new name[32];
        get_user_name(id, name, charsmax(name));
        ColorChat(0, "%s !g%s !yadlı oyuncu !g/reportmenu !ykomutunu kullandı.", SLASH_REPORT_TAG, name);
        ColorChat(id, INFORMATIVE_MESSAGE);
        g_LastReportMessageTime[id] = current_time; // Bilgilendirme mesajı için zamanı kaydet
    } else {
        new minutes = time_left / 60;
        new seconds = time_left % 60;
        ColorChat(id, "%s Şikayet için kalan süre: !g%d dakika %d saniye", PLUGIN_TAG, minutes, seconds);
    }

    if (time_left > 0) {
        return PLUGIN_HANDLED;
    }

    new menu = menu_create("\yQuality | ReportMenu\w", "reportmenu_handler");

    new players[32], pnum;
    get_players(players, pnum, "ch"); // Sadece bağlı olan oyuncuları al

    for (new i = 0; i < pnum; i++) {
        new name[32], authid[32];
        get_user_name(players[i], name, charsmax(name));
        get_user_authid(players[i], authid, charsmax(authid));

        // Oyuncu Spectator takımında değilse ve oyuncu kendisi değilse menüye ekle
        if (get_user_team(players[i]) > 0 && players[i] != id && g_ReportCounts[id][players[i]] == 0) {
            // Tüm takımların (CT/Terörist) isimleri menüde gözükecek
            menu_additem(menu, name, authid);
        }
    }

    menu_setprop(menu, MPROP_EXITNAME, "Çıkış");
    menu_display(id, menu);

    return PLUGIN_HANDLED;
}

public reportmenu_handler(id, menu, item) {
    if (item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    new authid[32], name[32];
    menu_item_getinfo(menu, item, _, authid, charsmax(authid), name, charsmax(name));

    new target = find_player("c", authid);
    if (!target) {
        ColorChat(id, "%s !g%s !yadlı oyuncu bulunamadı.", PLUGIN_TAG, name);
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    // Kendini şikayet etme kontrolü
    if (target == id) {
        ColorChat(id, "%s !yKendinizi şikayet edemezsiniz!", PLUGIN_TAG);
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    // Şikayet sayısını kontrol et
    if (g_ReportCounts[id][target] == 0) {
        g_ReportCounts[id][target] = 1; // Oyuncu bir kez şikayet etti
        g_LastReportTime[id] = get_systime();
        g_LastReportMessageTime[id] = get_systime(); // Şikayet yapıldığında bilgilendirme mesajını göstermek için zamanı ayarla

        new total_reports = 0;
        for (new i = 0; i <= 32; i++) {
            total_reports += g_ReportCounts[i][target];
        }

        new required_reports = get_required_reports();

        // Şikayet eden ve edilenin sohbet ekranında görünmesi
        new reporter_name[32], target_name[32];
        get_user_name(id, reporter_name, charsmax(reporter_name));
        get_user_name(target, target_name, charsmax(target_name));

        // Şikayet edilen kişiye bildirim gönder
        ColorChat(0, "%s !g%s !yadlı oyuncu !t%s !yadlı oyuncuyu şikayet etti. Toplam şikayet: !t%d!y/!g%d", PLUGIN_TAG, reporter_name, target_name, total_reports, required_reports);

        log_report_to_file(g_LogFile, "Reporter: %s, Reported: %s, Total Reports: %d/%d", reporter_name, target_name, total_reports, required_reports);

        if (total_reports >= required_reports) {
            new ban_time = INITIAL_BAN_TIME;
            if (g_LastBanTime[target] > 0) {
                ban_time = min(g_LastBanTime[target] * 2, MAX_BAN_TIME);
            }

            new ban_reason[64];
            formatex(ban_reason, charsmax(ban_reason), "Oyuncular tarafından şikayet edildi (%d/%d şikayet)", total_reports, required_reports);

            server_cmd("banid %d %s kick", ban_time, authid);
            server_exec();

            g_LastBanTime[target] = ban_time;

            ColorChat(0, "%s !g%s !yadlı oyuncu !t%d dakika !ybanlandı. Sebep: !g%s", PLUGIN_TAG, target_name, ban_time, ban_reason);
            log_report_to_file(g_LogFile, "Banned: %s, Ban Time: %d dakika, Reason: %s", target_name, ban_time, ban_reason);
        } else {
            ColorChat(id, "%s !g%s !yadlı oyuncuyu şikayet ettiniz. Toplam şikayet: !t%d!y/!g%d", PLUGIN_TAG, target_name, total_reports, required_reports);
        }
    } else {
        ColorChat(id, "%s !yBu oyuncuya zaten şikayet ettiniz!", PLUGIN_TAG);
    }

    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

// Gerekli şikayet sayısını hesapla
stock get_required_reports() {
    new players[32], pnum;
    get_players(players, pnum, "ch");

    if (pnum <= 10) {
        return 4;
    } else if (pnum <= 25) {
        return 7;
    } else {
        return 10;
    }
}

// ColorChat fonksiyonu
stock ColorChat(const id, const input[], any:...) {
    new count = 1, players[32];
    static msg[191];
    vformat(msg, 190, input, 3);

    replace_all(msg, 190, "!g", "^x04"); // Green Color
    replace_all(msg, 190, "!y", "^x01"); // Default Color (Yellow)
    replace_all(msg, 190, "!t", "^x03"); // Team Color (Blue/Red)

    if (id) {
        players[0] = id;
    } else {
        get_players(players, count, "ch");
    }

    for (new i = 0; i < count; i++) {
        if (is_user_connected(players[i])) {
            message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
            write_byte(players[i]);
            write_string(msg);
            message_end();
        }
    }
}

// Log dosyasına yazan fonksiyon
stock log_report_to_file(const file[], const input[], any:...) {
    new data[512];
    vformat(data, 511, input, 3);

    new logFile = fopen(file, "a");
    if (logFile) {
        fprintf(logFile, "%s", data);
        fclose(logFile);
    }
}

stock log_report_to_file_init() {
    new date[12];
    get_time("%Y-%m-%d", date, charsmax(date)); // Günlük formatı değiştirildi (YYYY-MM-DD)
    formatex(g_LogFile, charsmax(g_LogFile), "addons/amxmodx/logs/%s-ReportLog.txt", date); // Her gün için farklı bir dosya
}


İp ban eklemek için de şunu deneyebilirsiniz,
Kod:
new ip[40];
get_user_ip (id, ip, charsmax(ip), 1);
server_cmd("amx_addban ^"%s^"", ip);

Ücretli Eklenti İşlemleri İçin Discord: egopatient, Instagram: zemheri.asilkan
Son Düzenleme: 25-10-2024, 00:52, Düzenleyen: Maravilha.
#4
@c4nerylmz konunuz cozulduyse bildiriniz.
MODEL TASARIMI SİLAH TASARIMI SPREY TASARIMI EKLENTİ İŞLERİ MOD KURULUMU İÇİN DİSCORD:okan5705 veya Ts3:flexekip
#5
(25-10-2024, 00:44)Maravilha Adlı Kullanıcıdan Alıntı:
Kod:
#include <amxmodx>
#include <amxmisc>
#include <nvault>

#define INITIAL_BAN_TIME 30 // dakika cinsinden
#define MAX_BAN_TIME 1440 // 24 saat (dakika cinsinden)
#define REPORT_COOLDOWN 300 // saniye cinsinden (5 dakika)

// Renk tanımlamaları
#define NORMAL  "\x01"
#define RED     "\x04"
#define BLUE    "\x03"

// PLUGIN_TAG değiştirilmiş hali
#define PLUGIN_TAG "^x04[Report News]^x01"
#define SLASH_REPORT_TAG "^x04!t[/ReportMenu]^x01"

// Bilgilendirme mesajı
#define INFORMATIVE_MESSAGE "^x04[Report News]^x01 !tHaksız kullanımların ban sebebi olabileceğini lütfen unutmayın!"

new g_ReportCounts[33][33]; // [reporter][reported]
new g_LastBanTime[33];
new g_LastReportTime[33];
new g_LastReportMessageTime[33]; // Bilgilendirme mesajı için zaman kaydedici

new g_LogFile[128]; // Log dosyası için yeni değişken

new Vault; //Vault için değişken

public plugin_init() {
    register_plugin("Report News", "1.0", "Your Name");
    register_clcmd("say /reportmenu", "cmd_reportmenu");
    register_clcmd("say_team /reportmenu", "cmd_reportmenu");
    log_report_to_file_init(); // Log dosyasını başlat
}

public plugin_cfg()
{
    Vault = nvault_open("report"); //report nvaultunu açıyoruz

    if(Vault == INVALID_HANDLE) {
        set_fail_state("report: unknown vault.");
    }
}

public plugin_end()
{
    nvault_close(Vault); //plugin kapandığında nvaultu kapatıyoruz
}

public client_putinserver(id)
{
    new authid[MAX_AUTHID_LENGTH];
    get_user_authid(id, authid, charsmax(authid));

    g_ReportCounts[0][id] = nvault_get(Vault, fmt("Reports-%s", authid)); //Kullanıcı giriş yaptığında Report sayısını nvaulttan çektiriyoruz, baştaki kısma 0 girmemin sebebi 0 idsi olmuyor bildiğim kadarıyla, o yüzden boş bir satıra çekiyormuş gibi düşünün.
}

public client_disconnected(id)
{
    new authid[MAX_AUTHID_LENGTH], data[MAX_AUTHID_LENGTH+10];
    get_user_authid(id, authid, charsmax(authid));

        new total_reports = 0;
        for (new i = 0; i <= 32; i++) { // for döngüsünü 0dan başlatıyoruz çünkü g_ReportCounts[0] 0'a kaydettiğimiz reportları çekmeli.
            total_reports += g_ReportCounts[i][id];
        }

    num_to_str(total_reports, data, charsmax(data));
    nvault_pset(Vault, fmt("Reports-%s", authid), data); // for döngüsüyle çektiğimiz reportları nvaulta kaydediyoruz.
}

public cmd_reportmenu(id) {
    new current_time = get_systime();
    new time_left = g_LastReportTime[id] + REPORT_COOLDOWN - current_time;
    new message_time_left = g_LastReportMessageTime[id] + REPORT_COOLDOWN - current_time;

    if (time_left <= 0) {
        // Komutun yazıldığı herkes tarafından görülsün
        new name[32];
        get_user_name(id, name, charsmax(name));
        ColorChat(0, "%s !g%s !yadlı oyuncu !g/reportmenu !ykomutunu kullandı.", SLASH_REPORT_TAG, name);

        // Bilgilendirme mesajını göster
        ColorChat(id, INFORMATIVE_MESSAGE);
        g_LastReportMessageTime[id] = current_time; // Bilgilendirme mesajı için zamanı kaydet
    } else if (message_time_left <= 0) {
        // 300 saniye bekledikten sonra mesajı göster
        new name[32];
        get_user_name(id, name, charsmax(name));
        ColorChat(0, "%s !g%s !yadlı oyuncu !g/reportmenu !ykomutunu kullandı.", SLASH_REPORT_TAG, name);
        ColorChat(id, INFORMATIVE_MESSAGE);
        g_LastReportMessageTime[id] = current_time; // Bilgilendirme mesajı için zamanı kaydet
    } else {
        new minutes = time_left / 60;
        new seconds = time_left % 60;
        ColorChat(id, "%s Şikayet için kalan süre: !g%d dakika %d saniye", PLUGIN_TAG, minutes, seconds);
    }

    if (time_left > 0) {
        return PLUGIN_HANDLED;
    }

    new menu = menu_create("\yQuality | ReportMenu\w", "reportmenu_handler");

    new players[32], pnum;
    get_players(players, pnum, "ch"); // Sadece bağlı olan oyuncuları al

    for (new i = 0; i < pnum; i++) {
        new name[32], authid[32];
        get_user_name(players[i], name, charsmax(name));
        get_user_authid(players[i], authid, charsmax(authid));

        // Oyuncu Spectator takımında değilse ve oyuncu kendisi değilse menüye ekle
        if (get_user_team(players[i]) > 0 && players[i] != id && g_ReportCounts[id][players[i]] == 0) {
            // Tüm takımların (CT/Terörist) isimleri menüde gözükecek
            menu_additem(menu, name, authid);
        }
    }

    menu_setprop(menu, MPROP_EXITNAME, "Çıkış");
    menu_display(id, menu);

    return PLUGIN_HANDLED;
}

public reportmenu_handler(id, menu, item) {
    if (item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    new authid[32], name[32];
    menu_item_getinfo(menu, item, _, authid, charsmax(authid), name, charsmax(name));

    new target = find_player("c", authid);
    if (!target) {
        ColorChat(id, "%s !g%s !yadlı oyuncu bulunamadı.", PLUGIN_TAG, name);
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    // Kendini şikayet etme kontrolü
    if (target == id) {
        ColorChat(id, "%s !yKendinizi şikayet edemezsiniz!", PLUGIN_TAG);
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    // Şikayet sayısını kontrol et
    if (g_ReportCounts[id][target] == 0) {
        g_ReportCounts[id][target] = 1; // Oyuncu bir kez şikayet etti
        g_LastReportTime[id] = get_systime();
        g_LastReportMessageTime[id] = get_systime(); // Şikayet yapıldığında bilgilendirme mesajını göstermek için zamanı ayarla

        new total_reports = 0;
        for (new i = 0; i <= 32; i++) {
            total_reports += g_ReportCounts[i][target];
        }

        new required_reports = get_required_reports();

        // Şikayet eden ve edilenin sohbet ekranında görünmesi
        new reporter_name[32], target_name[32];
        get_user_name(id, reporter_name, charsmax(reporter_name));
        get_user_name(target, target_name, charsmax(target_name));

        // Şikayet edilen kişiye bildirim gönder
        ColorChat(0, "%s !g%s !yadlı oyuncu !t%s !yadlı oyuncuyu şikayet etti. Toplam şikayet: !t%d!y/!g%d", PLUGIN_TAG, reporter_name, target_name, total_reports, required_reports);

        log_report_to_file(g_LogFile, "Reporter: %s, Reported: %s, Total Reports: %d/%d", reporter_name, target_name, total_reports, required_reports);

        if (total_reports >= required_reports) {
            new ban_time = INITIAL_BAN_TIME;
            if (g_LastBanTime[target] > 0) {
                ban_time = min(g_LastBanTime[target] * 2, MAX_BAN_TIME);
            }

            new ban_reason[64];
            formatex(ban_reason, charsmax(ban_reason), "Oyuncular tarafından şikayet edildi (%d/%d şikayet)", total_reports, required_reports);

            server_cmd("banid %d %s kick", ban_time, authid);
            server_exec();

            g_LastBanTime[target] = ban_time;

            ColorChat(0, "%s !g%s !yadlı oyuncu !t%d dakika !ybanlandı. Sebep: !g%s", PLUGIN_TAG, target_name, ban_time, ban_reason);
            log_report_to_file(g_LogFile, "Banned: %s, Ban Time: %d dakika, Reason: %s", target_name, ban_time, ban_reason);
        } else {
            ColorChat(id, "%s !g%s !yadlı oyuncuyu şikayet ettiniz. Toplam şikayet: !t%d!y/!g%d", PLUGIN_TAG, target_name, total_reports, required_reports);
        }
    } else {
        ColorChat(id, "%s !yBu oyuncuya zaten şikayet ettiniz!", PLUGIN_TAG);
    }

    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

// Gerekli şikayet sayısını hesapla
stock get_required_reports() {
    new players[32], pnum;
    get_players(players, pnum, "ch");

    if (pnum <= 10) {
        return 4;
    } else if (pnum <= 25) {
        return 7;
    } else {
        return 10;
    }
}

// ColorChat fonksiyonu
stock ColorChat(const id, const input[], any:...) {
    new count = 1, players[32];
    static msg[191];
    vformat(msg, 190, input, 3);

    replace_all(msg, 190, "!g", "^x04"); // Green Color
    replace_all(msg, 190, "!y", "^x01"); // Default Color (Yellow)
    replace_all(msg, 190, "!t", "^x03"); // Team Color (Blue/Red)

    if (id) {
        players[0] = id;
    } else {
        get_players(players, count, "ch");
    }

    for (new i = 0; i < count; i++) {
        if (is_user_connected(players[i])) {
            message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
            write_byte(players[i]);
            write_string(msg);
            message_end();
        }
    }
}

// Log dosyasına yazan fonksiyon
stock log_report_to_file(const file[], const input[], any:...) {
    new data[512];
    vformat(data, 511, input, 3);

    new logFile = fopen(file, "a");
    if (logFile) {
        fprintf(logFile, "%s", data);
        fclose(logFile);
    }
}

stock log_report_to_file_init() {
    new date[12];
    get_time("%Y-%m-%d", date, charsmax(date)); // Günlük formatı değiştirildi (YYYY-MM-DD)
    formatex(g_LogFile, charsmax(g_LogFile), "addons/amxmodx/logs/%s-ReportLog.txt", date); // Her gün için farklı bir dosya
}


İp ban eklemek için de şunu deneyebilirsiniz,
Kod:
new ip[40];
get_user_ip (id, ip, charsmax(ip), 1);
server_cmd("amx_addban ^"%s^"", ip);

Derleme sırasında hata alıyorum hocam.
#6
hata nedir
CS 1.6 Eklenti , Model , Sprey Yapımı için Discord : emircw
#7
(26-10-2024, 16:44)EmirCW Adlı Kullanıcıdan Alıntı: hata nedir
reportmenu.sma(64) : warning 217: loose indentation
reportmenu.sma(69) : warning 217: loose indentation

ban'ı da ekleyınce cogalıyor hatalar bu sadece üst kısımdakı kod.
#8
warning 217: loose indentation bir hata mesajı değil uyarı mesajıdır, sorunsuz çalışacaktır.
Ücretli Eklenti İşlemleri İçin Discord: egopatient, Instagram: zemheri.asilkan
#9
(26-10-2024, 18:11)Maravilha Adlı Kullanıcıdan Alıntı: warning 217: loose indentation bir hata mesajı değil uyarı mesajıdır, sorunsuz çalışacaktır.
hocam şimdi şöyle bir sorun oldu mesela emre kişisi ahmet'i şikayet etti (2/4) şikayet oldu ama başka birisi alakasız birini şikayet edince o şikayet üzerinden devam ediyor (3/4 oluyor) herkesın sıkayet sayısı aynı yani farklı olması lazım.

birde 30 dakikadan sonra bir daha şikayet üzerine banlanırsa max 1440 dakika yani 24 saat banlanmasını ıstıyordum.
Son Düzenleme: 26-10-2024, 22:26, Düzenleyen: c4nerylmz.
#10
@c4nerylmz Konunuz çözüldüyse bildirmeyi unutmayıniz.
Çözülmediyse her 24 saatte bir konuyu güncelleye bilirsiniz.
CS 1.6 Eklenti , Model , Sprey Yapımı için Discord : emircw
Son Düzenleme: 29-10-2024, 19:39, Düzenleyen: EmirCW.

Bir hesap oluşturun veya yorum yapmak için giriş yapın

Yorum yapmak için üye olmanız gerekiyor

ya da

Benzer Konular

3
Yorum
298
Okunma
21-11-2024, 20:55
3
Yorum
383
Okunma
21-11-2024, 16:23
3
Yorum
309
Okunma
20-11-2024, 23:45
7
Yorum
449
Okunma
18-11-2024, 13:34
7
Yorum
556
Okunma
12-11-2024, 01:37
2
Yorum
594
Okunma
11-11-2024, 14:59
Task
Kayıt Ol
Discord Adresimize Katılın