diff --git a/app/friend.go b/app/friend.go index e9d28f49..07894202 100644 --- a/app/friend.go +++ b/app/friend.go @@ -182,3 +182,26 @@ func ChangeSkipGroupRankStatus(ctx *gin.Context) { ctx.String(http.StatusOK, "操作成功") } + +// ChangeEnableNewsStatus +// @description: 修改是否开启新闻 +// @param ctx +func ChangeEnableNewsStatus(ctx *gin.Context) { + var p changeStatusParam + if err := ctx.ShouldBindJSON(&p); err != nil { + ctx.String(http.StatusBadRequest, "参数错误") + return + } + log.Printf("待修改的Id:%s", p.WxId) + + err := client.MySQL.Model(&entity.Friend{}). + Where("wxid = ?", p.WxId). + Update("`enable_news`", gorm.Expr(" !`enable_news`")).Error + if err != nil { + log.Printf("修改早报启用状态失败:%s", err) + ctx.String(http.StatusInternalServerError, "操作失败: %s", err) + return + } + + ctx.String(http.StatusOK, "操作成功") +} diff --git a/config.yaml b/config.yaml index 9358b3bd..0e898264 100644 --- a/config.yaml +++ b/config.yaml @@ -14,6 +14,8 @@ system: summary: true # 默认是否开启新成员加群欢迎 welcome: true + # 每日早报 + news: true # 微信HOOK配置 wechat: @@ -40,12 +42,15 @@ mysql: schema: public # postgres 专用 task: - enable: false + enable: true + news: + enable: true + cron: '14 11 * * *' # 每天0:30 syncFriends: enable: false cron: '*/5 * * * *' # 五分钟一次 groupSummary: - enable: true + enable: false cron: '30 0 * * *' # 每天0:30 waterGroup: enable: false diff --git a/config/system.go b/config/system.go index 97d93411..9c3ca765 100644 --- a/config/system.go +++ b/config/system.go @@ -18,4 +18,5 @@ type defaultRule struct { ChatRank bool `json:"chatRank" yaml:"chatRank"` // 是否启用聊天排行榜 Summary bool `json:"summary" yaml:"summary"` // 是否启用聊天总结 Welcome bool `json:"welcome" yaml:"welcome"` // 是否启用欢迎新成员 + News bool `json:"news" yaml:"news"` // 是否启用每日早报 } diff --git a/config/task.go b/config/task.go index ce46e7d1..f29ad57f 100644 --- a/config/task.go +++ b/config/task.go @@ -4,6 +4,7 @@ package config // @description: 定时任务 type task struct { Enable bool `json:"enable" yaml:"enable"` // 是否启用 + News syncFriends `json:"news" yaml:"news"` // 每日早报 SyncFriends syncFriends `json:"syncFriends" yaml:"syncFriends"` // 同步好友 WaterGroup waterGroup `json:"waterGroup" yaml:"waterGroup"` // 水群排行榜 GroupSummary syncFriends `json:"groupSummary" yaml:"groupSummary"` // 群聊总结 diff --git a/entity/friend.go b/entity/friend.go index 04539615..96ee1acf 100644 --- a/entity/friend.go +++ b/entity/friend.go @@ -19,6 +19,7 @@ type Friend struct { EnableChatRank bool `json:"enableChatRank" gorm:"type:tinyint(1) default 0 not null"` // 是否使用聊天排行 EnableWelcome bool `json:"enableWelcome" gorm:"type:tinyint(1) default 0 not null"` // 是否启用迎新 EnableSummary bool `json:"enableSummary" gorm:"type:tinyint(1) default 0 not null"` // 是否启用总结 + EnableNews bool `json:"enableNews" gorm:"type:tinyint(1) default 0 not null"` // 是否启用新闻 IsOk bool `json:"isOk" gorm:"type:tinyint(1) default 0 not null"` // 是否正常 } diff --git a/model/news.go b/model/news.go new file mode 100644 index 00000000..bdfc397c --- /dev/null +++ b/model/news.go @@ -0,0 +1,18 @@ +package model + +// MorningPost +// @description: 每日早报返回结构体 +type MorningPost struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data struct { + Date string `json:"date"` // 新闻日期 + News []string `json:"news"` // 新闻标题文字版 + WeiYu string `json:"weiyu"` // 微语,就是一句屁话 + Image string `json:"image"` // 早报完整图片 + HeadImage string `json:"head_image"` // 早报头部图片 + } `json:"data"` + Time int `json:"time"` + Usage int `json:"usage"` + LogId string `json:"log_id"` +} diff --git a/plugin/plugins/ai.go b/plugin/plugins/ai.go index dec8b5e3..e6329802 100644 --- a/plugin/plugins/ai.go +++ b/plugin/plugins/ai.go @@ -54,7 +54,7 @@ func AI(m *plugin.MessageContext) { // 组装消息体 messages := make([]openai.ChatCompletionMessage, 0) - if config.Conf.Ai.Personality != "" { + if prompt != "" { // 填充人设 messages = append(messages, openai.ChatCompletionMessage{ Role: openai.ChatMessageRoleSystem, diff --git a/router/router.go b/router/router.go index 7df7ae50..f10f30a7 100644 --- a/router/router.go +++ b/router/router.go @@ -26,6 +26,7 @@ func Init(g *gin.Engine) { api.POST("/ai/model", app.ChangeUseAiModel) // 修改使用的AI模型 api.PUT("/welcome/status", app.ChangeEnableWelcomeStatus) // 修改是否开启迎新状态 api.PUT("/command/status", app.ChangeEnableCommandStatus) // 修改是否开启指令状态 + api.PUT("/news/status", app.ChangeEnableNewsStatus) // 修改是否开启早报状态 api.PUT("/grouprank/status", app.ChangeEnableGroupRankStatus) // 修改是否开启水群排行榜状态 api.PUT("/grouprank/skip", app.ChangeSkipGroupRankStatus) // 修改是否跳过水群排行榜状态 api.GET("/group/users", app.GetGroupUsers) // 获取群成员列表 diff --git a/service/friend.go b/service/friend.go index 856120ce..e3e6cf39 100644 --- a/service/friend.go +++ b/service/friend.go @@ -49,7 +49,10 @@ func GetAllEnableAI() (records []entity.Friend, err error) { // @return records // @return err func GetAllEnableChatRank() (records []entity.Friend, err error) { - err = client.MySQL.Where("enable_chat_rank = ?", 1).Where("wxid LIKE '%@chatroom'").Find(&records).Error + err = client.MySQL.Where("enable_chat_rank = ?", 1). + Where("is_ok IS TRUE"). + Where("wxid LIKE '%@chatroom'"). + Find(&records).Error return } @@ -58,7 +61,19 @@ func GetAllEnableChatRank() (records []entity.Friend, err error) { // @return records // @return err func GetAllEnableSummary() (records []entity.Friend, err error) { - err = client.MySQL.Where("enable_summary = ?", 1).Where("wxid LIKE '%@chatroom'").Find(&records).Error + err = client.MySQL.Where("enable_summary = ?", 1). + Where("is_ok IS TRUE"). + Where("wxid LIKE '%@chatroom'"). + Find(&records).Error + return +} + +// GetAllEnableNews +// @description: 取出所有启用了新闻的好友或群组 +// @return records +// @return err +func GetAllEnableNews() (records []entity.Friend, err error) { + err = client.MySQL.Where("enable_news = ?", 1).Where("is_ok IS TRUE").Find(&records).Error return } diff --git a/tasks/friends/friends.go b/tasks/friends/friends.go index b5e96ee6..8be344a3 100644 --- a/tasks/friends/friends.go +++ b/tasks/friends/friends.go @@ -74,6 +74,7 @@ func Sync() { EnableChatRank: config.Conf.System.DefaultRule.ChatRank, EnableSummary: config.Conf.System.DefaultRule.Summary, EnableWelcome: config.Conf.System.DefaultRule.Welcome, + EnableNews: config.Conf.System.DefaultRule.News, LastActive: time.Now().Local(), }).Error if err != nil { diff --git a/tasks/news/news.go b/tasks/news/news.go new file mode 100644 index 00000000..e393f1b6 --- /dev/null +++ b/tasks/news/news.go @@ -0,0 +1,36 @@ +package news + +import ( + "fmt" + "go-wechat/service" + "go-wechat/utils" + "log" + "strings" + "time" +) + +// DailyNews +// @description: 每日新闻 +func DailyNews() { + groups, err := service.GetAllEnableNews() + if err != nil { + log.Printf("获取启用了聊天排行榜的群组失败, 错误信息: %v", err) + return + } + + news := utils.NewsUtil().MorningPost() + if len(news) == 0 { + log.Println("每日早报获取失败") + return + } + + newsStr := fmt.Sprintf("#每日早报#\n\n又是新的一天了,让我们康康一觉醒来世界又发生了哪些变化~\n\n%s", strings.Join(news, "\n")) + + // 循环发送新闻 + for _, group := range groups { + // 发送消息 + utils.SendMessage(group.Wxid, "", newsStr, 0) + // 休眠一秒,防止频繁发送 + time.Sleep(time.Second) + } +} diff --git a/tasks/tasks.go b/tasks/tasks.go index 630f643a..4ff07247 100644 --- a/tasks/tasks.go +++ b/tasks/tasks.go @@ -4,6 +4,7 @@ import ( "github.com/go-co-op/gocron" "go-wechat/config" "go-wechat/tasks/friends" + "go-wechat/tasks/news" "go-wechat/tasks/summary" "go-wechat/tasks/watergroup" "log" @@ -42,7 +43,6 @@ func InitTasks() { if config.Conf.Task.GroupSummary.Enable { log.Printf("群聊总结任务已启用,执行表达式: %s", config.Conf.Task.GroupSummary.Cron) _, _ = s.Cron(config.Conf.Task.GroupSummary.Cron).Do(summary.AiSummary) - } // 更新好友列表 @@ -51,6 +51,11 @@ func InitTasks() { _, _ = s.Cron(config.Conf.Task.SyncFriends.Cron).Do(friends.Sync) } + // 每日早报 + if config.Conf.Task.News.Enable { + _, _ = s.Cron(config.Conf.Task.News.Cron).Do(news.DailyNews) + } + // 开启定时任务 s.StartAsync() log.Println("定时任务初始化成功") diff --git a/utils/news.go b/utils/news.go new file mode 100644 index 00000000..6d6c60ba --- /dev/null +++ b/utils/news.go @@ -0,0 +1,46 @@ +package utils + +import ( + "github.com/go-resty/resty/v2" + "go-wechat/model" + "log" +) + +// News +// @description: 新闻 +type News interface { + MorningPost() []string // 早报 +} + +type news struct{} + +// NewsUtil +// @description: 新闻工具 +// @param account +// @param password +// @return LeiGod +func NewsUtil() News { + return &news{} +} + +// MorningPost +// @description: 早报 +// @receiver news +// @return records +func (news) MorningPost() (records []string) { + var newsResp model.MorningPost + + res := resty.New() + resp, err := res.R(). + SetHeader("Content-Type", "application/json;chartset=utf-8"). + SetQueryParam("token", "cFoMZNNBxT4jQovS"). + SetResult(&newsResp). + Post("https://v2.alapi.cn/api/zaobao") + if err != nil { + log.Panicf("每日早报获取失败: %s", err.Error()) + } + log.Printf("每日早报获取结果: %s", unicodeToText(resp.String())) + + records = newsResp.Data.News + return +} diff --git a/views/components.html b/views/components.html index bf3772bd..a25cbce3 100644 --- a/views/components.html +++ b/views/components.html @@ -165,6 +165,33 @@ {{end}} + +{{define "news"}} + +{{end}} + {{define "flagTag"}} diff --git a/views/friend.html b/views/friend.html index 06f4a46c..d301e910 100644 --- a/views/friend.html +++ b/views/friend.html @@ -78,6 +78,13 @@ {{ end }} +
+
早报
+
+ {{ template "news" . }} +
+
+
指令
diff --git a/views/group.html b/views/group.html index b8f53723..d508132b 100644 --- a/views/group.html +++ b/views/group.html @@ -33,19 +33,22 @@ 是否在通讯录 - 是否启用AI + AI - 是否启用水群排行榜 + 排行榜 - 是否启用聊天记录总结 + 总结 - 是否启用迎新 + 迎新 - 是否启用指令 + 早报 + + + 指令 操作 @@ -98,6 +101,9 @@ {{ template "welcome" . }} + + {{ template "news" . }} + {{ template "command" . }} diff --git a/views/static/js/index.js b/views/static/js/index.js index 352f4548..5bb8fd2b 100644 --- a/views/static/js/index.js +++ b/views/static/js/index.js @@ -80,6 +80,25 @@ function changeWelcomeEnableStatus(wxId) { }) } +// 修改用户新闻开启状态 +function changeUserNewsStatus(wxId) { + axios({ + method: 'put', + url: '/api/news/status', + data: { + wxId: wxId + } + }).then(function (response) { + console.log(`返回结果: ${JSON.stringify(response)}`); + alert(`${response.data}`) + }).catch(function (error) { + console.log(`错误信息: ${error}`); + alert("修改失败") + }).finally(function () { + window.location.reload(); + }) +} + // 修改指令权限启用状态 function changeCommandEnableStatus(wxId) { axios({ diff --git a/vo/friend.go b/vo/friend.go index bddbcd08..da0da938 100644 --- a/vo/friend.go +++ b/vo/friend.go @@ -19,6 +19,7 @@ type FriendItem struct { EnableWelcome bool // 是否使用迎新 EnableCommand bool // 是否启用指令 EnableSummary bool // 是否启用总结 + EnableNews bool // 是否启用新闻 IsOk bool // 是否还在通讯库(群聊是要还在群里也算) }