Files

506 lines
15 KiB
Go
Raw Permalink Normal View History

2026-02-17 13:06:23 +08:00
package req
import (
"encoding/json"
"strings"
"time"
)
// 指令参数
// 自动抢红包 101
type AutoRedRequestModel struct {
Enable int32 `example:"1"` // 是否开启领取红包机制
Single int32 `example:"1"` // 是否仅抢单个红包(不同时抢多个)
AutoReply int32 `example:"1"` // 是否自动回复感谢
TimeInSeconds int32 `example:"0"` // 延迟回复的时间,单位为秒
ReplyMessages string // 回复内容(多个消息用逗号隔开)
}
func DealAutoRed(model *AutoRedRequestModel) {
if model.Enable != 1 {
model.Enable = 0
}
if model.Single != 1 {
model.Single = 0
}
if model.AutoReply != 1 {
model.AutoReply = 0
}
// TimeInSeconds 0-60
if model.TimeInSeconds < 0 {
model.TimeInSeconds = 0
} else if model.TimeInSeconds > 60 {
model.TimeInSeconds = 60
}
_, model.ReplyMessages = StringToSlice(model.ReplyMessages)
}
// 自动接收转账 106
type AutoTransferRequestModel struct {
Enable int32 `example:"1"` // 是否开启接收转账功能
AutoReply int32 `example:"1"` // 是否开启自动回复
TimeInSeconds int32 `example:"0"` // 延迟回复的时间,单位为秒
ReplyMessage string // 回复内容(仅一条)
}
func DealTransfer(model *AutoTransferRequestModel) {
if model.Enable != 1 {
model.Enable = 0
}
if model.AutoReply != 1 {
model.AutoReply = 0
}
// TimeInSeconds 0-60
if model.TimeInSeconds < 0 {
model.TimeInSeconds = 0
} else if model.TimeInSeconds > 60 {
model.TimeInSeconds = 60
}
model.ReplyMessage = StringTo1000(model.ReplyMessage)
}
// 延迟领取红包 103
type DelayRedRequestModel struct {
TimeInSeconds int32 `example:"0"` // 延迟领取红包的时间,单位为秒
}
func DealDelayRed(model *DelayRedRequestModel) {
// TimeInSeconds 0-60
if model.TimeInSeconds < 0 {
model.TimeInSeconds = 0
} else if model.TimeInSeconds > 60 {
model.TimeInSeconds = 60
}
}
// 延迟接收转账 113
type DelayAutoTransferRequestModel struct {
TimeInSeconds int32 `example:"0"` // 延迟接收转账的时间,单位为秒
}
func DealDelayTransfer(model *DelayAutoTransferRequestModel) {
// TimeInSeconds 0-60
if model.TimeInSeconds < 0 {
model.TimeInSeconds = 0
} else if model.TimeInSeconds > 60 {
model.TimeInSeconds = 60
}
}
// 关键字包不抢 118
type KeywordAvoidanceRequestModel struct {
Enable int32 `example:"1"` // 是否开启关键字包不抢
Keywords string // 设置关键字(多个用逗号隔开)
}
func DealKeywordAvoidance(model *KeywordAvoidanceRequestModel) {
if model.Enable != 1 {
model.Enable = 0
}
_, model.Keywords = StringToSlice(model.Keywords)
}
// 自动点赞 401
type AutoLikeRequestModel struct {
Enable int32 `example:"1"` // 是否开启自动点赞
StartTime string // 开始时间 // 点赞时间段
EndTime string // 结束时间// 点赞时间段
TimeInSeconds int32 `example:"0"` // 延迟点赞的时间,单位为秒
Mode int32 `example:"1"` // 模式1-仅点赞分组0-不点赞分组
Groups string // 设置分组,多个用逗号隔开
}
func DealAutoLike(model *AutoLikeRequestModel) {
if model.Enable != 1 {
model.Enable = 0
}
// TimeInSeconds 0-60
if model.TimeInSeconds < 0 {
model.TimeInSeconds = 0
} else if model.TimeInSeconds > 60 {
model.TimeInSeconds = 60
}
if model.Mode != 1 {
model.Mode = 0
}
_, model.Groups = StringToSlice(model.Groups)
}
// 朋友圈跟随转发 402
type AutoForwardRequestModel struct {
EnableAutoForward int32 `example:"1"` // 是否开启跟随转发
IsBlockAuthor int32 `example:"1"` // 是否屏蔽作者
IsBlockGroup int32 `example:"1"` // 是否屏蔽组
Groups string // 设置分组,多个用逗号隔开
}
func DealAutoForward(model *AutoForwardRequestModel) {
if model.EnableAutoForward != 1 {
model.EnableAutoForward = 0
}
if model.IsBlockAuthor != 1 {
model.IsBlockAuthor = 0
}
if model.IsBlockGroup != 1 {
model.IsBlockGroup = 0
}
_, model.Groups = StringToSlice(model.Groups)
}
// 朋友圈收藏转发 403
type FavoriteForwardRequestModel struct {
EnableFavoriteForward int32 `example:"1"` // 是否开启收藏转发
IsBlockAuthor int32 `example:"1"` // 是否屏蔽作者
IsBlockGroup int32 `example:"1"` // 是否屏蔽组
Groups string // 设置分组,多个用逗号隔开
}
func DealFavoriteForward(model *FavoriteForwardRequestModel) {
if model.EnableFavoriteForward != 1 {
model.EnableFavoriteForward = 0
}
if model.IsBlockAuthor != 1 {
model.IsBlockAuthor = 0
}
if model.IsBlockGroup != 1 {
model.IsBlockGroup = 0
}
_, model.Groups = StringToSlice(model.Groups)
}
// 朋友圈自动评论 404
type AutoCommentRequestModel struct {
Enable int32 `example:"1"` // 是否开启自动评论
CommentMessages string // 评论内容(多条用逗号隔开)
StartTime string // 评论时间段,开始时间
EndTime string // 评论时间段,结束时间
TimeInSeconds int32 `example:"0"` // 延迟评论的时间,单位为秒
Mode int32 `example:"1"` // 模式1-仅评论分组0-不评论分组
Groups string // 设置分组,多个用逗号隔开
}
func DealAutoComment(model *AutoCommentRequestModel) {
if model.Enable != 1 {
model.Enable = 0
}
_, model.CommentMessages = StringToSlice(model.CommentMessages)
// TimeInSeconds 0-60
if model.TimeInSeconds < 0 {
model.TimeInSeconds = 0
} else if model.TimeInSeconds > 60 {
model.TimeInSeconds = 60
}
if model.Mode != 1 {
model.Mode = 0
}
_, model.Groups = StringToSlice(model.Groups)
}
// 定时发朋友圈 405
type MomentsRequestModel struct {
MomentType int32 `example:"1"` // 发圈类型1-文字3-图片
MomentContent string // 朋友圈内容
MomentImages string // 朋友圈图片最多上传9张图片路径或链接用逗号隔开
IsBlock int32 `example:"1"` // 发圈时屏蔽组
Groups string // 设置分组,多个用逗号隔开
ScheduledTime string // 预约发圈时间
Status int32 `example:"0"` // 状态0-未发布1-已发布,-1-发布失败
}
func DealMoments(model *MomentsRequestModel) {
// MomentType must be either 1 or 3
if model.MomentType != 3 {
model.MomentType = 1 // Default to 1 if invalid
}
model.MomentContent = StringTo1000(model.MomentContent)
_, model.MomentImages = StringToSlice(model.MomentImages)
if model.IsBlock != 1 {
model.IsBlock = 0
}
_, model.Groups = StringToSlice(model.Groups)
// Status can remain as is since it is already initialized
}
// 发大视频朋友圈 406
type MomentsPostRequestModel struct {
Content string // 朋友圈内容
VideoURL string // 视频最大500M最多上传1个
IsBlock int32 `example:"1"` // 发圈时屏蔽组
Groups string // 设置分组,多个用逗号隔开
}
func DealMomentsPost(model *MomentsPostRequestModel) {
model.Content = StringTo1000(model.Content)
model.VideoURL = StringTo1000(model.VideoURL)
if model.IsBlock != 1 {
model.IsBlock = 0
}
_, model.Groups = StringToSlice(model.Groups)
}
// 欢迎新人入群 502
type WelcomeNewMemberRequestModel struct {
Enable int32 `example:"1"` // 是否开启欢迎新人入群
WelcomeMsg string // 欢迎语内容(仅一条)
Mode int32 `example:"1"` // 模式1-仅欢迎设置群0-不欢迎设置群
Rooms string // 设置的群
}
func DealWelcomeNewMember(model *WelcomeNewMemberRequestModel) {
if model.Enable != 1 {
model.Enable = 0
}
model.WelcomeMsg = StringTo1000(model.WelcomeMsg)
if model.Mode != 1 {
model.Mode = 0
}
_, model.Rooms = StringToSlice(model.Rooms)
}
// 关键词自动踢人 503
type KeywordKickRequestModel struct {
Enable int32 `example:"1"` // 是否开启关键词踢人
Keywords string // 触发的关键词(多条用逗号分隔)
IsLinkKick int32 `example:"1"` // 是否踢发链接的人
IsCardKick int32 `example:"1"` // 是否踢发名片的人
IsMiniProgramKick int32 `example:"1"` // 是否踢发小程序的人
IsImageQRCodeKick int32 `example:"1"` // 是否踢发图片二维码的人
Mode int32 `example:"1"` // 模式1-仅踢设置群0-不踢设置群
Rooms string // 设置的群
}
func DealKeywordKick(model *KeywordKickRequestModel) {
if model.Enable != 1 {
model.Enable = 0
}
_, model.Keywords = StringToSlice(model.Keywords)
if model.IsLinkKick != 1 {
model.IsLinkKick = 0
}
if model.IsCardKick != 1 {
model.IsCardKick = 0
}
if model.IsMiniProgramKick != 1 {
model.IsMiniProgramKick = 0
}
if model.IsImageQRCodeKick != 1 {
model.IsImageQRCodeKick = 0
}
if model.Mode != 1 {
model.Mode = 0
}
_, model.Rooms = StringToSlice(model.Rooms)
}
// 关键词自动回复 504
type ReplyKeywordsItem struct {
Keyword string // 触发的关键词
Content string // 回复的内容
NewMsgId string // 新消息ID 引用了文件助手某条消息时用这个字段
MsgType int32 // 收到消息时的类型1-文本 3-图片 24-笔记 33-小程序 42-名片 49-链接
SendType int32 // 回复的类型,发送类型 1-文本 3-图片 49-笔记|链接 2002-小程序 42-名片
}
type KeywordAutoReplyRequestModel struct {
Enable int32 `example:"1"` // 是否开启关键词自动回复
PrivateReply int32 `example:"1"` // 是否回复私聊
Mode int32 `example:"1"` // 模式1-仅回复设置群0-不回复设置群
Rooms string // 设置的群
Keywords []ReplyKeywordsItem // 关键词设置
}
func DealKeywordAutoReply(model *KeywordAutoReplyRequestModel) {
if model.Enable != 1 {
model.Enable = 0
}
if model.PrivateReply != 1 {
model.PrivateReply = 0
}
if model.Mode != 1 {
model.Mode = 0
}
_, model.Rooms = StringToSlice(model.Rooms)
for i := range model.Keywords {
model.Keywords[i].Keyword = StringTo1000(model.Keywords[i].Keyword)
model.Keywords[i].Content = StringTo1000(model.Keywords[i].Content)
// MsgType and SendType are assumed to be validated outside this function
}
}
// 万群同步 505
type MessageForwardingRequestModel struct {
Enable int32 `example:"1"` // 是否开启消息转发
MainRoom string // 设置的主讲群
Lecturers string // 添加的讲师
ForwardRooms string // 设置的转发群
StartTime string // 转发时间段,开始时间
EndTime string // 转发时间段,结束时间
}
func DealMessageForwarding(model *MessageForwardingRequestModel) {
if model.Enable != 1 {
model.Enable = 0
}
model.MainRoom = StringTo1000(model.MainRoom)
model.Lecturers = StringTo1000(model.Lecturers)
_, model.ForwardRooms = StringToSlice(model.ForwardRooms)
// StartTime and EndTime are assumed to be valid formats validated outside this function
startTime, endTime := DealTimeRange(model.StartTime, model.EndTime)
model.StartTime = startTime
model.EndTime = endTime
}
// 自动通过好友 801
type AutoApproveRequestModel struct {
Enable int32 `example:"1"` // 是否开启自动通过验证
AutoReply int32 `example:"1"` // 是否通过验证后自动回复
ReplyMessage string // 回复内容(仅一条)
}
func DealAutoApprove(model *AutoApproveRequestModel) {
if model.Enable != 1 {
model.Enable = 0
}
if model.AutoReply != 1 {
model.AutoReply = 0
}
model.ReplyMessage = StringTo1000(model.ReplyMessage)
}
// 中文逗号转为英文逗号,清理换行符,过滤空字符串,返回字符串数组和字符串表示
func StringToSlice(str string) ([]string, string) {
// 清理换行符(包括 \n 和 \r
str = strings.ReplaceAll(str, "\r", "")
// 回车符转成分隔付(逗号)
str = strings.ReplaceAll(str, "\n", ",")
// 将中文逗号替换为英文逗号
str = strings.ReplaceAll(str, "", ",")
// 按英文逗号分割成字符串数组
strArr := strings.Split(str, ",")
var result []string
var finalString string = ""
// 过滤掉空字符串,清理头尾空格
for _, v := range strArr {
v = strings.TrimSpace(v) // 去掉前后空格
if v != "" {
// 判断不能大于 1000 个字符
if len(finalString+","+v) > 1000 {
continue
}
if finalString != "" {
finalString += ","
}
finalString += v
result = append(result, v)
}
}
// 将数组转成字符串格式
// finalString := strings.Join(result, ",")
// 返回字符串数组和字符串
return result, finalString
}
// 判断字符串不能大于 1000 个字符,大于则截取前 1000 个字符
func StringTo1000(str string) string {
str = strings.TrimSpace(str) // 去掉前后空格
// 只取 前 1000 个字符
if len(str) > 1000 {
str = str[:1000]
}
return str
}
// 处理开始时间和结束时间,如果输入格式不正确,则使用默认值
func DealTimeRange(startTime string, endTime string) (string, string) {
const timeFormat = "15:04"
// 解析 StartTime
start, errStart := time.Parse(timeFormat, startTime)
if errStart != nil {
start = time.Date(0, 1, 1, 0, 0, 0, 0, time.UTC) // 设置为 00:00
startTime = start.Format(timeFormat)
} else {
startTime = start.Format(timeFormat)
}
// 解析 EndTime
end, errEnd := time.Parse(timeFormat, endTime)
if errEnd != nil {
end = time.Date(0, 1, 1, 23, 59, 0, 0, time.UTC) // 设置为 23:59
endTime = end.Format(timeFormat)
} else {
endTime = end.Format(timeFormat)
}
// 如果 EndTime 小于 StartTime则将 EndTime 设置为 StartTime
if end.Before(start) {
end = start
endTime = end.Format(timeFormat)
}
return startTime, endTime
}
// ToJSON 将任意结构体转换为 JSON 字符串
func ToJSONStr(input interface{}) (string, error) {
// 使用 json.Marshal 将对象转换为 JSON 字节数组
bytes, err := json.Marshal(input)
if err != nil {
// 如果转换失败,返回错误提示
return "", err
}
// 将字节数组转换为字符串并返回
return string(bytes), nil
}
// FromJSONS 将 JSON 字符串转换为任意结构体
func FromJSONS(input string, output interface{}) error {
if len(input) == 0 {
// 将空字符串替换为一个空 JSON 对象
input = "{}"
}
err := json.Unmarshal([]byte(input), output)
return err
}
// 定时任务执行函数 true 可以执行false 不执行
func IsInTimeRange(StartTime string, EndTime string) bool {
// 获取系统当前时间HH:mm 格式)
now := time.Now()
layout := "15:04"
currentTime, err := time.Parse(layout, now.Format(layout)) // 将当前时间转换为 HH:mm 格式
if err != nil {
// 如果解析失败,执行任务即可
return true
}
// 解析 StartTime 和 EndTime
startTime, err := time.Parse(layout, StartTime)
if err != nil {
// 如果解析失败,执行任务即可
return true
}
endTime, err := time.Parse(layout, EndTime)
if err != nil {
// 如果解析失败,执行任务即可
return true
}
// 判断当前时间是否在范围内
if (currentTime.After(startTime) || currentTime.Equal(startTime)) && (currentTime.Before(endTime) || currentTime.Equal(endTime)) {
// 执行任务
return true
} else {
// 不执行
return false
}
}