Skip to content

Commit

Permalink
feat: 支持帮助信息
Browse files Browse the repository at this point in the history
  • Loading branch information
amtoaer committed Feb 17, 2022
1 parent 4221508 commit 406fa0a
Show file tree
Hide file tree
Showing 2 changed files with 145 additions and 91 deletions.
223 changes: 141 additions & 82 deletions client/qq.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"net/url"
"strconv"
"strings"
"sync"
"time"

"github.com/amtoaer/bing-bong/internal"
Expand All @@ -17,11 +18,22 @@ import (
"github.com/wdvxdr1123/ZeroBot/extension"
)

var (
helpInfo string
once sync.Once
)

type QQ struct {
bot *zero.Ctx
Conf map[string]interface{}
}

type command struct {
commandGroup []string
handler func(*zero.Ctx)
info string
}

func (q *QQ) Init() {
var (
account = q.Conf["account"].(string)
Expand Down Expand Up @@ -60,103 +72,150 @@ func (q *QQ) SendMessage(userID int64, message string, isGroup bool) {

// 监听事件并阻塞程序
func (q *QQ) HandleEvent(mm *message.Manager) {
zero.OnCommandGroup([]string{"订阅", "subscribe"}).Handle(func(ctx *zero.Ctx) {
var cmd extension.CommandModel
err := ctx.Parse(&cmd)
if err != nil {
utils.Errorf("处理命令失败:%v", err)
return
}
if cmd.Args == "" {
ctx.Send("请输入要订阅的链接!")
} else {
if _, err := url.ParseRequestURI(cmd.Args); err != nil {
ctx.Send("请输入合法的链接!")
} else {
var functions []command
functions = []command{
{
[]string{"订阅", "subscribe"},
func(ctx *zero.Ctx) {
var cmd extension.CommandModel
err := ctx.Parse(&cmd)
if err != nil {
utils.Errorf("处理命令失败:%v", err)
return
}
if cmd.Args == "" {
ctx.Send("请输入要订阅的链接!")
} else {
if _, err := url.ParseRequestURI(cmd.Args); err != nil {
ctx.Send("请输入合法的链接!")
} else {
isGroup, userID := getCtxInfo(ctx)
feeds, err := model.QueryFeed(userID, isGroup)
if err != nil {
utils.Errorf("查询订阅出现错误:%v", err)
ctx.Send("查询订阅出现未知错误,请联系管理员排查。")
return
}
for _, existFeed := range feeds {
if cmd.Args == existFeed.URL {
ctx.Send("您已经订阅了该地址!")
return
}
}
ctx.Send("获取feeds信息中...")
title, err := internal.ParseTitle(cmd.Args)
if err != nil {
utils.Errorf("获取订阅标题失败:%v", err)
ctx.Send("获取信息失败,请检查机器人网络并确保网址为rss地址。")
return
}
mm.Subscribe(cmd.Args, &model.User{Account: userID, IsGroup: isGroup})
err = model.InsertSubscription(cmd.Args, title, userID, isGroup)
if err != nil {
utils.Errorf("插入订阅出现错误:%v", err)
ctx.Send("订阅出现未知错误,请联系管理员排查。")
return
}
ctx.Send(fmt.Sprintf("订阅《%s》成功!", title))
}
}
},
"使用网站 RSS 作为参数以订阅网站更新",
},
{
[]string{"取消订阅", "unsubscribe"},
func(ctx *zero.Ctx) {
isGroup, userID := getCtxInfo(ctx)
feeds, err := model.QueryFeed(userID, isGroup)
if err != nil {
utils.Errorf("查询订阅出现错误:%v", err)
ctx.Send("查询订阅出现未知错误,请联系管理员排查。")
return
}
for _, existFeed := range feeds {
if cmd.Args == existFeed.URL {
ctx.Send("您已经订阅了该地址!")
return
hasURL, messageToSend := buildMessage(feeds, false)
if !hasURL {
ctx.Send("您还没有任何订阅内容!")
} else {
ctx.Send(messageToSend)
next := ctx.FutureEvent("message", ctx.CheckSession())
recv, cancel := next.Repeat()
time.AfterFunc(10*time.Second, cancel)
for event := range recv {
numStr := event.Message.ExtractPlainText()
if num, err := strconv.Atoi(numStr); err != nil {
ctx.Send("请确保输入数字!")
} else {
num--
if num >= 0 && num < len(feeds) {
err := model.DeleteSubscription(feeds[num].URL, userID, isGroup)
if err != nil {
utils.Errorf("删除订阅出现错误:%v", err)
return
}
mm.UnSubscribe(feeds[num].URL, &model.User{Account: userID, IsGroup: isGroup})
ctx.Send("删除订阅成功!")
break
} else {
ctx.Send("编号错误,请重试!")
}
}
}
}
ctx.Send("获取feeds信息中...")
title, err := internal.ParseTitle(cmd.Args)
if err != nil {
utils.Errorf("获取订阅标题失败:%v", err)
ctx.Send("获取信息失败,请检查机器人网络并确保网址为rss地址。")
return
}
mm.Subscribe(cmd.Args, &model.User{Account: userID, IsGroup: isGroup})
err = model.InsertSubscription(cmd.Args, title, userID, isGroup)
},
"交互式删除当前的网站订阅",
},
{
[]string{"查询订阅", "searchSubscription"},
func(ctx *zero.Ctx) {
isGroup, userID := getCtxInfo(ctx)
feeds, err := model.QueryFeed(userID, isGroup)
if err != nil {
utils.Errorf("插入订阅出现错误:%v", err)
ctx.Send("订阅出现未知错误,请联系管理员排查。")
utils.Errorf("查询订阅出现错误:%v", err)
ctx.Send("查询订阅出现未知错误,请联系管理员排查。")
return
}
ctx.Send(fmt.Sprintf("订阅《%s》成功!", title))
}
}
})
zero.OnCommandGroup([]string{"取消订阅", "unsubscribe"}).Handle(func(ctx *zero.Ctx) {
isGroup, userID := getCtxInfo(ctx)
feeds, err := model.QueryFeed(userID, isGroup)
if err != nil {
utils.Errorf("查询订阅出现错误:%v", err)
ctx.Send("查询订阅出现未知错误,请联系管理员排查。")
return
}
hasUrl, messageToSend := buildMessage(feeds, false)
if !hasUrl {
ctx.Send("您还没有任何订阅内容!")
} else {
ctx.Send(messageToSend)
next := ctx.FutureEvent("message", ctx.CheckSession())
recv, cancel := next.Repeat()
time.AfterFunc(10*time.Second, cancel)
for event := range recv {
numStr := event.Message.ExtractPlainText()
if num, err := strconv.Atoi(numStr); err != nil {
ctx.Send("请确保输入数字!")
hasURL, messageToSend := buildMessage(feeds, true)
if !hasURL {
ctx.Send("您还没有任何订阅内容!")
} else {
num -= 1
if num >= 0 && num < len(feeds) {
err := model.DeleteSubscription(feeds[num].URL, userID, isGroup)
if err != nil {
utils.Errorf("删除订阅出现错误:%v", err)
return
ctx.Send(messageToSend)
}
},
"打印当前订阅的网站列表",
},
{
[]string{"帮助", "help"},
func(ctx *zero.Ctx) { //根据功能列表注册帮助信息
once.Do(func() {
var sb strings.Builder
sb.WriteString("bing bong 是一个适用于 QQ 的 RSS 机器人,项目地址:github.com/amtoaer/bing-bong。\n当前支持的命令:\n")
for idx := range functions {
sb.WriteByte('\t')
for commandIdx := range functions[idx].commandGroup {
sb.WriteByte('/')
sb.WriteString(functions[idx].commandGroup[commandIdx])
if commandIdx != len(functions[idx].commandGroup)-1 {
sb.WriteRune('、')
} else {
sb.WriteString(":\n")
}
}
sb.WriteString("\t\t")
sb.WriteString(functions[idx].info)
if idx != len(functions)-1 {
sb.WriteByte('\n')
}
mm.UnSubscribe(feeds[num].URL, &model.User{Account: userID, IsGroup: isGroup})
ctx.Send("删除订阅成功!")
break
} else {
ctx.Send("编号错误,请重试!")
}
}
}
}
})
zero.OnCommandGroup([]string{"查询订阅", "searchSubscription"}).Handle(func(ctx *zero.Ctx) {
isGroup, userID := getCtxInfo(ctx)
feeds, err := model.QueryFeed(userID, isGroup)
if err != nil {
utils.Errorf("查询订阅出现错误:%v", err)
ctx.Send("查询订阅出现未知错误,请联系管理员排查。")
return
}
hasUrl, messageToSend := buildMessage(feeds, true)
if !hasUrl {
ctx.Send("您还没有任何订阅内容!")
} else {
ctx.Send(messageToSend)
}
})
helpInfo = sb.String()
})
ctx.Send(helpInfo)
},
"打印帮助信息",
},
}
for idx := range functions { // 批量注册功能
zero.OnCommandGroup(functions[idx].commandGroup).Handle(functions[idx].handler)
}
select {}
}

Expand Down
13 changes: 4 additions & 9 deletions internal/rss.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,14 @@ import (
var fp *gofeed.Parser = gofeed.NewParser()

func init() {
fp.Client = &http.Client{}
proxyUrl := viper.GetString("proxy")
if proxy, err := url.ParseRequestURI(proxyUrl); err == nil {
fp.Client = &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyURL(proxy),
},
Timeout: 15 * time.Second,
}
} else {
fp.Client = &http.Client{
Timeout: 15 * time.Second,
fp.Client.Transport = &http.Transport{
Proxy: http.ProxyURL(proxy),
}
}
fp.Client.Timeout = 15 * time.Second
}

// 检测rss更新的定时任务
Expand Down

0 comments on commit 406fa0a

Please sign in to comment.