Massive refactoring for future development
This commit is contained in:
63
lib/broadcaster/broadcaster.go
Normal file
63
lib/broadcaster/broadcaster.go
Normal file
@@ -0,0 +1,63 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package broadcaster
|
||||
|
||||
import (
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
"time"
|
||||
)
|
||||
|
||||
func (b *Broadcaster) createBroadcastMessage(playerRaw *dbmapping.Player, messageBody string, broadcastType string) (dbmapping.Broadcast, bool) {
|
||||
messageRaw := dbmapping.Broadcast{}
|
||||
messageRaw.Text = messageBody
|
||||
messageRaw.Status = "new"
|
||||
messageRaw.BroadcastType = broadcastType
|
||||
messageRaw.AuthorID = playerRaw.ID
|
||||
messageRaw.CreatedAt = time.Now().UTC()
|
||||
_, err := c.Db.NamedExec("INSERT INTO broadcasts VALUES(NULL, :text, :broadcast_type, :status, :author_id, :created_at)", &messageRaw)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
return messageRaw, false
|
||||
}
|
||||
err2 := c.Db.Get(&messageRaw, c.Db.Rebind("SELECT * FROM broadcasts WHERE author_id=? AND text=?"), messageRaw.AuthorID, messageRaw.Text)
|
||||
if err2 != nil {
|
||||
c.Log.Error(err2)
|
||||
return messageRaw, false
|
||||
}
|
||||
|
||||
return messageRaw, true
|
||||
}
|
||||
|
||||
func (b *Broadcaster) getBroadcastMessageByID(messageID int) (dbmapping.Broadcast, bool) {
|
||||
messageRaw := dbmapping.Broadcast{}
|
||||
err := c.Db.Get(&messageRaw, c.Db.Rebind("SELECT * FROM broadcasts WHERE id=?"), messageID)
|
||||
if err != nil {
|
||||
c.Log.Error(err)
|
||||
return messageRaw, false
|
||||
}
|
||||
|
||||
return messageRaw, true
|
||||
}
|
||||
|
||||
func (b *Broadcaster) updateBroadcastMessageStatus(messageID int, messageStatus string) (dbmapping.Broadcast, bool) {
|
||||
messageRaw := dbmapping.Broadcast{}
|
||||
err := c.Db.Get(&messageRaw, c.Db.Rebind("SELECT * FROM broadcasts WHERE id=?"), messageID)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
return messageRaw, false
|
||||
}
|
||||
messageRaw.Status = messageStatus
|
||||
_, err = c.Db.NamedExec("UPDATE broadcasts SET status=:status WHERE id=:id", &messageRaw)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
return messageRaw, false
|
||||
}
|
||||
err = c.Db.Get(&messageRaw, c.Db.Rebind("SELECT * FROM broadcasts WHERE author_id=? AND text=?"), messageRaw.AuthorID, messageRaw.Text)
|
||||
if err != nil {
|
||||
c.Log.Error(err.Error())
|
||||
return messageRaw, false
|
||||
}
|
||||
|
||||
return messageRaw, true
|
||||
}
|
17
lib/broadcaster/broadcasterinterface/broadcasterinterface.go
Normal file
17
lib/broadcaster/broadcasterinterface/broadcasterinterface.go
Normal file
@@ -0,0 +1,17 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package broadcasterinterface
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
)
|
||||
|
||||
// BroadcasterInterface implements Broadcaster for importing via appcontex
|
||||
type BroadcasterInterface interface {
|
||||
Init()
|
||||
|
||||
AdminBroadcastMessageCompose(update *tgbotapi.Update, playerRaw *dbmapping.Player) string
|
||||
AdminBroadcastMessageSend(update *tgbotapi.Update, playerRaw *dbmapping.Player) string
|
||||
}
|
28
lib/broadcaster/exported.go
Normal file
28
lib/broadcaster/exported.go
Normal file
@@ -0,0 +1,28 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package broadcaster
|
||||
|
||||
import (
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/appcontext"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/broadcaster/broadcasterinterface"
|
||||
)
|
||||
|
||||
var (
|
||||
c *appcontext.Context
|
||||
)
|
||||
|
||||
// Broadcaster is a function-handling struct for broadcaster
|
||||
type Broadcaster struct{}
|
||||
|
||||
// New is a appcontext initialization function
|
||||
func New(ac *appcontext.Context) {
|
||||
c = ac
|
||||
b := &Broadcaster{}
|
||||
c.RegisterBroadcasterInterface(broadcasterinterface.BroadcasterInterface(b))
|
||||
}
|
||||
|
||||
// Init is an initialization function for talkers
|
||||
func (b *Broadcaster) Init() {
|
||||
c.Log.Info("Initializing Broadcaster...")
|
||||
}
|
47
lib/broadcaster/responders.go
Normal file
47
lib/broadcaster/responders.go
Normal file
@@ -0,0 +1,47 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package broadcaster
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// AdminBroadcastMessageCompose saves message for future broadcast
|
||||
func (b *Broadcaster) AdminBroadcastMessageCompose(update *tgbotapi.Update, playerRaw *dbmapping.Player) string {
|
||||
broadcastingMessageBody := strings.Replace(update.Message.Text, "/send_all ", "", 1)
|
||||
|
||||
messageRaw, ok := b.createBroadcastMessage(playerRaw, broadcastingMessageBody, "all")
|
||||
if !ok {
|
||||
return "fail"
|
||||
}
|
||||
|
||||
message := "Сообщение сохранено в базу.\n"
|
||||
message += "Выглядеть оно будет так:"
|
||||
|
||||
msg := tgbotapi.NewMessage(update.Message.Chat.ID, message)
|
||||
msg.ParseMode = "Markdown"
|
||||
|
||||
c.Bot.Send(msg)
|
||||
|
||||
broadcastingMessage := "*Привет, %username%!*\n\n"
|
||||
broadcastingMessage += "*Важное сообщение от администратора " + update.Message.From.FirstName + " " + update.Message.From.LastName + "* (@" + update.Message.From.UserName + ")\n\n"
|
||||
broadcastingMessage += messageRaw.Text
|
||||
|
||||
msg = tgbotapi.NewMessage(update.Message.Chat.ID, broadcastingMessage)
|
||||
msg.ParseMode = "Markdown"
|
||||
|
||||
c.Bot.Send(msg)
|
||||
|
||||
message = "Чтобы отправить сообщение всем, отправь команду /send\\_confirm " + strconv.Itoa(messageRaw.ID)
|
||||
|
||||
msg = tgbotapi.NewMessage(update.Message.Chat.ID, message)
|
||||
msg.ParseMode = "Markdown"
|
||||
|
||||
c.Bot.Send(msg)
|
||||
|
||||
return "ok"
|
||||
}
|
59
lib/broadcaster/sender.go
Normal file
59
lib/broadcaster/sender.go
Normal file
@@ -0,0 +1,59 @@
|
||||
// i2_bot – Instinct PokememBro Bot
|
||||
// Copyright (c) 2017 Vladimir "fat0troll" Hodakov
|
||||
|
||||
package broadcaster
|
||||
|
||||
import (
|
||||
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||
"lab.pztrn.name/fat0troll/i2_bot/lib/dbmapping"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// AdminBroadcastMessageSend sends saved message to all private chats
|
||||
func (b *Broadcaster) AdminBroadcastMessageSend(update *tgbotapi.Update, playerRaw *dbmapping.Player) string {
|
||||
messageNum := strings.Replace(update.Message.Text, "/send_confirm ", "", 1)
|
||||
messageNumInt, _ := strconv.Atoi(messageNum)
|
||||
messageRaw, ok := b.getBroadcastMessageByID(messageNumInt)
|
||||
if !ok {
|
||||
return "fail"
|
||||
}
|
||||
if messageRaw.AuthorID != playerRaw.ID {
|
||||
return "fail"
|
||||
}
|
||||
if messageRaw.Status != "new" {
|
||||
return "fail"
|
||||
}
|
||||
|
||||
broadcastingMessageBody := messageRaw.Text
|
||||
|
||||
privateChats, ok := c.Chatter.GetAllPrivateChats()
|
||||
if !ok {
|
||||
return "fail"
|
||||
}
|
||||
|
||||
for i := range privateChats {
|
||||
chat := privateChats[i]
|
||||
broadcastingMessage := "*Привет, " + chat.Name + "!*\n\n"
|
||||
broadcastingMessage += "*Важное сообщение от администратора " + update.Message.From.FirstName + " " + update.Message.From.LastName + "* (@" + update.Message.From.UserName + ")\n\n"
|
||||
broadcastingMessage += broadcastingMessageBody
|
||||
|
||||
msg := tgbotapi.NewMessage(int64(chat.TelegramID), broadcastingMessage)
|
||||
msg.ParseMode = "Markdown"
|
||||
c.Bot.Send(msg)
|
||||
}
|
||||
|
||||
messageRaw, ok = b.updateBroadcastMessageStatus(messageRaw.ID, "sent")
|
||||
if !ok {
|
||||
return "fail"
|
||||
}
|
||||
|
||||
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