diff --git a/src/moderation/llmModerationClient.ts b/src/moderation/llmModerationClient.ts index 4d24413..7c80e66 100644 --- a/src/moderation/llmModerationClient.ts +++ b/src/moderation/llmModerationClient.ts @@ -667,12 +667,12 @@ Ini adalah server Discord komunitas Indonesia. Kamu harus memahami: - Bahasa gaul/slang Indonesia: "anjay", "wkwk", "gws", "gaskeun", "santuy", "njir", "baka", "woy", "woi", "hadeh", dll. - Singkatan umum: "gw", "lo", "emg", "kyk", "tdk", "krn", "jgn", dll. - Konteks budaya lokal: SARA (Suku, Agama, Ras, Antar-golongan), hoaks, ujaran kebencian berbasis konteks Indonesia. -- Makian/kata kasar umum (seperti "anjing", "asu", "bangsat") BUKAN pelanggaran SARA. SARA khusus untuk diskriminasi/hinaan terhadap Suku, Agama, Ras, dan Antargolongan. +- Makian/kata kasar umum (seperti "anjing", "asu", "bangsat") BUKAN pelanggaran SARA. SARA khusus untuk diskriminasi/hinaan terhadap Suku, Agama, Ras, dan Antargolongan. NAMUN makian/kata kasar TETAP bisa di-flag sebagai "harassment" atau "vulgar_language" sesuai konteks (misalnya jika ditujukan ke orang lain atau dalam tone agresif). Jangan flag sebagai SARA, tapi flag sesuai kategori yang tepat. - Kata "asus" adalah merk teknologi, jangan pernah dianggap sebagai makian "asu". - Perbedaan antara humor/banter biasa vs konten yang benar-benar melanggar. - "woy"/"woi" adalah sapaan/interjeksi informal Indonesia dan tidak boleh dianggap SARA, hate speech, atau harassment tanpa target hinaan/ancaman jelas. - Discord custom emoji seperti <:hadeh:123> atau [emoji:hadeh] adalah ekspresi/emoji, bukan pelanggaran teks. Gunakan sebagai konteks ekspresi saja. -- Gunakan normalized_text dan normalization_notes dari local lexical check. Jika notes menyatakan no Indonesian badword detected dan hanya ada slang/emoji aman, jangan flag karena kata slang itu saja. +- Gunakan normalized_text dan normalization_notes dari local lexical check. Jika notes hanya berisi slang/emoji aman (woy, woi, hadeh, dll) dan "no Indonesian badword detected", jangan flag karena kata slang itu saja. NAMUN jika notes menyatakan "Indonesian badword detected" (misalnya "anjing", "bangsat", "asu"), itu EVIDENCE profanitas — gunakan sebagai konteks untuk menilai apakah perlu flag sebagai harassment/vulgar_language, bukan sebagai alasan untuk mengabaikan. - Kalimat ambigu dalam bahasa Indonesia harus diberi keputusan final: "clean" bila bukti pelanggaran tidak jelas, "flagged" bila bukti pelanggaran jelas. - Jangan pernah menulis analisis yang meminta admin/moderator memeriksa ulang, menyebut kurang konteks, atau tidak bisa menentukan. Berikan kesimpulan langsung berdasarkan teks + media + konteks yang tersedia. - Gambar, sticker, embed, dan preview link adalah evidence utama yang setara dengan teks, bukan sekadar URL teks. @@ -704,7 +704,7 @@ Larangan output analysis: - Jangan tulis "kurang konteks", "perlu dicek admin", "perlu moderator periksa", "tidak bisa menentukan", atau frasa deferral sejenis. - Jika evidence tidak cukup kuat untuk pelanggaran, status harus "clean" dan analysis menjelaskan alasan langsung. -Flag yang valid: spam, hate_speech, sara, hoaks, harassment, sexual_content, violence, self_harm, doxxing, scam, misinformation, nsfw_image, gore_image, illegal_content +Flag yang valid: spam, hate_speech, sara, hoaks, harassment, vulgar_language, sexual_content, violence, self_harm, doxxing, scam, misinformation, nsfw_image, gore_image, illegal_content CRITICAL: "message_id" HARUS berupa STRING (dibungkus tanda kutip ganda). Jangan perlakukan ID sebagai angka — ini snowflake Discord yang bisa kehilangan presisi jika diparse sebagai number.`; diff --git a/src/moderation/resources/indonesianSlangLexicon.ts b/src/moderation/resources/indonesianSlangLexicon.ts index aa9f3ba..51e211b 100644 --- a/src/moderation/resources/indonesianSlangLexicon.ts +++ b/src/moderation/resources/indonesianSlangLexicon.ts @@ -17,6 +17,46 @@ export const INDONESIAN_SLANG_LEXICON: Record = { tdk: { normalized: "tidak", note: "common abbreviation" }, krn: { normalized: "karena", note: "common abbreviation" }, jgn: { normalized: "jangan", note: "common abbreviation" }, + // Indonesian swear-word slang variants — normalize to standard form so the + // badwords detector can recognise them. These are NOT safeByDefault because + // they map to genuine Indonesian profanity. + ajg: { normalized: "anjing", note: "slang for 'anjing' (profanity)" }, + anjg: { normalized: "anjing", note: "slang for 'anjing' (profanity)" }, + njing: { normalized: "anjing", note: "slang for 'anjing' (profanity)" }, + anjir: { normalized: "anjing", note: "slang for 'anjing' (profanity)" }, + njir: { normalized: "anjing", note: "slang for 'anjing' (profanity)" }, + bgsd: { normalized: "bangsat", note: "slang for 'bangsat' (profanity)" }, + bgst: { normalized: "bangsat", note: "slang for 'bangsat' (profanity)" }, + bngst: { normalized: "bangsat", note: "slang for 'bangsat' (profanity)" }, + brngsk: { normalized: "brengsek", note: "slang for 'brengsek' (profanity)" }, + bjngn: { normalized: "bajingan", note: "slang for 'bajingan' (profanity)" }, + bjgn: { normalized: "bajingan", note: "slang for 'bajingan' (profanity)" }, + kntl: { normalized: "kontol", note: "slang for 'kontol' (profanity)" }, + knt: { normalized: "kontol", note: "slang for 'kontol' (profanity)" }, + kontl: { normalized: "kontol", note: "slang for 'kontol' (profanity)" }, + mmk: { normalized: "memek", note: "slang for 'memek' (profanity)" }, + memk: { normalized: "memek", note: "slang for 'memek' (profanity)" }, + tae: { normalized: "tai", note: "slang for 'tai' (profanity)" }, + ty: { normalized: "tai", note: "slang for 'tai' (profanity)" }, + gblk: { normalized: "goblok", note: "slang for 'goblok' (profanity)" }, + goblog: { normalized: "goblok", note: "slang for 'goblok' (profanity)" }, + tlol: { normalized: "tolol", note: "slang for 'tolol' (profanity)" }, + bgo: { normalized: "bego", note: "slang for 'bego' (profanity)" }, + slan: { normalized: "sialan", note: "slang for 'sialan' (profanity)" }, + sln: { normalized: "sialan", note: "slang for 'sialan' (profanity)" }, + jncuk: { normalized: "jancuk", note: "Javanese slang for 'jancuk' (profanity)" }, + jcuk: { normalized: "jancuk", note: "Javanese slang for 'jancuk' (profanity)" }, + kmprt: { normalized: "kampret", note: "slang for 'kampret' (profanity)" }, + ppk: { normalized: "pepek", note: "slang for 'pepek' (profanity)" }, + jmbt: { normalized: "jembut", note: "slang for 'jembut' (profanity)" }, + ngntt: { normalized: "ngentot", note: "slang for 'ngentot' (profanity)" }, + ngnt: { normalized: "ngentot", note: "slang for 'ngentot' (profanity)" }, + ngw: { normalized: "ngewe", note: "slang for 'ngewe' (profanity)" }, + cli: { normalized: "coli", note: "slang for 'coli' (profanity)" }, + clka: { normalized: "celaka", note: "slang for 'celaka' (profanity)" }, + lknt: { normalized: "laknat", note: "slang for 'laknat' (profanity)" }, + bngsat: { normalized: "bangsat", note: "slang for 'bangsat' (profanity)" }, + bgsat: { normalized: "bangsat", note: "slang for 'bangsat' (profanity)" }, woy: { normalized: "woy", note: "casual Indonesian interjection/greeting; not SARA/hate/harassment by default",