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
}
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,
)

View File

@@ -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)

View File

@@ -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)
}

View File

@@ -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)

View File

@@ -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))
}
}

View File

@@ -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"`