28
lib/orders/exported.go
Normal file
28
lib/orders/exported.go
Normal file
@@ -0,0 +1,28 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package orders
|
||||
|
||||
import (
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/appcontext"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/orders/ordersinterface"
|
||||
)
|
||||
|
||||
var (
|
||||
c *appcontext.Context
|
||||
)
|
||||
|
||||
// Orders is a function-handling struct for package orders.
|
||||
type Orders struct{}
|
||||
|
||||
// New is an initialization function for appcontext
|
||||
func New(ac *appcontext.Context) {
|
||||
c = ac
|
||||
o := &Orders{}
|
||||
c.RegisterOrdersInterface(ordersinterface.OrdersInterface(o))
|
||||
}
|
||||
|
||||
// Init is a initialization function for package
|
||||
func (o *Orders) Init() {
|
||||
c.Log.Info("Initializing Orders...")
|
||||
}
|
34
lib/orders/getters.go
Normal file
34
lib/orders/getters.go
Normal file
@@ -0,0 +1,34 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package orders
|
||||
|
||||
import (
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
)
|
||||
|
||||
// GetAllOrders returns all orders in database
|
||||
func (o *Orders) GetAllOrders() ([]dbmapping.Order, bool) {
|
||||
orders := []dbmapping.Order{}
|
||||
|
||||
err := c.Db.Select(&orders, "SELECT * FROM orders ORDER BY created_at asc")
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return orders, false
|
||||
}
|
||||
|
||||
return orders, true
|
||||
}
|
||||
|
||||
// GetOrderByID returns single order by ID
|
||||
func (o *Orders) GetOrderByID(orderID int) (dbmapping.Order, bool) {
|
||||
order := dbmapping.Order{}
|
||||
|
||||
err := c.Db.Get(&order, c.Db.Rebind("SELECT * FROM orders WHERE id=?"), orderID)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
return order, false
|
||||
}
|
||||
|
||||
return order, true
|
||||
}
|
94
lib/orders/orders.go
Normal file
94
lib/orders/orders.go
Normal file
@@ -0,0 +1,94 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package orders
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Internal functions
|
||||
|
||||
func (o *Orders) getOrderByID(orderID int) (dbmapping.Order, bool) {
|
||||
order := dbmapping.Order{}
|
||||
|
||||
err := c.Db.Get(&order, c.Db.Rebind("SELECT * FROM orders WHERE id=?"), orderID)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
return order, false
|
||||
}
|
||||
|
||||
return order, true
|
||||
}
|
||||
|
||||
func (o *Orders) sendOrder(order *dbmapping.Order) string {
|
||||
targetChats := []dbmapping.Chat{}
|
||||
ok := false
|
||||
|
||||
if order.TargetSquads == "all" {
|
||||
targetChats, ok = c.Squader.GetAllSquadChats()
|
||||
if !ok {
|
||||
return "fail"
|
||||
}
|
||||
} else {
|
||||
targetChats, ok = c.Squader.GetSquadChatsBySquadsIDs(order.TargetSquads)
|
||||
if !ok {
|
||||
return "fail"
|
||||
}
|
||||
}
|
||||
|
||||
for i := range targetChats {
|
||||
message := "Поступил приказ:"
|
||||
|
||||
msg := tgbotapi.NewMessage(targetChats[i].TelegramID, message)
|
||||
keyboard := tgbotapi.InlineKeyboardMarkup{}
|
||||
var row []tgbotapi.InlineKeyboardButton
|
||||
btn := tgbotapi.NewInlineKeyboardButtonSwitch("В атаку!", strconv.Itoa(order.ID))
|
||||
row = append(row, btn)
|
||||
keyboard.InlineKeyboard = append(keyboard.InlineKeyboard, row)
|
||||
|
||||
msg.ReplyMarkup = keyboard
|
||||
msg.ParseMode = "Markdown"
|
||||
|
||||
pinnableMessage, err := c.Bot.Send(msg)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
} else {
|
||||
pinChatMessageConfig := tgbotapi.PinChatMessageConfig{
|
||||
ChatID: pinnableMessage.Chat.ID,
|
||||
MessageID: pinnableMessage.MessageID,
|
||||
DisableNotification: true,
|
||||
}
|
||||
|
||||
_, err = c.Bot.PinChatMessage(pinChatMessageConfig)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return "ok"
|
||||
}
|
||||
|
||||
// External functions
|
||||
|
||||
// SendOrder sends order to selected or all squads
|
||||
func (o *Orders) SendOrder(update *tgbotapi.Update) string {
|
||||
command := update.Message.Command()
|
||||
orderNumber := strings.TrimPrefix(command, "send_order")
|
||||
orderID, _ := strconv.Atoi(orderNumber)
|
||||
|
||||
if orderID == 0 {
|
||||
return "fail"
|
||||
}
|
||||
|
||||
order, ok := o.getOrderByID(orderID)
|
||||
if !ok {
|
||||
return "fail"
|
||||
}
|
||||
|
||||
return o.sendOrder(&order)
|
||||
}
|
21
lib/orders/ordersinterface/ordersinterface.go
Normal file
21
lib/orders/ordersinterface/ordersinterface.go
Normal file
@@ -0,0 +1,21 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package ordersinterface
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
)
|
||||
|
||||
// OrdersInterface implements Orders for importing via appcontext.
|
||||
type OrdersInterface interface {
|
||||
Init()
|
||||
|
||||
GetAllOrders() ([]dbmapping.Order, bool)
|
||||
GetOrderByID(orderID int) (dbmapping.Order, bool)
|
||||
|
||||
ListAllOrders(update *tgbotapi.Update) string
|
||||
|
||||
SendOrder(update *tgbotapi.Update) string
|
||||
}
|
44
lib/orders/responders.go
Normal file
44
lib/orders/responders.go
Normal file
@@ -0,0 +1,44 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package orders
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// ListAllOrders returns to user all orders in database
|
||||
func (o *Orders) ListAllOrders(update *tgbotapi.Update) string {
|
||||
orders, ok := o.GetAllOrders()
|
||||
if !ok {
|
||||
return "fail"
|
||||
}
|
||||
|
||||
message := "*Приказы на атаку*\n"
|
||||
for i := range orders {
|
||||
message += "\\[" + strconv.Itoa(orders[i].ID) + "] " + orders[i].TargetSquads + " → "
|
||||
if orders[i].Target == "M" {
|
||||
message += "🈳 МИСТИКА "
|
||||
} else {
|
||||
message += "🈵 ОТВАГА "
|
||||
}
|
||||
if orders[i].Scheduled {
|
||||
message += "запланировано на "
|
||||
message += orders[i].ScheduledAt.Time.Format("02.01.2006 15:04:05")
|
||||
}
|
||||
if orders[i].Status == "sent" {
|
||||
message += "\nПросмотреть выполнение приказа: /show\\_order" + strconv.Itoa(orders[i].ID)
|
||||
} else {
|
||||
message += "\nОтправить приказ прямо сейчас: /send\\_order" + strconv.Itoa(orders[i].ID)
|
||||
}
|
||||
message += "\n"
|
||||
}
|
||||
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, message)
|
||||
msg.ParseMode = "Markdown"
|
||||
|
||||
c.Bot.Send(msg)
|
||||
|
||||
return "ok"
|
||||
}
|
Reference in New Issue
Block a user