Merge pull request #8 from ServerusSnap/feature

split tg-groups
This commit is contained in:
Serverus Snap
2025-11-21 15:49:44 +03:00
committed by GitHub
6 changed files with 133 additions and 115 deletions

View File

@@ -13,14 +13,15 @@ type AdminMessageController struct {
Bot *tele.Bot Bot *tele.Bot
} }
func NewAdminMessageController(b *tele.Bot, db *DataController) *BonusController { func NewAdminMessageController(b *tele.Bot, db *DataController) *AdminMessageController {
return &BonusController{DC: db, Bot: b} return &AdminMessageController{DC: db, Bot: b}
} }
func (b *BonusController) AdminMessage(c tele.Context) error { func (b *AdminMessageController) AdminMessage(c tele.Context) error {
var text string var text string
chatId := c.Chat().ID
user := b.DC.GetUser(c.Sender().ID) user := b.DC.GetUser(c.Sender().ID, chatId)
if !user.Admin { if !user.Admin {
return c.Send("У вас нет прав для использования этой команды") return c.Send("У вас нет прав для использования этой команды")
} }
@@ -33,7 +34,7 @@ func (b *BonusController) AdminMessage(c tele.Context) error {
} }
_, err := b.Bot.Send( _, err := b.Bot.Send(
&tele.Chat{ID: -1002345923642}, c.Chat(),
text, text,
) )

View File

@@ -21,8 +21,9 @@ func NewBonusController(b *tele.Bot, db *DataController) *BonusController {
func (b *BonusController) Bonus(c tele.Context) error { func (b *BonusController) Bonus(c tele.Context) error {
var text string var text string
var msg *tele.Message var msg *tele.Message
chatId := c.Chat().ID
user := b.DC.GetUser(c.Sender().ID) user := b.DC.GetUser(c.Sender().ID, chatId)
if !user.Admin { if !user.Admin {
return c.Send("У вас нет прав для использования этой команды") return c.Send("У вас нет прав для использования этой команды")
} }
@@ -31,7 +32,7 @@ func (b *BonusController) Bonus(c tele.Context) error {
text = strings.Split(c.Text(), " ")[1] text = strings.Split(c.Text(), " ")[1]
fmt.Println("New bonus", text) fmt.Println("New bonus", text)
} else { } else {
return c.Send("Некоректная команда, используйте /bonus1 <сумма>") return c.Send("Некоректная команда, используйте /b <сумма>")
} }
giftSumm, err := strconv.Atoi(text) giftSumm, err := strconv.Atoi(text)
@@ -40,11 +41,11 @@ func (b *BonusController) Bonus(c tele.Context) error {
} }
btn := &tele.ReplyMarkup{} btn := &tele.ReplyMarkup{}
row := btn.Row(btn.Data("Забрать", "add_bonus", fmt.Sprintf("%d", giftSumm)+":"+fmt.Sprintf("%d", c.Sender().ID))) row := btn.Row(btn.Data("Забрать", "add_bonus", fmt.Sprintf("%d", giftSumm)+":"+fmt.Sprintf("%d", c.Sender().ID)+":"+fmt.Sprintf("%d", chatId)))
btn.Inline(row) btn.Inline(row)
msg, err = b.Bot.Send( msg, err = b.Bot.Send(
&tele.Chat{ID: -1002345923642}, c.Chat(),
fmt.Sprintf("Успей забрать бонус.\nСумма: %d", giftSumm), fmt.Sprintf("Успей забрать бонус.\nСумма: %d", giftSumm),
btn, btn,
) )
@@ -54,10 +55,14 @@ func (b *BonusController) Bonus(c tele.Context) error {
} }
b.Bot.Handle(&row[0], func(c tele.Context) error { b.Bot.Handle(&row[0], func(c tele.Context) error {
user := b.DC.GetUser(c.Sender().ID) data := strings.Split(c.Data(), ":")
giftSumm, _ := strconv.Atoi(data[0])
chatId, _ := strconv.ParseInt(data[2], 10, 64)
user := b.DC.GetUser(c.Sender().ID, chatId)
newSize := user.DickSize + giftSumm newSize := user.DickSize + giftSumm
b.DC.UpdateDick(c.Sender().ID, newSize) b.DC.UpdateDick(c.Sender().ID, chatId, newSize)
_, err := b.Bot.Edit(msg, fmt.Sprintf("%s получает бонус: %d", c.Sender().FirstName, giftSumm)) _, err := b.Bot.Edit(msg, fmt.Sprintf("%s получает бонус: %d", c.Sender().FirstName, giftSumm))
if err != nil { if err != nil {
log.Println(err) log.Println(err)

View File

@@ -44,8 +44,8 @@ func (d *DataController) ClearAllBlocked() {
} }
// CreateUser creates new user with random dick size and sets it to blocked // CreateUser creates new user with random dick size and sets it to blocked
func (d *DataController) CreateUser(id int64, lname string, fname string) { func (d *DataController) CreateUser(id int64, chatId int64, lname string, fname string) {
_, err := d.DB.Exec("INSERT INTO users (id, fname, lname, dick_size, admin, blocked, trick) VALUES (?,?,?,?,?,?,?)", id, fname, lname, 0, 0, 0, 1) _, err := d.DB.Exec("INSERT INTO users (id, chat_id, fname, lname, dick_size, admin, blocked, trick) VALUES (?,?,?,?,?,?,?,?)", id, chatId, fname, lname, 0, 0, 0, 1)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} else { } else {
@@ -54,15 +54,15 @@ func (d *DataController) CreateUser(id int64, lname string, fname string) {
} }
// GetUser gets user's data by id // GetUser gets user's data by id
func (d *DataController) GetUser(id int64) *models.User { func (d *DataController) GetUser(id int64, chatId int64) *models.User {
var user models.User var user models.User
row, err := d.DB.Query("SELECT * FROM users WHERE id =?", id) row, err := d.DB.Query("SELECT * FROM users WHERE id = ? AND chat_id = ?", id, chatId)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
for row.Next() { for row.Next() {
err := row.Scan(&user.ID, &user.FirstName, &user.LastName, &user.DickSize, &user.Blocked, &user.Admin, &user.Trick) err := row.Scan(&user.ID, &user.ChatID, &user.FirstName, &user.LastName, &user.DickSize, &user.Blocked, &user.Admin, &user.Trick)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@@ -72,8 +72,8 @@ func (d *DataController) GetUser(id int64) *models.User {
} }
// UpdateUser updates user's dick size and blocked status // UpdateUser updates user's dick size and blocked status
func (d *DataController) UpdateDick(id int64, newDickSize int) { func (d *DataController) UpdateDick(id int64, chatId int64, newDickSize int) {
_, err := d.DB.Exec("UPDATE users SET dick_size =?, blocked =? WHERE id =?", newDickSize, 1, id) _, err := d.DB.Exec("UPDATE users SET dick_size =?, blocked =? WHERE id =? AND chat_id = ?", newDickSize, 1, id, chatId)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} else { } else {
@@ -82,8 +82,8 @@ func (d *DataController) UpdateDick(id int64, newDickSize int) {
} }
// AddTricks updates user's // AddTricks updates user's
func (d *DataController) AddTricks(id int64) { func (d *DataController) AddTricks(id int64, chatId int64) {
_, err := d.DB.Exec("UPDATE users SET trick = trick + 1 WHERE id =?", id) _, err := d.DB.Exec("UPDATE users SET trick = trick + 1 WHERE id =? AND chat_id = ?", id, chatId)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} else { } else {
@@ -92,16 +92,16 @@ func (d *DataController) AddTricks(id int64) {
} }
// GetTopUsers gets top 10 users by dick size // GetTopUsers gets top 10 users by dick size
func (d *DataController) GetTopUsers() []models.User { func (d *DataController) GetTopUsers(chatId int64) []models.User {
var users []models.User var users []models.User
rows, err := d.DB.Query("SELECT * FROM users ORDER BY dick_size DESC LIMIT 10") rows, err := d.DB.Query("SELECT * FROM users WHERE chat_id = ? ORDER BY dick_size DESC LIMIT 10", chatId)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
for rows.Next() { for rows.Next() {
var user models.User var user models.User
err := rows.Scan(&user.ID, &user.FirstName, &user.LastName, &user.DickSize, &user.Blocked, &user.Admin, &user.Trick) err := rows.Scan(&user.ID, &user.ChatID, &user.FirstName, &user.LastName, &user.DickSize, &user.Blocked, &user.Admin, &user.Trick)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }

View File

@@ -18,14 +18,15 @@ func (d *DickController) Dick(c tele.Context) error {
var retMessage string var retMessage string
id := c.Sender().ID id := c.Sender().ID
chatId := c.Chat().ID
lName := c.Sender().LastName lName := c.Sender().LastName
fName := c.Sender().FirstName fName := c.Sender().FirstName
user := d.DC.GetUser(id) user := d.DC.GetUser(id, chatId)
if user.ID == 0 { if user.ID == 0 {
d.DC.CreateUser(id, lName, fName) d.DC.CreateUser(id, chatId, lName, fName)
user = d.DC.GetUser(id) user = d.DC.GetUser(id, chatId)
} }
newRange := RandRange() newRange := RandRange()
@@ -34,8 +35,8 @@ func (d *DickController) Dick(c tele.Context) error {
if user.Blocked { if user.Blocked {
retMessage = fmt.Sprintf("%s %s, ты уже отращивал свой писюн, следющая попытка будет после 22:00 по МСК. Сейчас он равен %d см.", fName, lName, user.DickSize) retMessage = fmt.Sprintf("%s %s, ты уже отращивал свой писюн, следющая попытка будет после 22:00 по МСК. Сейчас он равен %d см.", fName, lName, user.DickSize)
} else { } else {
d.DC.UpdateDick(id, newSize) d.DC.UpdateDick(id, chatId, newSize)
d.DC.AddTricks(id) d.DC.AddTricks(id, chatId)
if newRange == 0 { if newRange == 0 {
retMessage = fmt.Sprintf("%s %s, твой писюн сегодня не подрос. Не переживай, просто он, видимо, решил взять выходной — пусть лучше отдохнет перед завтрашними подвигами!", fName, lName) retMessage = fmt.Sprintf("%s %s, твой писюн сегодня не подрос. Не переживай, просто он, видимо, решил взять выходной — пусть лучше отдохнет перед завтрашними подвигами!", fName, lName)
@@ -51,7 +52,8 @@ func (d *DickController) Dick(c tele.Context) error {
func (d *DickController) TopDick(c tele.Context) error { func (d *DickController) TopDick(c tele.Context) error {
var retMessage string var retMessage string
users := d.DC.GetTopUsers() chatId := c.Chat().ID
users := d.DC.GetTopUsers(chatId)
for iter, user := range users { for iter, user := range users {
retMessage += fmt.Sprintf("%d. %s %s, %d см\n", iter+1, user.FirstName, user.LastName, user.DickSize) retMessage += fmt.Sprintf("%d. %s %s, %d см\n", iter+1, user.FirstName, user.LastName, user.DickSize)

View File

@@ -8,46 +8,59 @@ import (
"strings" "strings"
"time" "time"
"gopkg.in/telebot.v4"
tele "gopkg.in/telebot.v4" tele "gopkg.in/telebot.v4"
) )
// AcceptDuelButtonUnique is the unique identifier for the duel accept button. // AcceptDuelButtonUnique is the unique identifier for the duel accept button.
const AcceptDuelButtonUnique = "accept_duel" const AcceptDuelButtonUnique = "accept_duel"
type DuelController struct { type DuelState struct {
PlayerOne struct { PlayerOne struct {
ID int64 ID int64
Counter int Counter int
FName string FName string
} }
PlayerTwo struct { PlayerTwo struct {
ID int64 ID int64
Counter int Counter int
FName string FName string
} }
Summ int Summ int
Inited bool Inited bool
MatchAccepted bool MatchAccepted bool
InitialMessage *tele.Message InitialMessage *tele.Message
Bot *tele.Bot }
DC *DataController
type DuelController struct {
Bot *tele.Bot
DC *DataController
duels map[int64]*DuelState
} }
// Controller Init // Controller Init
func NewDuel(bot *tele.Bot, dc *DataController) *DuelController { func NewDuel(bot *telebot.Bot, dc *DataController) *DuelController {
return &DuelController{ return &DuelController{
Inited: false, Bot: bot,
Bot: bot, DC: dc,
DC: dc, duels: make(map[int64]*DuelState),
} }
} }
func (s *DuelController) getDuelState(chatId int64) *DuelState {
if _, ok := s.duels[chatId]; !ok {
s.duels[chatId] = &DuelState{}
}
return s.duels[chatId]
}
// Start Match // Start Match
func (s *DuelController) StartMatch(c tele.Context) error { func (s *DuelController) StartMatch(c tele.Context) error {
if s.Inited { chatId := c.Chat().ID
return c.Send(fmt.Sprintf("Дуэль уже началась!\nИгрок: %s\nСтавка: %d", s.PlayerOne.FName, s.Summ)) duel := s.getDuelState(chatId)
if duel.Inited {
return c.Send(fmt.Sprintf("Дуэль уже началась!\nИгрок: %s\nСтавка: %d", duel.PlayerOne.FName, duel.Summ))
} }
var text string var text string
@@ -66,88 +79,89 @@ func (s *DuelController) StartMatch(c tele.Context) error {
if summ <= 0 { if summ <= 0 {
return c.Send("Некорректная сумма, используйте положительное значение!") return c.Send("Некорректная сумма, используйте положительное значение!")
} else { } else {
s.Summ = summ duel.Summ = summ
} }
} }
s.Inited = true duel.Inited = true
s.PlayerOne.ID = c.Sender().ID duel.PlayerOne.ID = c.Sender().ID
s.PlayerOne.FName = c.Sender().FirstName duel.PlayerOne.FName = c.Sender().FirstName
user := s.DC.GetUser(s.PlayerOne.ID) // Assuming GetUser now returns (*User, error) user := s.DC.GetUser(duel.PlayerOne.ID, chatId)
// CRITICAL: Check if the user was found to prevent a panic.
if user == nil { if user == nil {
s.Inited = false // Reset state since the duel can't start duel.Inited = false
return c.Send("Не удалось найти вас в базе данных. Попробуйте /start.") return c.Send("Не удалось найти вас в базе данных. Попробуйте /start.")
} }
if user.DickSize < summ { if user.DickSize < summ {
s.Inited = false duel.Inited = false
return c.Send("У вас недостаточно длинный пенис для состязания!") return c.Send("У вас недостаточно длинный пенис для состязания!")
} }
// Create an inline keyboard with an "Accept" button
markup := &tele.ReplyMarkup{} markup := &tele.ReplyMarkup{}
btnAccept := markup.Data("Принять", AcceptDuelButtonUnique) btnAccept := markup.Data("Принять", AcceptDuelButtonUnique)
markup.Inline(markup.Row(btnAccept)) markup.Inline(markup.Row(btnAccept))
msg, err := s.Bot.Send(c.Chat(), fmt.Sprintf("%s начал дуель, ставка: %d", s.PlayerOne.FName, summ), markup) msg, err := s.Bot.Send(c.Chat(), fmt.Sprintf("%s начал дуель, ставка: %d", duel.PlayerOne.FName, summ), markup)
if err != nil { if err != nil {
s.resetDuelState() s.resetDuelState(chatId)
return err return err
} }
s.InitialMessage = msg duel.InitialMessage = msg
return nil return nil
} }
// Accept Match // Accept Match
func (s *DuelController) AcceptMatch(c tele.Context) error { func (s *DuelController) AcceptMatch(c tele.Context) error {
if s.MatchAccepted { chatId := c.Chat().ID
duel := s.getDuelState(chatId)
if duel.MatchAccepted {
return c.Send("Дождитесь окончания дуэли.") return c.Send("Дождитесь окончания дуэли.")
} }
if !s.Inited { if !duel.Inited {
return c.Send("Дуэль еще не началась! Дождитесь старта матча или начните новую дуель с помощью /duel <сумма>") return c.Send("Дуэль еще не началась! Дождитесь старта матча или начните новую дуель с помощью /duel <сумма>")
} }
s.PlayerTwo.ID = c.Sender().ID duel.PlayerTwo.ID = c.Sender().ID
s.PlayerTwo.FName = c.Sender().FirstName duel.PlayerTwo.FName = c.Sender().FirstName
user := s.DC.GetUser(s.PlayerTwo.ID) // Assuming GetUser now returns (*User, error) user := s.DC.GetUser(duel.PlayerTwo.ID, chatId)
// CRITICAL: Check if the user was found to prevent a panic.
if user == nil { if user == nil {
// No need to reset state here, the duel is still waiting for a valid player.
return c.Send("Не удалось найти вас в базе данных. Попробуйте /start.") return c.Send("Не удалось найти вас в базе данных. Попробуйте /start.")
} }
if user.DickSize < s.Summ { if user.DickSize < duel.Summ {
return c.Send("У вас недостаточно длинный пенис для состязания!") return c.Send("У вас недостаточно длинный пенис для состязания!")
} }
if s.PlayerTwo.ID == s.PlayerOne.ID { if duel.PlayerTwo.ID == duel.PlayerOne.ID {
return c.Send("Вы не можете принять участие в своей же дуэли!") return c.Send("Вы не можете принять участие в своей же дуэли!")
} }
s.MatchAccepted = true duel.MatchAccepted = true
s.Summ *= 2 duel.Summ *= 2
if s.InitialMessage == nil { if duel.InitialMessage == nil {
log.Println("Error: InitialMessage is nil in AcceptMatch") log.Println("Error: InitialMessage is nil in AcceptMatch")
s.resetDuelState() s.resetDuelState(chatId)
return c.Send("Произошла ошибка, дуэль отменена. Попробуйте начать заново.") return c.Send("Произошла ошибка, дуэль отменена. Попробуйте начать заново.")
} }
// Edit the original message to remove the button and show the second player. s.Bot.Edit(duel.InitialMessage, fmt.Sprintf("%s начал дуель, ставка: %d\n\n%s принимает участие в дуэли.", duel.PlayerOne.FName, duel.Summ/2, duel.PlayerTwo.FName))
s.Bot.Edit(s.InitialMessage, fmt.Sprintf("%s начал дуель, ставка: %d\n\n%s принимает участие в дуэли.", s.PlayerOne.FName, s.Summ/2, s.PlayerTwo.FName))
go s.gameProccess(s.InitialMessage) go s.gameProccess(chatId, duel.InitialMessage)
return c.Respond() return c.Respond()
} }
// Clear match // Clear match
func (s *DuelController) ClearMatch(c tele.Context) error { func (s *DuelController) ClearMatch(c tele.Context) error {
if c.Sender().ID == s.PlayerOne.ID { chatId := c.Chat().ID
s.resetDuelState() duel := s.getDuelState(chatId)
if c.Sender().ID == duel.PlayerOne.ID {
s.resetDuelState(chatId)
return c.Send(fmt.Sprintf("%s отменил дуель!", c.Sender().FirstName)) return c.Send(fmt.Sprintf("%s отменил дуель!", c.Sender().FirstName))
} else { } else {
return c.Send("Отменить дуель может только инициатор!") return c.Send("Отменить дуель может только инициатор!")
@@ -155,74 +169,69 @@ func (s *DuelController) ClearMatch(c tele.Context) error {
} }
// resetDuelState clears the current duel's information, making it ready for a new one. // resetDuelState clears the current duel's information, making it ready for a new one.
func (s *DuelController) resetDuelState() { func (s *DuelController) resetDuelState(chatId int64) {
s.PlayerOne.Counter = 0 delete(s.duels, chatId)
s.PlayerTwo.Counter = 0
s.PlayerOne.FName = ""
s.PlayerTwo.FName = ""
s.PlayerOne.ID = 0
s.PlayerTwo.ID = 0
s.Summ = 0
s.Inited = false
s.MatchAccepted = false
s.InitialMessage = nil
} }
// Start Game // Start Game
func (s *DuelController) gameProccess(msg *tele.Message) { func (s *DuelController) gameProccess(chatId int64, msg *tele.Message) {
duel := s.getDuelState(chatId)
time.Sleep(time.Second * 3) time.Sleep(time.Second * 3)
editedMsg, err := s.Bot.Edit(msg, fmt.Sprintf("Дуэль началась!\nНа кону: %d", s.Summ)) editedMsg, err := s.Bot.Edit(msg, fmt.Sprintf("Дуэль началась!\nНа кону: %d", duel.Summ))
if err != nil { if err != nil {
log.Printf("Error sending duel start message: %v", err) log.Printf("Error sending duel start message: %v", err)
s.resetDuelState() // Reset state if we can't even send the message s.resetDuelState(chatId) // Reset state if we can't even send the message
return return
} }
s.RoundOne(editedMsg) s.RoundOne(chatId, editedMsg)
} }
// Round One // Round One
func (s *DuelController) RoundOne(msg *tele.Message) { func (s *DuelController) RoundOne(chatId int64, msg *tele.Message) {
duel := s.getDuelState(chatId)
time.Sleep(time.Second * 3) time.Sleep(time.Second * 3)
s.PlayerOne.Counter += rand.Intn(11) + 1 duel.PlayerOne.Counter += rand.Intn(11) + 1
s.PlayerTwo.Counter += rand.Intn(11) + 1 duel.PlayerTwo.Counter += rand.Intn(11) + 1
msg, _ = s.Bot.Edit(msg, msg, _ = s.Bot.Edit(msg,
fmt.Sprintf("Результаты первого раунда\n%s: %d очков.\n%s: %d очков.", fmt.Sprintf("Результаты первого раунда\n%s: %d очков.\n%s: %d очков.",
s.PlayerOne.FName, s.PlayerOne.Counter, s.PlayerTwo.FName, s.PlayerTwo.Counter), duel.PlayerOne.FName, duel.PlayerOne.Counter, duel.PlayerTwo.FName, duel.PlayerTwo.Counter),
) )
s.RoundTwo(msg) s.RoundTwo(chatId, msg)
} }
// Round Two // Round Two
func (s *DuelController) RoundTwo(msg *tele.Message) { func (s *DuelController) RoundTwo(chatId int64, msg *tele.Message) {
duel := s.getDuelState(chatId)
time.Sleep(time.Second * 3) time.Sleep(time.Second * 3)
s.PlayerOne.Counter += rand.Intn(11) + 1 duel.PlayerOne.Counter += rand.Intn(11) + 1
s.PlayerTwo.Counter += rand.Intn(11) + 1 duel.PlayerTwo.Counter += rand.Intn(11) + 1
msg, _ = s.Bot.Edit(msg, msg, _ = s.Bot.Edit(msg,
fmt.Sprintf("Результаты второго раунда\n%s: %d очков.\n%s: %d очков.", fmt.Sprintf("Результаты второго раунда\n%s: %d очков.\n%s: %d очков.",
s.PlayerOne.FName, s.PlayerOne.Counter, s.PlayerTwo.FName, s.PlayerTwo.Counter), duel.PlayerOne.FName, duel.PlayerOne.Counter, duel.PlayerTwo.FName, duel.PlayerTwo.Counter),
) )
s.RoundThree(msg) s.RoundThree(chatId, msg)
} }
// Round Three // Round Three
func (s *DuelController) RoundThree(msg *tele.Message) { func (s *DuelController) RoundThree(chatId int64, msg *tele.Message) {
duel := s.getDuelState(chatId)
time.Sleep(time.Second * 3) time.Sleep(time.Second * 3)
s.PlayerOne.Counter += rand.Intn(11) + 1 duel.PlayerOne.Counter += rand.Intn(11) + 1
s.PlayerTwo.Counter += rand.Intn(11) + 1 duel.PlayerTwo.Counter += rand.Intn(11) + 1
msg, _ = s.Bot.Edit(msg, msg, _ = s.Bot.Edit(msg,
fmt.Sprintf("Результаты третьего раунда\n%s: %d очков.\n%s: %d очков.", fmt.Sprintf("Результаты третьего раунда\n%s: %d очков.\n%s: %d очков.",
s.PlayerOne.FName, s.PlayerOne.Counter, s.PlayerTwo.FName, s.PlayerTwo.Counter), duel.PlayerOne.FName, duel.PlayerOne.Counter, duel.PlayerTwo.FName, duel.PlayerTwo.Counter),
) )
s.CheckWin(msg) s.CheckWin(chatId, msg)
} }
// Check Win // Check Win
func (s *DuelController) CheckWin(msg *tele.Message) { func (s *DuelController) CheckWin(chatId int64, msg *tele.Message) {
// Ensure the duel state is reset regardless of how this function exits. duel := s.getDuelState(chatId)
defer s.resetDuelState() defer s.resetDuelState(chatId)
userOne := s.DC.GetUser(s.PlayerOne.ID) userOne := s.DC.GetUser(duel.PlayerOne.ID, chatId)
userTwo := s.DC.GetUser(s.PlayerTwo.ID) userTwo := s.DC.GetUser(duel.PlayerTwo.ID, chatId)
if userOne == nil || userTwo == nil { if userOne == nil || userTwo == nil {
log.Println("Error: Could not find one or both duel participants in CheckWin.") log.Println("Error: Could not find one or both duel participants in CheckWin.")
s.Bot.Edit(msg, "Произошла ошибка, дуэль отменена.") s.Bot.Edit(msg, "Произошла ошибка, дуэль отменена.")
@@ -230,17 +239,17 @@ func (s *DuelController) CheckWin(msg *tele.Message) {
} }
time.Sleep(time.Second * 3) time.Sleep(time.Second * 3)
var message string = fmt.Sprintf("Дуэль окончена!\n%s: %d очков. vs %s: %d очков.", s.PlayerOne.FName, s.PlayerOne.Counter, s.PlayerTwo.FName, s.PlayerTwo.Counter) var message string = fmt.Sprintf("Дуэль окончена!\n%s: %d очков. vs %s: %d очков.", duel.PlayerOne.FName, duel.PlayerOne.Counter, duel.PlayerTwo.FName, duel.PlayerTwo.Counter)
if s.PlayerOne.Counter > s.PlayerTwo.Counter { if duel.PlayerOne.Counter > duel.PlayerTwo.Counter {
s.Bot.Edit(msg, fmt.Sprintf("%s\n%s победил!", message, s.PlayerOne.FName)) s.Bot.Edit(msg, fmt.Sprintf("%s\n%s победил!", message, duel.PlayerOne.FName))
s.DC.UpdateDick(userOne.ID, userOne.DickSize+(s.Summ/2)) s.DC.UpdateDick(userOne.ID, chatId, userOne.DickSize+(duel.Summ/2))
s.DC.UpdateDick(userTwo.ID, userTwo.DickSize-(s.Summ/2)) s.DC.UpdateDick(userTwo.ID, chatId, userTwo.DickSize-(duel.Summ/2))
} else if s.PlayerOne.Counter < s.PlayerTwo.Counter { } else if duel.PlayerOne.Counter < duel.PlayerTwo.Counter {
s.Bot.Edit(msg, fmt.Sprintf("%s\n%s победил!", message, s.PlayerTwo.FName)) s.Bot.Edit(msg, fmt.Sprintf("%s\n%s победил!", message, duel.PlayerTwo.FName))
s.DC.UpdateDick(userOne.ID, userOne.DickSize-(s.Summ/2)) s.DC.UpdateDick(userOne.ID, chatId, userOne.DickSize-(duel.Summ/2))
s.DC.UpdateDick(userTwo.ID, userTwo.DickSize+(s.Summ/2)) s.DC.UpdateDick(userTwo.ID, chatId, userTwo.DickSize+(duel.Summ/2))
} else if s.PlayerOne.Counter == s.PlayerTwo.Counter { } else if duel.PlayerOne.Counter == duel.PlayerTwo.Counter {
s.Bot.Edit(msg, fmt.Sprintf("%s\nНичья!", message)) s.Bot.Edit(msg, fmt.Sprintf("%s\nНичья!", message))
} }
} }

View File

@@ -2,6 +2,7 @@ package models
type User struct { type User struct {
ID int64 `sql:"id"` ID int64 `sql:"id"`
ChatID int64 `sql:"chat_id"`
FirstName string `sql:"fname"` FirstName string `sql:"fname"`
LastName string `sql:"lname"` LastName string `sql:"lname"`
DickSize int `sql:"dick_size"` DickSize int `sql:"dick_size"`