Syncope.T-*
728x90

우선 우리가 채팅상으로 쓰는 욕들을 나열해 봅시다

욕필터에 않걸러지게 쓰는 욕들도 적어봅니다

예 ) 시발, 시1발 시 발, 씼 빨, ㅅ ㅣ  ㅂ ㅏ 등등.

우리가 코딩으로 처리할 수 있는건 시발 과 ㅅ ㅣ ㅂ ㅏ 정도 입니다.
씼빨 같은 욕에 들어가는 단어는 아니지만 발음과 뉘앙스가 욕으로 해석되는건 처리하지 못합니다.
시123123발 << 이런건 어떻게 처리하냐고요? 이제부터 보여드리겠습니다 어디에서도 쓰이지 않았던 방법입니다
제가 고안 해 냈습니다.


우선 기본적인 욕 필터에 관한 자료입니다

출처 : http://forums.alliedmods.net/showthread.php?p=499584

badword : 욕 단어들을 정리하여 넣습니다
replacements : 욕을 대체할 말을 넣습니다.


우선 sp 파일을 열어보시면 이러한 구조가 눈에 띄입니다.

[CODE]
public Action:Command_Say(client,args){
 if(client != 0){
  decl String:speech[191];
  decl String:clientname[64];
  GetClientName(client,clientname,64);
  GetCmdArgString(speech,sizeof(speech));
  
  
  new startidx = 0;
  if (speech[0] == '"'){
   startidx = 1;
   /* Strip the ending quote, if there is one */
   new len = strlen(speech);
   if (speech[len-1] == '"'){
     speech[len-1] = '\0';
   }
  }
  
  decl String:originalstring[191];
  strcopy(originalstring, sizeof(speech), speech[startidx]);
  string_cleaner(speech[startidx], sizeof(speech) - startidx);
  
  new i = 0;
  new found;
  while (i < g_swearNum){
   if (StrContains(speech[startidx], g_swearwords[i], false) != -1 ){
    new String:replacement[32];
    GetConVarString(cvarswearreplace, replacement, 32);
    ReplaceString(speech, strlen(speech), g_swearwords[i], replacement);
    found = true;
   }
   i++;
  }
  if (found){
   LogMessage("[Swear Replacement] %s : %s",clientname, originalstring);
   if (GetConVarInt(cvarswearmode) == 1){
    new random_replace = GetRandomInt(0, g_replaceNum);
    strcopy(speech[startidx], sizeof(g_replaceLines[]), g_replaceLines[random_replace]);
    PrintToChatAll("%s: %s", clientname, speech[startidx]);
    PrintToChat(client, "Please do not use foul language here!");
    return Plugin_Handled;
   }else if (GetConVarInt(cvarswearmode) == 2){
    PrintToChatAll("%s: %s", clientname, speech[startidx]);
    PrintToChat(client, "Please do not use foul language here!");
    return Plugin_Handled;
   }else if (GetConVarInt(cvarswearmode) == 3){
    PrintToChat(client, "Please do not use foul language here!");
    return Plugin_Handled;
   }
  }
  
 }
 return Plugin_Continue;
}
[CODE/]


위 코드의 내용과 처리과정은 이러합니다.
채팅으로 받은 문자열을 깨끗하게 다듬습니다. 맨 끝문장에 남아있는 "" 와 같은 잡 요소들을 제거한다는 말입니다.
string_cleaner 라는 함수를 통해 |< 와 같이 상형문자로 K 와 비슷한 문자열 같이 지는 것들을 K로 치환하게 해 줍니다.
이것또한 다듬는 과정입니다.
그 후 이 채팅 문장에 badword에 포함된 단어가 있으면 경고 메시지가 날라옵니다.

자 이제 다듬는 과정을 하나 더 추가해야 할 것입니다.
' 시1발 ' 을 다듬는 과정이지요. 단어와 단어사이에 숫자가 들어간 건 빼 줘 봅시다.
이걸 어떻게 체크하고 확인해야할까요? 바로 그 함수가 있습니다.

if (IsCharNumeric(char) == true) << 이게 바로 숫자를 체크하는 함수입니다.
본 char 문자열에 숫자가 들어가있으면 true라는 값을 반환하는 함수입니다.
그럼 이 함수에다가 각각 배열로정리된 문자열에 대입시키면 되겠지요.

new i, len = strlen(speech);
 for(i = 0; i < len; i++)
 {
  if(IsCharNumeric(speech[ㅑ]) == true)
  {
   speech[i] = " ";
  }
 }

StripQuotes(speech[startidx]);
TrimString(speech[startidx]);
if (StrContains(speech[startidx], g_swearwords[i], false) != -1 )
{
 // replace 시작.
 // 경고메시지 추가. 예) 이 단어는 채팅에 적합하지 않습니다.
}

그럼 완료 !
profile

Syncope.T-*

@Syncope

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...