180 lines
4.8 KiB
Go
180 lines
4.8 KiB
Go
package controllers
|
||
|
||
import (
|
||
"fmt"
|
||
"math/rand"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
|
||
tele "gopkg.in/telebot.v4"
|
||
)
|
||
|
||
type DuelController struct {
|
||
PlayerOne struct {
|
||
ID int64
|
||
Counter int
|
||
FName string
|
||
}
|
||
|
||
PlayerTwo struct {
|
||
ID int64
|
||
Counter int
|
||
FName string
|
||
}
|
||
|
||
Summ int
|
||
Inited bool
|
||
Bot *tele.Bot
|
||
DC *DataController
|
||
}
|
||
|
||
// Controller Init
|
||
func NewDuel(bot *tele.Bot, dc *DataController) *DuelController {
|
||
return &DuelController{
|
||
Inited: false,
|
||
Bot: bot,
|
||
DC: dc,
|
||
}
|
||
}
|
||
|
||
// 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))
|
||
}
|
||
|
||
var text string
|
||
|
||
if strings.Contains(c.Text(), " ") {
|
||
text = strings.Split(c.Text(), " ")[1]
|
||
fmt.Println("new command", text)
|
||
} else {
|
||
return c.Send("Некоректная команда, используйте /duel <сумма>")
|
||
}
|
||
|
||
s.Inited = true
|
||
s.PlayerOne.ID = c.Sender().ID
|
||
s.PlayerOne.FName = c.Sender().FirstName
|
||
|
||
user := s.DC.GetUser(s.PlayerOne.ID)
|
||
|
||
summ, err := strconv.Atoi(text)
|
||
if err != nil {
|
||
return c.Send("Некорректная команда, используйте /duel <сумма>")
|
||
} else {
|
||
s.Summ = summ
|
||
}
|
||
|
||
if user.DickSize < summ {
|
||
return c.Send("У вас недостаточно длинный пенис для состязания!")
|
||
}
|
||
|
||
if summ <= 0 {
|
||
return c.Send("Некорректная сумма, используйте положительное значение!")
|
||
}
|
||
|
||
return c.Send(fmt.Sprintf("%s начал дуель, ставка: %d", s.PlayerOne.FName, summ))
|
||
}
|
||
|
||
// Accept Match
|
||
func (s *DuelController) AcceptMatch(c tele.Context) error {
|
||
if !s.Inited {
|
||
return c.Send("Дуэль еще не началась! Дождитесь старта матча или начните новую дуель с помощью /duel <сумма>")
|
||
}
|
||
|
||
s.PlayerTwo.ID = c.Sender().ID
|
||
s.PlayerTwo.FName = c.Sender().FirstName
|
||
|
||
user := s.DC.GetUser(s.PlayerTwo.ID)
|
||
|
||
if user.DickSize < s.Summ {
|
||
return c.Send("У вас недостаточно длинный пенис для состязания!")
|
||
}
|
||
|
||
if s.PlayerTwo.ID == s.PlayerOne.ID {
|
||
return c.Send("Вы не можете принять участие в своей же дуэли!")
|
||
}
|
||
|
||
s.Summ *= 2
|
||
go s.gameProccess(c.Chat())
|
||
|
||
return c.Send(fmt.Sprintf("%s принимает участие в дуэли.", s.PlayerTwo.FName))
|
||
}
|
||
|
||
// Start Game
|
||
func (s *DuelController) gameProccess(r tele.Recipient) {
|
||
time.Sleep(time.Second * 3)
|
||
s.Bot.Send(r, fmt.Sprintf("Дуэль началась!\nНа кону: %d", s.Summ))
|
||
s.RoundOne(r)
|
||
}
|
||
|
||
// Round One
|
||
func (s *DuelController) RoundOne(r tele.Recipient) {
|
||
time.Sleep(time.Second * 3)
|
||
s.PlayerOne.Counter += rand.Intn(11) + 1
|
||
s.PlayerTwo.Counter += rand.Intn(11) + 1
|
||
s.Bot.Send(r,
|
||
fmt.Sprintf("Результаты первого раунда\nИгрок %s: %d очков.\nИгрок %s: %d очков.",
|
||
s.PlayerOne.FName, s.PlayerOne.Counter, s.PlayerTwo.FName, s.PlayerTwo.Counter),
|
||
)
|
||
s.RoundTwo(r)
|
||
}
|
||
|
||
// Round Two
|
||
func (s *DuelController) RoundTwo(r tele.Recipient) {
|
||
time.Sleep(time.Second * 3)
|
||
s.PlayerOne.Counter += rand.Intn(11) + 1
|
||
s.PlayerTwo.Counter += rand.Intn(11) + 1
|
||
s.Bot.Send(r,
|
||
fmt.Sprintf("Результаты второго раунда\nИгрок %s: %d очков.\nИгрок %s: %d очков.",
|
||
s.PlayerOne.FName, s.PlayerOne.Counter, s.PlayerTwo.FName, s.PlayerTwo.Counter),
|
||
)
|
||
s.RoundThree(r)
|
||
}
|
||
|
||
// Round Three
|
||
func (s *DuelController) RoundThree(r tele.Recipient) {
|
||
time.Sleep(time.Second * 3)
|
||
s.PlayerOne.Counter += rand.Intn(11) + 1
|
||
s.PlayerTwo.Counter += rand.Intn(11) + 1
|
||
s.Bot.Send(r,
|
||
fmt.Sprintf("Результаты третьего раунда\nИгрок %s: %d очков.\nИгрок %s: %d очков.",
|
||
s.PlayerOne.FName, s.PlayerOne.Counter, s.PlayerTwo.FName, s.PlayerTwo.Counter),
|
||
)
|
||
s.CheckWin(r)
|
||
}
|
||
|
||
// Check Win
|
||
func (s *DuelController) CheckWin(r tele.Recipient) {
|
||
userOne := s.DC.GetUser(s.PlayerOne.ID)
|
||
userTwo := s.DC.GetUser(s.PlayerTwo.ID)
|
||
time.Sleep(time.Second * 3)
|
||
var winner int = 0
|
||
|
||
if s.PlayerOne.Counter > s.PlayerTwo.Counter {
|
||
winner = 1
|
||
} else {
|
||
winner = 2
|
||
}
|
||
|
||
if winner == 1 {
|
||
s.Bot.Send(r, fmt.Sprintf("Игрок %s победил!", s.PlayerOne.FName))
|
||
s.DC.UpdateDick(userOne.ID, userOne.DickSize+(s.Summ/2))
|
||
s.DC.UpdateDick(userTwo.ID, userTwo.DickSize-(s.Summ/2))
|
||
s.Inited = false
|
||
} else if winner == 2 {
|
||
s.Bot.Send(r, fmt.Sprintf("Игрок %s победил!", s.PlayerTwo.FName))
|
||
s.DC.UpdateDick(userOne.ID, userOne.DickSize-(s.Summ/2))
|
||
s.DC.UpdateDick(userTwo.ID, userTwo.DickSize+(s.Summ/2))
|
||
s.Inited = false
|
||
} else {
|
||
s.Bot.Send(r, "Ничья!")
|
||
s.Inited = false
|
||
}
|
||
|
||
s.PlayerOne.Counter = 0
|
||
s.PlayerTwo.Counter = 0
|
||
s.Summ = 0
|
||
}
|