Bu modül sayesinde belirlediğiniz kanallara giren veya nick değiştiren kullanıcıların nickleri otomatik olarak kontrol edilecek ve uygunsuz içerik tespit edilirse belirlediğimiz kanallardan çıkartılıp #Badnick kanalına yönlendirecek, ayrıca #Log kanalına yapılan işlem bildirilecektir.
dizisini kontrol edilecek kanallarla güncelleyin.
sabitlerini kendi kanal isimlerinizle değiştirin.
Kod: Kodu kopyalamak için üzerine çift tıklayın!
#include "unrealircd.h"
#define MODULE_NAME "badnick"
#define MODULE_VERSION "1.0"
#define BADWORDS_CONFIG_FILE "conf/badwords.conf"
#define QUARANTINE_CHANNEL "#Badnick"
#define LOG_CHANNEL "#Log"
ModuleHeader MOD_HEADER = {
MODULE_NAME,
MODULE_VERSION,
"Badnick Kontrol",
"fatal",
"unrealircd-6",
};
// Kötü kelimeler listesi
char **badwords = NULL;
int badwords_count = 0;
// Yapılandırma fonksiyonları
int badnick_configtest(ConfigFile *cf, ConfigEntry *ce, int type, int *errs);
int badnick_configposttest(int *errs);
int badnick_configrun(ConfigFile *cf, ConfigEntry *ce, int type);
// Olay dinleyicileri
int badnick_user_join(Client *client, Channel *channel, char *key, char *parv[]);
int badnick_user_nick(Client *client, const char *newnick);
MOD_INIT() {
// Kötü kelimeleri yükle
load_badwords();
// Hook'ları kaydet
HookAdd(modinfo->handle, HOOKTYPE_LOCAL_JOIN, 0, badnick_user_join);
HookAdd(modinfo->handle, HOOKTYPE_LOCAL_NICKCHANGE, 0, badnick_user_nick);
return MOD_SUCCESS;
}
MOD_LOAD() {
return MOD_SUCCESS;
}
MOD_UNLOAD() {
// Belleği temizle
if (badwords) {
for (int i = 0; i < badwords_count; i++)
free(badwords[i]);
free(badwords);
}
return MOD_SUCCESS;
}
void load_badwords() {
FILE *file = fopen(BADWORDS_CONFIG_FILE, "r");
if (!file) {
config_error("Badwords dosyasi acilamadi: %s", BADWORDS_CONFIG_FILE);
return;
}
char line[256];
while (fgets(line, sizeof(line), file)) {
// Yorum satırlarını ve boş satırları atla
if (line[0] == '#' || line[0] == '\n')
continue;
// Satır sonundaki newline karakterini kaldır
line[strcspn(line, "\n")] = 0;
// Bellek ayır ve listeye ekle
badwords = realloc(badwords, (badwords_count + 1) * sizeof(char*));
badwords[badwords_count] = strdup(line);
badwords_count++;
}
fclose(file);
}
int contains_badword(const char *text) {
char ltext[256];
strlcpy(ltext, text, sizeof(ltext));
strtolower(ltext);
for (int i = 0; i < badwords_count; i++) {
if (strstr(ltext, badwords[i])) {
return 1;
}
}
return 0;
}
int badnick_user_join(Client *client, Channel *channel, char *key, char *parv[]) {
// Kanal kontrolü (sadece belirli kanallarda çalışsın)
const char *monitored_channels[] = {"#sohbet", "#radyo", NULL};
int is_monitored = 0;
for (int i = 0; monitored_channels[i]; i++) {
if (!strcasecmp(channel->name, monitored_channels[i])) {
is_monitored = 1;
break;
}
}
if (!is_monitored)
return 0;
// Nick kontrolü
if (contains_badword(client->name)) {
// Kullanıcıyı kanaldan çıkar
sendto_channel(NULL, NULL, NULL, channel->name, "KICK %s %s :Uygunsuz nick kullanimi", channel->name, client->name);
// Karantina kanalına ekle
sendto_one(client, NULL, ":%s JOIN %s", client->name, QUARANTINE_CHANNEL);
sendto_server(NULL, 0, 0, NULL, ":%s JOIN %s", client->name, QUARANTINE_CHANNEL);
// Log kanalına bildir
sendto_channel(NULL, NULL, NULL, LOG_CHANNEL, "NOTICE %s :Uygunsuz nick tespit edildi: %s (%s) -> %s",
LOG_CHANNEL, client->name, client->user->realhost, QUARANTINE_CHANNEL);
return 0;
}
return 0;
}
int badnick_user_nick(Client *client, const char *newnick) {
if (contains_badword(newnick)) {
// Nick değişimini engelle
sendnotice(client, "Bu nick uygun degil. Lutfen baska bir nick secin.");
return HOOK_DENY;
}
return 0;
}