Allowing resending captcha
This commit is contained in:
parent
cb030a60d1
commit
c5490d64a3
|
@ -2,3 +2,4 @@
|
|||
bot.db
|
||||
.env
|
||||
.vscode
|
||||
kickbot
|
||||
|
|
1
go.mod
1
go.mod
|
@ -13,6 +13,7 @@ require (
|
|||
github.com/google/uuid v1.5.0 // indirect
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
github.com/jmoiron/sqlx v1.4.0 // indirect
|
||||
github.com/joho/godotenv v1.5.1 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
||||
github.com/spf13/cobra v0.0.5 // indirect
|
||||
|
|
2
go.sum
2
go.sum
|
@ -27,6 +27,8 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH
|
|||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=
|
||||
github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY=
|
||||
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
|
|
|
@ -68,7 +68,7 @@ func InitResources() {
|
|||
|
||||
}
|
||||
|
||||
func GenCaptcha() ([]byte, string) {
|
||||
func GenCaptcha(answer string) ([]byte, string) {
|
||||
width, height := 500.0, 500.0
|
||||
ctx := gg.NewContext(int(width), int(height))
|
||||
// Make gradient
|
||||
|
@ -91,9 +91,15 @@ func GenCaptcha() ([]byte, string) {
|
|||
|
||||
items := []Item{}
|
||||
for i, image := range Images {
|
||||
var code string
|
||||
if i == CorrectImage {
|
||||
code = answer
|
||||
} else {
|
||||
code = generateRandomDigits(4)
|
||||
}
|
||||
items = append(items, Item{
|
||||
img: image,
|
||||
code: generateRandomDigits(4),
|
||||
code: code,
|
||||
correct: i == CorrectImage,
|
||||
})
|
||||
}
|
||||
|
|
|
@ -13,7 +13,8 @@ id INTEGER PRIMARY KEY,
|
|||
name TEXT NOT NULL,
|
||||
username TEXT DEFAULT '',
|
||||
topic INTEGER DEFAULT 0,
|
||||
active INTEGER DEFAULT 0
|
||||
active INTEGER DEFAULT 0,
|
||||
rules_msg TEXT DEFAULT ''
|
||||
);
|
||||
|
||||
create table if not exists activations
|
||||
|
@ -79,6 +80,7 @@ type Chat struct {
|
|||
Username string `json:"username" db:"username"`
|
||||
Topic int `json:"topic" db:"topic"`
|
||||
Active bool `json:"active" db:"active"`
|
||||
RulesMsg string `json:"rules_msg" db:"rules_msg"`
|
||||
}
|
||||
|
||||
type MessageToDelete struct {
|
||||
|
|
|
@ -106,6 +106,10 @@ var NewUserTemplate = `
|
|||
|
||||
func handleNewJoined(ctx context.Context, b *bot.Bot, u *models.Update) {
|
||||
var chat Chat
|
||||
b.DeleteMessage(ctx, &bot.DeleteMessageParams{
|
||||
ChatID: u.Message.Chat.ID,
|
||||
MessageID: u.Message.ID,
|
||||
})
|
||||
err := db.Get(&chat, "select * from chats where id = $1 and active = 1", u.Message.Chat.ID)
|
||||
if err != nil {
|
||||
log.Println("can't get chat for new joined: ", err)
|
||||
|
@ -120,7 +124,7 @@ func handleNewJoined(ctx context.Context, b *bot.Bot, u *models.Update) {
|
|||
ReplyMarkup: models.InlineKeyboardMarkup{
|
||||
InlineKeyboard: [][]models.InlineKeyboardButton{
|
||||
{
|
||||
{URL: fmt.Sprintf("https://t.me/nefrace_php_test_bot?start=cap_%d", u.Message.Chat.ID), Text: "Check"},
|
||||
{URL: fmt.Sprintf("https://t.me/%s?start=cap_%d", BOT_NAME, u.Message.Chat.ID), Text: "Check"},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -255,6 +259,7 @@ var NewCaptchaTemplate = `
|
|||
|
||||
func handlePrivateStartCaptcha(ctx context.Context, b *bot.Bot, u *models.Update) {
|
||||
args := strings.Split(u.Message.Text, " ")
|
||||
log.Println(u.Message.From.FirstName, u.Message.Text)
|
||||
userID := u.Message.From.ID
|
||||
chatID := 0
|
||||
if len(args) > 1 {
|
||||
|
@ -307,10 +312,10 @@ WHERE captchas.id = $1`, captcha.Id)
|
|||
}
|
||||
|
||||
if captcha.CorrectAnswer == "" {
|
||||
img, answer := GenCaptcha()
|
||||
img, answer := GenCaptcha(generateRandomDigits(4))
|
||||
captcha.CorrectAnswer = answer
|
||||
if _, err := b.SendPhoto(ctx, &bot.SendPhotoParams{
|
||||
Caption: fmt.Sprintf(NewCaptchaTemplate, userchat.UserName, userchat.ChatName),
|
||||
Caption: fmt.Sprintf(NewCaptchaTemplate, bot.EscapeMarkdown(userchat.UserName), bot.EscapeMarkdown(userchat.ChatName)),
|
||||
Photo: &models.InputFileUpload{Filename: "captcha.png", Data: bytes.NewReader(img)},
|
||||
ChatID: u.Message.Chat.ID,
|
||||
ParseMode: models.ParseModeMarkdown,
|
||||
|
@ -322,10 +327,15 @@ WHERE captchas.id = $1`, captcha.Id)
|
|||
log.Println("Can't update captcha:", err)
|
||||
}
|
||||
} else {
|
||||
b.SendMessage(ctx, &bot.SendMessageParams{
|
||||
Text: fmt.Sprintf("Я тебе уже выдавал капчу для %d", captcha.ChatID),
|
||||
img, _ := GenCaptcha(captcha.CorrectAnswer)
|
||||
if _, err := b.SendPhoto(ctx, &bot.SendPhotoParams{
|
||||
Caption: fmt.Sprintf(NewCaptchaTemplate, bot.EscapeMarkdown(userchat.UserName), bot.EscapeMarkdown(userchat.ChatName)),
|
||||
Photo: &models.InputFileUpload{Filename: "captcha.png", Data: bytes.NewReader(img)},
|
||||
ChatID: u.Message.Chat.ID,
|
||||
})
|
||||
ParseMode: models.ParseModeMarkdown,
|
||||
}); err != nil {
|
||||
log.Println("can't send private captcha: ", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -388,8 +398,28 @@ func handlePrivateCaptcha(ctx context.Context, b *bot.Bot, u *models.Update) {
|
|||
log.Println("Deleting message:", result, err)
|
||||
db.Exec("delete from captchas where id = $1", captcha.Id)
|
||||
|
||||
b.SendMessage(ctx, &bot.SendMessageParams{
|
||||
Text: "Капча решена! Поздравляю! Теперь можешь вернуться в чат, я вернул тебе возможность отправлять там сообщения.\n\nСоветую ознакомиться с местными правилами, прежде чем что-либо писать!",
|
||||
congrats := `
|
||||
Капча решена, поздравляю\!
|
||||
Теперь можешь вернуться в чат, я вернул тебе возможность отправлять там сообщения\.
|
||||
`
|
||||
rulesText := `Советую ознакомиться с местными [правилами](%s), прежде чем что\-либо писать\!`
|
||||
fullCongrats := congrats
|
||||
|
||||
var chat Chat
|
||||
err = db.Get(&chat, "select * from chats where id = $1", captcha.ChatID)
|
||||
if err == nil {
|
||||
if chat.RulesMsg != "" {
|
||||
rules := fmt.Sprintf(rulesText, chat.RulesMsg)
|
||||
fullCongrats = fmt.Sprintf("%s\n\n%s", congrats, rules)
|
||||
}
|
||||
}
|
||||
|
||||
_, err = b.SendMessage(ctx, &bot.SendMessageParams{
|
||||
Text: fullCongrats,
|
||||
ParseMode: models.ParseModeMarkdown,
|
||||
ChatID: msg.From.ID,
|
||||
})
|
||||
if err != nil {
|
||||
log.Println("Can't send congrats: ", err, "\n===\n", fullCongrats)
|
||||
}
|
||||
}
|
||||
|
|
14
src/main.go
14
src/main.go
|
@ -11,11 +11,19 @@ import (
|
|||
_ "github.com/glebarez/go-sqlite"
|
||||
"github.com/go-telegram/bot"
|
||||
"github.com/go-telegram/bot/models"
|
||||
"github.com/joho/godotenv"
|
||||
)
|
||||
|
||||
var BOT_NAME string
|
||||
|
||||
func main() {
|
||||
log.SetFlags(log.Lshortfile + log.Ltime + log.Ldate)
|
||||
InitResources()
|
||||
err := godotenv.Load()
|
||||
if err != nil {
|
||||
log.Println("No .env loaded. Relying on existing variables")
|
||||
}
|
||||
|
||||
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
|
||||
defer cancel()
|
||||
|
||||
|
@ -35,6 +43,12 @@ func main() {
|
|||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
me, err := b.GetMe(ctx)
|
||||
if err != nil {
|
||||
log.Fatalf("Can't get me: %v", err)
|
||||
}
|
||||
BOT_NAME = me.Username
|
||||
log.Println("Using name", BOT_NAME)
|
||||
|
||||
b.RegisterHandler(bot.HandlerTypeMessageText, "/register", bot.MatchTypePrefix, registerChat)
|
||||
b.RegisterHandler(bot.HandlerTypeMessageText, "/unregister", bot.MatchTypePrefix, unregisterChat)
|
||||
|
|
Loading…
Reference in New Issue