From 75e01df0a9cfedcac607cbb5584b481582cbf4b5 Mon Sep 17 00:00:00 2001 From: Smile Rex Date: Fri, 21 Nov 2025 15:49:10 +0300 Subject: [PATCH] split tg-groups --- src/controllers/adminMessageController.go | 11 +- src/controllers/bonusController.go | 17 +- src/controllers/dataController.go | 24 +-- src/controllers/dickController.go | 14 +- src/controllers/duelController.go | 181 ++++++++++++---------- src/models/user.go | 1 + 6 files changed, 133 insertions(+), 115 deletions(-) diff --git a/src/controllers/adminMessageController.go b/src/controllers/adminMessageController.go index 1b7195f..fa93b3d 100644 --- a/src/controllers/adminMessageController.go +++ b/src/controllers/adminMessageController.go @@ -13,14 +13,15 @@ type AdminMessageController struct { Bot *tele.Bot } -func NewAdminMessageController(b *tele.Bot, db *DataController) *BonusController { - return &BonusController{DC: db, Bot: b} +func NewAdminMessageController(b *tele.Bot, db *DataController) *AdminMessageController { + 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 + chatId := c.Chat().ID - user := b.DC.GetUser(c.Sender().ID) + user := b.DC.GetUser(c.Sender().ID, chatId) if !user.Admin { return c.Send("У вас нет прав для использования этой команды") } @@ -33,7 +34,7 @@ func (b *BonusController) AdminMessage(c tele.Context) error { } _, err := b.Bot.Send( - &tele.Chat{ID: -1002345923642}, + c.Chat(), text, ) diff --git a/src/controllers/bonusController.go b/src/controllers/bonusController.go index 2f52df8..7f1bc0c 100644 --- a/src/controllers/bonusController.go +++ b/src/controllers/bonusController.go @@ -21,8 +21,9 @@ func NewBonusController(b *tele.Bot, db *DataController) *BonusController { func (b *BonusController) Bonus(c tele.Context) error { var text string 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 { return c.Send("У вас нет прав для использования этой команды") } @@ -31,7 +32,7 @@ func (b *BonusController) Bonus(c tele.Context) error { text = strings.Split(c.Text(), " ")[1] fmt.Println("New bonus", text) } else { - return c.Send("Некоректная команда, используйте /bonus1 <сумма>") + return c.Send("Некоректная команда, используйте /b <сумма>") } giftSumm, err := strconv.Atoi(text) @@ -40,11 +41,11 @@ func (b *BonusController) Bonus(c tele.Context) error { } 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) msg, err = b.Bot.Send( - &tele.Chat{ID: -1002345923642}, + c.Chat(), fmt.Sprintf("Успей забрать бонус.\nСумма: %d", giftSumm), btn, ) @@ -54,10 +55,14 @@ func (b *BonusController) Bonus(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 - 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)) if err != nil { log.Println(err) diff --git a/src/controllers/dataController.go b/src/controllers/dataController.go index c8a59be..5f7e68b 100644 --- a/src/controllers/dataController.go +++ b/src/controllers/dataController.go @@ -44,8 +44,8 @@ func (d *DataController) ClearAllBlocked() { } // CreateUser creates new user with random dick size and sets it to blocked -func (d *DataController) CreateUser(id 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) +func (d *DataController) CreateUser(id int64, chatId int64, lname string, fname string) { + _, 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 { log.Fatal(err) } else { @@ -54,15 +54,15 @@ func (d *DataController) CreateUser(id int64, lname string, fname string) { } // 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 - 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 { log.Fatal(err) } 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 { log.Fatal(err) } @@ -72,8 +72,8 @@ func (d *DataController) GetUser(id int64) *models.User { } // UpdateUser updates user's dick size and blocked status -func (d *DataController) UpdateDick(id int64, newDickSize int) { - _, err := d.DB.Exec("UPDATE users SET dick_size =?, blocked =? WHERE id =?", newDickSize, 1, id) +func (d *DataController) UpdateDick(id int64, chatId int64, newDickSize int) { + _, err := d.DB.Exec("UPDATE users SET dick_size =?, blocked =? WHERE id =? AND chat_id = ?", newDickSize, 1, id, chatId) if err != nil { log.Fatal(err) } else { @@ -82,8 +82,8 @@ func (d *DataController) UpdateDick(id int64, newDickSize int) { } // AddTricks updates user's -func (d *DataController) AddTricks(id int64) { - _, err := d.DB.Exec("UPDATE users SET trick = trick + 1 WHERE id =?", id) +func (d *DataController) AddTricks(id int64, chatId int64) { + _, err := d.DB.Exec("UPDATE users SET trick = trick + 1 WHERE id =? AND chat_id = ?", id, chatId) if err != nil { log.Fatal(err) } else { @@ -92,16 +92,16 @@ func (d *DataController) AddTricks(id int64) { } // 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 - 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 { log.Fatal(err) } for rows.Next() { 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 { log.Fatal(err) } diff --git a/src/controllers/dickController.go b/src/controllers/dickController.go index ee52358..8737bc9 100644 --- a/src/controllers/dickController.go +++ b/src/controllers/dickController.go @@ -18,14 +18,15 @@ func (d *DickController) Dick(c tele.Context) error { var retMessage string id := c.Sender().ID + chatId := c.Chat().ID lName := c.Sender().LastName fName := c.Sender().FirstName - user := d.DC.GetUser(id) + user := d.DC.GetUser(id, chatId) if user.ID == 0 { - d.DC.CreateUser(id, lName, fName) - user = d.DC.GetUser(id) + d.DC.CreateUser(id, chatId, lName, fName) + user = d.DC.GetUser(id, chatId) } newRange := RandRange() @@ -34,8 +35,8 @@ func (d *DickController) Dick(c tele.Context) error { if user.Blocked { retMessage = fmt.Sprintf("%s %s, ты уже отращивал свой писюн, следющая попытка будет после 22:00 по МСК. Сейчас он равен %d см.", fName, lName, user.DickSize) } else { - d.DC.UpdateDick(id, newSize) - d.DC.AddTricks(id) + d.DC.UpdateDick(id, chatId, newSize) + d.DC.AddTricks(id, chatId) if newRange == 0 { 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 { var retMessage string - users := d.DC.GetTopUsers() + chatId := c.Chat().ID + users := d.DC.GetTopUsers(chatId) for iter, user := range users { retMessage += fmt.Sprintf("%d. %s %s, %d см\n", iter+1, user.FirstName, user.LastName, user.DickSize) diff --git a/src/controllers/duelController.go b/src/controllers/duelController.go index 64533e4..b07ca9b 100644 --- a/src/controllers/duelController.go +++ b/src/controllers/duelController.go @@ -8,46 +8,59 @@ import ( "strings" "time" + "gopkg.in/telebot.v4" tele "gopkg.in/telebot.v4" ) // AcceptDuelButtonUnique is the unique identifier for the duel accept button. const AcceptDuelButtonUnique = "accept_duel" -type DuelController struct { +type DuelState struct { PlayerOne struct { ID int64 Counter int FName string } - PlayerTwo struct { ID int64 Counter int FName string } - Summ int Inited bool MatchAccepted bool InitialMessage *tele.Message - Bot *tele.Bot - DC *DataController +} + +type DuelController struct { + Bot *tele.Bot + DC *DataController + duels map[int64]*DuelState } // Controller Init -func NewDuel(bot *tele.Bot, dc *DataController) *DuelController { +func NewDuel(bot *telebot.Bot, dc *DataController) *DuelController { return &DuelController{ - Inited: false, - Bot: bot, - DC: dc, + Bot: bot, + 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 func (s *DuelController) StartMatch(c tele.Context) error { - if s.Inited { - return c.Send(fmt.Sprintf("Дуэль уже началась!\nИгрок: %s\nСтавка: %d", s.PlayerOne.FName, s.Summ)) + chatId := c.Chat().ID + duel := s.getDuelState(chatId) + + if duel.Inited { + return c.Send(fmt.Sprintf("Дуэль уже началась!\nИгрок: %s\nСтавка: %d", duel.PlayerOne.FName, duel.Summ)) } var text string @@ -66,88 +79,89 @@ func (s *DuelController) StartMatch(c tele.Context) error { if summ <= 0 { return c.Send("Некорректная сумма, используйте положительное значение!") } else { - s.Summ = summ + duel.Summ = summ } } - s.Inited = true - s.PlayerOne.ID = c.Sender().ID - s.PlayerOne.FName = c.Sender().FirstName + duel.Inited = true + duel.PlayerOne.ID = c.Sender().ID + duel.PlayerOne.FName = c.Sender().FirstName - user := s.DC.GetUser(s.PlayerOne.ID) // Assuming GetUser now returns (*User, error) - // CRITICAL: Check if the user was found to prevent a panic. + user := s.DC.GetUser(duel.PlayerOne.ID, chatId) if user == nil { - s.Inited = false // Reset state since the duel can't start + duel.Inited = false return c.Send("Не удалось найти вас в базе данных. Попробуйте /start.") } if user.DickSize < summ { - s.Inited = false + duel.Inited = false return c.Send("У вас недостаточно длинный пенис для состязания!") } - // Create an inline keyboard with an "Accept" button markup := &tele.ReplyMarkup{} btnAccept := markup.Data("Принять", AcceptDuelButtonUnique) 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 { - s.resetDuelState() + s.resetDuelState(chatId) return err } - s.InitialMessage = msg + duel.InitialMessage = msg return nil } // Accept Match 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("Дождитесь окончания дуэли.") } - if !s.Inited { + if !duel.Inited { return c.Send("Дуэль еще не началась! Дождитесь старта матча или начните новую дуель с помощью /duel <сумма>") } - s.PlayerTwo.ID = c.Sender().ID - s.PlayerTwo.FName = c.Sender().FirstName + duel.PlayerTwo.ID = c.Sender().ID + duel.PlayerTwo.FName = c.Sender().FirstName - user := s.DC.GetUser(s.PlayerTwo.ID) // Assuming GetUser now returns (*User, error) - // CRITICAL: Check if the user was found to prevent a panic. + user := s.DC.GetUser(duel.PlayerTwo.ID, chatId) if user == nil { - // No need to reset state here, the duel is still waiting for a valid player. return c.Send("Не удалось найти вас в базе данных. Попробуйте /start.") } - if user.DickSize < s.Summ { + if user.DickSize < duel.Summ { return c.Send("У вас недостаточно длинный пенис для состязания!") } - if s.PlayerTwo.ID == s.PlayerOne.ID { + if duel.PlayerTwo.ID == duel.PlayerOne.ID { return c.Send("Вы не можете принять участие в своей же дуэли!") } - s.MatchAccepted = true - s.Summ *= 2 + duel.MatchAccepted = true + duel.Summ *= 2 - if s.InitialMessage == nil { + if duel.InitialMessage == nil { log.Println("Error: InitialMessage is nil in AcceptMatch") - s.resetDuelState() + s.resetDuelState(chatId) return c.Send("Произошла ошибка, дуэль отменена. Попробуйте начать заново.") } - // Edit the original message to remove the button and show the second player. - s.Bot.Edit(s.InitialMessage, fmt.Sprintf("%s начал дуель, ставка: %d\n\n%s принимает участие в дуэли.", s.PlayerOne.FName, s.Summ/2, s.PlayerTwo.FName)) + s.Bot.Edit(duel.InitialMessage, fmt.Sprintf("%s начал дуель, ставка: %d\n\n%s принимает участие в дуэли.", duel.PlayerOne.FName, duel.Summ/2, duel.PlayerTwo.FName)) - go s.gameProccess(s.InitialMessage) + go s.gameProccess(chatId, duel.InitialMessage) return c.Respond() } // Clear match func (s *DuelController) ClearMatch(c tele.Context) error { - if c.Sender().ID == s.PlayerOne.ID { - s.resetDuelState() + chatId := c.Chat().ID + duel := s.getDuelState(chatId) + + if c.Sender().ID == duel.PlayerOne.ID { + s.resetDuelState(chatId) return c.Send(fmt.Sprintf("%s отменил дуель!", c.Sender().FirstName)) } else { 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. -func (s *DuelController) resetDuelState() { - s.PlayerOne.Counter = 0 - 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 +func (s *DuelController) resetDuelState(chatId int64) { + delete(s.duels, chatId) } // 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) - 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 { 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 } - s.RoundOne(editedMsg) + s.RoundOne(chatId, editedMsg) } // 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) - s.PlayerOne.Counter += rand.Intn(11) + 1 - s.PlayerTwo.Counter += rand.Intn(11) + 1 + duel.PlayerOne.Counter += rand.Intn(11) + 1 + duel.PlayerTwo.Counter += rand.Intn(11) + 1 msg, _ = s.Bot.Edit(msg, 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 -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) - s.PlayerOne.Counter += rand.Intn(11) + 1 - s.PlayerTwo.Counter += rand.Intn(11) + 1 + duel.PlayerOne.Counter += rand.Intn(11) + 1 + duel.PlayerTwo.Counter += rand.Intn(11) + 1 msg, _ = s.Bot.Edit(msg, 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 -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) - s.PlayerOne.Counter += rand.Intn(11) + 1 - s.PlayerTwo.Counter += rand.Intn(11) + 1 + duel.PlayerOne.Counter += rand.Intn(11) + 1 + duel.PlayerTwo.Counter += rand.Intn(11) + 1 msg, _ = s.Bot.Edit(msg, 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 -func (s *DuelController) CheckWin(msg *tele.Message) { - // Ensure the duel state is reset regardless of how this function exits. - defer s.resetDuelState() +func (s *DuelController) CheckWin(chatId int64, msg *tele.Message) { + duel := s.getDuelState(chatId) + defer s.resetDuelState(chatId) - userOne := s.DC.GetUser(s.PlayerOne.ID) - userTwo := s.DC.GetUser(s.PlayerTwo.ID) + userOne := s.DC.GetUser(duel.PlayerOne.ID, chatId) + userTwo := s.DC.GetUser(duel.PlayerTwo.ID, chatId) if userOne == nil || userTwo == nil { log.Println("Error: Could not find one or both duel participants in CheckWin.") s.Bot.Edit(msg, "Произошла ошибка, дуэль отменена.") @@ -230,17 +239,17 @@ func (s *DuelController) CheckWin(msg *tele.Message) { } 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 { - s.Bot.Edit(msg, fmt.Sprintf("%s\n%s победил!", message, s.PlayerOne.FName)) - s.DC.UpdateDick(userOne.ID, userOne.DickSize+(s.Summ/2)) - s.DC.UpdateDick(userTwo.ID, userTwo.DickSize-(s.Summ/2)) - } else if s.PlayerOne.Counter < s.PlayerTwo.Counter { - s.Bot.Edit(msg, fmt.Sprintf("%s\n%s победил!", message, s.PlayerTwo.FName)) - s.DC.UpdateDick(userOne.ID, userOne.DickSize-(s.Summ/2)) - s.DC.UpdateDick(userTwo.ID, userTwo.DickSize+(s.Summ/2)) - } else if s.PlayerOne.Counter == s.PlayerTwo.Counter { + if duel.PlayerOne.Counter > duel.PlayerTwo.Counter { + s.Bot.Edit(msg, fmt.Sprintf("%s\n%s победил!", message, duel.PlayerOne.FName)) + s.DC.UpdateDick(userOne.ID, chatId, userOne.DickSize+(duel.Summ/2)) + s.DC.UpdateDick(userTwo.ID, chatId, userTwo.DickSize-(duel.Summ/2)) + } else if duel.PlayerOne.Counter < duel.PlayerTwo.Counter { + s.Bot.Edit(msg, fmt.Sprintf("%s\n%s победил!", message, duel.PlayerTwo.FName)) + s.DC.UpdateDick(userOne.ID, chatId, userOne.DickSize-(duel.Summ/2)) + s.DC.UpdateDick(userTwo.ID, chatId, userTwo.DickSize+(duel.Summ/2)) + } else if duel.PlayerOne.Counter == duel.PlayerTwo.Counter { s.Bot.Edit(msg, fmt.Sprintf("%s\nНичья!", message)) } } diff --git a/src/models/user.go b/src/models/user.go index cd294e8..22ed621 100644 --- a/src/models/user.go +++ b/src/models/user.go @@ -2,6 +2,7 @@ package models type User struct { ID int64 `sql:"id"` + ChatID int64 `sql:"chat_id"` FirstName string `sql:"fname"` LastName string `sql:"lname"` DickSize int `sql:"dick_size"`