JS
Size: a a a
JS
З🧟
JS
JS
З🧟
N
З🧟
З🧟
package controllers
import (
"fmt"
"github.com/jinzhu/gorm"
"github.com/zombiedevel/photobot/models"
"github.com/zombiedevel/photobot/payments"
"github.com/zombiedevel/photobot/pkg/database"
"github.com/zombiedevel/photobot/utils"
tb "gopkg.in/tucnak/telebot.v2"
"log"
"time"
)
var db *gorm.DB
var err error
func StartCommand(m *tb.Message, b *tb.Bot) {
if createUser(m.Sender) {
log.Printf("User %s Telegram ID: %d created.", m.Sender.Username, m.Sender.ID)
}
u := getUserData(m.Sender)
msg, err := utils.MsgTpl("start", "templates/bot/start.tmpl", &struct {
FirstName string
Balance int
MsgBalance bool
}{
FirstName: u.FirstName,
Balance: u.Balance,
MsgBalance: func(b int) bool { return b > 0 }(u.Balance),
})
utils.CheckError(err)
b.Send(m.Sender, msg, &tb.SendOptions{ParseMode: tb.ModeHTML})
}
func createUser(u *tb.User) bool {
db = database.GetDB()
var user models.Users
user.TelegramId = u.ID
user.Username = u.Username
user.FirstName = u.FirstName
user.Balance = 0
db.Model(&models.Users{}).Create(&user)
if user.ID > 0 {
return true
} else {
return false
}
}
//Сообщение с оплатой
func PaymentReply(m *tb.Message, b *tb.Bot) {
keyInline := &tb.ReplyMarkup{Selective: false}
var btnPay50 = keyInline.Data("Оплатить 50р", "pay_50", "50")
var btnPay100 = keyInline.Data("Оплатить 100р", "pay_100", "100")
var btnPay200 = keyInline.Data("Оплатить 200р", "pay_200", "200")
keyInline.Inline(keyInline.Row(btnPay50, btnPay100, btnPay200))
msg, err := utils.MsgTpl("balance", "templates/bot/balance.tmpl", &struct {
Balance int
}{
Balance: getUserBalance(m.Sender),
})
utils.CheckError(err)
b.Reply(m, msg, keyInline)
b.Handle(&btnPay50, payHandle(m, b, 50))
b.Handle(&btnPay100, payHandle(m, b, 100))
b.Handle(&btnPay200, payHandle(m, b, 200))
}
func payHandle(m *tb.Message, b *tb.Bot, sum int) func(c *tb.Callback) {
return func(c *tb.Callback) {
payButtons := &tb.ReplyMarkup{Selective: false}
pay := payments.YooRequestPay(sum, m.Sender.ID, "bank_card")
payButtons.Inline(payButtons.Row(payButtons.URL(fmt.Sprintf("Оплатить %d рублей", sum), pay.Confirmation.ConfirmationURL)))
b.Reply(m, fmt.Sprintf("Оплата %d рублей", sum), payButtons)
go func() {
for _ = range time.Tick(time.Second * 3) {
if payments.YooPayStatusRequest(pay.ID).Status == "waiting_for_capture" {
msg, err := utils.MsgTpl("start", "templates/bot/pay_success.tmpl", &struct {
Balance int
}{
Balance: addUserBalance(sum, m.Sender),
})
utils.CheckError(err)
b.Reply(m, msg, &tb.SendOptions{ParseMode: tb.ModeHTML})
return
}
}
}()
}
}
func PhotoReply(m *tb.Message, b *tb.Bot) {
if deductUserBalance(m.Sender) == true {
//b.Reply(m, "You send as photo. For high quality please send as file.")
save := saveImage(m, b, "photo")
p := &tb.Photo{File: tb.FromDisk(save)}
b.SendAlbum(m.Sender, tb.Album{p, p})
} else {
PaymentReply(m, b)
}
}
func DocumentReply(m *tb.Message, b *tb.Bot) {
if deductUserBalance(m.Sender) == true {
//b.Reply(m, "You send as photo. For high quality please send as file.")
save := saveImage(m, b, "document")
p := &tb.Photo{File: tb.FromDisk(save)}
b.SendAlbum(m.Sender, tb.Album{p, p})
} else {
PaymentReply(m, b)
}
}
func saveImage(m *tb.Message, b *tb.Bot, t string) string {
path := fmt.Sprintf("uploads/%s.jpg", utils.MakeUUID())
fmt.Println(path)
switch t {
case "photo":
b.Download(&m.Photo.File, path)
case "document": b.Download(&m.Document.File, path)
}
return path
}
func getUserBalance(u *tb.User) int {
db = database.GetDB()
var user models.Users
db.Model(&models.Users{}).Select("balance").Where("telegram_id = ?", u.ID).First(&user)
return user.Balance
}
З🧟
//Информация о пользователе
func getUserData(u *tb.User) models.Users {
db = database.GetDB()
var user models.Users
db.Model(&models.Users{}).Where("telegram_id = ?", u.ID).First(&user)
return user
}
func addUserBalance(sum int, u *tb.User) int {
db = database.GetDB()
currentBalance := getUserBalance(u)
db.Model(&models.Users{}).Where("telegram_id = ?", u.ID).Update("balance", currentBalance+sum)
return getUserBalance(u)
}
func deductUserBalance(u *tb.User) bool {
db = database.GetDB()
drop := 50
currentBalance := getUserBalance(u)
fmt.Println(currentBalance)
if currentBalance > 0 && currentBalance >= drop {
db.Model(&models.Users{}).Where("telegram_id = ?", u.ID).Update("balance", currentBalance-drop)
return true
} else {
return false
}
}
З🧟
З🧟
JS
JS
JS
JS
З🧟
З🧟
NR
З🧟
NR