From b023de86eeb72a550f49d27e9bff4b33cefbc9ee Mon Sep 17 00:00:00 2001 From: Vaala Cat Date: Mon, 28 Aug 2023 17:22:04 +0800 Subject: [PATCH] feat: support ban and kick --- services/handler.go | 2 +- services/mc/auth.go | 6 +++--- services/mc/helper.go | 12 ++++++------ services/mc/mc.go | 2 +- services/tgbot/bot.go | 4 +++- services/tgbot/kick.go | 30 ++++++++++++++++++++++++++++++ services/tgbot/set.go | 25 +++++++++++++++++++++++-- 7 files changed, 67 insertions(+), 14 deletions(-) create mode 100644 services/tgbot/kick.go diff --git a/services/handler.go b/services/handler.go index 080e9b3..30ee690 100644 --- a/services/handler.go +++ b/services/handler.go @@ -14,5 +14,5 @@ func Run() { } } }() - tgbot.Run(mc.SendMsg) + tgbot.Run(mc.SendMsg, mc.SendCommand) } diff --git a/services/mc/auth.go b/services/mc/auth.go index 60295b6..2a9ae1d 100644 --- a/services/mc/auth.go +++ b/services/mc/auth.go @@ -28,9 +28,9 @@ func GetAuthcator() Auth { } func (a *Authcator) IsAuthed(u models.User, expireMode bool) bool { - if u.MCName != "VaalaCat" { - return true - } + // if u.MCName != "VaalaCat" { + // return true + // } if approveTime, ok := a.UserMap.Load(u.MCName); ok { if !expireMode { return true diff --git a/services/mc/helper.go b/services/mc/helper.go index 383289f..72897bd 100644 --- a/services/mc/helper.go +++ b/services/mc/helper.go @@ -52,7 +52,7 @@ func HandleJoinGame(userName string, mention bool, expireMode bool) { tgbotapi.NewInlineKeyboardButtonData("拒绝", defs.NewRejectCommand(u.MCName).ToJSON())), ) conf.Bot.Send(m) - kickPlayer(userName) + KickPlayer(userName) return } if mention { @@ -61,7 +61,7 @@ func HandleJoinGame(userName string, mention bool, expireMode bool) { case StatusPending: SendMsgToPlayer("你还没有绑定 Telegram 哦, 5秒后你将会被踢出。请在群组中发送 /bind <你的 MC 用户名> 进行绑定。", userName) time.Sleep(5 * time.Second) - kickPlayer(userName) + KickPlayer(userName) m := tgbotapi.NewMessage(conf.GetBotSettings().GroupID, fmt.Sprintf("用户:%v 没有绑定,尝试登录已被T出", userName)) conf.Bot.Send(m) case StatusBanned: @@ -71,13 +71,13 @@ func HandleJoinGame(userName string, mention bool, expireMode bool) { default: SendMsgToPlayer("未知错误,请联系管理员,你将被踢出", userName) time.Sleep(3 * time.Second) - kickPlayer(userName) + KickPlayer(userName) m := tgbotapi.NewMessage(conf.GetBotSettings().GroupID, fmt.Sprintf("用户:%v 登录失败,错误未知,已被T出", userName)) conf.Bot.Send(m) } } -func sendCommand(cmd string) error { +func SendCommand(cmd string) error { var salt int64 if err := binary.Read(rand.Reader, binary.BigEndian, &salt); err != nil { return err @@ -95,8 +95,8 @@ func sendCommand(cmd string) error { return err } -func kickPlayer(userName string) error { - err := sendCommand("kick " + userName) +func KickPlayer(userName string) error { + err := SendCommand("kick " + userName) return err } diff --git a/services/mc/mc.go b/services/mc/mc.go index 802853d..aa4c955 100644 --- a/services/mc/mc.go +++ b/services/mc/mc.go @@ -63,7 +63,7 @@ func SendMsg(msg string) { func SendMsgToPlayer(msg string, playerName string) { go func() { - err := sendCommand(fmt.Sprintf("tell %s %s", playerName, msg)) + err := SendCommand(fmt.Sprintf("tell %s %s", playerName, msg)) if err != nil { logrus.Error("send msg to player error: ", err) } diff --git a/services/tgbot/bot.go b/services/tgbot/bot.go index 266428d..0030456 100644 --- a/services/tgbot/bot.go +++ b/services/tgbot/bot.go @@ -18,6 +18,8 @@ var funcHandlers = map[string]func(*tgbotapi.Message, interface{}){ "unbind": UnbindHandler, "get": GetHandler, "set": SetHandler, + "kick": KickHandler, + "ban": BanHandler, } var callBackHandlers = map[string]func(tgbotapi.Update, defs.Command){ @@ -56,7 +58,7 @@ func init() { log.Printf("Authorized on account %s", conf.Bot.Self.UserName) } -func Run(sendFunc func(string)) { +func Run(sendFunc func(string), cmdFunc func(string) error) { u := tgbotapi.NewUpdate(0) u.Timeout = 60 updates := conf.Bot.GetUpdatesChan(u) diff --git a/services/tgbot/kick.go b/services/tgbot/kick.go new file mode 100644 index 0000000..5201f3f --- /dev/null +++ b/services/tgbot/kick.go @@ -0,0 +1,30 @@ +package tgbot + +import ( + "fmt" + "tg-mc/conf" + "tg-mc/models" + + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" +) + +func KickHandler(m *tgbotapi.Message, i interface{}) { + f, ok := i.(func(string) error) + if !ok { + return + } + + u, err := models.GetUserByTGID(m.From.ID) + if err != nil { + conf.Bot.Send(tgbotapi.NewMessage(m.Chat.ID, "您还没有绑定账号,请先绑定")) + return + } + + err = f(fmt.Sprintf("kick %s", u.MCName)) + if err != nil { + conf.Bot.Send(tgbotapi.NewMessage(m.Chat.ID, err.Error())) + return + } + + conf.Bot.Send(tgbotapi.NewMessage(m.Chat.ID, fmt.Sprintf("已踢出用户 %s", u.MCName))) +} diff --git a/services/tgbot/set.go b/services/tgbot/set.go index d33301e..1187f8a 100644 --- a/services/tgbot/set.go +++ b/services/tgbot/set.go @@ -2,23 +2,31 @@ package tgbot import ( "fmt" + "math/rand" "strconv" "tg-mc/conf" "tg-mc/models" "tg-mc/services/utils" commonUtils "tg-mc/utils" + "time" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" "github.com/samber/lo" ) func SetHandler(m *tgbotapi.Message, i interface{}) { + var a []string + if t, ok := i.([]string); ok { + a = t + } else { + a = commonUtils.GetArgs(m.CommandArguments()) + } + if !utils.IsAdmin(m) { tm := tgbotapi.NewMessage(m.Chat.ID, "您不是管理员,没有该权限") conf.Bot.Send(tm) return } - a := commonUtils.GetArgs(m.CommandArguments()) if len(a) != 3 { tm := tgbotapi.NewMessage(m.Chat.ID, "参数错误,样例:\n```\n/set username tgid status\n```") tm.ParseMode = "Markdown" @@ -46,5 +54,18 @@ func SetHandler(m *tgbotapi.Message, i interface{}) { return } conf.Bot.Send(tgbotapi.NewMessage(m.Chat.ID, "设置用户成功")) - return +} + +func BanHandler(m *tgbotapi.Message, i interface{}) { + rand.Seed(time.Now().UnixNano()) + randomNumber := rand.Intn(11) + for { + _, err := models.GetUserByTGID(int64(randomNumber)) + if err != nil { + break + } else { + randomNumber = rand.Intn(11) + } + } + SetHandler(m, []string{m.CommandArguments(), fmt.Sprintf("-%d", randomNumber), "2"}) }