Files
2026-03-28 13:14:07 +08:00

365 lines
14 KiB
Go

package middleware
import (
"context"
"github.com/go-telegram/bot"
"github.com/go-telegram/bot/models"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"trle5.xyz/trbot/utils"
"trle5.xyz/trbot/utils/type/message_utils"
"trle5.xyz/trbot/utils/type/update_utils"
)
func ZeroLog(logger zerolog.Logger) func (next bot.HandlerFunc) bot.HandlerFunc {
return func(next bot.HandlerFunc) bot.HandlerFunc {
return func(ctx context.Context, bot *bot.Bot, update *models.Update) {
ctx = logger.WithContext(ctx)
next(ctx, bot, update)
}
}
}
func ZeroLogRequestLog(next bot.HandlerFunc) bot.HandlerFunc {
return func(ctx context.Context, bot *bot.Bot, update *models.Update) {
logger := zerolog.Ctx(ctx)
if logger.GetLevel() == zerolog.Disabled {
logger = &log.Logger
}
updateType := update_utils.GetUpdateType(update)
switch updateType.AsType() {
case update_utils.Message:
// 正常消息
if update.Message.Photo != nil {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.Message)).
Dict(utils.GetChatDict(&update.Message.Chat)).
Int("messageID", update.Message.ID).
Str("caption", update.Message.Caption).
Str("photoID", update.Message.Photo[len(update.Message.Photo)-1].FileID).
Msg("photoMessage")
} else if update.Message.Sticker != nil {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.Message)).
Dict(utils.GetChatDict(&update.Message.Chat)).
Int("messageID", update.Message.ID).
Dict("sticker", zerolog.Dict().
Str("emoji", update.Message.Sticker.Emoji).
Str("setname", update.Message.Sticker.SetName).
Str("fileID", update.Message.Sticker.FileID),
).
Msg("stickerMessage")
} else if update.Message.Video != nil {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.Message)).
Dict(utils.GetChatDict(&update.Message.Chat)).
Int("messageID", update.Message.ID).
Str("caption", update.Message.Caption).
Dict("video", zerolog.Dict().
Str("type", update.Message.Video.MimeType).
Int("duration", update.Message.Video.Duration).
Str("fileID", update.Message.Video.FileID),
).
Msg("videoMessage")
} else if update.Message.Animation != nil {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.Message)).
Dict(utils.GetChatDict(&update.Message.Chat)).
Int("messageID", update.Message.ID).
Dict("animation", zerolog.Dict().
Int("duration", update.Message.Animation.Duration).
Str("fileID", update.Message.Animation.FileID),
).
Msg("gifMessage")
} else if update.Message.Document != nil {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.Message)).
Dict(utils.GetChatDict(&update.Message.Chat)).
Int("messageID", update.Message.ID).
Str("caption", update.Message.Caption).
Dict("document", zerolog.Dict().
Str("fileName", update.Message.Document.FileName).
Str("fileID", update.Message.Document.FileID),
).
Msg("documentMessage")
} else if update.Message.PinnedMessage != nil {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.Message)).
Dict(utils.GetChatDict(&update.Message.Chat)).
Int("messageID", update.Message.ID).
Msg("pinnedMessage")
} else if update.Message.NewChatMembers != nil {
for _, chatMember := range update.Message.NewChatMembers {
logger.Info().
Dict(utils.GetUserDict(&chatMember)).
Dict(utils.GetChatDict(&update.Message.Chat)).
Int("messageID", update.Message.ID).
Msg("newChatMemberMessage")
}
} else if update.Message.LeftChatMember != nil {
logger.Info().
Dict(utils.GetUserDict(update.Message.LeftChatMember)).
Dict(utils.GetChatDict(&update.Message.Chat)).
Int("messageID", update.Message.ID).
Msg("leftChatMemberMessage")
} else {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.Message)).
Dict(utils.GetChatDict(&update.Message.Chat)).
Int("messageID", update.Message.ID).
Str("text", update.Message.Text).
Str("type", message_utils.GetMessageType(update.Message).Str()).
Msg("normalMessage")
}
case update_utils.EditedMessage:
// 私聊或群组消息被编辑
if update.EditedMessage.Caption != "" {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.EditedMessage)).
Dict(utils.GetChatDict(&update.EditedMessage.Chat)).
Int("messageID", update.EditedMessage.ID).
Str("editedCaption", update.EditedMessage.Caption).
Msg("editedMessage")
} else {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.EditedMessage)).
Dict(utils.GetChatDict(&update.EditedMessage.Chat)).
Int("messageID", update.EditedMessage.ID).
Str("editedText", update.EditedMessage.Text).
Msg("editedMessage")
}
case update_utils.InlineQuery:
// inline 查询
logger.Info().
Dict(utils.GetUserDict(update.InlineQuery.From)).
Str("query", update.InlineQuery.Query).
Msg("inline request")
case update_utils.ChosenInlineResult:
// inline 查询结果被选择
logger.Info().
Dict(utils.GetUserDict(&update.ChosenInlineResult.From)).
Str("query", update.ChosenInlineResult.Query).
Str("resultID", update.ChosenInlineResult.ResultID).
Msg("chosen inline result")
case update_utils.CallbackQuery:
// replymarkup 回调
var chat = zerolog.Dict()
if update.CallbackQuery.Message.Message != nil {
// some time `update.CallbackQuery.Message` will be nil
_, chat = utils.GetChatDict(&update.CallbackQuery.Message.Message.Chat)
}
logger.Info().
Dict(utils.GetUserDict(&update.CallbackQuery.From)).
Dict("chat", chat).
Str("callbackQueryData", update.CallbackQuery.Data).
Msg("callback query")
case update_utils.MessageReaction:
// 私聊或群组表情回应
if len(update.MessageReaction.OldReaction) > 0 {
for i, oldReaction := range update.MessageReaction.OldReaction {
if oldReaction.ReactionTypeEmoji != nil {
logger.Info().
Dict(utils.GetUserDict(update.MessageReaction.User)).
Dict(utils.GetChatDict(&update.MessageReaction.Chat)).
Int("messageID", update.MessageReaction.MessageID).
Str("removedEmoji", oldReaction.ReactionTypeEmoji.Emoji).
Str("emojiType", string(oldReaction.ReactionTypeEmoji.Type)).
Int("count", i+1).
Msg("removed emoji reaction")
} else if oldReaction.ReactionTypeCustomEmoji != nil {
logger.Info().
Dict(utils.GetUserDict(update.MessageReaction.User)).
Dict(utils.GetChatDict(&update.MessageReaction.Chat)).
Int("messageID", update.MessageReaction.MessageID).
Str("removedEmojiID", oldReaction.ReactionTypeCustomEmoji.CustomEmojiID).
Str("emojiType", string(oldReaction.ReactionTypeCustomEmoji.Type)).
Int("count", i+1).
Msg("removed custom emoji reaction")
} else if oldReaction.ReactionTypePaid != nil {
logger.Info().
Dict(utils.GetUserDict(update.MessageReaction.User)).
Dict(utils.GetChatDict(&update.MessageReaction.Chat)).
Int("messageID", update.MessageReaction.MessageID).
Str("emojiType", string(oldReaction.ReactionTypePaid.Type)).
Int("count", i+1).
Msg("removed paid emoji reaction")
}
}
}
if len(update.MessageReaction.NewReaction) > 0 {
for i, newReaction := range update.MessageReaction.NewReaction {
if newReaction.ReactionTypeEmoji != nil {
logger.Info().
Dict(utils.GetUserDict(update.MessageReaction.User)).
Dict(utils.GetChatDict(&update.MessageReaction.Chat)).
Int("messageID", update.MessageReaction.MessageID).
Str("addEmoji", newReaction.ReactionTypeEmoji.Emoji).
Str("emojiType", string(newReaction.ReactionTypeEmoji.Type)).
Int("count", i+1).
Msg("add emoji reaction")
} else if newReaction.ReactionTypeCustomEmoji != nil {
logger.Info().
Dict(utils.GetUserDict(update.MessageReaction.User)).
Dict(utils.GetChatDict(&update.MessageReaction.Chat)).
Int("messageID", update.MessageReaction.MessageID).
Str("addEmojiID", newReaction.ReactionTypeCustomEmoji.CustomEmojiID).
Str("emojiType", string(newReaction.ReactionTypeCustomEmoji.Type)).
Int("count", i+1).
Msg("add custom emoji reaction")
} else if newReaction.ReactionTypePaid != nil {
logger.Info().
Dict(utils.GetUserDict(update.MessageReaction.User)).
Dict(utils.GetChatDict(&update.MessageReaction.Chat)).
Int("messageID", update.MessageReaction.MessageID).
Str("emojiType", string(newReaction.ReactionTypePaid.Type)).
Int("count", i+1).
Msg("add paid emoji reaction")
}
}
}
case update_utils.MessageReactionCount:
// 频道消息表情回应数量
var emoji = zerolog.Dict()
var customEmoji = zerolog.Dict()
var paid = zerolog.Dict()
for _, n := range update.MessageReactionCount.Reactions {
switch n.Type.Type {
case models.ReactionTypeTypeEmoji:
emoji.Dict(n.Type.ReactionTypeEmoji.Emoji, zerolog.Dict().
// Str("type", string(n.Type.ReactionTypeEmoji.Type)).
// Str("emoji", n.Type.ReactionTypeEmoji.Emoji).
Int("count", n.TotalCount),
)
case models.ReactionTypeTypeCustomEmoji:
customEmoji.Dict(n.Type.ReactionTypeCustomEmoji.CustomEmojiID, zerolog.Dict().
// Str("type", string(n.Type.ReactionTypeCustomEmoji.Type)).
// Str("customEmojiID", n.Type.ReactionTypeCustomEmoji.CustomEmojiID).
Int("count", n.TotalCount),
)
case models.ReactionTypeTypePaid:
paid.Dict(n.Type.ReactionTypePaid.Type, zerolog.Dict().
// Str("type", n.Type.ReactionTypePaid.Type).
Int("count", n.TotalCount),
)
}
}
logger.Info().
Dict(utils.GetChatDict(&update.MessageReactionCount.Chat)).
Dict("reactions", zerolog.Dict().
Dict("emoji", emoji).
Dict("customEmoji", customEmoji).
Dict("paid", paid),
).
Int("messageID", update.MessageReactionCount.MessageID).
Msg("emoji reaction count updated")
case update_utils.ChannelPost:
// 频道信息
if update.ChannelPost.Photo != nil {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.ChannelPost)).
Dict(utils.GetChatDict(&update.ChannelPost.Chat)).
Int("messageID", update.ChannelPost.ID).
Str("caption", update.ChannelPost.Caption).
Str("photoID", update.ChannelPost.Photo[len(update.ChannelPost.Photo)-1].FileID).
Msg("channelPhoto")
} else if update.ChannelPost.Sticker != nil {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.ChannelPost)).
Dict(utils.GetChatDict(&update.ChannelPost.Chat)).
Int("messageID", update.ChannelPost.ID).
Dict("sticker", zerolog.Dict().
Str("emoji", update.ChannelPost.Sticker.Emoji).
Str("setname", update.ChannelPost.Sticker.SetName).
Str("fileID", update.ChannelPost.Sticker.FileID),
).
Msg("channelSticker")
} else if update.ChannelPost.Video != nil {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.ChannelPost)).
Dict(utils.GetChatDict(&update.ChannelPost.Chat)).
Int("messageID", update.ChannelPost.ID).
Str("caption", update.ChannelPost.Caption).
Dict("video", zerolog.Dict().
Str("type", update.ChannelPost.Video.MimeType).
Int("duration", update.ChannelPost.Video.Duration).
Str("fileID", update.ChannelPost.Video.FileID),
).
Msg("channelVideo")
} else if update.ChannelPost.Animation != nil {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.ChannelPost)).
Dict(utils.GetChatDict(&update.ChannelPost.Chat)).
Int("messageID", update.ChannelPost.ID).
Dict("animation", zerolog.Dict().
Int("duration", update.ChannelPost.Animation.Duration).
Str("fileID", update.ChannelPost.Animation.FileID),
).
Msg("channelGIF")
} else if update.ChannelPost.Document != nil {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.ChannelPost)).
Dict(utils.GetChatDict(&update.ChannelPost.Chat)).
Int("messageID", update.ChannelPost.ID).
Str("caption", update.ChannelPost.Caption).
Dict("document", zerolog.Dict().
Str("fileName", update.ChannelPost.Document.FileName).
Str("fileID", update.ChannelPost.Document.FileID),
).
Msg("channelDocument")
} else if update.ChannelPost.PinnedMessage != nil {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.ChannelPost)).
Dict(utils.GetChatDict(&update.ChannelPost.Chat)).
Int("messageID", update.ChannelPost.ID).
Msg("channelPinnedMessage")
} else {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.ChannelPost)).
Dict(utils.GetChatDict(&update.ChannelPost.Chat)).
Int("messageID", update.ChannelPost.ID).
Str("text", update.ChannelPost.Text).
Str("type", message_utils.GetMessageType(update.ChannelPost).Str()).
Msg("channelPost")
}
case update_utils.EditedChannelPost:
// 频道中编辑过的消息
if update.EditedChannelPost.Caption != "" {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.EditedChannelPost)).
Dict(utils.GetChatDict(&update.EditedChannelPost.Chat)).
Int("messageID", update.EditedChannelPost.ID).
Str("editedCaption", update.EditedChannelPost.Caption).
Msg("edited channel post caption")
} else {
logger.Info().
Dict(utils.GetUserOrSenderChatDict(update.EditedChannelPost)).
Dict(utils.GetChatDict(&update.EditedChannelPost.Chat)).
Int("messageID", update.EditedChannelPost.ID).
Str("editedText", update.EditedChannelPost.Text).
Msg("edited channel post")
}
case update_utils.ChatMember:
logger.Info().
Dict(utils.GetUserDict(&update.ChatMember.From)).
Dict(utils.GetChatDict(&update.ChatMember.Chat)).
Str("oldType", string(update.ChatMember.OldChatMember.Type)).
Str("newType", string(update.ChatMember.NewChatMember.Type)).
Str("notice", "the user field may not be the actual user whose status was changed").
Msg("chatMemberUpdated")
default:
// 其他没有加入的更新类型
logger.Warn().
Str("updateType", updateType.Str()).
Msg("Receive a no tagged update type")
}
next(ctx, bot, update)
}
}