goProject/.svn/pristine/a6/a6c4c9528342b0a41b56a7c3115aace8b4c73c19.svn-base
2025-01-06 16:21:36 +08:00

237 lines
6.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package sensitiveWordsMgr
import (
"encoding/json"
"errors"
"fmt"
"strconv"
"strings"
"time"
"Framework/goroutineMgr"
. "Framework/managecenterModel"
"goutil/dfaUtil"
"goutil/logUtil"
"goutil/mathUtil"
"goutil/webUtil"
"goutil/zlibUtil"
)
// const GetForbidWordURL string = "http://10.253.0.186:10090/Query"
type ForbidWords struct {
//游戏ID
GameId int
//屏蔽字
Words string
}
// 请求屏蔽字库地址
const GetForbidWordURL string = "http://forbidword.7qule.com/Query"
var (
mHashValue string
mDFAUtil *dfaUtil.DFAUtil
mGameId int
rand *mathUtil.Rand
mGameOnly bool = false
)
// 获取屏蔽字
func refreshSensitiveWord() error {
//定义参数
requestParamMap := make(map[string]string, 0)
requestParamMap["GameId"] = strconv.Itoa(mGameId)
requestParamMap["HashValue"] = mHashValue
requestParamMap["DataType"] = "1"
requestParamMap["IsResultCompressed"] = "true"
if mGameOnly {
requestParamMap["GameOnly"] = "true"
}
//data, _ := json.Marshal(requestParamMap)
//请求url,请求头
header := webUtil.GetFormHeader()
transport := webUtil.NewTransport()
transport.DisableKeepAlives = true
transport = webUtil.GetTimeoutTransport(transport, 1000)
statusCode, returnBytesTemp, err := webUtil.PostMapData(GetForbidWordURL, requestParamMap, header, transport)
//statusCode, returnBytes, err := webUtil.PostMapData(GetForbidWordURL, requestParamMap, header, nil)
if err != nil {
logUtil.ErrorLog(fmt.Sprintf("获取敏感字出错url:%s,错误信息为:%s", GetForbidWordURL, err))
return err
}
if statusCode != 200 {
logUtil.ErrorLog(fmt.Sprintf("获取敏感字出错url:%s,错误码为:%d", GetForbidWordURL, statusCode))
return err
}
//解压
returnBytes, err := zlibUtil.Decompress(returnBytesTemp)
if err != nil {
logUtil.ErrorLog("返回结果解压失败")
return err
}
// 解析返回值
returnObj := new(ReturnObject)
if err = json.Unmarshal(returnBytes, &returnObj); err != nil {
logUtil.ErrorLog(fmt.Sprintf("获取敏感字反序列化返回值出错,错误信息为:%s, str:%s", err, string(returnBytes)))
return err
}
// 判断返回状态是否为成功
if returnObj.Code != 0 {
msg := fmt.Sprintf("获取敏感字出错,返回状态:%d信息为%s", returnObj.Code, returnObj.Message)
logUtil.ErrorLog(msg)
return errors.New(msg)
} else if returnObj.Code == 0 && len(returnObj.HashValue) == 0 { //表示没有更新
return nil
}
// 解析Data
var tmpSensitiveWordList []*ForbidWords
if data, ok := returnObj.Data.(string); !ok {
msg := "获取敏感字出错返回的数据不是string类型"
logUtil.ErrorLog(msg)
return errors.New(msg)
} else {
if err = json.Unmarshal([]byte(data), &tmpSensitiveWordList); err != nil {
logUtil.ErrorLog(fmt.Sprintf("获取敏感字反序列化数据出错,错误信息为:%s", err))
return err
}
}
//缓存hasvalue
mHashValue = returnObj.HashValue
//获取敏感字数组
var temWordArray []string
for _, item := range tmpSensitiveWordList {
temWordArray = append(temWordArray, strings.ToUpper(item.Words))
}
//dfa
mDFAUtil = dfaUtil.NewDFAUtil(temWordArray)
return nil
}
// 是否包含屏蔽字
func IsSensitiveWords(input string) (exist bool) {
input = strings.ToUpper(input)
exist = mDFAUtil.IsMatch(input)
return
}
// 取出敏感字及开始位置
func SensitiveWords(input string) (words []string, pos []int, exist bool) {
input2 := strings.ToUpper(input)
inputRune := []rune(input)
startIndexList, endIndexList := mDFAUtil.SearchSentence(input2)
if len(startIndexList) > 0 {
exist = true
words = make([]string, 0, len(startIndexList))
pos = make([]int, 0, len(startIndexList))
for i := 0; i < len(startIndexList); i++ {
start := startIndexList[i]
end := endIndexList[i]
words = append(words, string(inputRune[start:end+1]))
pos = append(pos, start)
}
}
return
}
// 取出敏感字及开始及结束位置
func SensitiveWordsEndStartPos(input string) (words []string, starts, ends []int, exist bool) {
input2 := strings.ToUpper(input)
inputRune := []rune(input)
startIndexList, endIndexList := mDFAUtil.SearchSentence(input2)
if len(startIndexList) > 0 {
exist = true
words = make([]string, 0, len(startIndexList))
starts = startIndexList
ends = endIndexList
for i := 0; i < len(startIndexList); i++ {
start := startIndexList[i]
end := endIndexList[i]
words = append(words, string(inputRune[start:end+1]))
//pos = append(pos, start)
}
}
return
}
// 根据用户输入的替换词替换敏感词
func ReplaceSendsitiveWords(input, replaceStr string) (newStr string) {
words, _, _, exist := SensitiveWordsEndStartPos(input)
newStr = input
//如果不存在敏感词,则直接返回
if !exist {
return
}
//循环替换
for _, sendsitiveWord := range words {
newStr = strings.Replace(newStr, sendsitiveWord, replaceStr, -1)
}
return
}
// 判断服务器是否存在
func IfServerExists() (exist bool) {
return
}
// 处理敏感字
func HandleSendsitiveWords(input string) (newStr string) {
newStr = mDFAUtil.HandleWord(input, rune('*'))
return
}
// 定时刷新敏感字库
func StartRefreshSensitiveWordListTread(gameId int) {
rand = mathUtil.GetRand()
mGameId = gameId
// 定时刷新数据
go func() {
goroutineName := "sensitiveWordsMgr.StartRefreshSensitiveWordListTread"
goroutineMgr.Monitor(goroutineName)
defer goroutineMgr.ReleaseMonitor(goroutineName)
for {
// 刷新屏蔽字
refreshSensitiveWord()
// 每5分钟刷新一次
time.Sleep(time.Duration(rand.GetRandRangeInt64(120, 300)) * time.Second)
}
}()
}
// 定时刷新敏感字库(排除公共字库,只刷新游戏内的)
func StartRefreshSensitiveListTreadExcludeComm(gameId int) {
rand = mathUtil.GetRand()
mGameId = gameId
mGameOnly = true
// 定时刷新数据
go func() {
goroutineName := "sensitiveWordsMgr.StartRefreshSensitiveWordListTread"
goroutineMgr.Monitor(goroutineName)
defer goroutineMgr.ReleaseMonitor(goroutineName)
for {
// 刷新屏蔽字
refreshSensitiveWord()
// 每5分钟刷新一次
time.Sleep(time.Duration(rand.GetRandRangeInt64(120, 300)) * time.Second)
}
}()
}