|
@@ -0,0 +1,501 @@
|
|
|
+package tgadtool
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
|
|
+ "github.com/sirupsen/logrus"
|
|
|
+ "gogs.daxia.dev/huanan/pkg.daxia.dev/db"
|
|
|
+ "gogs.daxia.dev/huanan/pkg.daxia.dev/event2"
|
|
|
+ "gogs.daxia.dev/huanan/pkg.daxia.dev/parse"
|
|
|
+ "nn.daxia.dev/model"
|
|
|
+)
|
|
|
+
|
|
|
+type MsgFormat interface {
|
|
|
+ GetType() string
|
|
|
+}
|
|
|
+
|
|
|
+type MsgFormatBase struct {
|
|
|
+ Name string `json:"名称"`
|
|
|
+ Type string `json:"类型"`
|
|
|
+ Btn1 []string `json:"按钮1"`
|
|
|
+ Btn2 []string `json:"按钮2"`
|
|
|
+ Btn3 []string `json:"按钮3"`
|
|
|
+ Btn4 []string `json:"按钮4"`
|
|
|
+}
|
|
|
+
|
|
|
+type MsgFormatText struct {
|
|
|
+ MsgFormatBase
|
|
|
+ Text string `json:"文字"`
|
|
|
+}
|
|
|
+
|
|
|
+func (p *MsgFormatText) GetType() string {
|
|
|
+ return p.Type
|
|
|
+}
|
|
|
+
|
|
|
+type MsgFormatImg struct {
|
|
|
+ MsgFormatBase
|
|
|
+ ImgUrl string `json:"图片地址"`
|
|
|
+ Text string `json:"文字"`
|
|
|
+}
|
|
|
+
|
|
|
+func (p *MsgFormatImg) GetType() string {
|
|
|
+ return p.Type
|
|
|
+}
|
|
|
+
|
|
|
+type MsgFormatGif struct {
|
|
|
+ MsgFormatBase
|
|
|
+ ImgUrl string `json:"图片地址"`
|
|
|
+ Text string `json:"文字"`
|
|
|
+}
|
|
|
+
|
|
|
+func (p *MsgFormatGif) GetType() string {
|
|
|
+ return p.Type
|
|
|
+}
|
|
|
+
|
|
|
+func StartGen() {
|
|
|
+ event2.On[tgbotapi.Update](EventUpdateMsg, event2.ListenerFunc[tgbotapi.Update](onUpdate))
|
|
|
+ go StartTimer()
|
|
|
+}
|
|
|
+
|
|
|
+func StartTimer() {
|
|
|
+ for {
|
|
|
+ <-time.After(3 * time.Second)
|
|
|
+
|
|
|
+ timerModelList := make([]model.Timer, 0)
|
|
|
+ err := db.GetDB().Model(model.Timer{}).Where("last_timestamp + `interval` < ?", time.Now().Unix()).Scan(&timerModelList).Error
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, timerModel := range timerModelList {
|
|
|
+ adMsgModel := model.Admsg{}
|
|
|
+ err = db.GetDB().Model(model.Admsg{}).Where("name = ?", timerModel.AdMsgName).First(&adMsgModel).Error
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ err = db.GetDB().Model(model.Timer{}).Where("id = ?", timerModel.ID).Update("last_timestamp", time.Now().Unix()).Error
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ jsonStr := adMsgModel.Json
|
|
|
+ chattable, err := GenMsg(0, timerModel.ChatID, jsonStr, false)
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ MainBot.botApi.Send(chattable)
|
|
|
+ <-time.After(time.Second)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//按json,生成消息,输出编号
|
|
|
+func GenMsg(tgID, chatID int64, jsonStr string, save bool) (tgbotapi.Chattable, error) {
|
|
|
+ var err error
|
|
|
+
|
|
|
+ msgFormat := MsgFormatBase{}
|
|
|
+ logrus.Info("jsonStr:", jsonStr)
|
|
|
+ err = json.Unmarshal([]byte(jsonStr), &msgFormat)
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ msgFormat.Name = strings.TrimSpace(msgFormat.Name)
|
|
|
+ if msgFormat.Name == "" {
|
|
|
+ return nil, errors.New("名称不能为空")
|
|
|
+ }
|
|
|
+
|
|
|
+ chattable, err := JsonToChattable(chatID, jsonStr)
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ if save {
|
|
|
+ count := int64(0)
|
|
|
+ err = db.GetDB().Model(model.Admsg{}).Where("name = ?", msgFormat.Name).Count(&count).Error
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ if count != 0 {
|
|
|
+ return nil, errors.New("名称已经存在")
|
|
|
+ }
|
|
|
+
|
|
|
+ err = db.GetDB().Model(model.Admsg{}).Create(&model.Admsg{
|
|
|
+ Name: msgFormat.Name,
|
|
|
+ Json: jsonStr,
|
|
|
+ }).Error
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return chattable, nil
|
|
|
+}
|
|
|
+
|
|
|
+func JsonToChattable(chatID int64, jsonStr string) (tgbotapi.Chattable, error) {
|
|
|
+ var err error
|
|
|
+
|
|
|
+ msgFormat := MsgFormatBase{}
|
|
|
+ logrus.Info("jsonStr:", jsonStr)
|
|
|
+ err = json.Unmarshal([]byte(jsonStr), &msgFormat)
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ obj := tgbotapi.NewInlineKeyboardMarkup()
|
|
|
+ btnListWrap := &obj
|
|
|
+ btnList, err := parseBtnList(msgFormat.Btn1)
|
|
|
+ if err == nil && len(btnList) != 0 {
|
|
|
+ btnListWrap.InlineKeyboard = append(btnListWrap.InlineKeyboard, btnList)
|
|
|
+ }
|
|
|
+
|
|
|
+ btnList, err = parseBtnList(msgFormat.Btn2)
|
|
|
+ if err == nil && len(btnList) != 0 {
|
|
|
+ btnListWrap.InlineKeyboard = append(btnListWrap.InlineKeyboard, btnList)
|
|
|
+ }
|
|
|
+
|
|
|
+ btnList, err = parseBtnList(msgFormat.Btn3)
|
|
|
+ if err == nil && len(btnList) != 0 {
|
|
|
+ btnListWrap.InlineKeyboard = append(btnListWrap.InlineKeyboard, btnList)
|
|
|
+ }
|
|
|
+
|
|
|
+ btnList, err = parseBtnList(msgFormat.Btn4)
|
|
|
+ if err == nil && len(btnList) != 0 {
|
|
|
+ btnListWrap.InlineKeyboard = append(btnListWrap.InlineKeyboard, btnList)
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(btnListWrap.InlineKeyboard) == 0 {
|
|
|
+ btnListWrap = nil
|
|
|
+ }
|
|
|
+
|
|
|
+ logrus.Info("msgFormat:", msgFormat)
|
|
|
+ if msgFormat.Type == "文字" {
|
|
|
+ msgFormatText := MsgFormatText{}
|
|
|
+ err = json.Unmarshal([]byte(jsonStr), &msgFormatText)
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ msgFormatText.Text = strings.TrimSpace(msgFormatText.Text)
|
|
|
+ if msgFormatText.Text == "" {
|
|
|
+ return nil, errors.New("消息内容不能为空")
|
|
|
+ }
|
|
|
+
|
|
|
+ msgConfig := tgbotapi.MessageConfig{
|
|
|
+ BaseChat: tgbotapi.BaseChat{
|
|
|
+ ChatID: chatID,
|
|
|
+ ReplyMarkup: btnListWrap,
|
|
|
+ },
|
|
|
+ Text: msgFormatText.Text,
|
|
|
+ ParseMode: "MARKDOWN",
|
|
|
+ DisableWebPagePreview: true,
|
|
|
+ }
|
|
|
+
|
|
|
+ return msgConfig, nil
|
|
|
+ }
|
|
|
+
|
|
|
+ if msgFormat.Type == "图片" {
|
|
|
+ msgFormatImg := MsgFormatImg{}
|
|
|
+ err = json.Unmarshal([]byte(jsonStr), &msgFormatImg)
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ msgFormatImg.Text = strings.TrimSpace(msgFormatImg.Text)
|
|
|
+ if msgFormatImg.Text == "" {
|
|
|
+ return nil, errors.New("消息内容不能为空")
|
|
|
+ }
|
|
|
+
|
|
|
+ msgConfig := tgbotapi.PhotoConfig{
|
|
|
+ BaseFile: tgbotapi.BaseFile{
|
|
|
+ BaseChat: tgbotapi.BaseChat{
|
|
|
+ ChatID: chatID,
|
|
|
+ ReplyMarkup: btnListWrap,
|
|
|
+ },
|
|
|
+ File: tgbotapi.FileURL(msgFormatImg.ImgUrl),
|
|
|
+ },
|
|
|
+ Thumb: tgbotapi.FileURL(msgFormatImg.ImgUrl),
|
|
|
+ Caption: msgFormatImg.Text,
|
|
|
+ ParseMode: "MARKDOWN",
|
|
|
+ }
|
|
|
+
|
|
|
+ return msgConfig, nil
|
|
|
+ }
|
|
|
+
|
|
|
+ if msgFormat.Type == "动图" {
|
|
|
+ msgFormatGif := MsgFormatGif{}
|
|
|
+ err = json.Unmarshal([]byte(jsonStr), &msgFormatGif)
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ msgFormatGif.Text = strings.TrimSpace(msgFormatGif.Text)
|
|
|
+ if msgFormatGif.Text == "" {
|
|
|
+ return nil, errors.New("消息内容不能为空")
|
|
|
+ }
|
|
|
+
|
|
|
+ msgConfig := tgbotapi.AnimationConfig{
|
|
|
+ BaseFile: tgbotapi.BaseFile{
|
|
|
+ BaseChat: tgbotapi.BaseChat{
|
|
|
+ ChatID: chatID,
|
|
|
+ ReplyMarkup: btnListWrap,
|
|
|
+ },
|
|
|
+ File: tgbotapi.FileURL(msgFormatGif.ImgUrl),
|
|
|
+ },
|
|
|
+ Thumb: tgbotapi.FileURL(msgFormatGif.ImgUrl),
|
|
|
+ Caption: msgFormatGif.Text,
|
|
|
+ ParseMode: "MARKDOWN",
|
|
|
+ }
|
|
|
+
|
|
|
+ return msgConfig, nil
|
|
|
+
|
|
|
+ }
|
|
|
+ return nil, errors.New("找不到类型")
|
|
|
+}
|
|
|
+
|
|
|
+func onUpdate(e event2.Event[tgbotapi.Update]) error {
|
|
|
+ var err error
|
|
|
+
|
|
|
+ update := e.Data()
|
|
|
+ logrus.Info(update)
|
|
|
+
|
|
|
+ if update.Message == nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ chatID := update.Message.Chat.ID
|
|
|
+
|
|
|
+ msgText := update.Message.Text
|
|
|
+ if msgText == "列表" {
|
|
|
+ adMsgListModel := make([]model.Admsg, 0)
|
|
|
+ err = db.GetDB().Model(model.Admsg{}).Scan(&adMsgListModel).Error
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ SendSimpleMsg(update.Message.Chat.ID, err.Error())
|
|
|
+
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ msg := "列表\n========================\n"
|
|
|
+ for index, item := range adMsgListModel {
|
|
|
+ msg += fmt.Sprintf("%d. %s\n", index+1, item.Name)
|
|
|
+ }
|
|
|
+
|
|
|
+ msgConfig := tgbotapi.MessageConfig{
|
|
|
+ BaseChat: tgbotapi.BaseChat{
|
|
|
+ ChatID: chatID,
|
|
|
+ },
|
|
|
+ Text: msg,
|
|
|
+ ParseMode: "MARKDOWN",
|
|
|
+ DisableWebPagePreview: true,
|
|
|
+ }
|
|
|
+
|
|
|
+ MainBot.botApi.Send(msgConfig)
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ if strings.HasPrefix(msgText, "删除 ") {
|
|
|
+ deleteListStr := strings.Split(msgText, " ")
|
|
|
+ if len(deleteListStr) != 2 {
|
|
|
+ SendSimpleMsg(chatID, "格式错误: 删除 名字")
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ err = db.GetDB().Model(model.Admsg{}).Where("name = ?", deleteListStr[1]).Delete(model.Admsg{}).Error
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ SendSimpleMsg(update.Message.Chat.ID, err.Error())
|
|
|
+
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ SendSimpleMsg(chatID, "删除成功")
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ if strings.HasPrefix(msgText, "定时显示 ") {
|
|
|
+ //定时显示 定时1,180,测试5
|
|
|
+ timeerListStr := strings.Split(msgText, " ")
|
|
|
+ if len(timeerListStr) != 2 {
|
|
|
+ SendSimpleMsg(chatID, "格式错误: 定时显示 名字,时间,消息名称")
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ parameterListStr := strings.Split(timeerListStr[1], ",")
|
|
|
+ if len(parameterListStr) != 3 {
|
|
|
+ SendSimpleMsg(chatID, "格式错误: 定时显示 名字,时间,消息名称")
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ adMsgName := parameterListStr[2]
|
|
|
+
|
|
|
+ count := int64(0)
|
|
|
+ err = db.GetDB().Model(model.Admsg{}).Where("name = ?", adMsgName).Count(&count).Error
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if count == 0 {
|
|
|
+ return errors.New("名称不存在")
|
|
|
+ }
|
|
|
+
|
|
|
+ err = db.GetDB().Model(model.Timer{}).Create(&model.Timer{
|
|
|
+ Name: parameterListStr[0],
|
|
|
+ ChatID: chatID,
|
|
|
+ LastTimestamp: 0,
|
|
|
+ Interval: parse.StringToInt64(parameterListStr[1]),
|
|
|
+ AdMsgName: adMsgName,
|
|
|
+ }).Error
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ SendSimpleMsg(update.Message.Chat.ID, err.Error())
|
|
|
+
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ SendSimpleMsg(chatID, "设置成功")
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ if strings.HasPrefix(msgText, "查看 ") {
|
|
|
+ deleteListStr := strings.Split(msgText, " ")
|
|
|
+ if len(deleteListStr) != 2 {
|
|
|
+ SendSimpleMsg(chatID, "格式错误: 查看 名字")
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ adMsgModel := model.Admsg{}
|
|
|
+ err = db.GetDB().Model(model.Admsg{}).Where("name = ?", deleteListStr[1]).First(&adMsgModel).Error
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ SendSimpleMsg(update.Message.Chat.ID, err.Error())
|
|
|
+
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ jsonStr := adMsgModel.Json
|
|
|
+ chattable, err := GenMsg(update.Message.From.ID, update.Message.Chat.ID, jsonStr, false)
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ SendSimpleMsg(update.Message.Chat.ID, err.Error())
|
|
|
+
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ logrus.Info("view msg:", chattable)
|
|
|
+
|
|
|
+ _, err = MainBot.botApi.Send(chattable)
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ SendSimpleMsg(update.Message.Chat.ID, err.Error())
|
|
|
+
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ if strings.HasPrefix(msgText, "生成") {
|
|
|
+ msgText = strings.ReplaceAll(msgText, "”", `"`)
|
|
|
+ msgText = strings.ReplaceAll(msgText, "“", `"`)
|
|
|
+ msgText = strings.ReplaceAll(msgText, ":", `:`)
|
|
|
+ msgText = strings.ReplaceAll(msgText, ",", ",")
|
|
|
+
|
|
|
+ jsonStr := strings.Replace(msgText, "生成", "", -1)
|
|
|
+ chattable, err := GenMsg(update.Message.From.ID, update.Message.Chat.ID, jsonStr, true)
|
|
|
+ if err != nil {
|
|
|
+ logrus.Error(err)
|
|
|
+ SendSimpleMsg(update.Message.Chat.ID, err.Error())
|
|
|
+
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ logrus.Info("gen msg:", chattable)
|
|
|
+
|
|
|
+ MainBot.botApi.Send(chattable)
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func SendSimpleMsg(chatID int64, msg string) {
|
|
|
+ logrus.Info("SendErrorMsg:", msg)
|
|
|
+
|
|
|
+ msgConfig := tgbotapi.MessageConfig{
|
|
|
+ BaseChat: tgbotapi.BaseChat{
|
|
|
+ ChatID: chatID,
|
|
|
+ },
|
|
|
+ Text: msg,
|
|
|
+ ParseMode: "MARKDOWN",
|
|
|
+ DisableWebPagePreview: true,
|
|
|
+ }
|
|
|
+
|
|
|
+ MainBot.botApi.Send(msgConfig)
|
|
|
+}
|
|
|
+
|
|
|
+func parseBtnList(btnListStr []string) ([]tgbotapi.InlineKeyboardButton, error) {
|
|
|
+ if btnListStr == nil {
|
|
|
+ return nil, errors.New("不存在按钮")
|
|
|
+ }
|
|
|
+
|
|
|
+ resultBtn := make([]tgbotapi.InlineKeyboardButton, 0)
|
|
|
+ for _, item := range btnListStr {
|
|
|
+ btnListStr := strings.Split(item, ",")
|
|
|
+ if len(btnListStr) == 0 {
|
|
|
+ return nil, errors.New("参数错误")
|
|
|
+ }
|
|
|
+
|
|
|
+ name := btnListStr[0]
|
|
|
+ if name == "地址按钮" {
|
|
|
+ if len(btnListStr) != 3 {
|
|
|
+ return nil, errors.New("地址按钮参数错误")
|
|
|
+ }
|
|
|
+
|
|
|
+ displayName := btnListStr[1]
|
|
|
+ jumpUrl := btnListStr[2]
|
|
|
+ resultBtn = append(resultBtn, tgbotapi.NewInlineKeyboardButtonURL(displayName, jumpUrl))
|
|
|
+ }
|
|
|
+
|
|
|
+ if name == "分享按钮" {
|
|
|
+ if len(btnListStr) != 3 {
|
|
|
+ return nil, errors.New("分享按钮参数错误")
|
|
|
+ }
|
|
|
+
|
|
|
+ displayName := btnListStr[1]
|
|
|
+ shareStr := btnListStr[2]
|
|
|
+
|
|
|
+ shareBtn := tgbotapi.InlineKeyboardButton{
|
|
|
+ Text: displayName,
|
|
|
+ SwitchInlineQuery: &shareStr,
|
|
|
+ }
|
|
|
+
|
|
|
+ resultBtn = append(resultBtn, shareBtn)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return resultBtn, nil
|
|
|
+}
|