Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Beta44 #150

Merged
merged 3 commits into from
Nov 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Processor/ProcessC2CMessage.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error {
}
messageID := int(messageID64)
//转换at
messageText := handlers.RevertTransformedText(data)
messageText := handlers.RevertTransformedText(data, "group_private", p.Api, p.Apiv2)
if messageText == "" {
mylog.Printf("信息被自定义黑白名单拦截")
return nil
Expand Down Expand Up @@ -107,7 +107,7 @@ func (p *Processors) ProcessC2CMessage(data *dto.WSC2CMessageData) error {
//将私聊信息转化为群信息(特殊需求情况下)

//转换at
messageText := handlers.RevertTransformedText(data)
messageText := handlers.RevertTransformedText(data, "group_private", p.Api, p.Apiv2)
if messageText == "" {
mylog.Printf("信息被自定义黑白名单拦截")
return nil
Expand Down
6 changes: 3 additions & 3 deletions Processor/ProcessChannelDirectMessage.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData)
}
messageID := int(messageID64)
//转换at
messageText := handlers.RevertTransformedText(data)
messageText := handlers.RevertTransformedText(data, "guild_private", p.Api, p.Apiv2)
if messageText == "" {
mylog.Printf("信息被自定义黑白名单拦截")
return nil
Expand Down Expand Up @@ -127,7 +127,7 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData)
//获取s
s := client.GetGlobalS()
//转换at
messageText := handlers.RevertTransformedText(data)
messageText := handlers.RevertTransformedText(data, "guild_private", p.Api, p.Apiv2)
if messageText == "" {
mylog.Printf("信息被自定义黑白名单拦截")
return nil
Expand Down Expand Up @@ -220,7 +220,7 @@ func (p *Processors) ProcessChannelDirectMessage(data *dto.WSDirectMessageData)
//直接储存 适用于私信场景私聊
idmap.WriteConfigv2(data.ChannelID, "guild_id", data.GuildID)
//转换at
messageText := handlers.RevertTransformedText(data)
messageText := handlers.RevertTransformedText(data, "guild_private", p.Api, p.Apiv2)
if messageText == "" {
mylog.Printf("信息被自定义黑白名单拦截")
return nil
Expand Down
2 changes: 1 addition & 1 deletion Processor/ProcessGroupMessage.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ func (p *Processors) ProcessGroupMessage(data *dto.WSGroupATMessageData) error {
s := client.GetGlobalS()

// 转换at
messageText := handlers.RevertTransformedText(data)
messageText := handlers.RevertTransformedText(data, "group", p.Api, p.Apiv2)
if messageText == "" {
mylog.Printf("信息被自定义黑白名单拦截")
return nil
Expand Down
4 changes: 2 additions & 2 deletions Processor/ProcessGuildATMessage.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func (p *Processors) ProcessGuildATMessage(data *dto.WSATMessageData) error {
//获取s
s := client.GetGlobalS()
//转换at
messageText := handlers.RevertTransformedText(data)
messageText := handlers.RevertTransformedText(data, "guild", p.Api, p.Apiv2)
if messageText == "" {
mylog.Printf("信息被自定义黑白名单拦截")
return nil
Expand Down Expand Up @@ -123,7 +123,7 @@ func (p *Processors) ProcessGuildATMessage(data *dto.WSATMessageData) error {
//转成int再互转
idmap.WriteConfigv2(fmt.Sprint(ChannelID64), "guild_id", data.GuildID)
//转换at和图片
messageText := handlers.RevertTransformedText(data)
messageText := handlers.RevertTransformedText(data, "guild", p.Api, p.Apiv2)
if messageText == "" {
mylog.Printf("信息被自定义黑白名单拦截")
return nil
Expand Down
4 changes: 2 additions & 2 deletions Processor/ProcessGuildNormalMessage.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func (p *Processors) ProcessGuildNormalMessage(data *dto.WSMessageData) error {
//获取s
s := client.GetGlobalS()
//转换at
messageText := handlers.RevertTransformedText(data)
messageText := handlers.RevertTransformedText(data, "guild", p.Api, p.Apiv2)
if messageText == "" {
mylog.Printf("信息被自定义黑白名单拦截")
return nil
Expand Down Expand Up @@ -125,7 +125,7 @@ func (p *Processors) ProcessGuildNormalMessage(data *dto.WSMessageData) error {
//转成int再互转
idmap.WriteConfigv2(fmt.Sprint(ChannelID64), "guild_id", data.GuildID)
//转换at
messageText := handlers.RevertTransformedText(data)
messageText := handlers.RevertTransformedText(data, "guild", p.Api, p.Apiv2)
if messageText == "" {
mylog.Printf("信息被自定义黑白名单拦截")
return nil
Expand Down
13 changes: 13 additions & 0 deletions config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ type Settings struct {
ImageLimitB int `yaml:"image_limit"`
RecordSampleRate int `yaml:"record_sampleRate"`
RecordBitRate int `yaml:"record_bitRate"`
NoWhiteResponse string `yaml:"No_White_Response"`
}

// LoadConfig 从文件中加载配置并初始化单例配置
Expand Down Expand Up @@ -898,3 +899,15 @@ func GetRecordBitRate() int {

return instance.Settings.RecordBitRate
}

// 获取NoWhiteResponse的值
func GetNoWhiteResponse() string {
mu.Lock()
defer mu.Unlock()

if instance == nil {
mylog.Println("Warning: instance is nil when trying to NoWhiteResponse value.")
return ""
}
return instance.Settings.NoWhiteResponse
}
85 changes: 83 additions & 2 deletions handlers/message_parser.go
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
package handlers

import (
"context"
"errors"
"fmt"
"net"
"path/filepath"
"regexp"
"runtime"
"strconv"
"strings"
"time"

"github.com/hoshinonyaruko/gensokyo/callapi"
"github.com/hoshinonyaruko/gensokyo/config"
"github.com/hoshinonyaruko/gensokyo/echo"
"github.com/hoshinonyaruko/gensokyo/idmap"
"github.com/hoshinonyaruko/gensokyo/mylog"
"github.com/hoshinonyaruko/gensokyo/url"
"github.com/tencent-connect/botgo/dto"
"github.com/tencent-connect/botgo/openapi"
"mvdan.cc/xurls" //xurls是一个从文本提取url的库 适用于多种场景
)

Expand Down Expand Up @@ -239,7 +244,7 @@ func transformMessageText(messageText string) string {
}

// 处理at和其他定形文到onebotv11格式(cq码)
func RevertTransformedText(data interface{}) string {
func RevertTransformedText(data interface{}, msgtype string, api openapi.OpenAPI, apiv2 openapi.OpenAPI) string {
var msg *dto.Message
switch v := data.(type) {
case *dto.WSGroupATMessageData:
Expand Down Expand Up @@ -322,9 +327,10 @@ func RevertTransformedText(data interface{}) string {
}
}

// 如果没有匹配项,则将 messageText 置为空
// 如果没有匹配项,则将 messageText 置为兜底回复 兜底回复可空
if !matched {
messageText = ""
SendMessage(config.GetNoWhiteResponse(), data, msgtype, api, apiv2)
}
}
//检查是否启用黑名单模式
Expand Down Expand Up @@ -529,3 +535,78 @@ func sortMessageSegments(segments []map[string]interface{}) []map[string]interfa
// 按照指定的顺序合并这些切片
return append(append(atSegments, textSegments...), imageSegments...)
}

// SendMessage 发送消息根据不同的类型
func SendMessage(messageText string, data interface{}, messageType string, api openapi.OpenAPI, apiv2 openapi.OpenAPI) error {
// 强制类型转换,获取Message结构
var msg *dto.Message
switch v := data.(type) {
case *dto.WSGroupATMessageData:
msg = (*dto.Message)(v)
case *dto.WSATMessageData:
msg = (*dto.Message)(v)
case *dto.WSMessageData:
msg = (*dto.Message)(v)
case *dto.WSDirectMessageData:
msg = (*dto.Message)(v)
case *dto.WSC2CMessageData:
msg = (*dto.Message)(v)
default:
return nil
}
switch messageType {
case "guild":
// 处理公会消息
msgseq := echo.GetMappingSeq(msg.ID)
echo.AddMappingSeq(msg.ID, msgseq+1)
textMsg, _ := GenerateReplyMessage(msg.ID, nil, messageText, msgseq+1)
if _, err := api.PostMessage(context.TODO(), msg.ChannelID, textMsg); err != nil {
mylog.Printf("发送文本信息失败: %v", err)
return err
}

case "group":
// 处理群组消息
msgseq := echo.GetMappingSeq(msg.ID)
echo.AddMappingSeq(msg.ID, msgseq+1)
textMsg, _ := GenerateReplyMessage(msg.ID, nil, messageText, msgseq+1)
_, err := apiv2.PostGroupMessage(context.TODO(), msg.GroupID, textMsg)
if err != nil {
mylog.Printf("发送文本群组信息失败: %v", err)
return err
}

case "guild_private":
// 处理私信
timestamp := time.Now().Unix()
timestampStr := fmt.Sprintf("%d", timestamp)
dm := &dto.DirectMessage{
GuildID: msg.GuildID,
ChannelID: msg.ChannelID,
CreateTime: timestampStr,
}
msgseq := echo.GetMappingSeq(msg.ID)
echo.AddMappingSeq(msg.ID, msgseq+1)
textMsg, _ := GenerateReplyMessage(msg.ID, nil, messageText, msgseq+1)
if _, err := apiv2.PostDirectMessage(context.TODO(), dm, textMsg); err != nil {
mylog.Printf("发送文本信息失败: %v", err)
return err
}

case "group_private":
// 处理群组私聊消息
msgseq := echo.GetMappingSeq(msg.ID)
echo.AddMappingSeq(msg.ID, msgseq+1)
textMsg, _ := GenerateReplyMessage(msg.ID, nil, messageText, msgseq+1)
_, err := apiv2.PostC2CMessage(context.TODO(), msg.Author.ID, textMsg)
if err != nil {
mylog.Printf("发送文本私聊信息失败: %v", err)
return err
}

default:
return errors.New("未知的消息类型")
}

return nil
}
24 changes: 19 additions & 5 deletions handlers/send_private_msg.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,16 +184,30 @@ func handleSendGuildChannelPrivateMsg(client callapi.Client, api openapi.OpenAPI

var guildID, channelID string
var err error
GroupID := message.Params.GroupID.(string)

if optionalGuildID != nil && optionalChannelID != nil {
guildID = *optionalGuildID
channelID = *optionalChannelID
} else {
//默认私信场景 通过仅有的userid来还原频道私信需要的guildid
guildID, channelID, err = getGuildIDFromMessage(message)
if err != nil {
mylog.Printf("获取 guild_id 和 channel_id 出错: %v", err)
return
//频道私信,虚拟成群 通过仅有的group来还原频道私信需要的guildid channelID
if GroupID != "" {
guildID, err = idmap.ReadConfigv2(GroupID, "guild_id")
if err != nil {
mylog.Printf("根据GroupID获取guild_id失败: %v", err)
return
}
channelID, err = idmap.RetrieveRowByIDv2(GroupID)
if err != nil {
mylog.Printf("根据GroupID获取channelID失败: %v", err)
return
}
} else { //默认私信场景 通过仅有的userid来还原频道私信需要的guildid channelID
guildID, channelID, err = getGuildIDFromMessage(message)
if err != nil {
mylog.Printf("获取 guild_id 和 channel_id 出错: %v", err)
return
}
}
}
RawUserID := message.Params.UserID.(string)
Expand Down
18 changes: 13 additions & 5 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"net/http"
"os"
"os/signal"
"runtime"
"strings"
"syscall"
"time"
Expand Down Expand Up @@ -51,11 +52,18 @@ func main() {
sys.InitBase() // 如果不是faststart模式,则执行初始化
}
if _, err := os.Stat("config.yml"); os.IsNotExist(err) {
// 获取内网IP地址
ip, err := sys.GetLocalIP()
if err != nil {
log.Println("Error retrieving the local IP address:", err)
return
var ip string
var err error
// 检查操作系统是否为Android
if runtime.GOOS == "android" {
ip = "127.0.0.1"
} else {
// 获取内网IP地址
ip, err = sys.GetLocalIP()
if err != nil {
log.Println("Error retrieving the local IP address:", err)
ip = "127.0.0.1"
}
}
// 将 <YOUR_SERVER_DIR> 替换成实际的内网IP地址 确保初始状态webui能够被访问
configData := strings.Replace(template.ConfigTemplate, "<YOUR_SERVER_DIR>", ip, -1)
Expand Down
Loading