customization-guide-chat-filter
Last updated on July 14, 2026
注釈:本資料はAI技術を用いて翻訳されています。
Overview
AccelByte Gaming Services (AGS)のチャットフィルターは、Extendを使ってカスタマイズできます。このガイドでは、チャットメッセージを受け取り、特定の単語をフィルタリングして返すカスタムチャットフィルターの作成方法を、カスタマイズのコントラクトとサンプルコードを用いて説明します。この処理には、以下に示すコントラクト内のFilterBulk関数を使用します。
service FilterService {
...
rpc FilterBulk(ChatMessageBulk) returns (MessageBatchResult);
}
FilterBulk
- Go
- Python
FilterBulk関数は、プレイヤーからのチャットがある際に呼び出されます。この関数の1回の呼び出しには、複数のチャットメッセージが含まれる場合があります。この例では、受信したすべてのチャットメッセージをループ処理し、IsProfane(...)が特定の単語を検出した場合、Censor(...)でそれを検閲し、結果を返します。
コード例は以下のとおりです。
func (s FilterServiceServer) FilterBulk(ctx context.Context, chatMessages *pb.ChatMessageBulk) (*pb.MessageBatchResult, error) {
result := &pb.MessageBatchResult{
Data: make([]*pb.MessageResult, len(chatMessages.GetMessages())),
}
for index, chatMessage := range chatMessages.GetMessages() {
action := pb.MessageResult_PASS
timestamp := chatMessage.GetTimestamp()
message := chatMessage.GetMessage()
if s.detector.IsProfane(chatMessage.GetMessage()) {
action = pb.MessageResult_CENSORED
timestamp = time.Now().Unix()
message = s.detector.Censor(message)
}
result.GetData()[index] = &pb.MessageResult{
Id: chatMessage.GetId(),
Timestamp: timestamp,
Action: action,
Classification: []pb.MessageResult_Classification{},
Message: message,
}
}
return result, nil
}
FilterBulk関数は、プレイヤーからのチャットがある際に呼び出されます。この関数の1回の呼び出しには、複数のチャットメッセージが含まれる場合があります。この例では、受信したすべてのチャットメッセージをループ処理し、is_profaneが特定の単語を検出した場合、do_censorでそれを検閲し、結果を返します。
async def FilterBulk(self, request, context):
self.log_payload(f'{self.FilterBulk.__name__} request: %s', request)
data = [self.do_censor(message) for message in request.messages]
response = MessageBatchResult(data=data)
self.log_payload(f'{self.FilterBulk.__name__} response: %s', response)
return response
def do_censor(self, chat_message: ChatMessage) -> MessageResult:
action: MessageResult.Action = MessageResult.Action.PASS
classification: List[MessageResult.Classification] = []
censored_words: List[str] = []
message: str = chat_message.message
reference_id: str = uuid4().hex
censored_message = message
if self.filter.is_profane(message):
censored_message = self.filter.censor(message)
# action
action = MessageResult.Action.CENSORED
# classification
classification.append(MessageResult.Classification.OTHER)
# censored_words
words = message.split()
cwords = censored_message.split()
if len(words) == len(cwords):
censored_words = [words[i] for i in range(len(words)) if words[i] != cwords[i]]
return MessageResult(
id=chat_message.id,
timestamp=chat_message.timestamp,
action=action,
classification=classification,
censoredWords=censored_words,
message=censored_message,
referenceId=reference_id,
)